am 7f34538a: (-s ours) am 65aec3a3: am 6d429d9d: (-s ours) am 3efb9e2e: DO NOT MERGE Change pairing_cb to assume temporary pairing by default

* commit '7f34538ac0e447a88d1f54ff819c28b3574f0aa4':
  DO NOT MERGE Change pairing_cb to assume temporary pairing by default
diff --git a/Android.mk b/Android.mk
index 5f2d274..1ddfb47 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,12 +1,20 @@
 LOCAL_PATH := $(call my-dir)
 
+bdroid_CFLAGS := -Wno-unused-parameter
+
 # Setup bdroid local make variables for handling configuration
 ifneq ($(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR),)
   bdroid_C_INCLUDES := $(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)
-  bdroid_CFLAGS := -DHAS_BDROID_BUILDCFG
+  bdroid_CFLAGS += -DHAS_BDROID_BUILDCFG
 else
   bdroid_C_INCLUDES :=
-  bdroid_CFLAGS := -DHAS_NO_BDROID_BUILDCFG
+  bdroid_CFLAGS += -DHAS_NO_BDROID_BUILDCFG
+endif
+
+bdroid_CFLAGS += -Wall -Werror
+
+ifneq ($(BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED),)
+  bdroid_CFLAGS += -DHCILP_INCLUDED=$(BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED)
 endif
 
 include $(call all-subdir-makefiles)
diff --git a/CleanSpec.mk b/CleanSpec.mk
index b84e1b6..518119b 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -44,6 +44,10 @@
 #$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
 #$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
 
+# Start of Clean Step list:
+$(call add-clean-step, find $(OUT_DIR) -type f -iname "*blue*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(OUT_DIR) -type f -iname "*bdroid*" -print0 | xargs -0 rm -f)
+
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/audio_a2dp_hw/Android.mk b/audio_a2dp_hw/Android.mk
index f9fd0a1..6fb83cb 100644
--- a/audio_a2dp_hw/Android.mk
+++ b/audio_a2dp_hw/Android.mk
@@ -1,21 +1,21 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES:= \
+LOCAL_SRC_FILES := \
 	audio_a2dp_hw.c
 
-LOCAL_C_INCLUDES+= . $(LOCAL_PATH)/../utils/include
+LOCAL_C_INCLUDES += \
+	. \
+	$(LOCAL_PATH)/../utils/include
 
-LOCAL_SHARED_LIBRARIES := \
-	libcutils liblog
-
-LOCAL_SHARED_LIBRARIES += \
-	libpower
+LOCAL_CFLAGS += -std=c99
 
 LOCAL_MODULE := audio.a2dp.default
 LOCAL_MODULE_RELATIVE_PATH := hw
 
+LOCAL_SHARED_LIBRARIES := libcutils liblog
+
 LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/audio_a2dp_hw/audio_a2dp_hw.c b/audio_a2dp_hw/audio_a2dp_hw.c
index cde56c1..5310ba3 100644
--- a/audio_a2dp_hw/audio_a2dp_hw.c
+++ b/audio_a2dp_hw/audio_a2dp_hw.c
@@ -25,6 +25,7 @@
  *****************************************************************************/
 
 #include <errno.h>
+#include <inttypes.h>
 #include <pthread.h>
 #include <stdint.h>
 #include <sys/time.h>
@@ -47,7 +48,7 @@
 
 #define LOG_TAG "audio_a2dp_hw"
 /* #define LOG_NDEBUG 0 */
-#include <cutils/log.h>
+#include <log/log.h>
 
 /*****************************************************************************
 **  Constants & Macros
@@ -78,10 +79,12 @@
     AUDIO_A2DP_STATE_STANDBY    /* allows write to autoresume */
 } a2dp_state_t;
 
+struct a2dp_stream_in;
 struct a2dp_stream_out;
 
 struct a2dp_audio_device {
     struct audio_hw_device device;
+    struct a2dp_stream_in  *input;
     struct a2dp_stream_out *output;
 };
 
@@ -93,18 +96,23 @@
 
 /* move ctrl_fd outside output stream and keep open until HAL unloaded ? */
 
-struct a2dp_stream_out {
-    struct audio_stream_out stream;
+struct a2dp_stream_common {
     pthread_mutex_t         lock;
     int                     ctrl_fd;
     int                     audio_fd;
     size_t                  buffer_sz;
-    a2dp_state_t            state;
     struct a2dp_config      cfg;
+    a2dp_state_t            state;
+};
+
+struct a2dp_stream_out {
+    struct audio_stream_out stream;
+    struct a2dp_stream_common common;
 };
 
 struct a2dp_stream_in {
-    struct audio_stream_in stream;
+    struct audio_stream_in  stream;
+    struct a2dp_stream_common common;
 };
 
 /*****************************************************************************
@@ -188,14 +196,14 @@
 **
 *****************************************************************************/
 
-static int skt_connect(struct a2dp_stream_out *out, char *path)
+static int skt_connect(char *path, size_t buffer_sz)
 {
     int ret;
     int skt_fd;
     struct sockaddr_un remote;
     int len;
 
-    INFO("connect to %s (sz %d)", path, out->buffer_sz);
+    INFO("connect to %s (sz %zu)", path, buffer_sz);
 
     skt_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
 
@@ -207,18 +215,43 @@
         return -1;
     }
 
-    len = out->buffer_sz;
+    len = buffer_sz;
     ret = setsockopt(skt_fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, (int)sizeof(len));
 
     /* only issue warning if failed */
     if (ret < 0)
         ERROR("setsockopt failed (%s)", strerror(errno));
 
+    ret = setsockopt(skt_fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, (int)sizeof(len));
+
+    /* only issue warning if failed */
+    if (ret < 0)
+        ERROR("setsockopt failed (%s)", strerror(errno));
+
     INFO("connected to stack fd = %d", skt_fd);
 
     return skt_fd;
 }
 
+static int skt_read(int fd, void *p, size_t len)
+{
+    int read;
+    struct pollfd pfd;
+    struct timespec ts;
+
+    FNLOG();
+
+    ts_log("skt_read recv", len, NULL);
+
+    if ((read = recv(fd, p, len, MSG_NOSIGNAL)) == -1)
+    {
+        ERROR("write failed with errno=%d\n", errno);
+        return -1;
+    }
+
+    return read;
+}
+
 static int skt_write(int fd, const void *p, size_t len)
 {
     int sent;
@@ -266,29 +299,53 @@
 **
 *****************************************************************************/
 
-static int a2dp_command(struct a2dp_stream_out *out, char cmd)
+static int a2dp_ctrl_receive(struct a2dp_stream_common *common, void* buffer, int length)
+{
+    int ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
+    if (ret < 0)
+    {
+        ERROR("ack failed (%s)", strerror(errno));
+        if (errno == EINTR)
+        {
+            /* retry again */
+            ret = recv(common->ctrl_fd, buffer, length, MSG_NOSIGNAL);
+            if (ret < 0)
+            {
+               ERROR("ack failed (%s)", strerror(errno));
+               skt_disconnect(common->ctrl_fd);
+               common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+               return -1;
+            }
+        }
+        else
+        {
+               skt_disconnect(common->ctrl_fd);
+               common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+               return -1;
+
+        }
+    }
+    return ret;
+}
+
+static int a2dp_command(struct a2dp_stream_common *common, char cmd)
 {
     char ack;
 
     DEBUG("A2DP COMMAND %s", dump_a2dp_ctrl_event(cmd));
 
     /* send command */
-    if (send(out->ctrl_fd, &cmd, 1, MSG_NOSIGNAL) == -1)
+    if (send(common->ctrl_fd, &cmd, 1, MSG_NOSIGNAL) == -1)
     {
         ERROR("cmd failed (%s)", strerror(errno));
-        skt_disconnect(out->ctrl_fd);
-        out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+        skt_disconnect(common->ctrl_fd);
+        common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
         return -1;
     }
 
     /* wait for ack byte */
-    if (recv(out->ctrl_fd, &ack, 1, MSG_NOSIGNAL) < 0)
-    {
-        ERROR("ack failed (%s)", strerror(errno));
-        skt_disconnect(out->ctrl_fd);
-        out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+    if (a2dp_ctrl_receive(common, &ack, 1) < 0)
         return -1;
-    }
 
     DEBUG("A2DP COMMAND %s DONE STATUS %d", dump_a2dp_ctrl_event(cmd), ack);
 
@@ -298,13 +355,74 @@
     return 0;
 }
 
+static int check_a2dp_ready(struct a2dp_stream_common *common)
+{
+    if (a2dp_command(common, A2DP_CTRL_CMD_CHECK_READY) < 0)
+    {
+        ERROR("check a2dp ready failed");
+        return -1;
+    }
+    return 0;
+}
+
+static int a2dp_read_audio_config(struct a2dp_stream_common *common)
+{
+    char cmd = A2DP_CTRL_GET_AUDIO_CONFIG;
+    uint32_t sample_rate;
+    uint8_t channel_count;
+
+    if (a2dp_command(common, A2DP_CTRL_GET_AUDIO_CONFIG) < 0)
+    {
+        ERROR("check a2dp ready failed");
+        return -1;
+    }
+
+    if (a2dp_ctrl_receive(common, &sample_rate, 4) < 0)
+        return -1;
+    if (a2dp_ctrl_receive(common, &channel_count, 1) < 0)
+        return -1;
+
+    common->cfg.channel_flags = (channel_count == 1 ? AUDIO_CHANNEL_IN_MONO : AUDIO_CHANNEL_IN_STEREO);
+    common->cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
+    common->cfg.rate = sample_rate;
+
+    INFO("got config %d %d", common->cfg.format, common->cfg.rate);
+
+    return 0;
+}
+
+static void a2dp_open_ctrl_path(struct a2dp_stream_common *common)
+{
+    int i;
+
+    /* retry logic to catch any timing variations on control channel */
+    for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
+    {
+        /* connect control channel if not already connected */
+        if ((common->ctrl_fd = skt_connect(A2DP_CTRL_PATH, common->buffer_sz)) > 0)
+        {
+            /* success, now check if stack is ready */
+            if (check_a2dp_ready(common) == 0)
+                break;
+
+            ERROR("error : a2dp not ready, wait 250 ms and retry");
+            usleep(250000);
+            skt_disconnect(common->ctrl_fd);
+            common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+        }
+
+        /* ctrl channel not ready, wait a bit */
+        usleep(250000);
+    }
+}
+
 /*****************************************************************************
 **
 ** AUDIO DATA PATH
 **
 *****************************************************************************/
 
-static void a2dp_stream_out_init(struct a2dp_stream_out *out)
+static void a2dp_stream_common_init(struct a2dp_stream_common *common)
 {
     pthread_mutexattr_t lock_attr;
 
@@ -312,124 +430,109 @@
 
     pthread_mutexattr_init(&lock_attr);
     pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
-    pthread_mutex_init(&out->lock, &lock_attr);
+    pthread_mutex_init(&common->lock, &lock_attr);
 
-    out->ctrl_fd = AUDIO_SKT_DISCONNECTED;
-    out->audio_fd = AUDIO_SKT_DISCONNECTED;
-    out->state = AUDIO_A2DP_STATE_STOPPED;
-
-    out->cfg.channel_flags = AUDIO_STREAM_DEFAULT_CHANNEL_FLAG;
-    out->cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
-    out->cfg.rate = AUDIO_STREAM_DEFAULT_RATE;
+    common->ctrl_fd = AUDIO_SKT_DISCONNECTED;
+    common->audio_fd = AUDIO_SKT_DISCONNECTED;
+    common->state = AUDIO_A2DP_STATE_STOPPED;
 
     /* manages max capacity of socket pipe */
-    out->buffer_sz = AUDIO_STREAM_OUTPUT_BUFFER_SZ;
+    common->buffer_sz = AUDIO_STREAM_OUTPUT_BUFFER_SZ;
 }
 
-static int start_audio_datapath(struct a2dp_stream_out *out)
+static int start_audio_datapath(struct a2dp_stream_common *common)
 {
-    int oldstate = out->state;
+    int oldstate = common->state;
 
-    INFO("state %d", out->state);
+    INFO("state %d", common->state);
 
-    if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+    if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED) {
+        INFO("AUDIO_SKT_DISCONNECTED");
         return -1;
+    }
 
-    out->state = AUDIO_A2DP_STATE_STARTING;
+    common->state = AUDIO_A2DP_STATE_STARTING;
 
-    if (a2dp_command(out, A2DP_CTRL_CMD_START) < 0)
+    if (a2dp_command(common, A2DP_CTRL_CMD_START) < 0)
     {
         ERROR("audiopath start failed");
 
-        out->state = oldstate;
+        common->state = oldstate;
         return -1;
     }
 
     /* connect socket if not yet connected */
-    if (out->audio_fd == AUDIO_SKT_DISCONNECTED)
+    if (common->audio_fd == AUDIO_SKT_DISCONNECTED)
     {
-        out->audio_fd = skt_connect(out, A2DP_DATA_PATH);
-
-        if (out->audio_fd < 0)
+        common->audio_fd = skt_connect(A2DP_DATA_PATH, common->buffer_sz);
+        if (common->audio_fd < 0)
         {
-            out->state = oldstate;
+            common->state = oldstate;
             return -1;
         }
 
-        out->state = AUDIO_A2DP_STATE_STARTED;
+        common->state = AUDIO_A2DP_STATE_STARTED;
     }
 
     return 0;
 }
 
 
-static int stop_audio_datapath(struct a2dp_stream_out *out)
+static int stop_audio_datapath(struct a2dp_stream_common *common)
 {
-    int oldstate = out->state;
+    int oldstate = common->state;
 
-    INFO("state %d", out->state);
+    INFO("state %d", common->state);
 
-    if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+    if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
          return -1;
 
     /* prevent any stray output writes from autostarting the stream
        while stopping audiopath */
-    out->state = AUDIO_A2DP_STATE_STOPPING;
+    common->state = AUDIO_A2DP_STATE_STOPPING;
 
-    if (a2dp_command(out, A2DP_CTRL_CMD_STOP) < 0)
+    if (a2dp_command(common, A2DP_CTRL_CMD_STOP) < 0)
     {
         ERROR("audiopath stop failed");
-        out->state = oldstate;
+        common->state = oldstate;
         return -1;
     }
 
-    out->state = AUDIO_A2DP_STATE_STOPPED;
+    common->state = AUDIO_A2DP_STATE_STOPPED;
 
     /* disconnect audio path */
-    skt_disconnect(out->audio_fd);
-    out->audio_fd = AUDIO_SKT_DISCONNECTED;
+    skt_disconnect(common->audio_fd);
+    common->audio_fd = AUDIO_SKT_DISCONNECTED;
 
     return 0;
 }
 
-static int suspend_audio_datapath(struct a2dp_stream_out *out, bool standby)
+static int suspend_audio_datapath(struct a2dp_stream_common *common, bool standby)
 {
-    INFO("state %d", out->state);
+    INFO("state %d", common->state);
 
-    if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+    if (common->ctrl_fd == AUDIO_SKT_DISCONNECTED)
          return -1;
 
-    if (out->state == AUDIO_A2DP_STATE_STOPPING)
+    if (common->state == AUDIO_A2DP_STATE_STOPPING)
         return -1;
 
-    if (a2dp_command(out, A2DP_CTRL_CMD_SUSPEND) < 0)
+    if (a2dp_command(common, A2DP_CTRL_CMD_SUSPEND) < 0)
         return -1;
 
     if (standby)
-        out->state = AUDIO_A2DP_STATE_STANDBY;
+        common->state = AUDIO_A2DP_STATE_STANDBY;
     else
-        out->state = AUDIO_A2DP_STATE_SUSPENDED;
+        common->state = AUDIO_A2DP_STATE_SUSPENDED;
 
     /* disconnect audio path */
-    skt_disconnect(out->audio_fd);
+    skt_disconnect(common->audio_fd);
 
-    out->audio_fd = AUDIO_SKT_DISCONNECTED;
+    common->audio_fd = AUDIO_SKT_DISCONNECTED;
 
     return 0;
 }
 
-static int check_a2dp_ready(struct a2dp_stream_out *out)
-{
-    INFO("state %d", out->state);
-
-    if (a2dp_command(out, A2DP_CTRL_CMD_CHECK_READY) < 0)
-    {
-        ERROR("check a2dp ready failed");
-        return -1;
-    }
-    return 0;
-}
-
 
 /*****************************************************************************
 **
@@ -443,52 +546,52 @@
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
     int sent;
 
-    DEBUG("write %d bytes (fd %d)", bytes, out->audio_fd);
+    DEBUG("write %zu bytes (fd %d)", bytes, out->common.audio_fd);
 
-    if (out->state == AUDIO_A2DP_STATE_SUSPENDED)
+    if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
     {
         DEBUG("stream suspended");
         return -1;
     }
 
     /* only allow autostarting if we are in stopped or standby */
-    if ((out->state == AUDIO_A2DP_STATE_STOPPED) ||
-        (out->state == AUDIO_A2DP_STATE_STANDBY))
+    if ((out->common.state == AUDIO_A2DP_STATE_STOPPED) ||
+        (out->common.state == AUDIO_A2DP_STATE_STANDBY))
     {
-        pthread_mutex_lock(&out->lock);
+        pthread_mutex_lock(&out->common.lock);
 
-        if (start_audio_datapath(out) < 0)
+        if (start_audio_datapath(&out->common) < 0)
         {
             /* emulate time this write represents to avoid very fast write
                failures during transition periods or remote suspend */
 
-            int us_delay = calc_audiotime(out->cfg, bytes);
+            int us_delay = calc_audiotime(out->common.cfg, bytes);
 
             DEBUG("emulate a2dp write delay (%d us)", us_delay);
 
             usleep(us_delay);
-            pthread_mutex_unlock(&out->lock);
+            pthread_mutex_unlock(&out->common.lock);
             return -1;
         }
 
-        pthread_mutex_unlock(&out->lock);
+        pthread_mutex_unlock(&out->common.lock);
     }
-    else if (out->state != AUDIO_A2DP_STATE_STARTED)
+    else if (out->common.state != AUDIO_A2DP_STATE_STARTED)
     {
         ERROR("stream not in stopped or standby");
         return -1;
     }
 
-    sent = skt_write(out->audio_fd, buffer,  bytes);
+    sent = skt_write(out->common.audio_fd, buffer,  bytes);
 
     if (sent == -1)
     {
-        skt_disconnect(out->audio_fd);
-        out->audio_fd = AUDIO_SKT_DISCONNECTED;
-        out->state = AUDIO_A2DP_STATE_STOPPED;
+        skt_disconnect(out->common.audio_fd);
+        out->common.audio_fd = AUDIO_SKT_DISCONNECTED;
+        out->common.state = AUDIO_A2DP_STATE_STOPPED;
     }
 
-    DEBUG("wrote %d bytes out of %d bytes", sent, bytes);
+    DEBUG("wrote %d bytes out of %zu bytes", sent, bytes);
     return sent;
 }
 
@@ -497,16 +600,16 @@
 {
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
 
-    DEBUG("rate %d", out->cfg.rate);
+    DEBUG("rate %" PRIu32,out->common.cfg.rate);
 
-    return out->cfg.rate;
+    return out->common.cfg.rate;
 }
 
 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
 {
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
 
-    DEBUG("out_set_sample_rate : %d", rate);
+    DEBUG("out_set_sample_rate : %" PRIu32, rate);
 
     if (rate != AUDIO_STREAM_DEFAULT_RATE)
     {
@@ -514,7 +617,7 @@
         return -1;
     }
 
-    out->cfg.rate = rate;
+    out->common.cfg.rate = rate;
 
     return 0;
 }
@@ -523,25 +626,25 @@
 {
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
 
-    DEBUG("buffer_size : %d", out->buffer_sz);
+    DEBUG("buffer_size : %zu", out->common.buffer_sz);
 
-    return out->buffer_sz;
+    return out->common.buffer_sz;
 }
 
 static uint32_t out_get_channels(const struct audio_stream *stream)
 {
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
 
-    DEBUG("channels 0x%x", out->cfg.channel_flags);
+    DEBUG("channels 0x%" PRIx32, out->common.cfg.channel_flags);
 
-    return out->cfg.channel_flags;
+    return out->common.cfg.channel_flags;
 }
 
 static audio_format_t out_get_format(const struct audio_stream *stream)
 {
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
-    DEBUG("format 0x%x", out->cfg.format);
-    return out->cfg.format;
+    DEBUG("format 0x%x", out->common.cfg.format);
+    return out->common.cfg.format;
 }
 
 static int out_set_format(struct audio_stream *stream, audio_format_t format)
@@ -559,13 +662,13 @@
 
     FNLOG();
 
-    pthread_mutex_lock(&out->lock);
+    pthread_mutex_lock(&out->common.lock);
 
-    if (out->state == AUDIO_A2DP_STATE_STARTED)
-        retVal =  suspend_audio_datapath(out, true);
+    if (out->common.state == AUDIO_A2DP_STATE_STARTED)
+        retVal =  suspend_audio_datapath(&out->common, true);
     else
         retVal = 0;
-    pthread_mutex_unlock (&out->lock);
+    pthread_mutex_unlock(&out->common.lock);
 
     return retVal;
 }
@@ -583,11 +686,12 @@
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
     struct str_parms *parms;
     char keyval[16];
-    int retval = 0;
+    int retval;
+    int status = 0;
 
-    INFO("state %d", out->state);
+    INFO("state %d", out->common.state);
 
-    pthread_mutex_lock(&out->lock);
+    pthread_mutex_lock(&out->common.lock);
 
     parms = str_parms_create_str(kvpairs);
 
@@ -601,7 +705,7 @@
         if (strcmp(keyval, "true") == 0)
         {
             DEBUG("stream closing, disallow any writes");
-            out->state = AUDIO_A2DP_STATE_STOPPING;
+            out->common.state = AUDIO_A2DP_STATE_STOPPING;
         }
     }
 
@@ -611,25 +715,24 @@
     {
         if (strcmp(keyval, "true") == 0)
         {
-            if (out->state == AUDIO_A2DP_STATE_STARTED)
-                retval = suspend_audio_datapath(out, false);
+            if (out->common.state == AUDIO_A2DP_STATE_STARTED)
+                status = suspend_audio_datapath(&out->common, false);
         }
         else
         {
             /* Do not start the streaming automatically. If the phone was streaming
              * prior to being suspended, the next out_write shall trigger the
              * AVDTP start procedure */
-            if (out->state == AUDIO_A2DP_STATE_SUSPENDED)
-                out->state = AUDIO_A2DP_STATE_STANDBY;
+            if (out->common.state == AUDIO_A2DP_STATE_SUSPENDED)
+                out->common.state = AUDIO_A2DP_STATE_STANDBY;
             /* Irrespective of the state, return 0 */
-            retval = 0;
         }
     }
 
-    pthread_mutex_unlock(&out->lock);
+    pthread_mutex_unlock(&out->common.lock);
     str_parms_destroy(parms);
 
-    return retval;
+    return status;
 }
 
 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
@@ -652,9 +755,9 @@
 
     FNLOG();
 
-    latency_us = ((out->buffer_sz * 1000 ) /
-                    audio_stream_frame_size(&out->stream.common) /
-                    out->cfg.rate) * 1000;
+    latency_us = ((out->common.buffer_sz * 1000 ) /
+                    audio_stream_out_frame_size(&out->stream) /
+                    out->common.cfg.rate) * 1000;
 
 
     return (latency_us / 1000) + 200;
@@ -710,19 +813,22 @@
 
 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
 {
-    UNUSED(stream);
+    struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
 
     FNLOG();
-    return 8000;
+    return in->common.cfg.rate;
 }
 
 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
 {
-    UNUSED(stream);
-    UNUSED(rate);
+    struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
 
     FNLOG();
-    return 0;
+
+    if (in->common.cfg.rate > 0 && in->common.cfg.rate == rate)
+        return 0;
+    else
+        return -1;
 }
 
 static size_t in_get_buffer_size(const struct audio_stream *stream)
@@ -735,10 +841,10 @@
 
 static uint32_t in_get_channels(const struct audio_stream *stream)
 {
-    UNUSED(stream);
+    struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
 
     FNLOG();
-    return AUDIO_CHANNEL_IN_MONO;
+    return in->common.cfg.channel_flags;
 }
 
 static audio_format_t in_get_format(const struct audio_stream *stream)
@@ -755,7 +861,10 @@
     UNUSED(format);
 
     FNLOG();
-    return 0;
+    if (format == AUDIO_FORMAT_PCM_16_BIT)
+        return 0;
+    else
+        return -1;
 }
 
 static int in_standby(struct audio_stream *stream)
@@ -806,12 +915,60 @@
 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
                        size_t bytes)
 {
-    UNUSED(stream);
-    UNUSED(buffer);
-    UNUSED(bytes);
+    struct a2dp_stream_in *in = (struct a2dp_stream_in *)stream;
+    int read;
 
-    FNLOG();
-    return bytes;
+    DEBUG("read %zu bytes, state: %d", bytes, in->common.state);
+
+    if (in->common.state == AUDIO_A2DP_STATE_SUSPENDED)
+    {
+        DEBUG("stream suspended");
+        return -1;
+    }
+
+    /* only allow autostarting if we are in stopped or standby */
+    if ((in->common.state == AUDIO_A2DP_STATE_STOPPED) ||
+        (in->common.state == AUDIO_A2DP_STATE_STANDBY))
+    {
+        pthread_mutex_lock(&in->common.lock);
+
+        if (start_audio_datapath(&in->common) < 0)
+        {
+            /* emulate time this write represents to avoid very fast write
+               failures during transition periods or remote suspend */
+
+            int us_delay = calc_audiotime(in->common.cfg, bytes);
+
+            DEBUG("emulate a2dp read delay (%d us)", us_delay);
+
+            usleep(us_delay);
+            pthread_mutex_unlock(&in->common.lock);
+            return -1;
+        }
+
+        pthread_mutex_unlock(&in->common.lock);
+    }
+    else if (in->common.state != AUDIO_A2DP_STATE_STARTED)
+    {
+        ERROR("stream not in stopped or standby");
+        return -1;
+    }
+
+    read = skt_read(in->common.audio_fd, buffer, bytes);
+
+    if (read == -1)
+    {
+        skt_disconnect(in->common.audio_fd);
+        in->common.audio_fd = AUDIO_SKT_DISCONNECTED;
+        in->common.state = AUDIO_A2DP_STATE_STOPPED;
+    } else if (read == 0) {
+        DEBUG("read time out - return zeros");
+        memset(buffer, 0, bytes);
+        read = bytes;
+    }
+
+    DEBUG("read %d bytes out of %zu bytes", read, bytes);
+    return read;
 }
 
 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
@@ -846,7 +1003,8 @@
                                    audio_devices_t devices,
                                    audio_output_flags_t flags,
                                    struct audio_config *config,
-                                   struct audio_stream_out **stream_out)
+                                   struct audio_stream_out **stream_out,
+                                   const char *address __unused)
 
 {
     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
@@ -882,7 +1040,11 @@
     out->stream.get_render_position = out_get_render_position;
 
     /* initialize a2dp specifics */
-    a2dp_stream_out_init(out);
+    a2dp_stream_common_init(&out->common);
+
+    out->common.cfg.channel_flags = AUDIO_STREAM_DEFAULT_CHANNEL_FLAG;
+    out->common.cfg.format = AUDIO_STREAM_DEFAULT_FORMAT;
+    out->common.cfg.rate = AUDIO_STREAM_DEFAULT_RATE;
 
    /* set output config values */
    if (config)
@@ -894,26 +1056,8 @@
     *stream_out = &out->stream;
     a2dp_dev->output = out;
 
-    /* retry logic to catch any timing variations on control channel */
-    for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
-    {
-        /* connect control channel if not already connected */
-        if ((out->ctrl_fd = skt_connect(out, A2DP_CTRL_PATH)) > 0)
-        {
-            /* success, now check if stack is ready */
-            if (check_a2dp_ready(out) == 0)
-                break;
-
-            ERROR("error : a2dp not ready, wait 250 ms and retry");
-            usleep(250000);
-            skt_disconnect(out->ctrl_fd);
-        }
-
-        /* ctrl channel not ready, wait a bit */
-        usleep(250000);
-    }
-
-    if (out->ctrl_fd == AUDIO_SKT_DISCONNECTED)
+    a2dp_open_ctrl_path(&out->common);
+    if (out->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
     {
         ERROR("ctrl socket failed to connect (%s)", strerror(errno));
         ret = -1;
@@ -926,6 +1070,7 @@
 err_open:
     free(out);
     *stream_out = NULL;
+    a2dp_dev->output = NULL;
     ERROR("failed");
     return ret;
 }
@@ -936,12 +1081,12 @@
     struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
     struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
 
-    INFO("closing output (state %d)", out->state);
+    INFO("closing output (state %d)", out->common.state);
 
-    if ((out->state == AUDIO_A2DP_STATE_STARTED) || (out->state == AUDIO_A2DP_STATE_STOPPING))
-        stop_audio_datapath(out);
+    if ((out->common.state == AUDIO_A2DP_STATE_STARTED) || (out->common.state == AUDIO_A2DP_STATE_STOPPING))
+        stop_audio_datapath(&out->common);
 
-    skt_disconnect(out->ctrl_fd);
+    skt_disconnect(out->common.ctrl_fd);
     free(stream);
     a2dp_dev->output = NULL;
 
@@ -955,9 +1100,11 @@
     int retval = 0;
 
     if (out == NULL)
+    {
+        ERROR("ERROR: set param called even when stream out is null");
         return retval;
-
-    INFO("state %d", out->state);
+    }
+    INFO("state %d", out->common.state);
 
     retval = out->stream.common.set_parameters((struct audio_stream *)out, kvpairs);
 
@@ -1055,9 +1202,12 @@
                                   audio_io_handle_t handle,
                                   audio_devices_t devices,
                                   struct audio_config *config,
-                                  struct audio_stream_in **stream_in)
+                                  struct audio_stream_in **stream_in,
+                                  audio_input_flags_t flags __unused,
+                                  const char *address __unused,
+                                  audio_source_t source __unused)
 {
-    struct a2dp_audio_device *ladev = (struct a2dp_audio_device *)dev;
+    struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
     struct a2dp_stream_in *in;
     int ret;
     UNUSED(handle);
@@ -1087,24 +1237,54 @@
     in->stream.read = in_read;
     in->stream.get_input_frames_lost = in_get_input_frames_lost;
 
+    /* initialize a2dp specifics */
+    a2dp_stream_common_init(&in->common);
+
     *stream_in = &in->stream;
+    a2dp_dev->input = in;
+
+    a2dp_open_ctrl_path(&in->common);
+    if (in->common.ctrl_fd == AUDIO_SKT_DISCONNECTED)
+    {
+        ERROR("ctrl socket failed to connect (%s)", strerror(errno));
+        ret = -1;
+        goto err_open;
+    }
+
+    if (a2dp_read_audio_config(&in->common) < 0) {
+        ERROR("a2dp_read_audio_config failed (%s)", strerror(errno));
+        ret = -1;
+        goto err_open;
+    }
+
+    DEBUG("success");
     return 0;
 
 err_open:
     free(in);
     *stream_in = NULL;
+    a2dp_dev->input = NULL;
+    ERROR("failed");
     return ret;
 }
 
 static void adev_close_input_stream(struct audio_hw_device *dev,
-                                   struct audio_stream_in *in)
+                                   struct audio_stream_in *stream)
 {
-    UNUSED(dev);
-    UNUSED(in);
+    struct a2dp_audio_device *a2dp_dev = (struct a2dp_audio_device *)dev;
+    struct a2dp_stream_in* in = (struct a2dp_stream_in *)stream;
+    a2dp_state_t state = in->common.state;
 
-    FNLOG();
+    INFO("closing input (state %d)", state);
 
-    return;
+    if ((state == AUDIO_A2DP_STATE_STARTED) || (state == AUDIO_A2DP_STATE_STOPPING))
+        stop_audio_datapath(&in->common);
+
+    skt_disconnect(in->common.ctrl_fd);
+    free(stream);
+    a2dp_dev->input = NULL;
+
+    DEBUG("done");
 }
 
 static int adev_dump(const audio_hw_device_t *device, int fd)
@@ -1146,7 +1326,7 @@
         return -ENOMEM;
 
     adev->device.common.tag = HARDWARE_DEVICE_TAG;
-    adev->device.common.version = AUDIO_DEVICE_API_VERSION_CURRENT;
+    adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
     adev->device.common.module = (struct hw_module_t *) module;
     adev->device.common.close = adev_close;
 
diff --git a/audio_a2dp_hw/audio_a2dp_hw.h b/audio_a2dp_hw/audio_a2dp_hw.h
index 2015591..b4ac85d 100644
--- a/audio_a2dp_hw/audio_a2dp_hw.h
+++ b/audio_a2dp_hw/audio_a2dp_hw.h
@@ -46,7 +46,8 @@
     A2DP_CTRL_CMD_CHECK_READY,
     A2DP_CTRL_CMD_START,
     A2DP_CTRL_CMD_STOP,
-    A2DP_CTRL_CMD_SUSPEND
+    A2DP_CTRL_CMD_SUSPEND,
+    A2DP_CTRL_GET_AUDIO_CONFIG,
 } tA2DP_CTRL_CMD;
 
 typedef enum {
diff --git a/bta/Android.mk b/bta/Android.mk
index bca6c08..c863d10 100644
--- a/bta/Android.mk
+++ b/bta/Android.mk
@@ -1,5 +1,3 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
 LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
@@ -8,7 +6,7 @@
 LOCAL_CFLAGS += \
 	-DBOARD_HAVE_BLUETOOTH_BCM
 endif
-LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS)
+LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -std=c99
 
 LOCAL_PRELINK_MODULE:=false
 LOCAL_SRC_FILES:= \
@@ -39,6 +37,14 @@
     ./ag/bta_ag_cmd.c \
     ./ag/bta_ag_ci.c \
     ./ag/bta_ag_at.c \
+    ./hf_client/bta_hf_client_act.c \
+    ./hf_client/bta_hf_client_api.c \
+    ./hf_client/bta_hf_client_main.c \
+    ./hf_client/bta_hf_client_rfc.c \
+    ./hf_client/bta_hf_client_at.c \
+    ./hf_client/bta_hf_client_sdp.c \
+    ./hf_client/bta_hf_client_sco.c \
+    ./hf_client/bta_hf_client_cmd.c \
     ./hh/bta_hh_cfg.c \
     ./hh/bta_hh_act.c \
     ./hh/bta_hh_api.c \
@@ -67,6 +73,10 @@
     ./hl/bta_hl_utils.c \
     ./hl/bta_hl_sdp.c \
     ./hl/bta_hl_ci.c \
+    ./mce/bta_mce_api.c \
+    ./mce/bta_mce_main.c \
+    ./mce/bta_mce_act.c \
+    ./mce/bta_mce_cfg.c \
     ./sys/bta_sys_main.c \
     ./sys/bta_sys_ci.c \
     ./sys/bta_sys_conn.c \
@@ -77,12 +87,13 @@
     ./jv/bta_jv_act.c \
     ./jv/bta_jv_cfg.c \
     ./jv/bta_jv_main.c \
-    ./jv/bta_jv_api.c
+    ./jv/bta_jv_api.c \
 
 LOCAL_MODULE := libbt-brcm_bta
 LOCAL_MODULE_CLASS := STATIC_LIBRARIES
 LOCAL_MODULE_TAGS := optional
 LOCAL_SHARED_LIBRARIES := libcutils libc
+LOCAL_MULTILIB := 32
 
 LOCAL_C_INCLUDES+= . \
                    $(LOCAL_PATH)/include \
@@ -97,11 +108,9 @@
                    $(LOCAL_PATH)/../hcis \
                    $(LOCAL_PATH)/../hcis/patchram \
                    $(LOCAL_PATH)/../udrv/include \
-                   $(LOCAL_PATH)/../brcm/include \
+                   $(LOCAL_PATH)/../vnd/include \
                    $(LOCAL_PATH)/../utils/include \
                    $(bdroid_C_INCLUDES) \
 
 
 include $(BUILD_STATIC_LIBRARY)
-
-endif  # TARGET_SIMULATOR != true
diff --git a/bta/ag/bta_ag_act.c b/bta/ag/bta_ag_act.c
index 11fc85c..ca4f8eb 100644
--- a/bta/ag/bta_ag_act.c
+++ b/bta/ag/bta_ag_act.c
@@ -244,7 +244,7 @@
 {
     UINT16 event = BTA_AG_DISC_FAIL_EVT;
 
-    APPL_TRACE_DEBUG1 ("bta_ag_disc_int_res: Status: %d", p_data->disc_result.status);
+    APPL_TRACE_DEBUG ("bta_ag_disc_int_res: Status: %d", p_data->disc_result.status);
 
     /* if found service */
     if (p_data->disc_result.status == SDP_SUCCESS ||
@@ -406,7 +406,7 @@
 *******************************************************************************/
 void bta_ag_rfc_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
 {
-    tBTA_AG_HDR    close;
+    tBTA_AG_CLOSE    close;
     tBTA_SERVICE_MASK services;
     int i, num_active_conn = 0;
     UNUSED(p_data);
@@ -423,6 +423,10 @@
 #if (BTM_WBS_INCLUDED == TRUE )
     p_scb->peer_codecs = BTA_AG_CODEC_NONE;
     p_scb->sco_codec = BTA_AG_CODEC_NONE;
+    /* Clear these flags upon SLC teardown */
+    p_scb->codec_updated = FALSE;
+    p_scb->codec_fallback = FALSE;
+    p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
 #endif
     p_scb->role = 0;
     p_scb->post_sco = BTA_AG_POST_SCO_NONE;
@@ -436,13 +440,14 @@
     bta_sys_stop_timer(&p_scb->cn_timer);
 #endif
 
-    close.handle = bta_ag_scb_to_idx(p_scb);
-    close.app_id = p_scb->app_id;
+    close.hdr.handle = bta_ag_scb_to_idx(p_scb);
+    close.hdr.app_id = p_scb->app_id;
+    bdcpy(close.bd_addr, p_scb->peer_addr);
 
     bta_sys_conn_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
 
     /* call close call-out */
-    bta_ag_co_data_close(close.handle);
+    bta_ag_co_data_close(close.hdr.handle);
 
     /* call close cback */
     (*bta_ag_cb.p_cback)(BTA_AG_CLOSE_EVT, (tBTA_AG *) &close);
@@ -555,13 +560,13 @@
     /* set role */
     p_scb->role = BTA_AG_ACP;
 
-    APPL_TRACE_DEBUG2 ("bta_ag_rfc_acp_open: serv_handle0 = %d serv_handle1 = %d",
+    APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: serv_handle0 = %d serv_handle1 = %d",
                        p_scb->serv_handle[0], p_scb->serv_handle[1]);
 
     /* get bd addr of peer */
     if (PORT_SUCCESS != (status=PORT_CheckConnection(p_data->rfc.port_handle, dev_addr, &lcid)))
     {
-        APPL_TRACE_DEBUG1 ("bta_ag_rfc_acp_open error PORT_CheckConnection returned status %d", status);
+        APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open error PORT_CheckConnection returned status %d", status);
     }
 
     /* Collision Handling */
@@ -601,7 +606,7 @@
     /* determine connected service from port handle */
     for (i = 0; i < BTA_AG_NUM_IDX; i++)
     {
-        APPL_TRACE_DEBUG3 ("bta_ag_rfc_acp_open: i = %d serv_handle = %d port_handle = %d",
+        APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: i = %d serv_handle = %d port_handle = %d",
                            i, p_scb->serv_handle[i], p_data->rfc.port_handle);
 
         if (p_scb->serv_handle[i] == p_data->rfc.port_handle)
@@ -612,7 +617,7 @@
         }
     }
 
-    APPL_TRACE_DEBUG2 ("bta_ag_rfc_acp_open: conn_service = %d conn_handle = %d",
+    APPL_TRACE_DEBUG ("bta_ag_rfc_acp_open: conn_service = %d conn_handle = %d",
                        p_scb->conn_service, p_scb->conn_handle);
 
     /* close any unopened server */
@@ -819,6 +824,7 @@
         evt.hdr.handle = bta_ag_scb_to_idx(p_scb);
         evt.hdr.app_id = p_scb->app_id;
         evt.peer_feat = p_scb->peer_features;
+        bdcpy(evt.bd_addr, p_scb->peer_addr);
 #if (BTM_WBS_INCLUDED == TRUE )
         evt.peer_codec  = p_scb->peer_codecs;
 #endif
@@ -865,7 +871,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_ag_rcvd_slc_ready: handle = %d", bta_ag_scb_to_idx(p_scb));
+    APPL_TRACE_DEBUG("bta_ag_rcvd_slc_ready: handle = %d", bta_ag_scb_to_idx(p_scb));
 
     if (bta_ag_cb.parse_mode == BTA_AG_PASS_THROUGH)
     {
@@ -874,3 +880,51 @@
     }
 }
 
+/*******************************************************************************
+**
+** Function         bta_ag_setcodec
+**
+** Description      Handle API SetCodec
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
+{
+#if (BTM_WBS_INCLUDED == TRUE )
+    tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
+    tBTA_AG_VAL        val;
+
+    /* Check if the requested codec type is valid */
+    if((codec_type != BTA_AG_CODEC_NONE) &&
+       (codec_type != BTA_AG_CODEC_CVSD) &&
+       (codec_type != BTA_AG_CODEC_MSBC))
+    {
+        val.num = codec_type;
+        val.hdr.status = BTA_AG_FAIL_RESOURCES;
+        APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d", codec_type);
+        (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG *) &val);
+        return;
+    }
+
+    if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) ||
+        (codec_type == BTA_AG_CODEC_CVSD))
+    {
+        p_scb->sco_codec = codec_type;
+        p_scb->codec_updated = TRUE;
+        val.num = codec_type;
+        val.hdr.status = BTA_AG_SUCCESS;
+        APPL_TRACE_DEBUG("bta_ag_setcodec: Updated codec type %d", codec_type);
+    }
+    else
+    {
+        val.num = codec_type;
+        val.hdr.status = BTA_AG_FAIL_RESOURCES;
+        APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d", codec_type);
+    }
+
+    (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG *) &val);
+#endif
+}
+
diff --git a/bta/ag/bta_ag_api.c b/bta/ag/bta_ag_api.c
index 07dceb9..5bfa492 100644
--- a/bta/ag/bta_ag_api.c
+++ b/bta/ag/bta_ag_api.c
@@ -65,15 +65,13 @@
     {
         if (bta_ag_cb.scb[idx].in_use)
         {
-            APPL_TRACE_ERROR0 ("BTA_AgEnable: FAILED, AG already enabled.");
+            APPL_TRACE_ERROR ("BTA_AgEnable: FAILED, AG already enabled.");
             return BTA_FAILURE;
         }
     }
 
     /* register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_register(BTA_ID_AG, &bta_ag_reg);
-    GKI_sched_unlock();
 
     if ((p_buf = (tBTA_AG_API_ENABLE *) GKI_getbuf(sizeof(tBTA_AG_API_ENABLE))) != NULL)
     {
diff --git a/bta/ag/bta_ag_ci.c b/bta/ag/bta_ag_ci.c
index fd39e34..c9f0a10 100644
--- a/bta/ag/bta_ag_ci.c
+++ b/bta/ag/bta_ag_ci.c
@@ -65,7 +65,7 @@
 
         bta_sys_sendmsg(p_buf);
         } else {
-        APPL_TRACE_ERROR1("ERROR: Unable to allocate buffer to hold AT response code. len=%i", len);
+        APPL_TRACE_ERROR("ERROR: Unable to allocate buffer to hold AT response code. len=%i", len);
             break;
         }
 
diff --git a/bta/ag/bta_ag_cmd.c b/bta/ag/bta_ag_cmd.c
old mode 100644
new mode 100755
index 54cd4d3..fd30247
--- a/bta/ag/bta_ag_cmd.c
+++ b/bta/ag/bta_ag_cmd.c
@@ -21,7 +21,10 @@
  *  This file contains functions for processing AT commands and results.
  *
  ******************************************************************************/
-
+#include "bt_target.h"
+#include "bt_types.h"
+#include "gki.h"
+#include "bd.h"
 #include "bta_api.h"
 #include "bta_sys.h"
 #include "bta_ag_api.h"
@@ -353,7 +356,7 @@
             if(*(p+COLON_IDX_4_VGSVGM) == ':')
             {
                 #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
-                APPL_TRACE_DEBUG0("[HSP] ':'symbol is changed as '=' for HSP compatibility");
+                APPL_TRACE_DEBUG("[HSP] ':'symbol is changed as '=' for HSP compatibility");
                 #endif
                 *(p+COLON_IDX_4_VGSVGM) = '=';
             }
@@ -379,7 +382,7 @@
     *p++ = '\n';
 
 #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("bta_ag_send_result: %s", buf);
+    APPL_TRACE_DEBUG("bta_ag_send_result: %s", buf);
 #endif
 
     /* send to RFCOMM */
@@ -406,7 +409,7 @@
 
     if((!m_res_cb) || (m_res_cb->num_result == 0) || (m_res_cb->num_result > BTA_AG_AT_MULTI_LEN))
     {
-        APPL_TRACE_DEBUG0("m_res_cb is NULL or num_result is out of range.");
+        APPL_TRACE_DEBUG("m_res_cb is NULL or num_result is out of range.");
         return;
     }
 
@@ -443,7 +446,7 @@
     }
 
 #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("send_result: %s", buf);
+    APPL_TRACE_DEBUG("send_result: %s", buf);
 #endif
 
     /* send to RFCOMM */
@@ -681,7 +684,7 @@
             case UUID_CODEC_CVSD:   retval |= BTA_AG_CODEC_CVSD;     break;
             case UUID_CODEC_MSBC:   retval |= BTA_AG_CODEC_MSBC;     break;
             default:
-                APPL_TRACE_ERROR1("Unknown Codec UUID(%d) received", uuid_codec);
+                APPL_TRACE_ERROR("Unknown Codec UUID(%d) received", uuid_codec);
                 return BTA_AG_CODEC_NONE;
         }
 
@@ -823,7 +826,7 @@
 {
     tBTA_AG_VAL val;
 
-    APPL_TRACE_DEBUG4("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
+    APPL_TRACE_DEBUG("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
                       int_arg, p_arg);
 
     /* send OK */
@@ -861,12 +864,13 @@
     tBTA_AG_PEER_CODEC  codec_type, codec_sent;
 #endif
 
-    APPL_TRACE_DEBUG4("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
+    APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
                       int_arg, p_arg);
 
     val.hdr.handle = bta_ag_scb_to_idx(p_scb);
     val.hdr.app_id = p_scb->app_id;
     val.num = int_arg;
+    bdcpy(val.bd_addr, p_scb->peer_addr);
     BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
     val.str[BTA_AG_AT_MAX_LEN] = 0;
 
@@ -1192,14 +1196,17 @@
                 if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC)
                 {
                     p_scb->sco_codec = UUID_CODEC_MSBC;
-                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to MSBC");
+                    APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to MSBC");
                 }
                 else
                 {
                     p_scb->sco_codec = UUID_CODEC_CVSD;
-                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to CVSD");
+                    APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to CVSD");
                 }
-
+                /* The above logic sets the stack preferred codec based on local and peer codec
+                capabilities. This can be overridden by the application depending on its preference
+                using the bta_ag_setcodec API. We send the peer_codecs to the application. */
+                val.num = p_scb->peer_codecs;
                 /* Received BAC while in codec negotiation. */
                 if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb))
                 {
@@ -1209,11 +1216,13 @@
             else
             {
                 p_scb->peer_codecs = BTA_AG_CODEC_NONE;
-                APPL_TRACE_ERROR0("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
+                APPL_TRACE_ERROR("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
             }
             break;
 
         case BTA_AG_HF_CMD_BCS:
+            bta_ag_send_ok(p_scb);
+
             /* stop cn timer */
             bta_sys_stop_timer(&p_scb->cn_timer);
 
@@ -1222,7 +1231,7 @@
                 case UUID_CODEC_CVSD:   codec_type = BTA_AG_CODEC_CVSD;     break;
                 case UUID_CODEC_MSBC:   codec_type = BTA_AG_CODEC_MSBC;     break;
                 default:
-                    APPL_TRACE_ERROR1("Unknown codec_uuid %d", int_arg);
+                    APPL_TRACE_ERROR("Unknown codec_uuid %d", int_arg);
                     codec_type = 0xFFFF;
                     break;
             }
@@ -1237,7 +1246,8 @@
             else
                 bta_ag_sco_codec_nego(p_scb, FALSE);
 
-            bta_ag_send_ok(p_scb);
+            /* send final codec info to callback */
+            val.num = codec_sent;
             break;
 
         case BTA_AG_HF_CMD_BCC:
@@ -1274,7 +1284,7 @@
 
     if(unknown && (!strlen(p_arg)))
     {
-        APPL_TRACE_DEBUG0("Empty AT cmd string received");
+        APPL_TRACE_DEBUG("Empty AT cmd string received");
         bta_ag_send_ok(p_scb);
         return;
     }
@@ -1309,7 +1319,7 @@
 {
     UINT8 code = bta_ag_trans_result[p_result->result];
 
-    APPL_TRACE_DEBUG1("bta_ag_hsp_result : res = %d", p_result->result);
+    APPL_TRACE_DEBUG("bta_ag_hsp_result : res = %d", p_result->result);
 
     switch(p_result->result)
     {
@@ -1382,7 +1392,7 @@
 
         case BTA_AG_INBAND_RING_RES:
             p_scb->inband_enabled = p_result->data.state;
-            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
+            APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
             break;
 
         case BTA_AG_UNAT_RES:
@@ -1422,7 +1432,7 @@
 {
     UINT8 code = bta_ag_trans_result[p_result->result];
 
-    APPL_TRACE_DEBUG1("bta_ag_hfp_result : res = %d", p_result->result);
+    APPL_TRACE_DEBUG("bta_ag_hfp_result : res = %d", p_result->result);
 
     switch(p_result->result)
     {
@@ -1445,7 +1455,7 @@
                     p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT;
             }
 
-            APPL_TRACE_DEBUG1("CLIP type :%d", p_result->data.num);
+            APPL_TRACE_DEBUG("CLIP type :%d", p_result->data.num);
             p_scb->clip[0] = 0;
             if (p_result->data.str[0] != 0)
                 sprintf(p_scb->clip,"%s,%d", p_result->data.str, p_result->data.num);
@@ -1593,7 +1603,7 @@
 
         case BTA_AG_INBAND_RING_RES:
             p_scb->inband_enabled = p_result->data.state;
-            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
+            APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
             bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
             break;
 
@@ -1605,7 +1615,7 @@
             p_scb->signal_ind = p_result->data.str[6] - '0';
             p_scb->roam_ind = p_result->data.str[8] - '0';
             p_scb->battchg_ind = p_result->data.str[10] - '0';
-            APPL_TRACE_DEBUG2("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
+            APPL_TRACE_DEBUG("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
 
             bta_ag_send_result(p_scb, code, p_result->data.str, 0);
             bta_ag_send_ok(p_scb);
@@ -1638,7 +1648,7 @@
                 if (p_result->data.str[0] != 0)
                 {
                     bta_ag_process_unat_res(p_result->data.str);
-                    APPL_TRACE_DEBUG1("BTA_AG_RES :%s",p_result->data.str);
+                    APPL_TRACE_DEBUG("BTA_AG_RES :%s",p_result->data.str);
                     bta_ag_send_result(p_scb, code, p_result->data.str, 0);
                 }
 
@@ -1714,47 +1724,6 @@
     }
 }
 
-/*******************************************************************************
-**
-** Function         bta_ag_setcodec
-**
-** Description      Handle API SetCodec
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-void bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
-{
-#if (BTM_WBS_INCLUDED == TRUE )
-    tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
-
-    /* Check if the requested codec type is valid */
-    if((codec_type != BTA_AG_CODEC_NONE) &&
-       (codec_type != BTA_AG_CODEC_CVSD) &&
-       (codec_type != BTA_AG_CODEC_MSBC))
-    {
-        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
-        return;
-    }
-
-    if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) || (codec_type == BTA_AG_CODEC_CVSD))
-    {
-        p_scb->sco_codec = codec_type;
-        p_scb->codec_updated = TRUE;
-        APPL_TRACE_DEBUG1("bta_ag_setcodec: Updated codec type %d", codec_type);
-    }
-    else
-    {
-        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
-    }
-#else
-    UNUSED(p_scb);
-    UNUSED(p_data);
-#endif
-}
-
-
 #if (BTM_WBS_INCLUDED == TRUE )
 /*******************************************************************************
 **
@@ -1781,13 +1750,14 @@
             case BTA_AG_CODEC_CVSD:     codec_uuid = UUID_CODEC_CVSD;   break;
             case BTA_AG_CODEC_MSBC:     codec_uuid = UUID_CODEC_MSBC;   break;
             default:
-                APPL_TRACE_ERROR1("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
+                APPL_TRACE_ERROR("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
                 codec_uuid = UUID_CODEC_CVSD;
                 break;
         }
     }
 
     /* send +BCS */
+    APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid);
     bta_ag_send_result(p_scb, BTA_AG_RES_BCS, NULL, codec_uuid);
 
 }
diff --git a/bta/ag/bta_ag_int.h b/bta/ag/bta_ag_int.h
index b0d1b1d..b2d9fb0 100644
--- a/bta/ag/bta_ag_int.h
+++ b/bta/ag/bta_ag_int.h
@@ -237,6 +237,14 @@
     UINT8           scn;
 } tBTA_AG_PROFILE;
 
+#if (BTM_WBS_INCLUDED == TRUE)
+typedef enum
+{
+    BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */
+    BTA_AG_SCO_MSBC_SETTINGS_T1,
+} tBTA_AG_SCO_MSBC_SETTINGS;
+#endif
+
 /* type for each service control block */
 typedef struct
 {
@@ -261,6 +269,7 @@
     tBTA_AG_PEER_CODEC  inuse_codec;    /* codec being used for the current SCO connection */
     BOOLEAN             codec_updated;  /* set to TRUE whenever the app updates codec type */
     BOOLEAN             codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
+    tBTA_AG_SCO_MSBC_SETTINGS codec_msbc_settings; /* settings to be used for the impending eSCO */
     TIMER_LIST_ENT      cn_timer;       /* codec negotiation timer */
 #endif
     UINT16              sco_idx;        /* SCO handle */
diff --git a/bta/ag/bta_ag_main.c b/bta/ag/bta_ag_main.c
index bae992b..3a32a9d 100644
--- a/bta/ag/bta_ag_main.c
+++ b/bta/ag/bta_ag_main.c
@@ -318,12 +318,17 @@
             /* initialize variables */
             p_scb->in_use = TRUE;
             p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
-
+#if (BTM_WBS_INCLUDED == TRUE )
+            p_scb->codec_updated = FALSE;
+#endif
             /* set up timers */
             p_scb->act_timer.param = (UINT32) p_scb;
             p_scb->act_timer.p_cback = bta_ag_timer_cback;
-
-            APPL_TRACE_DEBUG1("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
+#if (BTM_WBS_INCLUDED == TRUE)
+            /* set eSCO mSBC setting to T2 as the preferred */
+            p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
+            APPL_TRACE_DEBUG("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
             break;
         }
     }
@@ -332,7 +337,7 @@
     {
         /* out of scbs */
         p_scb = NULL;
-        APPL_TRACE_WARNING0("Out of ag scbs");
+        APPL_TRACE_WARNING("Out of ag scbs");
     }
     return p_scb;
 }
@@ -352,7 +357,7 @@
     UINT8   idx;
     BOOLEAN allocated = FALSE;
 
-    APPL_TRACE_DEBUG1("bta_ag_scb_dealloc %d", bta_ag_scb_to_idx(p_scb));
+    APPL_TRACE_DEBUG("bta_ag_scb_dealloc %d", bta_ag_scb_to_idx(p_scb));
 
     /* stop timers */
     bta_sys_stop_timer(&p_scb->act_timer);
@@ -421,13 +426,13 @@
         if (!p_scb->in_use)
         {
             p_scb = NULL;
-            APPL_TRACE_WARNING1("ag scb idx %d not allocated", idx);
+            APPL_TRACE_WARNING("ag scb idx %d not allocated", idx);
         }
     }
     else
     {
         p_scb = NULL;
-        APPL_TRACE_DEBUG1("ag scb idx %d out of range", idx);
+        APPL_TRACE_DEBUG("ag scb idx %d out of range", idx);
     }
     return p_scb;
 }
@@ -481,7 +486,7 @@
     }
 
     /* no scb found */
-    APPL_TRACE_WARNING0("No ag scb for peer addr");
+    APPL_TRACE_WARNING("No ag scb for peer addr");
     return 0;
 }
 
@@ -509,7 +514,7 @@
     }
 
     /* no other scb found */
-    APPL_TRACE_DEBUG0("No other ag scb open");
+    APPL_TRACE_DEBUG("No other ag scb open");
     return FALSE;
 }
 
@@ -537,7 +542,7 @@
     }
 
     /* no other scb found */
-    APPL_TRACE_DEBUG0("bta_ag_get_other_idle_scb: No idle AG scb");
+    APPL_TRACE_DEBUG("bta_ag_get_other_idle_scb: No idle AG scb");
     return NULL;
 }
 
@@ -555,7 +560,7 @@
 {
     tBTA_AG_SCB *p_scb;
 
-    APPL_TRACE_DEBUG0 ("bta_ag_colli_timer_cback");
+    APPL_TRACE_DEBUG ("bta_ag_colli_timer_cback");
 
     if (p_tle)
     {
@@ -598,15 +603,15 @@
     {
         if (id == BTA_ID_SYS)   /* ACL collision */
         {
-            APPL_TRACE_WARNING0 ("AG found collision (ACL) ...");
+            APPL_TRACE_WARNING ("AG found collision (ACL) ...");
         }
         else if (id == BTA_ID_AG)   /* RFCOMM collision */
         {
-            APPL_TRACE_WARNING0 ("AG found collision (RFCOMM) ...");
+            APPL_TRACE_WARNING ("AG found collision (RFCOMM) ...");
         }
         else
         {
-            APPL_TRACE_WARNING0 ("AG found collision (\?\?\?) ...");
+            APPL_TRACE_WARNING ("AG found collision (\?\?\?) ...");
         }
 
         p_scb->state = BTA_AG_INIT_ST;
@@ -646,7 +651,7 @@
 {
     if (p_scb)
     {
-        APPL_TRACE_DEBUG1 ("bta_ag_resume_open, Handle(%d)", bta_ag_scb_to_idx(p_scb));
+        APPL_TRACE_DEBUG ("bta_ag_resume_open, Handle(%d)", bta_ag_scb_to_idx(p_scb));
 
         /* resume opening process.  */
         if (p_scb->state == BTA_AG_INIT_ST)
@@ -657,7 +662,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0 ("bta_ag_resume_open, Null p_scb");
+        APPL_TRACE_ERROR ("bta_ag_resume_open, Null p_scb");
     }
 }
 
@@ -708,14 +713,12 @@
 
     if (!bta_sys_is_register (BTA_ID_AG))
     {
-        APPL_TRACE_ERROR0("BTA AG is already disabled, ignoring ...");
+        APPL_TRACE_ERROR("BTA AG is already disabled, ignoring ...");
         return;
     }
 
     /* De-register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_deregister(BTA_ID_AG);
-    GKI_sched_unlock();
 
     for (i = 0; i < BTA_AG_NUM_SCB; i++, p_scb++)
     {
@@ -753,6 +756,7 @@
     /* allocate an scb */
     if ((p_scb = bta_ag_scb_alloc()) != NULL)
     {
+        APPL_TRACE_DEBUG("bta_ag_api_register: p_scb 0x%08x ", p_scb);
         bta_ag_sm_execute(p_scb, p_data->hdr.event, p_data);
     }
     else
@@ -781,6 +785,7 @@
     {
         if ((p_scb = bta_ag_scb_by_idx(p_data->hdr.layer_specific)) != NULL)
         {
+            APPL_TRACE_DEBUG("bta_ag_api_result: p_scb 0x%08x ", p_scb);
             bta_ag_sm_execute(p_scb, BTA_AG_API_RESULT_EVT, p_data);
         }
     }
@@ -788,8 +793,9 @@
     {
         for (i = 0, p_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, p_scb++)
         {
-            if (p_scb->in_use)
+            if (p_scb->in_use && p_scb->svc_conn)
             {
+                APPL_TRACE_DEBUG("bta_ag_api_result p_scb 0x%08x ", p_scb);
                 bta_ag_sm_execute(p_scb, BTA_AG_API_RESULT_EVT, p_data);
             }
         }
@@ -819,20 +825,20 @@
     /* Ignore displaying of AT results when not connected (Ignored in state machine) */
     if (in_event != BTA_AG_API_RESULT_EVT || p_scb->state == BTA_AG_OPEN_ST)
     {
-        APPL_TRACE_EVENT5("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
+        APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
                            bta_ag_scb_to_idx(p_scb),
                            p_scb->state, bta_ag_state_str(p_scb->state),
                            event, bta_ag_evt_str(event, p_data->api_result.result));
     }
 #else
-    APPL_TRACE_EVENT3("AG evt (hdl 0x%04x): State %d, Event 0x%04x",
+    APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d, Event 0x%04x",
                       bta_ag_scb_to_idx(p_scb), p_scb->state, event);
 #endif
 
     event &= 0x00FF;
     if (event >= (BTA_AG_MAX_EVT & 0x00FF))
     {
-        APPL_TRACE_ERROR0("AG evt out of range, ignoring...");
+        APPL_TRACE_ERROR("AG evt out of range, ignoring...");
         return;
     }
 
@@ -857,7 +863,7 @@
 #if BTA_AG_DEBUG == TRUE
     if (p_scb->state != in_state)
     {
-        APPL_TRACE_EVENT3("BTA AG State Change: [%s] -> [%s] after Event [%s]",
+        APPL_TRACE_EVENT("BTA AG State Change: [%s] -> [%s] after Event [%s]",
                       bta_ag_state_str(in_state),
                       bta_ag_state_str(p_scb->state),
                       bta_ag_evt_str(in_event, p_data->api_result.result));
@@ -879,6 +885,7 @@
 {
     tBTA_AG_SCB *p_scb;
 
+    APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event);
     switch (p_msg->event)
     {
         /* handle enable event */
@@ -905,6 +912,7 @@
         default:
             if ((p_scb = bta_ag_scb_by_idx(p_msg->layer_specific)) != NULL)
             {
+                APPL_TRACE_DEBUG("bta_ag_hdl_event: p_scb 0x%08x ", p_scb);
                 bta_ag_sm_execute(p_scb, p_msg->event, (tBTA_AG_DATA *) p_msg);
             }
             break;
diff --git a/bta/ag/bta_ag_rfc.c b/bta/ag/bta_ag_rfc.c
index d6b5329..c0a9d3b 100644
--- a/bta/ag/bta_ag_rfc.c
+++ b/bta/ag/bta_ag_rfc.c
@@ -97,7 +97,7 @@
         /* ignore port events for port handles other than connected handle */
         if (port_handle != p_scb->conn_handle)
         {
-            APPL_TRACE_DEBUG3("ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d",
+            APPL_TRACE_DEBUG("ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d",
                               port_handle, p_scb->conn_handle, handle);
             return;
         }
@@ -129,7 +129,7 @@
     UINT8           i;
     BOOLEAN         found_handle = FALSE;
 
-    APPL_TRACE_DEBUG3("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d",
+    APPL_TRACE_DEBUG("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d",
                         code, port_handle, handle);
 
     if ((p_scb = bta_ag_scb_by_idx(handle)) != NULL)
@@ -137,7 +137,7 @@
         /* ignore close event for port handles other than connected handle */
         if ((code != PORT_SUCCESS) && (port_handle != p_scb->conn_handle))
         {
-            APPL_TRACE_DEBUG1("ag_mgmt_cback ignoring handle:%d", port_handle);
+            APPL_TRACE_DEBUG("ag_mgmt_cback ignoring handle:%d", port_handle);
             return;
         }
 
@@ -159,7 +159,7 @@
 
             if (!found_handle)
             {
-                APPL_TRACE_ERROR1 ("bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
+                APPL_TRACE_ERROR ("bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
                 return;
             }
 
@@ -306,7 +306,7 @@
             else
             {
                 /* TODO: CR#137125 to handle to error properly */
-                APPL_TRACE_DEBUG1("bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d", bta_ag_port_status);
+                APPL_TRACE_DEBUG("bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d", bta_ag_port_status);
             }
         }
     }
@@ -382,7 +382,7 @@
             bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]) == PORT_SUCCESS)
     {
         bta_ag_setup_port(p_scb, p_scb->conn_handle);
-        APPL_TRACE_DEBUG1("bta_ag_rfc_do_open : conn_handle = %d", p_scb->conn_handle);
+        APPL_TRACE_DEBUG("bta_ag_rfc_do_open : conn_handle = %d", p_scb->conn_handle);
     }
     /* RFCOMM create connection failed; send ourselves RFCOMM close event */
     else
diff --git a/bta/ag/bta_ag_sco.c b/bta/ag/bta_ag_sco.c
index 87d9188..ec00514 100644
--- a/bta/ag/bta_ag_sco.c
+++ b/bta/ag/bta_ag_sco.c
@@ -69,7 +69,11 @@
 };
 
 #if (BTM_WBS_INCLUDED == TRUE )
-#define BTA_AG_NUM_CODECS   2
+#define BTA_AG_NUM_CODECS   3
+#define BTA_AG_ESCO_SETTING_IDX_CVSD    0   /* eSCO setting for CVSD */
+#define BTA_AG_ESCO_SETTING_IDX_T1      1   /* eSCO setting for mSBC T1 */
+#define BTA_AG_ESCO_SETTING_IDX_T2      2   /* eSCO setting for mSBC T2 */
+
 static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] =
 {
     /* CVSD */
@@ -88,7 +92,20 @@
         BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
         BTM_ESCO_RETRANS_POWER       /* Retransmission effort                      */
     },
-    /* mSBC */
+    /* mSBC  T1 */
+    {
+        BTM_64KBITS_RATE,                   /* TX Bandwidth (64 kbits/sec), 8000        */
+        BTM_64KBITS_RATE,                   /* RX Bandwidth (64 kbits/sec), 8000        */
+        8,                                  /* 8 ms                                     */
+        BTM_VOICE_SETTING_TRANS,            /* Inp Linear, Transparent, 2s Comp, 16bit  */
+       (BTM_SCO_PKT_TYPES_MASK_EV3      |   /* Packet Types : EV3 + NO_2_EV3            */
+        BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+        BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+        BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 |
+        BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 ),
+        BTM_ESCO_RETRANS_QUALITY       /* Retransmission effort                      */
+    },
+    /* mSBC T2*/
     {
         BTM_64KBITS_RATE,                   /* TX Bandwidth (64 kbits/sec), 8000        */
         BTM_64KBITS_RATE,                   /* RX Bandwidth (64 kbits/sec), 8000        */
@@ -102,6 +119,7 @@
     }
 };
 #else
+/* WBS not included, CVSD by default */
 static const tBTM_ESCO_PARAMS bta_ag_esco_params =
 {
     BTM_64KBITS_RATE,                   /* TX Bandwidth (64 kbits/sec)              */
@@ -184,11 +202,11 @@
     BT_HDR  *p_buf;
     UINT16  handle = 0;
 
-    APPL_TRACE_DEBUG3 ("bta_ag_sco_disc_cback(): sco_idx: 0x%x  p_cur_scb: 0x%08x  sco.state: %d", sco_idx, bta_ag_cb.sco.p_curr_scb, bta_ag_cb.sco.state);
+    APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): sco_idx: 0x%x  p_cur_scb: 0x%08x  sco.state: %d", sco_idx, bta_ag_cb.sco.p_curr_scb, bta_ag_cb.sco.state);
 
-    APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x  in_use: %u  sco_idx: 0x%x  sco state: %u",
+    APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[0] addr: 0x%08x  in_use: %u  sco_idx: 0x%x  sco state: %u",
                        &bta_ag_cb.scb[0], bta_ag_cb.scb[0].in_use, bta_ag_cb.scb[0].sco_idx, bta_ag_cb.scb[0].state);
-    APPL_TRACE_DEBUG4 ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x  in_use: %u  sco_idx: 0x%x  sco state: %u",
+    APPL_TRACE_DEBUG ("bta_ag_sco_disc_cback(): scb[1] addr: 0x%08x  in_use: %u  sco_idx: 0x%x  sco state: %u",
                        &bta_ag_cb.scb[1], bta_ag_cb.scb[1].in_use, bta_ag_cb.scb[1].sco_idx, bta_ag_cb.scb[1].state);
 
     /* match callback to scb */
@@ -207,8 +225,8 @@
     {
 #if (BTM_SCO_HCI_INCLUDED == TRUE )
         tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, TRUE);
-        APPL_TRACE_DEBUG1("bta_ag_sco_disc_cback sco close config status = %d", status);
-	    /* SCO clean up here */
+        APPL_TRACE_DEBUG("bta_ag_sco_disc_cback sco close config status = %d", status);
+        /* SCO clean up here */
         bta_dm_sco_co_close();
 #endif
 
@@ -216,14 +234,23 @@
         /* Restore settings */
         if(bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC)
         {
-            BTM_SetWBSCodec (BTM_SCO_CODEC_NONE);
+            /* set_sco_codec(BTM_SCO_CODEC_NONE); we should get a close */
             BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
 
-            /* If SCO open was initiated by AG and failed for mSBC, try CVSD again. */
+            /* If SCO open was initiated by AG and failed for mSBC, then attempt
+            mSBC with T1 settings i.e. 'Safe Settings'. If this fails, then switch to CVSD */
             if (bta_ag_sco_is_opening (bta_ag_cb.sco.p_curr_scb))
             {
-                bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE;
-                APPL_TRACE_DEBUG0("Fallback to CVSD");
+                if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2)
+                {
+                     APPL_TRACE_DEBUG("Fallback to mSBC T1 settings");
+                     bta_ag_cb.sco.p_curr_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T1;
+                }
+                else
+                {
+                    APPL_TRACE_DEBUG("Fallback to CVSD settings");
+                    bta_ag_cb.sco.p_curr_scb->codec_fallback = TRUE;
+                }
             }
         }
 
@@ -240,7 +267,7 @@
     /* no match found */
     else
     {
-        APPL_TRACE_DEBUG0("no scb for ag_sco_disc_cback");
+        APPL_TRACE_DEBUG("no scb for ag_sco_disc_cback");
 
         /* sco could be closed after scb dealloc'ed */
         if (bta_ag_cb.sco.p_curr_scb != NULL)
@@ -266,7 +293,7 @@
 {
     if (status != BTM_SCO_DATA_CORRECT)
     {
-        APPL_TRACE_DEBUG1("bta_ag_sco_read_cback: status(%d)", status);
+        APPL_TRACE_DEBUG("bta_ag_sco_read_cback: status(%d)", status);
     }
 
     /* Callout function must free the data. */
@@ -294,7 +321,7 @@
         {
             status = BTM_RemoveSco(p_scb->sco_idx);
 
-            APPL_TRACE_DEBUG2("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status);
+            APPL_TRACE_DEBUG("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, status);
 
             if (status == BTM_CMD_STARTED)
             {
@@ -341,7 +368,7 @@
             /* If no other SCO active, allow this one */
             if (!bta_ag_cb.sco.p_curr_scb)
             {
-                APPL_TRACE_EVENT1("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx);
+                APPL_TRACE_EVENT("bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", sco_inx);
                 bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt);
 
                 bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST;
@@ -350,14 +377,14 @@
             }
             else    /* Begin a transfer: Close current SCO before responding */
             {
-                APPL_TRACE_DEBUG0("bta_ag_esco_connreq_cback: Begin XFER");
+                APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER");
                 bta_ag_cb.sco.p_xfer_scb = p_scb;
                 bta_ag_cb.sco.conn_data = p_data->conn_evt;
                 bta_ag_cb.sco.state = BTA_AG_SCO_OPEN_XFER_ST;
 
                 if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, TRUE))
                 {
-                    APPL_TRACE_ERROR1("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx);
+                    APPL_TRACE_ERROR("bta_ag_esco_connreq_cback: Nothing to remove so accept Conn Request (sco_inx 0x%04x)", sco_inx);
                     bta_ag_cb.sco.p_xfer_scb = NULL;
                     bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST;
 
@@ -368,14 +395,14 @@
         /* If error occurred send reject response immediately */
         else
         {
-            APPL_TRACE_WARNING0("no scb for bta_ag_esco_connreq_cback or no resources");
+            APPL_TRACE_WARNING("no scb for bta_ag_esco_connreq_cback or no resources");
             BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, NULL);
         }
     }
     /* Received a change in the esco link */
     else if (event == BTM_ESCO_CHG_EVT)
     {
-        APPL_TRACE_EVENT5("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d",
+        APPL_TRACE_EVENT("eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d",
             p_data->chg_evt.sco_inx,
             p_data->chg_evt.retrans_window, p_data->chg_evt.rx_pkt_len,
             p_data->chg_evt.tx_pkt_len, p_data->chg_evt.tx_interval);
@@ -431,7 +458,7 @@
     /* Make sure this sco handle is not already in use */
     if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX)
     {
-        APPL_TRACE_WARNING1("bta_ag_create_sco: Index 0x%04x Already In Use!",
+        APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!",
                              p_scb->sco_idx);
         return;
     }
@@ -450,11 +477,23 @@
         p_scb->codec_updated = TRUE;
     }
 
+    /* If WBS included, use CVSD by default, index is 0 for CVSD by initialization */
+    /* If eSCO codec is mSBC, index is T2 or T1 */
     if (esco_codec == BTM_SCO_CODEC_MSBC)
-        codec_index = esco_codec - 1;
+    {
+        if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2)
+        {
+            codec_index = BTA_AG_ESCO_SETTING_IDX_T2;
+        }
+        else
+        {
+            codec_index = BTA_AG_ESCO_SETTING_IDX_T1;
+        }
+    }
 
     params = bta_ag_esco_params[codec_index];
 #else
+    /* When WBS is not included, use CVSD by default */
     params = bta_ag_esco_params;
 #endif
 
@@ -464,7 +503,7 @@
     if(!bta_ag_cb.sco.param_updated)
     {
 #if (BTM_WBS_INCLUDED == TRUE)
-        if (!codec_index)   /* For non-WBS */
+        if (esco_codec == BTM_SCO_CODEC_CVSD)   /* For CVSD */
 #endif
         {
             /* Use the application packet types (5 slot EV packets not allowed) */
@@ -491,23 +530,23 @@
                 if (esco_codec != BTA_AG_CODEC_MSBC)
                 {
                     p_scb->retry_with_sco_only = TRUE;
-                    APPL_TRACE_API0("Setting retry_with_sco_only to TRUE");
+                    APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
                 }
                 else    /* Do not use SCO when using mSBC */
                 {
                     p_scb->retry_with_sco_only = FALSE;
-                    APPL_TRACE_API0("Setting retry_with_sco_only to FALSE");
+                    APPL_TRACE_API("Setting retry_with_sco_only to FALSE");
                 }
 #else
                 p_scb->retry_with_sco_only = TRUE;
-                APPL_TRACE_API0("Setting retry_with_sco_only to TRUE");
+                APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
 #endif
             }
         }
         else
         {
             if(p_scb->retry_with_sco_only)
-                APPL_TRACE_API0("retrying with SCO only");
+                APPL_TRACE_API("retrying with SCO only");
             p_scb->retry_with_sco_only = FALSE;
 
             BTM_SetEScoMode(BTM_LINK_TYPE_SCO, &params);
@@ -518,8 +557,23 @@
         /* tell sys to stop av if any */
         bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
 
+#if (BTM_WBS_INCLUDED == TRUE )
+        /* Allow any platform specific pre-SCO set up to take place */
+        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,\
+        esco_codec);
+
+        /* This setting may not be necessary */
+        /* To be verified with stable 2049 boards */
+        if (esco_codec == BTA_AG_CODEC_MSBC)
+            BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS);
+        else
+            BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
+        /* save the current codec because sco_codec can be updated while SCO is open. */
+        p_scb->inuse_codec = esco_codec;
+#else
         /* Allow any platform specific pre-SCO set up to take place */
         bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
+#endif
 
 #if (BTM_SCO_HCI_INCLUDED == TRUE )
 #if (BTM_WBS_INCLUDED == TRUE)
@@ -532,26 +586,6 @@
         sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, &codec_info, p_scb->app_id);
 #endif
 
-#if (BTM_WBS_INCLUDED == TRUE )
-        if (esco_codec == BTA_AG_CODEC_MSBC)
-        {
-            /* Enable mSBC codec in fw */
-            BTM_SetWBSCodec (esco_codec);
-        }
-
-        /* Specify PCM input for SBC codec in fw */
-        BTM_ConfigI2SPCM (esco_codec, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT);
-
-        /* This setting may not be necessary */
-        /* To be verified with stable 2049 boards */
-        if (esco_codec == BTA_AG_CODEC_MSBC)
-            BTM_WriteVoiceSettings (BTM_VOICE_SETTING_TRANS);
-        else
-            BTM_WriteVoiceSettings (BTM_VOICE_SETTING_CVSD);
-
-        /* save the current codec because sco_codec can be updated while SCO is open. */
-        p_scb->inuse_codec = esco_codec;
-#endif
 
 #if (BTM_SCO_HCI_INCLUDED == TRUE )
         /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate */
@@ -579,13 +613,32 @@
         }
     }
 
-    APPL_TRACE_API4("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
+    APPL_TRACE_API("ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
                       is_orig, p_scb->sco_idx, status, params.packet_types);
 }
 
 #if (BTM_WBS_INCLUDED == TRUE )
 /*******************************************************************************
 **
+** Function         bta_ag_attempt_msbc_safe_settings
+**
+** Description    Checks if ESCO connection needs to be attempted using mSBC T1(safe) settings
+**
+**
+** Returns          TRUE if T1 settings has to be used, FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB *p_scb)
+{
+    if (p_scb->svc_conn && p_scb->sco_codec == BTM_SCO_CODEC_MSBC &&
+        p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T1)
+        return TRUE;
+    else
+        return FALSE;
+}
+
+/*******************************************************************************
+**
 ** Function         bta_ag_cn_timer_cback
 **
 ** Description
@@ -627,7 +680,9 @@
 {
     bta_ag_cb.sco.p_curr_scb = p_scb;
 
-    if (p_scb->codec_updated || p_scb->codec_fallback)
+    if ((p_scb->codec_updated || p_scb->codec_fallback ||
+        bta_ag_attempt_msbc_safe_settings(p_scb)) &&
+       (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC))
     {
         /* Change the power mode to Active until sco open is completed. */
         bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -643,10 +698,11 @@
     else
     {
         /* use same codec type as previous SCO connection, skip codec negotiation */
+        APPL_TRACE_DEBUG("use same codec type as previous SCO connection,skip codec negotiation");
         bta_ag_sco_codec_nego(p_scb, TRUE);
     }
 }
-#endif
+#endif /* (BTM_WBS_INCLUDED == TRUE ) */
 
 /*******************************************************************************
 **
@@ -670,12 +726,12 @@
 #if BTA_AG_SCO_DEBUG == TRUE
     UINT8   in_state = p_sco->state;
 
-    APPL_TRACE_EVENT5("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)",
+    APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)",
                         p_scb->sco_idx,
                         p_sco->state, bta_ag_sco_state_str(p_sco->state),
                         event, bta_ag_sco_evt_str(event));
 #else
-    APPL_TRACE_EVENT3("BTA ag sco evt (hdl 0x%04x): State %d, Event %d",
+    APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d, Event %d",
                       p_scb->sco_idx, p_sco->state, event);
 #endif
 
@@ -712,7 +768,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -757,7 +813,7 @@
                 case BTA_AG_SCO_CLOSE_E:
                     /* remove listening connection */
                     /* Ignore the event. We need to keep listening SCO for the active SLC */
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
                     break;
 
                 case BTA_AG_SCO_CONN_CLOSE_E:
@@ -767,7 +823,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -819,7 +875,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -878,7 +934,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -923,7 +979,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -959,7 +1015,7 @@
                      break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1012,7 +1068,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1059,7 +1115,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1096,7 +1152,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1145,7 +1201,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1202,7 +1258,7 @@
                     break;
 
                 default:
-                    APPL_TRACE_WARNING1("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event);
+                    APPL_TRACE_WARNING("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", event);
                     break;
             }
             break;
@@ -1213,7 +1269,7 @@
 #if BTA_AG_SCO_DEBUG == TRUE
     if (p_sco->state != in_state)
     {
-        APPL_TRACE_EVENT3("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]",
+        APPL_TRACE_EVENT("BTA AG SCO State Change: [%s] -> [%s] after Event [%s]",
                       bta_ag_sco_state_str(in_state),
                       bta_ag_sco_state_str(p_sco->state),
                       bta_ag_sco_evt_str(event));
@@ -1333,7 +1389,7 @@
     if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX)
 #endif
     {
-        APPL_TRACE_DEBUG1("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx);
+        APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx);
         bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E);
     }
 }
@@ -1399,7 +1455,12 @@
 
     bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
 
+#if (BTM_WBS_INCLUDED == TRUE)
+    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON,
+                          p_scb->inuse_codec);
+#else
     bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON);
+#endif
 
 #if (BTM_SCO_HCI_INCLUDED == TRUE )
     /* open SCO codec if SCO is routed through transport */
@@ -1410,6 +1471,10 @@
     bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT);
 
     p_scb->retry_with_sco_only = FALSE;
+#if (BTM_WBS_INCLUDED == TRUE)
+    /* reset to mSBC T2 settings as the preferred */
+    p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
 }
 
 /*******************************************************************************
@@ -1433,7 +1498,9 @@
 
 #if (BTM_WBS_INCLUDED == TRUE)
     /* codec_fallback is set when AG is initiator and connection failed for mSBC. */
-    if (p_scb->codec_fallback && p_scb->svc_conn)
+    /* OR if codec is msbc and T2 settings failed, then retry Safe T1 settings */
+    if ((p_scb->codec_fallback && p_scb->svc_conn) ||
+         bta_ag_attempt_msbc_safe_settings(p_scb))
     {
         bta_ag_sco_event(p_scb, BTA_AG_SCO_REOPEN_E);
     }
@@ -1452,12 +1519,15 @@
 #endif
     else
     {
+#if (BTM_WBS_INCLUDED == TRUE)
         /* Indicate if the closing of audio is because of transfer */
-        if (bta_ag_cb.sco.p_xfer_scb)
-            bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF_XFER);
-        else
-            bta_ag_co_audio_state(handle, p_scb->app_id, BTA_AG_CO_AUD_STATE_OFF);
-
+        bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
+        BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF,p_scb->inuse_codec);
+#else
+        /* Indicate if the closing of audio is because of transfer */
+        bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
+        BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF);
+#endif
         bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E);
 
         bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -1472,6 +1542,9 @@
 
         /* call app callback */
         bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT);
+#if (BTM_WBS_INCLUDED == TRUE)
+        p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
+#endif
     }
     p_scb->retry_with_sco_only = FALSE;
 }
@@ -1531,12 +1604,14 @@
         /* tell sys to stop av if any */
         bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
 
+#if (BTM_WBS_INCLUDED == FALSE )
         /* Allow any platform specific pre-SCO set up to take place */
         bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
-
-#if (BTM_WBS_INCLUDED == TRUE )
+#else
         /* When HS initiated SCO, it cannot be WBS. */
-        BTM_ConfigI2SPCM (BTM_SCO_CODEC_CVSD, (UINT8)HCI_BRCM_I2SPCM_IS_DEFAULT_ROLE, (UINT8)HCI_BRCM_I2SPCM_SAMPLE_DEFAULT, (UINT8)HCI_BRCM_I2SPCM_CLOCK_DEFAULT);
+        /* Allow any platform specific pre-SCO set up to take place */
+        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,
+                              BTA_AG_CODEC_CVSD);
 #endif
 
 #if (BTM_SCO_HCI_INCLUDED == TRUE )
@@ -1593,13 +1668,13 @@
     if(set_reset == FALSE)    /* reset the parameters to default */
     {
         bta_ag_cb.sco.param_updated = FALSE;
-        APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Resetting ESCO parameters to default");
+        APPL_TRACE_DEBUG("bta_ag_set_esco_param : Resetting ESCO parameters to default");
     }
     else
     {
         bta_ag_cb.sco.param_updated = TRUE;
         bta_ag_cb.sco.params = *param;
-        APPL_TRACE_DEBUG0("bta_ag_set_esco_param : Setting ESCO parameters");
+        APPL_TRACE_DEBUG("bta_ag_set_esco_param : Setting ESCO parameters");
     }
 }
 
diff --git a/bta/ag/bta_ag_sdp.c b/bta/ag/bta_ag_sdp.c
index 333cb1b..8099d5f 100644
--- a/bta/ag/bta_ag_sdp.c
+++ b/bta/ag/bta_ag_sdp.c
@@ -74,7 +74,7 @@
     UINT16              event;
     tBTA_AG_SCB         *p_scb;
 
-    APPL_TRACE_DEBUG1("bta_ag_sdp_cback status:0x%x", status);
+    APPL_TRACE_DEBUG("bta_ag_sdp_cback status:0x%x", status);
 
     if ((p_scb = bta_ag_scb_by_idx(idx)) != NULL)
     {
@@ -140,7 +140,7 @@
     BOOLEAN             codec_supported = FALSE;
     UINT8               buf[2];
 
-    APPL_TRACE_DEBUG1("bta_ag_add_record uuid: %x", service_uuid);
+    APPL_TRACE_DEBUG("bta_ag_add_record uuid: %x", service_uuid);
 
     memset( proto_elem_list, 0 , BTA_AG_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM));
 
@@ -280,7 +280,7 @@
         /* if service registered for this scb and not registered for any other scb */
         if (((services & 1) == 1) && ((others & 1) == 0))
         {
-            APPL_TRACE_DEBUG1("bta_ag_del_records %d", i);
+            APPL_TRACE_DEBUG("bta_ag_del_records %d", i);
             if (bta_ag_cb.profile[i].sdp_handle != 0)
             {
                 SDP_DeleteRecord(bta_ag_cb.profile[i].sdp_handle);
diff --git a/bta/ar/bta_ar.c b/bta/ar/bta_ar.c
index 89b732a..25b27d3 100644
--- a/bta/ar/bta_ar.c
+++ b/bta/ar/bta_ar.c
@@ -115,7 +115,7 @@
 #if (BTA_AR_DEBUG == TRUE)
     else
     {
-        APPL_TRACE_ERROR1("bta_ar_reg_avdt: the registration is from wrong sys_id:%d", sys_id);
+        APPL_TRACE_ERROR("bta_ar_reg_avdt: the registration is from wrong sys_id:%d", sys_id);
     }
 #endif
 
diff --git a/bta/av/bta_av_aact.c b/bta/av/bta_av_aact.c
index fed838a..e8e5edc 100644
--- a/bta/av/bta_av_aact.c
+++ b/bta/av/bta_av_aact.c
@@ -193,6 +193,7 @@
     0                               /* AVDT_DELAY_REPORT_CFM_EVT */
 };
 
+void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt);
 static void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data);
 static void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data);
 #if BTA_AV_NUM_STRS > 2
@@ -225,6 +226,48 @@
     ,bta_av_stream5_cback
 #endif
 };
+/***********************************************
+**
+** Function         bta_get_scb_handle
+**
+** Description      gives the registered AVDT handle.by checking with sep_type.
+**
+**
+** Returns          void
+***********************************************/
+UINT8  bta_av_get_scb_handle ( tBTA_AV_SCB *p_scb, UINT8 local_sep )
+{
+    UINT8 xx =0;
+    for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++)
+    {
+        if ((p_scb->seps[xx].tsep == local_sep) &&
+            (p_scb->seps[xx].codec_type == p_scb->codec_type))
+            return (p_scb->seps[xx].av_handle);
+    }
+    APPL_TRACE_DEBUG(" bta_av_get_scb_handle appropiate sep_type not found")
+    return 0; /* return invalid handle */
+}
+
+/***********************************************
+**
+** Function         bta_av_get_scb_sep_type
+**
+** Description      gives the sep type by cross-checking with AVDT handle
+**
+**
+** Returns          void
+***********************************************/
+UINT8  bta_av_get_scb_sep_type ( tBTA_AV_SCB *p_scb, UINT8 tavdt_handle)
+{
+    UINT8 xx =0;
+    for (xx = 0; xx<BTA_AV_MAX_SEPS; xx++)
+    {
+        if (p_scb->seps[xx].av_handle == tavdt_handle)
+            return (p_scb->seps[xx].tsep);
+    }
+    APPL_TRACE_DEBUG(" bta_av_get_scb_sep_type appropiate handle not found")
+    return 3; /* return invalid sep type */
+}
 
 /*******************************************************************************
 **
@@ -238,11 +281,11 @@
 *******************************************************************************/
 static void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b)
 {
-    APPL_TRACE_DEBUG2("bta_av_save_addr r:%d, s:%d",
+    APPL_TRACE_DEBUG("bta_av_save_addr r:%d, s:%d",
         p_scb->recfg_sup, p_scb->suspend_sup);
     if(bdcmp(p_scb->peer_addr, b) != 0)
     {
-        APPL_TRACE_ERROR0("reset flags");
+        APPL_TRACE_ERROR("reset flags");
         /* a new addr, reset the supported flags */
         p_scb->recfg_sup    = TRUE;
         p_scb->suspend_sup  = TRUE;
@@ -290,7 +333,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG2("bta_av_st_rc_timer rc_handle:%d, use_rc: %d",
+    APPL_TRACE_DEBUG("bta_av_st_rc_timer rc_handle:%d, use_rc: %d",
         p_scb->rc_handle, p_scb->use_rc);
     /* for outgoing RC connection as INT/CT */
     if( (p_scb->rc_handle == BTA_AV_RC_HANDLE_NONE) &&
@@ -320,12 +363,19 @@
     int     i;
     tAVDT_GETCAP_REQ    *p_req;
     BOOLEAN     sent_cmd = FALSE;
+    UINT16 uuid_int = p_scb->uuid_int;
+    UINT8 sep_requested = 0;
+
+    if(uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+       sep_requested = AVDT_TSEP_SNK;
+    else if(uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+       sep_requested = AVDT_TSEP_SRC;
 
     for (i = p_scb->sep_info_idx; i < p_scb->num_seps; i++)
     {
         /* steam not in use, is a sink, and is the right media type (audio/video) */
         if ((p_scb->sep_info[i].in_use == FALSE) &&
-            (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
+            (p_scb->sep_info[i].tsep == sep_requested) &&
             (p_scb->sep_info[i].media_type == p_scb->media_type))
         {
             p_scb->sep_info_idx = i;
@@ -405,7 +455,7 @@
         if (bd_addr != NULL)
         {
             bdcpy(p_msg->bd_addr, bd_addr);
-            APPL_TRACE_DEBUG6("  bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+            APPL_TRACE_DEBUG("  bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                           bd_addr[0], bd_addr[1],
                           bd_addr[2], bd_addr[3],
                           bd_addr[4], bd_addr[5]);
@@ -418,7 +468,7 @@
             switch (event)
             {
             case AVDT_RECONFIG_CFM_EVT:
-            APPL_TRACE_DEBUG4("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x",
+            APPL_TRACE_DEBUG("reconfig cfm event codec info = 0x%06x-%06x-%06x-%02x",
                 (p_msg->msg.reconfig_cfm.p_cfg->codec_info[0]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[1]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[2],
                 (p_msg->msg.reconfig_cfm.p_cfg->codec_info[3]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[4]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[5],
                 (p_msg->msg.reconfig_cfm.p_cfg->codec_info[6]<<16)+(p_msg->msg.reconfig_cfm.p_cfg->codec_info[7]<<8)+p_msg->msg.reconfig_cfm.p_cfg->codec_info[8],
@@ -494,7 +544,7 @@
         if (event == AVDT_SUSPEND_CFM_EVT)
             p_msg->initiator = TRUE;
 
-        APPL_TRACE_VERBOSE1("hndl:x%x", p_scb->hndl);
+        APPL_TRACE_VERBOSE("hndl:x%x", p_scb->hndl);
         p_msg->hdr.layer_specific = p_scb->hndl;
         p_msg->handle   = handle;
         p_msg->avdt_event = event;
@@ -509,6 +559,39 @@
 
 /*******************************************************************************
 **
+** Function         bta_av_stream_data_cback
+**
+** Description      This is the AVDTP callback function for stream events.
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt)
+{
+    int index = 0;
+    tBTA_AV_SCB         *p_scb ;
+    APPL_TRACE_DEBUG("bta_av_stream_data_cback avdt_handle: %d pkt_len=0x%x  ofst = 0x%x", handle,p_pkt->len,p_pkt->offset);
+    APPL_TRACE_DEBUG(" Number of frames 0x%x",*((UINT8*)(p_pkt + 1) + p_pkt->offset));
+    APPL_TRACE_DEBUG("Sequence Number 0x%x",p_pkt->layer_specific);
+    /* Get  SCB  and correct sep type*/
+    for(index = 0; index < BTA_AV_NUM_STRS;index ++ )
+    {
+        p_scb = bta_av_cb.p_scb[index];
+        if((p_scb->avdt_handle == handle)&&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK))
+            break;
+    }
+    if(index == BTA_AV_NUM_STRS) /* cannot find correct handler */
+    {
+        GKI_freebuf(p_pkt);
+        return;
+    }
+    p_pkt->event = BTA_AV_MEDIA_DATA_EVT;
+    p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_DATA_EVT, (tBTA_AV_MEDIA*)p_pkt);
+    GKI_freebuf(p_pkt);  /* a copy of packet had been delivered, we free this buffer */
+}
+
+/*******************************************************************************
+**
 ** Function         bta_av_stream0_cback
 **
 ** Description      This is the AVDTP callback function for stream events.
@@ -518,7 +601,7 @@
 *******************************************************************************/
 static void bta_av_stream0_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_VERBOSE2("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_VERBOSE("bta_av_stream0_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 0);
 }
 
@@ -533,7 +616,7 @@
 *******************************************************************************/
 static void bta_av_stream1_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_EVENT2("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_stream1_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 1);
 }
 
@@ -549,7 +632,7 @@
 *******************************************************************************/
 static void bta_av_stream2_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_EVENT2("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_stream2_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 2);
 }
 #endif
@@ -566,7 +649,7 @@
 *******************************************************************************/
 static void bta_av_stream3_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_EVENT2("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_stream3_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 3);
 }
 #endif
@@ -583,7 +666,7 @@
 #if BTA_AV_NUM_STRS > 4
 static void bta_av_stream4_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_EVENT2("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_stream4_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 4);
 }
 #endif
@@ -600,7 +683,7 @@
 #if BTA_AV_NUM_STRS > 5
 static void bta_av_stream5_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
 {
-    APPL_TRACE_EVENT2("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_stream5_cback avdt_handle: %d event=0x%x", handle, event);
     bta_av_proc_stream_evt(handle, bd_addr, event, p_data, 5);
 }
 #endif
@@ -636,7 +719,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR1 ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle);
+            APPL_TRACE_ERROR ("bta_av_a2d_sdp_cback, no scb found for handle(0x%x)", bta_av_cb.handle);
         }
     }
 }
@@ -650,16 +733,16 @@
 ** Returns
 **
 *******************************************************************************/
-static void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb)
+static void bta_av_adjust_seps_idx(tBTA_AV_SCB *p_scb, UINT8 avdt_handle)
 {
-    int             xx;
-
-    APPL_TRACE_DEBUG1("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type);
+    int xx;
+    APPL_TRACE_DEBUG("bta_av_adjust_seps_idx codec_type: %d", p_scb->codec_type);
     for(xx=0; xx<BTA_AV_MAX_SEPS; xx++)
     {
-        APPL_TRACE_DEBUG2("av_handle: %d codec_type: %d",
+        APPL_TRACE_DEBUG("av_handle: %d codec_type: %d",
             p_scb->seps[xx].av_handle, p_scb->seps[xx].codec_type);
-        if(p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type)
+        if((p_scb->seps[xx].av_handle && p_scb->codec_type == p_scb->seps[xx].codec_type)
+            && (p_scb->seps[xx].av_handle == avdt_handle))
         {
             p_scb->sep_idx      = xx;
             p_scb->avdt_handle  = p_scb->seps[xx].av_handle;
@@ -684,7 +767,7 @@
     tBTA_AV_API_OPEN  *p_buf = &p_scb->q_info.open;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_av_switch_role wait:x%x", p_scb->wait);
+    APPL_TRACE_DEBUG("bta_av_switch_role wait:x%x", p_scb->wait);
     if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_RES_START)
         p_scb->wait |= BTA_AV_WAIT_ROLE_SW_RETRY;
 
@@ -739,7 +822,7 @@
     tBTA_AV_START   start;
     tBTA_AV_OPEN    av_open;
 
-    APPL_TRACE_DEBUG3("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role);
+    APPL_TRACE_DEBUG("bta_av_role_res q_tag:%d, wait:x%x, role:x%x", p_scb->q_tag, p_scb->wait, p_scb->role);
     if (p_scb->role & BTA_AV_ROLE_START_INT)
         initiator = TRUE;
 
@@ -781,6 +864,10 @@
                 av_open.chnl   = p_scb->chnl;
                 av_open.hndl   = p_scb->hndl;
                 start.status = BTA_AV_FAIL_ROLE;
+                if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+                    av_open.sep = AVDT_TSEP_SNK;
+                else if(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+                    av_open.sep = AVDT_TSEP_SRC;
                 (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *)&av_open);
             }
             else
@@ -792,11 +879,11 @@
         }
         else
         {
-            APPL_TRACE_WARNING2 ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait);
+            APPL_TRACE_WARNING ("Unexpected role switch event: q_tag = %d wait = %d", p_scb->q_tag, p_scb->wait);
         }
     }
 
-    APPL_TRACE_DEBUG2("wait:x%x, role:x%x", p_scb->wait, p_scb->role);
+    APPL_TRACE_DEBUG("wait:x%x, role:x%x", p_scb->wait, p_scb->role);
 }
 
 /*******************************************************************************
@@ -830,8 +917,9 @@
     UINT16              attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST,
                                        ATTR_ID_PROTOCOL_DESC_LIST,
                                        ATTR_ID_BT_PROFILE_DESC_LIST};
+    UINT16 sdp_uuid = 0; /* UUID for which SDP has to be done */
 
-    APPL_TRACE_DEBUG3("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d",
+    APPL_TRACE_DEBUG("bta_av_do_disc_a2d use_rc: %d rs:%d, oc:%d",
         p_data->api_open.use_rc, p_data->api_open.switch_res, bta_av_cb.audio_open_cnt);
 
     memcpy (&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN));
@@ -876,7 +964,7 @@
         break;
     }
 
-    APPL_TRACE_DEBUG3("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag);
+    APPL_TRACE_DEBUG("ok_continue: %d wait:x%x, q_tag: %d", ok_continue, p_scb->wait, p_scb->q_tag);
     if (!ok_continue)
         return;
 
@@ -891,13 +979,13 @@
 
     if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
     {
-    L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH);
+        L2CA_SetDesireRole(L2CAP_ROLE_DISALLOW_SWITCH);
 
-    if (bta_av_cb.audio_open_cnt == 1)
-    {
-        /* there's already an A2DP connection. do not allow switch */
-        bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH);
-    }
+        if (bta_av_cb.audio_open_cnt == 1)
+        {
+            /* there's already an A2DP connection. do not allow switch */
+            bta_sys_clear_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH);
+        }
     }
     /* store peer addr other parameters */
     bta_av_save_addr(p_scb, p_data->api_open.bd_addr);
@@ -922,8 +1010,14 @@
         db_params.num_attr = 3;
         db_params.p_db = p_scb->p_disc_db;
         db_params.p_attrs = attr_list;
+        p_scb->uuid_int = p_data->api_open.uuid;
+        if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+            sdp_uuid = UUID_SERVCLASS_AUDIO_SOURCE;
+        else if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+            sdp_uuid = UUID_SERVCLASS_AUDIO_SINK;
 
-        if(A2D_FindService(UUID_SERVCLASS_AUDIO_SINK, p_scb->peer_addr, &db_params,
+        APPL_TRACE_DEBUG("uuid_int 0x%x, Doing SDP For 0x%x", p_scb->uuid_int, sdp_uuid);
+        if(A2D_FindService(sdp_uuid, p_scb->peer_addr, &db_params,
                         bta_av_a2d_sdp_cback) == A2D_SUCCESS)
         {
             return;
@@ -951,7 +1045,7 @@
     UINT8           role = BTA_AV_ROLE_AD_INT;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG0("bta_av_cleanup");
+    APPL_TRACE_DEBUG("bta_av_cleanup");
 
     /* free any buffers */
     utl_freebuf((void **) &p_scb->p_cap);
@@ -1021,8 +1115,12 @@
     tAVDT_SEP_INFO       *p_info;
     tAVDT_CFG            *p_evt_cfg = &p_data->str_msg.cfg;
     UINT8   psc_mask = (p_evt_cfg->psc_mask | p_scb->cfg.psc_mask);
+    UINT8 local_sep;    /* sep type of local handle on which connection was received */
+    UINT8 count = 0;
+    tBTA_AV_STR_MSG  *p_msg = (tBTA_AV_STR_MSG *)p_data;
     UNUSED(p_data);
 
+    local_sep = bta_av_get_scb_sep_type(p_scb, p_msg->handle);
     p_scb->avdt_label = p_data->str_msg.msg.hdr.label;
     memcpy(p_scb->cfg.codec_info, p_evt_cfg->codec_info, AVDT_CODEC_SIZE);
     p_scb->codec_type = p_evt_cfg->codec_info[BTA_AV_CODEC_TYPE_IDX];
@@ -1048,7 +1146,13 @@
         p_info->in_use = 0;
         p_info->media_type = p_scb->media_type;
         p_info->seid = p_data->str_msg.msg.config_ind.int_seid;
-        p_info->tsep = AVDT_TSEP_SNK;
+
+        /* Sep type of Peer will be oppsite role to our local sep */
+        if (local_sep == AVDT_TSEP_SRC)
+            p_info->tsep = AVDT_TSEP_SNK;
+        else if (local_sep == AVDT_TSEP_SNK)
+            p_info->tsep = AVDT_TSEP_SRC;
+
         p_scb->role      |= BTA_AV_ROLE_AD_ACP;
         p_scb->cur_psc_mask = p_evt_cfg->psc_mask;
         if (bta_av_cb.features & BTA_AV_FEAT_RCTG)
@@ -1058,14 +1162,30 @@
 
         p_scb->num_seps  = 1;
         p_scb->sep_info_idx = 0;
-        APPL_TRACE_DEBUG3("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask);
-
-        p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
+        APPL_TRACE_DEBUG("bta_av_config_ind: SEID: %d use_rc: %d cur_psc_mask:0x%x", p_info->seid, p_scb->use_rc, p_scb->cur_psc_mask);
+        /*  in case of A2DP SINK this is the first time peer data is being sent to co functions */
+        if (local_sep == AVDT_TSEP_SNK)
+        {
+            p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
                              p_evt_cfg->codec_info,
                              p_info->seid,
                              p_scb->peer_addr,
                              p_evt_cfg->num_protect,
-                             p_evt_cfg->protect_info);
+                             p_evt_cfg->protect_info,
+                             AVDT_TSEP_SNK,
+                             p_msg->handle);
+        }
+        else
+        {
+            p_scb->p_cos->setcfg(p_scb->hndl, p_scb->codec_type,
+                             p_evt_cfg->codec_info,
+                             p_info->seid,
+                             p_scb->peer_addr,
+                             p_evt_cfg->num_protect,
+                             p_evt_cfg->protect_info,
+                             AVDT_TSEP_SRC,
+                             p_msg->handle);
+        }
     }
 }
 
@@ -1083,7 +1203,7 @@
     tBTA_AV_RCB *p_rcb;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb);
+    APPL_TRACE_DEBUG("bta_av_disconnect_req conn_lcb: 0x%x", bta_av_cb.conn_lcb);
 
     bta_sys_stop_timer(&bta_av_cb.sig_tmr);
     bta_sys_stop_timer(&p_scb->timer);
@@ -1153,12 +1273,22 @@
 void bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
 {
     UINT8   num = p_data->ci_setconfig.num_seid + 1;
+    UINT8   avdt_handle = p_data->ci_setconfig.avdt_handle;
     UINT8   *p_seid = p_data->ci_setconfig.p_seid;
     int     i;
+    UINT8   local_sep;
 
     /* we like this codec_type. find the sep_idx */
-    bta_av_adjust_seps_idx(p_scb);
-    APPL_TRACE_DEBUG2("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask);
+    local_sep = bta_av_get_scb_sep_type(p_scb,avdt_handle);
+    bta_av_adjust_seps_idx(p_scb, avdt_handle);
+    APPL_TRACE_DEBUG("bta_av_setconfig_rsp: sep_idx: %d cur_psc_mask:0x%x", p_scb->sep_idx, p_scb->cur_psc_mask);
+
+    if ((AVDT_TSEP_SNK == local_sep) && (p_data->ci_setconfig.err_code == AVDT_SUCCESS) &&
+                                     (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL))
+        p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT,
+                                              (tBTA_AV_MEDIA*)p_scb->cfg.codec_info);
+
+
     AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, p_data->ci_setconfig.err_code,
                    p_data->ci_setconfig.category);
 
@@ -1169,7 +1299,7 @@
         p_scb->wait = BTA_AV_WAIT_ACP_CAPS_ON;
         if(p_data->ci_setconfig.recfg_needed)
             p_scb->role |= BTA_AV_ROLE_SUSPEND_OPT;
-        APPL_TRACE_ERROR3("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d",
+        APPL_TRACE_DEBUG("bta_av_setconfig_rsp recfg_needed:%d role:x%x num:%d",
             p_data->ci_setconfig.recfg_needed, p_scb->role, num);
         /* callout module tells BTA the number of "good" SEPs and their SEIDs.
          * getcap on these SEID */
@@ -1182,8 +1312,11 @@
         if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1)
         {
             /* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind.
-             * call disc_res now */
-            p_scb->p_cos->disc_res(p_scb->hndl, num, num, p_scb->peer_addr);
+                       * call disc_res now */
+           /* this is called in A2DP SRC path only, In case of SINK we don't need it  */
+            if (local_sep == AVDT_TSEP_SRC)
+                p_scb->p_cos->disc_res(p_scb->hndl, num, num, 0, p_scb->peer_addr,
+                                                      UUID_SERVCLASS_AUDIO_SOURCE);
         }
         else
         {
@@ -1195,14 +1328,22 @@
 
         for (i = 1; i < num; i++)
         {
-            APPL_TRACE_DEBUG2("sep_info[%d] SEID: %d", i, p_seid[i-1]);
+            APPL_TRACE_DEBUG("sep_info[%d] SEID: %d", i, p_seid[i-1]);
             /* initialize the sep_info[] to get capabilities */
             p_scb->sep_info[i].in_use = FALSE;
             p_scb->sep_info[i].tsep = AVDT_TSEP_SNK;
             p_scb->sep_info[i].media_type = p_scb->media_type;
             p_scb->sep_info[i].seid = p_seid[i-1];
         }
-        bta_av_next_getcap(p_scb, p_data);
+
+        /* only in case of local sep as SRC we need to look for other SEPs, In case of SINK we don't */
+        if (local_sep == AVDT_TSEP_SRC)
+        {
+            /* Make sure UUID has been initialized... */
+            if (p_scb->uuid_int == 0)
+                p_scb->uuid_int = p_scb->open_api.uuid;
+            bta_av_next_getcap(p_scb, p_data);
+        }
     }
 }
 
@@ -1233,7 +1374,7 @@
 
     p_scb->stream_mtu = p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE;
     mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
-    APPL_TRACE_DEBUG3("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d",
+    APPL_TRACE_DEBUG("bta_av_str_opened l2c_cid: 0x%x stream_mtu: %d mtu: %d",
         p_scb->l2c_cid, p_scb->stream_mtu, mtu);
     if(mtu == 0 || mtu > p_scb->stream_mtu)
         mtu = p_scb->stream_mtu;
@@ -1275,6 +1416,11 @@
 #if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
         bta_ar_avdt_conn(BTA_ID_AV, open.bd_addr);
 #endif
+        if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+            open.sep = AVDT_TSEP_SNK;
+        else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+            open.sep = AVDT_TSEP_SRC;
+
         (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open);
         if(open.starting)
         {
@@ -1303,7 +1449,7 @@
         protect_req.chnl    = p_scb->chnl;
         protect_req.hndl    = p_scb->hndl;
         /*
-        APPL_TRACE_EVENT1("sec ind handle: x%x", protect_req.hndl);
+        APPL_TRACE_EVENT("sec ind handle: x%x", protect_req.hndl);
         */
         protect_req.p_data  = p_data->str_msg.msg.security_ind.p_data;
         protect_req.len     = p_data->str_msg.msg.security_ind.len;
@@ -1398,7 +1544,7 @@
     {
         /* SNK initiated L2C connection while SRC was doing SDP.    */
         /* Wait until timeout to check if SNK starts signalling.    */
-        APPL_TRACE_EVENT1("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask);
+        APPL_TRACE_EVENT("bta_av_connect_req: coll_mask = 0x%2X", p_scb->coll_mask);
         return;
     }
 
@@ -1436,8 +1582,11 @@
 *******************************************************************************/
 void bta_av_disc_results (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
 {
-    UINT8 num_snks = 0, i;
+    UINT8 num_snks = 0, num_srcs =0, i;
+    /* our uuid in case we initiate connection */
+    UINT16 uuid_int = p_scb->uuid_int;
 
+    APPL_TRACE_DEBUG(" initiator UUID 0x%x", uuid_int);
     /* store number of stream endpoints returned */
     p_scb->num_seps = p_data->str_msg.msg.discover_cfm.num_seps;
 
@@ -1445,15 +1594,23 @@
     {
         /* steam not in use, is a sink, and is audio */
         if ((p_scb->sep_info[i].in_use == FALSE) &&
-            (p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
             (p_scb->sep_info[i].media_type == p_scb->media_type))
         {
-            num_snks++;
+            if((p_scb->sep_info[i].tsep == AVDT_TSEP_SNK) &&
+               (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE))
+                num_snks++;
+
+            if((p_scb->sep_info[i].tsep == AVDT_TSEP_SRC) &&
+               (uuid_int == UUID_SERVCLASS_AUDIO_SINK))
+                num_srcs++;
+
         }
     }
 
-    p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr);
+    p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, num_srcs, p_scb->peer_addr,
+                                                                                    uuid_int);
     p_scb->num_disc_snks = num_snks;
+    p_scb->num_disc_srcs = num_srcs;
 
     /* if we got any */
     if (p_scb->num_seps > 0)
@@ -1501,9 +1658,10 @@
             num_snks++;
         }
     }
-
-    p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, p_scb->peer_addr);
+    p_scb->p_cos->disc_res(p_scb->hndl, p_scb->num_seps, num_snks, 0, p_scb->peer_addr,
+                                                          UUID_SERVCLASS_AUDIO_SOURCE);
     p_scb->num_disc_snks = num_snks;
+    p_scb->num_disc_srcs = 0;
 
     /* if we got any */
     if (p_scb->num_seps > 0)
@@ -1537,7 +1695,7 @@
     UINT8       old_wait = p_scb->wait;
     BOOLEAN     getcap_done = FALSE;
 
-    APPL_TRACE_DEBUG3("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x",
+    APPL_TRACE_DEBUG("bta_av_save_caps num_seps:%d sep_info_idx:%d wait:x%x",
         p_scb->num_seps, p_scb->sep_info_idx, p_scb->wait);
     memcpy(&cfg, p_scb->p_cap, sizeof(tAVDT_CFG));
     /* let application know the capability of the SNK */
@@ -1622,7 +1780,7 @@
     UINT8 idx;
     tBTA_AV_OPEN    open;
 
-    APPL_TRACE_DEBUG0("bta_av_open_failed");
+    APPL_TRACE_DEBUG("bta_av_open_failed");
     p_scb->open_status = BTA_AV_FAIL_STREAM;
     bta_av_cco_close(p_scb, p_data);
 
@@ -1648,6 +1806,11 @@
         /* set the state back to initial state */
         bta_av_set_scb_sst_init(p_scb);
 
+        if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+            open.sep = AVDT_TSEP_SNK;
+        else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+            open.sep = AVDT_TSEP_SRC;
+
         (*bta_av_cb.p_cback)(BTA_AV_OPEN_EVT, (tBTA_AV *) &open);
 
     }
@@ -1674,6 +1837,7 @@
     tAVDT_CFG   cfg;
     UINT8       media_type;
     tAVDT_SEP_INFO  *p_info = &p_scb->sep_info[p_scb->sep_info_idx];
+    UINT16 uuid_int; /* UUID for which connection was initiatied */
 
     memcpy(&cfg, &p_scb->cfg, sizeof(tAVDT_CFG));
     cfg.num_codec = 1;
@@ -1682,10 +1846,10 @@
     memcpy(cfg.protect_info, p_scb->p_cap->protect_info, AVDT_PROTECT_SIZE);
     media_type = p_scb->p_cap->codec_info[BTA_AV_MEDIA_TYPE_IDX] >> 4;
 
-    APPL_TRACE_DEBUG1("num_codec %d", p_scb->p_cap->num_codec);
-    APPL_TRACE_DEBUG2("media type x%x, x%x", media_type, p_scb->media_type);
+    APPL_TRACE_DEBUG("num_codec %d", p_scb->p_cap->num_codec);
+    APPL_TRACE_DEBUG("media type x%x, x%x", media_type, p_scb->media_type);
 #if AVDT_MULTIPLEXING == TRUE
-    APPL_TRACE_DEBUG2("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask);
+    APPL_TRACE_DEBUG("mux x%x, x%x", cfg.mux_mask, p_scb->p_cap->mux_mask);
 #endif
 
     /* if codec present and we get a codec configuration */
@@ -1697,16 +1861,31 @@
     {
 #if AVDT_MULTIPLEXING == TRUE
         cfg.mux_mask &= p_scb->p_cap->mux_mask;
-        APPL_TRACE_DEBUG1("mux_mask used x%x", cfg.mux_mask);
+        APPL_TRACE_DEBUG("mux_mask used x%x", cfg.mux_mask);
 #endif
         /* save copy of codec type and configuration */
         p_scb->codec_type = cfg.codec_info[BTA_AV_CODEC_TYPE_IDX];
         memcpy(&p_scb->cfg, &cfg, sizeof(tAVDT_CFG));
-        bta_av_adjust_seps_idx(p_scb);
+
+        uuid_int = p_scb->uuid_int;
+        APPL_TRACE_DEBUG(" initiator UUID = 0x%x ", uuid_int);
+        if (uuid_int == UUID_SERVCLASS_AUDIO_SOURCE)
+            bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC));
+        else if (uuid_int == UUID_SERVCLASS_AUDIO_SINK)
+            bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SNK));
+
         /* use only the services peer supports */
         cfg.psc_mask &= p_scb->p_cap->psc_mask;
         p_scb->cur_psc_mask = cfg.psc_mask;
 
+        if ((uuid_int == UUID_SERVCLASS_AUDIO_SINK) &&
+            (p_scb->seps[p_scb->sep_idx].p_app_data_cback != NULL))
+        {
+            APPL_TRACE_DEBUG(" Configure Deoder for Sink Connection ");
+            p_scb->seps[p_scb->sep_idx].p_app_data_cback(BTA_AV_MEDIA_SINK_CFG_EVT,
+                     (tBTA_AV_MEDIA*)p_scb->cfg.codec_info);
+        }
+
         /* open the stream */
         AVDT_OpenReq(p_scb->seps[p_scb->sep_idx].av_handle, p_scb->peer_addr,
                      p_scb->sep_info[p_scb->sep_info_idx].seid, &cfg);
@@ -1738,9 +1917,12 @@
 void bta_av_setconfig_rej (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
 {
     tBTA_AV_REJECT reject;
+    UINT8   avdt_handle = p_data->ci_setconfig.avdt_handle;
 
-    APPL_TRACE_DEBUG0("bta_av_setconfig_rej");
-    AVDT_ConfigRsp(p_data->str_msg.handle, p_data->str_msg.msg.hdr.label, AVDT_ERR_BAD_STATE, 0);
+    bta_av_adjust_seps_idx(p_scb, avdt_handle);
+    APPL_TRACE_DEBUG("bta_av_setconfig_rej: sep_idx: %d",p_scb->sep_idx);
+    AVDT_ConfigRsp(p_scb->avdt_handle, p_scb->avdt_label, AVDT_ERR_UNSUP_CFG, 0);
+
     bdcpy(reject.bd_addr, p_data->str_msg.bd_addr);
     reject.hndl = p_scb->hndl;
     (*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, (tBTA_AV *) &reject);
@@ -1793,7 +1975,7 @@
     UINT8 policy = HCI_ENABLE_SNIFF_MODE;
     UINT8       cur_role;
 
-    APPL_TRACE_DEBUG3("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started);
+    APPL_TRACE_DEBUG("bta_av_do_start sco_occupied:%d, role:x%x, started:%d", bta_av_cb.sco_occupied, p_scb->role, p_scb->started);
     if (bta_av_cb.sco_occupied)
     {
         bta_av_start_failed(p_scb, p_data);
@@ -1829,7 +2011,7 @@
             }
         }
     }
-    APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role);
+    APPL_TRACE_DEBUG("started %d role:x%x", p_scb->started, p_scb->role);
 }
 
 /*******************************************************************************
@@ -1849,7 +2031,7 @@
     BT_HDR  *p_buf;
     UINT8 policy = HCI_ENABLE_SNIFF_MODE;
 
-    APPL_TRACE_ERROR2("bta_av_str_stopped:audio_open_cnt=%d, p_data %x",
+    APPL_TRACE_ERROR("bta_av_str_stopped:audio_open_cnt=%d, p_data %x",
             bta_av_cb.audio_open_cnt, p_data);
 
     bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr);
@@ -1882,7 +2064,7 @@
 
     if (p_data && p_data->api_stop.suspend)
     {
-        APPL_TRACE_DEBUG2("suspending: %d, sup:%d", start, p_scb->suspend_sup);
+        APPL_TRACE_DEBUG("suspending: %d, sup:%d", start, p_scb->suspend_sup);
         if ((start)  && (p_scb->suspend_sup))
         {
             sus_evt = FALSE;
@@ -1902,7 +2084,7 @@
     {
         suspend_rsp.status = BTA_AV_SUCCESS;
         suspend_rsp.initiator = TRUE;
-        APPL_TRACE_EVENT1("bta_av_str_stopped status %d", suspend_rsp.status);
+        APPL_TRACE_EVENT("bta_av_str_stopped status %d", suspend_rsp.status);
 
         /* send STOP_EVT event only if not in reconfiguring state */
         if (p_scb->state != BTA_AV_RCFG_SST)
@@ -1930,7 +2112,7 @@
     tBTA_AV_RECONFIG    evt;
     tBTA_AV_API_RCFG    *p_rcfg = &p_data->api_reconfig;
 
-    APPL_TRACE_DEBUG4("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)",
+    APPL_TRACE_DEBUG("bta_av_reconfig r:%d, s:%d idx: %d (o:%d)",
         p_scb->recfg_sup, p_scb->suspend_sup,
         p_scb->rcfg_idx, p_scb->sep_info_idx);
 
@@ -1976,7 +2158,7 @@
         }
         else
         {
-            APPL_TRACE_DEBUG0("Reconfig");
+            APPL_TRACE_DEBUG("Reconfig");
             AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap);
             p_scb->p_cap->psc_mask = p_scb->cur_psc_mask;
         }
@@ -1984,7 +2166,7 @@
     else
     {
         /* close the stream */
-        APPL_TRACE_DEBUG1("close/open num_protect: %d", p_cfg->num_protect);
+        APPL_TRACE_DEBUG("close/open num_protect: %d", p_cfg->num_protect);
         if(p_scb->started)
             bta_av_str_stopped(p_scb, NULL);
             p_scb->started = FALSE;
@@ -2019,7 +2201,7 @@
     if (!p_scb->cong)
     {
         /*
-        APPL_TRACE_ERROR1("q: %d", p_scb->l2c_bufs);
+        APPL_TRACE_ERROR("q: %d", p_scb->l2c_bufs);
         */
         //Always get the current number of bufs que'd up
         p_scb->l2c_bufs = (UINT8)L2CA_FlushChannel (p_scb->l2c_cid, L2CAP_FLUSH_CHANS_GET);
@@ -2055,7 +2237,7 @@
                 /*  There's no need to increment it here, it is always read from L2CAP see above */
                 /* p_scb->l2c_bufs++; */
                 /*
-                APPL_TRACE_ERROR1("qw: %d", p_scb->l2c_bufs);
+                APPL_TRACE_ERROR("qw: %d", p_scb->l2c_bufs);
                 */
 
                 /* opt is a bit mask, it could have several options set */
@@ -2118,7 +2300,7 @@
     UINT8           policy = HCI_ENABLE_SNIFF_MODE;
     UINT8           cur_role;
 
-    APPL_TRACE_DEBUG2("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role);
+    APPL_TRACE_DEBUG("bta_av_start_ok wait:x%x, role:x%x", p_scb->wait, p_scb->role);
 
     p_scb->started = TRUE;
     if (p_scb->sco_suspend)
@@ -2129,6 +2311,13 @@
     if (new_role & BTA_AV_ROLE_START_INT)
         initiator = TRUE;
 
+    /* for A2DP SINK we do not send get_caps */
+    if ((p_scb->avdt_handle == p_scb->seps[p_scb->sep_idx].av_handle)
+         &&(p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK))
+    {
+        p_scb->wait &= ~(BTA_AV_WAIT_ACP_CAPS_ON);
+        APPL_TRACE_DEBUG(" Local SEP type is SNK  new wait is 0x%x",p_scb->wait);
+    }
     if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_FAILED)
     {
         /* role switch has failed */
@@ -2136,7 +2325,7 @@
         p_data = (tBTA_AV_DATA *)&hdr;
         hdr.offset = BTA_AV_RS_FAIL;
     }
-    APPL_TRACE_DEBUG1("wait:x%x", p_scb->wait);
+    APPL_TRACE_DEBUG("wait:x%x", p_scb->wait);
 
     if (p_data && (p_data->hdr.offset != BTA_AV_RS_NONE))
     {
@@ -2170,15 +2359,15 @@
         p_scb->q_tag = BTA_AV_Q_TAG_START;
     }
 
-    if (p_scb->wait & BTA_AV_WAIT_ACP_CAPS_ON)
-    {
-        p_scb->wait |= BTA_AV_WAIT_ACP_CAPS_STARTED;
-    }
-
     if (p_scb->wait)
     {
-        APPL_TRACE_DEBUG2("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag);
-        return;
+        APPL_TRACE_ERROR("wait:x%x q_tag:%d- not started", p_scb->wait, p_scb->q_tag);
+        /* Clear first bit of p_scb->wait and not to return from this point else
+         * HAL layer gets blocked. And if there is delay in Get Capability response as
+         * first bit of p_scb->wait is cleared hence it ensures bt_av_start_ok is not called
+         * again from bta_av_save_caps.
+        */
+        p_scb->wait &= ~BTA_AV_WAIT_ACP_CAPS_ON;
     }
 
     /* tell role manager to check M/S role */
@@ -2243,7 +2432,7 @@
         p_scb->p_cos->start(p_scb->hndl, p_scb->codec_type, p_scb->cfg.codec_info, &p_scb->no_rtp_hdr);
         p_scb->co_started = TRUE;
 
-        APPL_TRACE_DEBUG3("bta_av_start_ok suspending: %d, role:x%x, init %d",
+        APPL_TRACE_DEBUG("bta_av_start_ok suspending: %d, role:x%x, init %d",
             suspend, p_scb->role, initiator);
 
         start.suspending = suspend;
@@ -2322,6 +2511,12 @@
         data.open.status = p_scb->open_status;
         data.open.chnl   = p_scb->chnl;
         data.open.hndl   = p_scb->hndl;
+
+        if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC )
+            data.open.sep = AVDT_TSEP_SNK;
+        else if (p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SNK )
+            data.open.sep = AVDT_TSEP_SRC;
+
         event = BTA_AV_OPEN_EVT;
         p_scb->open_status = BTA_AV_SUCCESS;
 
@@ -2385,7 +2580,7 @@
     UINT8           err_code = p_data->str_msg.msg.hdr.err_code;
     UINT8 policy = HCI_ENABLE_SNIFF_MODE;
 
-    APPL_TRACE_DEBUG2 ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d",
+    APPL_TRACE_DEBUG ("bta_av_suspend_cfm:audio_open_cnt = %d, err_code = %d",
         bta_av_cb.audio_open_cnt, err_code);
 
     if (p_scb->started == FALSE)
@@ -2393,7 +2588,7 @@
         /* handle the condition where there is a collision of SUSPEND req from either side
         ** Second SUSPEND req could be rejected. Do not treat this as a failure
         */
-        APPL_TRACE_WARNING1("bta_av_suspend_cfm: already suspended, ignore, err_code %d",
+        APPL_TRACE_WARNING("bta_av_suspend_cfm: already suspended, ignore, err_code %d",
                             err_code);
         return;
     }
@@ -2408,7 +2603,7 @@
         }
         suspend_rsp.status = BTA_AV_FAIL;
 
-        APPL_TRACE_ERROR0 ("bta_av_suspend_cfm: suspend failed, closing connection");
+        APPL_TRACE_ERROR ("bta_av_suspend_cfm: suspend failed, closing connection");
 
         /* SUSPEND failed. Close connection. */
         bta_av_ssm_execute(p_scb, BTA_AV_API_CLOSE_EVT, NULL);
@@ -2465,7 +2660,7 @@
     UNUSED(p_data);
 
     p_scb->l2c_cid      = AVDT_GetL2CapChannel(p_scb->avdt_handle);
-    APPL_TRACE_DEBUG1("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid);
+    APPL_TRACE_DEBUG("bta_av_rcfg_str_ok: l2c_cid: %d", p_scb->l2c_cid);
 
     /* rc listen */
     bta_av_st_rc_timer(p_scb, NULL);
@@ -2498,7 +2693,7 @@
 {
     tBTA_AV_RECONFIG evt;
 
-    APPL_TRACE_DEBUG2("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x",
+    APPL_TRACE_DEBUG("bta_av_rcfg_failed num_recfg: %d, conn_lcb:0x%x",
         p_scb->num_recfg, bta_av_cb.conn_lcb);
     if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
     {
@@ -2541,7 +2736,7 @@
 
     p_scb->cong    = FALSE;
     p_scb->num_recfg++;
-    APPL_TRACE_DEBUG1("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg);
+    APPL_TRACE_DEBUG("bta_av_rcfg_connect num_recfg: %d", p_scb->num_recfg);
     if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
     {
         /* let bta_av_rcfg_failed report fail */
@@ -2565,7 +2760,7 @@
     tBTA_AV_RECONFIG    evt;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg);
+    APPL_TRACE_DEBUG("bta_av_rcfg_discntd num_recfg: %d", p_scb->num_recfg);
     p_scb->num_recfg++;
     if(p_scb->num_recfg > BTA_AV_RECONFIG_RETRY)
     {
@@ -2609,7 +2804,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("suspend rejected, try close");
+            APPL_TRACE_ERROR("suspend rejected, try close");
              /* Disable suspend feature only with explicit rejection(not with timeout) */
             if (err_code != AVDT_ERR_TIMEOUT)
             {
@@ -2623,7 +2818,7 @@
     }
     else
     {
-        APPL_TRACE_DEBUG0("bta_av_suspend_cont calling AVDT_ReconfigReq");
+        APPL_TRACE_DEBUG("bta_av_suspend_cont calling AVDT_ReconfigReq");
         /* reconfig the stream */
 
         AVDT_ReconfigReq(p_scb->avdt_handle, p_scb->p_cap);
@@ -2646,11 +2841,11 @@
     UINT8   err_code = p_data->str_msg.msg.hdr.err_code;
 
     /*
-    APPL_TRACE_DEBUG0("bta_av_rcfg_cfm");
+    APPL_TRACE_DEBUG("bta_av_rcfg_cfm");
     */
     if (err_code)
     {
-        APPL_TRACE_ERROR0("reconfig rejected, try close");
+        APPL_TRACE_ERROR("reconfig rejected, try close");
          /* Disable reconfiguration feature only with explicit rejection(not with timeout) */
         if (err_code != AVDT_ERR_TIMEOUT)
         {
@@ -2683,7 +2878,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks);
+	APPL_TRACE_DEBUG("bta_av_rcfg_open, num_disc_snks = %d", p_scb->num_disc_snks);
 
     if (p_scb->num_disc_snks == 0)
     {
@@ -2699,7 +2894,7 @@
         memcpy(p_scb->cfg.codec_info, p_scb->p_cap->codec_info, AVDT_CODEC_SIZE);
         /* we may choose to use a different SEP at reconfig.
          * adjust the sep_idx now */
-        bta_av_adjust_seps_idx(p_scb);
+        bta_av_adjust_seps_idx(p_scb, bta_av_get_scb_handle(p_scb, AVDT_TSEP_SRC));
 
         /* open the stream with the new config */
         p_scb->sep_info_idx = p_scb->rcfg_idx;
@@ -2786,13 +2981,13 @@
 {
     tBTA_AV_START   start;
 
-    APPL_TRACE_DEBUG3("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role);
+    APPL_TRACE_DEBUG("bta_av_open_rc use_rc: %d, wait: x%x role:x%x", p_scb->use_rc, p_scb->wait, p_scb->role);
     if ((p_scb->wait & BTA_AV_WAIT_ROLE_SW_BITS) && (p_scb->q_tag == BTA_AV_Q_TAG_START))
     {
         /* waiting for role switch for some reason & the timer expires */
         if (!bta_av_link_role_ok(p_scb, A2D_SET_ONE_BIT))
         {
-            APPL_TRACE_ERROR0 ("failed to start streaming for role management reasons!!");
+            APPL_TRACE_ERROR ("failed to start streaming for role management reasons!!");
             bta_sys_stop_timer(&p_scb->timer);
             start.chnl   = p_scb->chnl;
             start.status = BTA_AV_FAIL_ROLE;
diff --git a/bta/av/bta_av_act.c b/bta/av/bta_av_act.c
old mode 100755
new mode 100644
index 4408874..dfd3662
--- a/bta/av/bta_av_act.c
+++ b/bta/av/bta_av_act.c
@@ -100,7 +100,7 @@
             p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1];
             if(p_scb)
             {
-                APPL_TRACE_DEBUG3("bta_av_del_rc shdl:%d, srch:%d rc_handle:%d", p_rcb->shdl,
+                APPL_TRACE_DEBUG("bta_av_del_rc shdl:%d, srch:%d rc_handle:%d", p_rcb->shdl,
                                   p_scb->rc_handle, p_rcb->handle);
                 if(p_scb->rc_handle == p_rcb->handle)
                     p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE;
@@ -110,7 +110,7 @@
             }
         }
 
-        APPL_TRACE_EVENT4("bta_av_del_rc  handle: %d status=0x%x, rc_acp_handle:%d, idx:%d",
+        APPL_TRACE_EVENT("bta_av_del_rc  handle: %d status=0x%x, rc_acp_handle:%d, idx:%d",
             p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, bta_av_cb.rc_acp_idx);
         rc_handle = p_rcb->handle;
         if(!(p_rcb->status & BTA_AV_RC_CONN_MASK) ||
@@ -125,7 +125,7 @@
         AVRC_Close(rc_handle);
         if (rc_handle == bta_av_cb.rc_acp_handle)
             bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE;
-        APPL_TRACE_EVENT4("end del_rc handle: %d status=0x%x, rc_acp_handle:%d, lidx:%d",
+        APPL_TRACE_EVENT("end del_rc handle: %d status=0x%x, rc_acp_handle:%d, lidx:%d",
             p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, p_rcb->lidx);
     }
 }
@@ -206,9 +206,9 @@
     UNUSED(result);
 
 #if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE)
-    APPL_TRACE_EVENT2("rc_ctrl handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("rc_ctrl handle: %d event=0x%x", handle, event);
 #else
-    APPL_TRACE_EVENT2("bta_av_rc_ctrl_cback handle: %d event=0x%x", handle, event);
+    APPL_TRACE_EVENT("bta_av_rc_ctrl_cback handle: %d event=0x%x", handle, event);
 #endif
     if (event == AVRC_OPEN_IND_EVT)
     {
@@ -252,9 +252,9 @@
     UINT16          data_len = 0;
 
 #if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE)
-    APPL_TRACE_ERROR2("rc_msg handle: %d opcode=0x%x", handle, opcode);
+    APPL_TRACE_ERROR("rc_msg handle: %d opcode=0x%x", handle, opcode);
 #else
-    APPL_TRACE_EVENT2("bta_av_rc_msg_cback handle: %d opcode=0x%x", handle, opcode);
+    APPL_TRACE_EVENT("bta_av_rc_msg_cback handle: %d opcode=0x%x", handle, opcode);
 #endif
     /* determine size of buffer we need */
     if (opcode == AVRC_OP_VENDOR && p_msg->vendor.p_vendor_data != NULL)
@@ -314,7 +314,7 @@
     {
         if ((p_rcb = bta_av_get_rcb_by_shdl(shdl)) != NULL )
         {
-            APPL_TRACE_ERROR1("bta_av_rc_create ACP handle exist for shdl:%d", shdl);
+            APPL_TRACE_ERROR("bta_av_rc_create ACP handle exist for shdl:%d", shdl);
             return p_rcb->handle;
         }
     }
@@ -335,7 +335,7 @@
 
     if (p_rcb->handle != BTA_AV_RC_HANDLE_NONE)
     {
-        APPL_TRACE_ERROR1("bta_av_rc_create found duplicated handle:%d", rc_handle);
+        APPL_TRACE_ERROR("bta_av_rc_create found duplicated handle:%d", rc_handle);
     }
 
     p_rcb->handle = rc_handle;
@@ -348,9 +348,9 @@
         /* this LIDX is reserved for the AVRCP ACP connection */
         p_cb->rc_acp_handle = p_rcb->handle;
         p_cb->rc_acp_idx = (i + 1);
-        APPL_TRACE_DEBUG2("rc_acp_handle:%d idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
+        APPL_TRACE_DEBUG("rc_acp_handle:%d idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
     }
-    APPL_TRACE_DEBUG6("create %d, role: %d, shdl:%d, rc_handle:%d, lidx:%d, status:0x%x",
+    APPL_TRACE_DEBUG("create %d, role: %d, shdl:%d, rc_handle:%d, lidx:%d, status:0x%x",
         i, role, shdl, p_rcb->handle, lidx, p_rcb->status);
 
     return rc_handle;
@@ -463,7 +463,7 @@
             if(op == BTA_AV_LCB_FREE)
             {
                 p_cb->conn_lcb &= ~mask; /* clear the connect mask */
-                APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+                APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
             }
             break;
         }
@@ -498,9 +498,9 @@
         if(p_scb && bdcmp(p_scb->peer_addr, p_data->rc_conn_chg.peer_addr) == 0)
         {
             p_scb->rc_handle = p_data->rc_conn_chg.handle;
-            APPL_TRACE_DEBUG2("bta_av_rc_opened shdl:%d, srch %d", i + 1, p_scb->rc_handle);
+            APPL_TRACE_DEBUG("bta_av_rc_opened shdl:%d, srch %d", i + 1, p_scb->rc_handle);
             shdl = i+1;
-            APPL_TRACE_ERROR1("use_rc:%d", p_scb->use_rc);
+            APPL_TRACE_ERROR("use_rc:%d", p_scb->use_rc);
             bta_sys_stop_timer(&p_scb->timer);
             disc = p_scb->hndl;
             break;
@@ -510,7 +510,7 @@
     i = p_data->rc_conn_chg.handle;
     if (p_cb->rcb[i].handle == BTA_AV_RC_HANDLE_NONE)
     {
-        APPL_TRACE_ERROR1("not a valid handle:%d any more", i);
+        APPL_TRACE_ERROR("not a valid handle:%d any more", i);
         return;
     }
 
@@ -528,14 +528,14 @@
             p_cb->rcb[i].lidx = tmp;
             p_cb->rc_acp_handle = p_rcb->handle;
             p_cb->rc_acp_idx = (p_rcb - p_cb->rcb) + 1;
-            APPL_TRACE_DEBUG2("switching RCB rc_acp_handle:%d idx:%d",
+            APPL_TRACE_DEBUG("switching RCB rc_acp_handle:%d idx:%d",
                                p_cb->rc_acp_handle, p_cb->rc_acp_idx);
         }
     }
 
     p_cb->rcb[i].shdl = shdl;
     rc_open.rc_handle = i;
-    APPL_TRACE_ERROR4("bta_av_rc_opened rcb[%d] shdl:%d lidx:%d/%d",
+    APPL_TRACE_ERROR("bta_av_rc_opened rcb[%d] shdl:%d lidx:%d/%d",
             i, shdl, p_cb->rcb[i].lidx, p_cb->lcb[BTA_AV_NUM_LINKS].lidx);
     p_cb->rcb[i].status |= BTA_AV_RC_CONN_MASK;
 
@@ -545,14 +545,14 @@
          * update the index to the extra LCB */
         p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS];
         bdcpy(p_lcb->addr, p_data->rc_conn_chg.peer_addr);
-        APPL_TRACE_DEBUG6("rc_only bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+        APPL_TRACE_DEBUG("rc_only bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                       p_lcb->addr[0], p_lcb->addr[1],
                       p_lcb->addr[2], p_lcb->addr[3],
                       p_lcb->addr[4], p_lcb->addr[5]);
         p_lcb->lidx = BTA_AV_NUM_LINKS + 1;
             p_cb->rcb[i].lidx = p_lcb->lidx;
         p_lcb->conn_msk = 1;
-        APPL_TRACE_ERROR3("rcb[%d].lidx=%d, lcb.conn_msk=x%x",
+        APPL_TRACE_ERROR("rcb[%d].lidx=%d, lcb.conn_msk=x%x",
             i, p_cb->rcb[i].lidx, p_lcb->conn_msk);
         disc = p_data->rc_conn_chg.handle|BTA_AV_CHNL_MSK;
     }
@@ -560,7 +560,7 @@
     bdcpy(rc_open.peer_addr, p_data->rc_conn_chg.peer_addr);
     rc_open.peer_features = p_cb->rcb[i].peer_features;
     rc_open.status = BTA_AV_SUCCESS;
-    APPL_TRACE_DEBUG2("local features:x%x peer_features:x%x", p_cb->features,
+    APPL_TRACE_DEBUG("local features:x%x peer_features:x%x", p_cb->features,
                       rc_open.peer_features);
     if(rc_open.peer_features == 0)
     {
@@ -777,7 +777,7 @@
     /* Metadata messages only use PANEL sub-unit type */
     if (p_vendor->hdr.subunit_type != AVRC_SUB_PANEL)
     {
-        APPL_TRACE_DEBUG0("SUBUNIT must be PANEL");
+        APPL_TRACE_DEBUG("SUBUNIT must be PANEL");
         /* reject it */
         evt=0;
         p_vendor->hdr.ctype = BTA_AV_RSP_NOT_IMPL;
@@ -785,7 +785,7 @@
     }
     else if (!AVRC_IsValidAvcType(pdu, p_vendor->hdr.ctype) )
     {
-        APPL_TRACE_DEBUG2("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype);
+        APPL_TRACE_DEBUG("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype);
         /* reject invalid message without reporting to app */
         evt = 0;
         p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD;
@@ -824,7 +824,7 @@
                 }
                 else
                 {
-                    APPL_TRACE_DEBUG1("Invalid capability ID: 0x%x", u8);
+                    APPL_TRACE_DEBUG("Invalid capability ID: 0x%x", u8);
                     /* reject - unknown capability ID */
                     p_rc_rsp->get_caps.status = AVRC_STS_BAD_PARAM;
                 }
@@ -842,7 +842,7 @@
         }
     }
 #else
-    APPL_TRACE_DEBUG0("AVRCP 1.3 Metadata not supporteed. Reject command.");
+    APPL_TRACE_DEBUG("AVRCP 1.3 Metadata not supporteed. Reject command.");
     /* reject invalid message without reporting to app */
     evt = 0;
     p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD;
@@ -870,7 +870,7 @@
     BOOLEAN is_inquiry = ((p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_SPEC_INQ) || p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_GEN_INQ);
 #if (AVRC_METADATA_INCLUDED == TRUE)
     tAVRC_STS   res;
-    UINT8       ctype;
+    UINT8       ctype = 0;
     tAVRC_RESPONSE  rc_rsp;
 
     rc_rsp.rsp.status = BTA_AV_STS_NO_RSP;
@@ -900,7 +900,7 @@
                 p_data->rc_msg.msg.hdr.ctype = bta_av_op_supported(p_data->rc_msg.msg.pass.op_id, is_inquiry);
             }
 
-            APPL_TRACE_DEBUG1("ctype %d",p_data->rc_msg.msg.hdr.ctype)
+            APPL_TRACE_DEBUG("ctype %d",p_data->rc_msg.msg.hdr.ctype)
 
             /* send response */
             if (p_data->rc_msg.msg.hdr.ctype != BTA_AV_RSP_INTERIM)
@@ -1031,7 +1031,7 @@
     {
         p_rcb = &p_cb->rcb[handle];
 
-        APPL_TRACE_DEBUG2("bta_av_rc_close handle: %d, status=0x%x", p_rcb->handle, p_rcb->status);
+        APPL_TRACE_DEBUG("bta_av_rc_close handle: %d, status=0x%x", p_rcb->handle, p_rcb->status);
         if(p_rcb->handle != BTA_AV_RC_HANDLE_NONE)
         {
             if(p_rcb->shdl)
@@ -1092,7 +1092,7 @@
     tBTA_AV_SCB *p_scbi;
 
     started_msk = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
-    APPL_TRACE_DEBUG3 ("bta_av_stream_chg started:%d started_msk:x%x chnl:x%x", started,
+    APPL_TRACE_DEBUG ("bta_av_stream_chg started:%d started_msk:x%x chnl:x%x", started,
                                                   started_msk, p_scb->chnl);
     if (BTA_AV_CHNL_AUDIO == p_scb->chnl)
         p_streams = &bta_av_cb.audio_streams;
@@ -1138,7 +1138,7 @@
             }
         }
 
-        APPL_TRACE_DEBUG4 ("no_streams:%d i:%d, audio_streams:x%x, video_streams:x%x", no_streams, i,
+        APPL_TRACE_DEBUG ("no_streams:%d i:%d, audio_streams:x%x, video_streams:x%x", no_streams, i,
                            bta_av_cb.audio_streams, bta_av_cb.video_streams);
         if (no_streams)
         {
@@ -1192,7 +1192,7 @@
                     if (bta_av_cb.rcb[i].lidx == p_lcb->lidx)
                     {
                         bta_av_cb.rcb[i].shdl = index + 1;
-                        APPL_TRACE_DEBUG5("conn_chg up[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
+                        APPL_TRACE_DEBUG("conn_chg up[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
                                           bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status,
                                           bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx);
                         break;
@@ -1217,18 +1217,18 @@
             }
 
 
-            APPL_TRACE_DEBUG2("rc_acp_handle:%d rc_acp_idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
+            APPL_TRACE_DEBUG("rc_acp_handle:%d rc_acp_idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx);
             /* check if the AVRCP ACP channel is already connected */
             if(p_lcb && p_cb->rc_acp_handle != BTA_AV_RC_HANDLE_NONE && p_cb->rc_acp_idx)
             {
                 p_lcb_rc = &p_cb->lcb[BTA_AV_NUM_LINKS];
-                APPL_TRACE_DEBUG1("rc_acp is connected && conn_chg on same addr p_lcb_rc->conn_msk:x%x",
+                APPL_TRACE_DEBUG("rc_acp is connected && conn_chg on same addr p_lcb_rc->conn_msk:x%x",
                                   p_lcb_rc->conn_msk);
                 /* check if the RC is connected to the scb addr */
-                APPL_TRACE_DEBUG6 ("p_lcb_rc->addr: %02x:%02x:%02x:%02x:%02x:%02x",
+                APPL_TRACE_DEBUG ("p_lcb_rc->addr: %02x:%02x:%02x:%02x:%02x:%02x",
                        p_lcb_rc->addr[0], p_lcb_rc->addr[1], p_lcb_rc->addr[2], p_lcb_rc->addr[3],
                        p_lcb_rc->addr[4], p_lcb_rc->addr[5]);
-                APPL_TRACE_DEBUG6 ("conn_chg.peer_addr: %02x:%02x:%02x:%02x:%02x:%02x",
+                APPL_TRACE_DEBUG ("conn_chg.peer_addr: %02x:%02x:%02x:%02x:%02x:%02x",
                        p_data->conn_chg.peer_addr[0], p_data->conn_chg.peer_addr[1],
                        p_data->conn_chg.peer_addr[2],
                        p_data->conn_chg.peer_addr[3], p_data->conn_chg.peer_addr[4],
@@ -1242,7 +1242,7 @@
                     p_scb->rc_handle = p_cb->rc_acp_handle;
                     p_rcb = &p_cb->rcb[p_cb->rc_acp_idx - 1];
                     p_rcb->shdl = bta_av_get_shdl(p_scb);
-                    APPL_TRACE_DEBUG3("update rc_acp shdl:%d/%d srch:%d", index + 1, p_rcb->shdl,
+                    APPL_TRACE_DEBUG("update rc_acp shdl:%d/%d srch:%d", index + 1, p_rcb->shdl,
                                       p_scb->rc_handle );
 
                     p_rcb2 = bta_av_get_rcb_by_shdl(p_rcb->shdl);
@@ -1251,14 +1251,14 @@
                         /* found the RCB that was created to associated with this SCB */
                         p_cb->rc_acp_handle = p_rcb2->handle;
                         p_cb->rc_acp_idx = (p_rcb2 - p_cb->rcb) + 1;
-                        APPL_TRACE_DEBUG2("new rc_acp_handle:%d, idx:%d", p_cb->rc_acp_handle,
+                        APPL_TRACE_DEBUG("new rc_acp_handle:%d, idx:%d", p_cb->rc_acp_handle,
                                            p_cb->rc_acp_idx);
                         p_rcb2->lidx = (BTA_AV_NUM_LINKS + 1);
-                        APPL_TRACE_DEBUG3("rc2 handle:%d lidx:%d/%d",p_rcb2->handle, p_rcb2->lidx,
+                        APPL_TRACE_DEBUG("rc2 handle:%d lidx:%d/%d",p_rcb2->handle, p_rcb2->lidx,
                                           p_cb->lcb[p_rcb2->lidx-1].lidx);
                     }
                     p_rcb->lidx = p_lcb->lidx;
-                    APPL_TRACE_DEBUG3("rc handle:%d lidx:%d/%d",p_rcb->handle, p_rcb->lidx,
+                    APPL_TRACE_DEBUG("rc handle:%d lidx:%d/%d",p_rcb->handle, p_rcb->lidx,
                                       p_cb->lcb[p_rcb->lidx-1].lidx);
                 }
             }
@@ -1297,10 +1297,10 @@
             }
         }
 
-        APPL_TRACE_DEBUG1("bta_av_conn_chg shdl:%d", index + 1);
+        APPL_TRACE_DEBUG("bta_av_conn_chg shdl:%d", index + 1);
         for (i=0; i<BTA_AV_NUM_RCB; i++)
         {
-            APPL_TRACE_DEBUG5("conn_chg dn[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
+            APPL_TRACE_DEBUG("conn_chg dn[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i,
                               bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status,
                               bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx);
             if(bta_av_cb.rcb[i].shdl == index + 1)
@@ -1322,7 +1322,7 @@
             bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
     }
 
-    APPL_TRACE_DEBUG6("bta_av_conn_chg audio:%x video:%x up:%d conn_msk:0x%x chk_restore:%d audio_open_cnt:%d",
+    APPL_TRACE_DEBUG("bta_av_conn_chg audio:%x video:%x up:%d conn_msk:0x%x chk_restore:%d audio_open_cnt:%d",
         p_cb->conn_audio, p_cb->conn_video, p_data->conn_chg.is_up, conn_msk, chk_restore, p_cb->audio_open_cnt);
 
     if (chk_restore)
@@ -1417,7 +1417,7 @@
     UINT8   mask;
     tBTA_AV_LCB *p_lcb = NULL;
 
-    APPL_TRACE_DEBUG1("bta_av_sig_chg event: %d", event);
+    APPL_TRACE_DEBUG("bta_av_sig_chg event: %d", event);
     if(event == AVDT_CONNECT_IND_EVT)
     {
         p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FIND);
@@ -1427,7 +1427,7 @@
             for(xx=0; xx<BTA_AV_NUM_LINKS; xx++)
             {
                 mask = 1 << xx;
-                APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+                APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
 
                 /* look for a p_lcb with its p_scb registered */
                 if((!(mask & p_cb->conn_lcb)) && (p_cb->p_scb[xx] != NULL))
@@ -1443,10 +1443,10 @@
                     }
                     /* this entry is not used yet. */
                     p_cb->conn_lcb |= mask;     /* mark it as used */
-                    APPL_TRACE_DEBUG1("start sig timer %d", p_data->hdr.offset);
+                    APPL_TRACE_DEBUG("start sig timer %d", p_data->hdr.offset);
                     if (p_data->hdr.offset == AVDT_ACP)
                     {
-                        APPL_TRACE_DEBUG1("Incoming L2CAP acquired, set state as incoming", NULL);
+                        APPL_TRACE_DEBUG("Incoming L2CAP acquired, set state as incoming", NULL);
                         bdcpy(p_cb->p_scb[xx]->peer_addr, p_data->str_msg.bd_addr);
                         p_cb->p_scb[xx]->use_rc = TRUE;     /* allowing RC for incoming connection */
                         bta_av_ssm_execute(p_cb->p_scb[xx], BTA_AV_ACP_CONNECT_EVT, p_data);
@@ -1474,7 +1474,7 @@
             {
                 /* We do not have scb for this avdt connection.     */
                 /* Silently close the connection.                   */
-                APPL_TRACE_ERROR0("av scb not available for avdt connection");
+                APPL_TRACE_ERROR("av scb not available for avdt connection");
                 AVDT_DisconnectReq (p_data->str_msg.bd_addr, NULL);
                 return;
             }
@@ -1492,7 +1492,7 @@
         p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FREE);
         if(p_lcb && p_lcb->conn_msk)
         {
-            APPL_TRACE_DEBUG1("conn_msk: 0x%x", p_lcb->conn_msk);
+            APPL_TRACE_DEBUG("conn_msk: 0x%x", p_lcb->conn_msk);
             /* clean up ssm  */
             for(xx=0; xx < BTA_AV_NUM_STRS; xx++)
             {
@@ -1505,7 +1505,7 @@
             }
         }
     }
-    APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb);
+    APPL_TRACE_DEBUG("conn_lcb: 0x%x", p_cb->conn_lcb);
 }
 
 /*******************************************************************************
@@ -1528,7 +1528,7 @@
     tBTA_AV_PEND pend;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG0("bta_av_sig_timer");
+    APPL_TRACE_DEBUG("bta_av_sig_timer");
     for(xx=0; xx<BTA_AV_NUM_LINKS; xx++)
     {
         mask = 1 << xx;
@@ -1565,7 +1565,7 @@
 
     if (p_scb)
     {
-        APPL_TRACE_DEBUG1("bta_av_acp_sig_timer_cback, coll_mask = 0x%02X", p_scb->coll_mask);
+        APPL_TRACE_DEBUG("bta_av_acp_sig_timer_cback, coll_mask = 0x%02X", p_scb->coll_mask);
 
         if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR)
         {
@@ -1628,7 +1628,7 @@
     UINT16              peer_rc_version=0;
     UINT16              categories = 0;
 
-    APPL_TRACE_DEBUG1("bta_av_check_peer_features service_uuid:x%x", service_uuid);
+    APPL_TRACE_DEBUG("bta_av_check_peer_features service_uuid:x%x", service_uuid);
     /* loop through all records we found */
     while (TRUE)
     {
@@ -1655,7 +1655,7 @@
         {
             /* get profile version (if failure, version parameter is not updated) */
             SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version);
-            APPL_TRACE_DEBUG1("peer_rc_version 0x%x", peer_rc_version);
+            APPL_TRACE_DEBUG("peer_rc_version 0x%x", peer_rc_version);
 
             if (peer_rc_version >= AVRC_REV_1_3)
                 peer_features |= (BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_METADATA);
@@ -1674,7 +1674,7 @@
             }
         }
     }
-    APPL_TRACE_DEBUG1("peer_features:x%x", peer_features);
+    APPL_TRACE_DEBUG("peer_features:x%x", peer_features);
     return peer_features;
 }
 
@@ -1699,7 +1699,7 @@
     tBTA_AV_FEAT        peer_features;  /* peer features mask */
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_av_rc_disc_done disc:x%x", p_cb->disc);
+    APPL_TRACE_DEBUG("bta_av_rc_disc_done disc:x%x", p_cb->disc);
     if (!p_cb->disc)
     {
         return;
@@ -1722,7 +1722,7 @@
         }
     }
 
-    APPL_TRACE_DEBUG1("rc_handle %d", rc_handle);
+    APPL_TRACE_DEBUG("rc_handle %d", rc_handle);
     /* check peer version and whether support CT and TG role */
     peer_features = bta_av_check_peer_features (UUID_SERVCLASS_AV_REMOTE_CONTROL);
     if ((p_cb->features & BTA_AV_FEAT_ADV_CTRL) && ((peer_features&BTA_AV_FEAT_ADV_CTRL) == 0))
@@ -1735,7 +1735,7 @@
     p_cb->disc = 0;
     utl_freebuf((void **) &p_cb->p_disc_db);
 
-    APPL_TRACE_DEBUG2("peer_features 0x%x, features 0x%x", peer_features, p_cb->features);
+    APPL_TRACE_DEBUG("peer_features 0x%x, features 0x%x", peer_features, p_cb->features);
 
     /* if we have no rc connection */
     if (rc_handle == BTA_AV_RC_HANDLE_NONE)
@@ -1755,7 +1755,7 @@
 #if (BT_USE_TRACES == TRUE || BT_TRACE_APPL == TRUE)
                 else
                 {
-                    APPL_TRACE_ERROR0("can not find LCB!!");
+                    APPL_TRACE_ERROR("can not find LCB!!");
                 }
 #endif
             }
@@ -1800,17 +1800,17 @@
     tBTA_AV_LCB *p_lcb;
 
     rc_close.rc_handle = BTA_AV_RC_HANDLE_NONE;
-    APPL_TRACE_DEBUG1("bta_av_rc_closed rc_handle:%d", p_msg->handle);
+    APPL_TRACE_DEBUG("bta_av_rc_closed rc_handle:%d", p_msg->handle);
     for(i=0; i<BTA_AV_NUM_RCB; i++)
     {
         p_rcb = &p_cb->rcb[i];
-        APPL_TRACE_DEBUG3("bta_av_rc_closed rcb[%d] rc_handle:%d, status=0x%x", i, p_rcb->handle, p_rcb->status);
+        APPL_TRACE_DEBUG("bta_av_rc_closed rcb[%d] rc_handle:%d, status=0x%x", i, p_rcb->handle, p_rcb->status);
         if(p_rcb->handle == p_msg->handle)
         {
             rc_close.rc_handle = i;
             p_rcb->status &= ~BTA_AV_RC_CONN_MASK;
             p_rcb->peer_features = 0;
-            APPL_TRACE_DEBUG2("       shdl:%d, lidx:%d", p_rcb->shdl, p_rcb->lidx);
+            APPL_TRACE_DEBUG("       shdl:%d, lidx:%d", p_rcb->shdl, p_rcb->lidx);
             if(p_rcb->shdl)
             {
                 p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1];
@@ -1819,7 +1819,7 @@
                     bdcpy(rc_close.peer_addr, p_scb->peer_addr);
                     if(p_scb->rc_handle == p_rcb->handle)
                         p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE;
-                    APPL_TRACE_DEBUG2("shdl:%d, srch:%d", p_rcb->shdl, p_scb->rc_handle);
+                    APPL_TRACE_DEBUG("shdl:%d, srch:%d", p_rcb->shdl, p_scb->rc_handle);
                 }
                 p_rcb->shdl = 0;
             }
@@ -1828,7 +1828,7 @@
                 /* if the RCB uses the extra LCB, use the addr for event and clean it */
                 p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS];
                 bdcpy(rc_close.peer_addr, p_msg->peer_addr);
-                APPL_TRACE_DEBUG6("rc_only closed bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+                APPL_TRACE_DEBUG("rc_only closed bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                               p_msg->peer_addr[0], p_msg->peer_addr[1],
                               p_msg->peer_addr[2], p_msg->peer_addr[3],
                               p_msg->peer_addr[4], p_msg->peer_addr[5]);
@@ -1895,7 +1895,7 @@
     UINT8       *p_addr = NULL;
     UINT8       rc_handle;
 
-    APPL_TRACE_DEBUG2("bta_av_rc_disc 0x%x, %d", disc, bta_av_cb.disc);
+    APPL_TRACE_DEBUG("bta_av_rc_disc 0x%x, %d", disc, bta_av_cb.disc);
     if ((bta_av_cb.disc != 0) || (disc == 0))
         return;
 
@@ -1915,7 +1915,7 @@
 
         if (p_scb)
         {
-            APPL_TRACE_DEBUG1("rc_handle %d", p_scb->rc_handle);
+            APPL_TRACE_DEBUG("rc_handle %d", p_scb->rc_handle);
             p_addr = p_scb->peer_addr;
         }
     }
@@ -1941,7 +1941,7 @@
                             bta_av_avrc_sdp_cback) == AVRC_SUCCESS)
             {
                 p_cb->disc = disc;
-                APPL_TRACE_DEBUG1("disc %d", p_cb->disc);
+                APPL_TRACE_DEBUG("disc %d", p_cb->disc);
             }
         }
     }
@@ -1969,7 +1969,7 @@
 
     if(p_scb)
     {
-        APPL_TRACE_DEBUG2("deregistered %d(h%d)", p_scb->chnl, p_scb->hndl);
+        APPL_TRACE_DEBUG("deregistered %d(h%d)", p_scb->chnl, p_scb->hndl);
         mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
         if(p_scb->chnl == BTA_AV_CHNL_AUDIO)
         {
@@ -1996,6 +1996,11 @@
 #endif
                 bta_av_del_sdp_rec(&p_cb->sdp_a2d_handle);
                 bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+                bta_av_del_sdp_rec(&p_cb->sdp_a2d_snk_handle);
+                bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
+#endif
             }
         }
         else
@@ -2013,7 +2018,7 @@
         utl_freebuf((void **)&p_cb->p_scb[p_scb->hdi]);
     }
 
-    APPL_TRACE_DEBUG3("audio 0x%x, video: 0x%x, disable:%d",
+    APPL_TRACE_DEBUG("audio 0x%x, video: 0x%x, disable:%d",
         p_cb->reg_audio, p_cb->reg_video, p_cb->disabling);
     /* if no stream control block is active */
     if((p_cb->reg_audio + p_cb->reg_video) == 0)
diff --git a/bta/av/bta_av_api.c b/bta/av/bta_av_api.c
index 98718fd..5aa401b 100644
--- a/bta/av/bta_av_api.c
+++ b/bta/av/bta_av_api.c
@@ -63,9 +63,7 @@
     tBTA_AV_API_ENABLE  *p_buf;
 
     /* register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_register(BTA_ID_AV, &bta_av_reg);
-    GKI_sched_unlock();
 
     if ((p_buf = (tBTA_AV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_AV_API_ENABLE))) != NULL)
     {
@@ -111,7 +109,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name, UINT8 app_id)
+void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name, UINT8 app_id, tBTA_AV_DATA_CBACK  *p_data_cback)
 {
     tBTA_AV_API_REG  *p_buf;
 
@@ -130,6 +128,7 @@
             p_buf->p_service_name[0] = 0;
         }
         p_buf->app_id = app_id;
+        p_buf->p_app_data_cback = p_data_cback;
         bta_sys_sendmsg(p_buf);
     }
 }
@@ -166,7 +165,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle, BOOLEAN use_rc, tBTA_SEC sec_mask)
+void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle, BOOLEAN use_rc, tBTA_SEC sec_mask,
+                                                                             UINT16 uuid)
 {
     tBTA_AV_API_OPEN  *p_buf;
 
@@ -178,6 +178,7 @@
         p_buf->use_rc = use_rc;
         p_buf->sec_mask = sec_mask;
         p_buf->switch_res = BTA_AV_RS_NONE;
+        p_buf->uuid = uuid;
         bta_sys_sendmsg(p_buf);
     }
 }
@@ -246,6 +247,31 @@
 
 /*******************************************************************************
 **
+** Function         BTA_AvEnable_Sink
+**
+** Description      Enable/Disable A2DP Sink..
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_AvEnable_Sink(int enable)
+{
+    BT_HDR  *p_buf;
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_AV_API_SINK_ENABLE_EVT;
+        p_buf->layer_specific = enable;
+        bta_sys_sendmsg(p_buf);
+    }
+#else
+    return;
+#endif
+}
+
+/*******************************************************************************
+**
 ** Function         BTA_AvStop
 **
 ** Description      Stop audio/video stream data transfer.
diff --git a/bta/av/bta_av_cfg.c b/bta/av/bta_av_cfg.c
old mode 100755
new mode 100644
diff --git a/bta/av/bta_av_ci.c b/bta/av/bta_av_ci.c
index a1c2ac0..2da1d97 100644
--- a/bta/av/bta_av_ci.c
+++ b/bta/av/bta_av_ci.c
@@ -68,7 +68,7 @@
 **
 *******************************************************************************/
 void bta_av_ci_setconfig(tBTA_AV_HNDL hndl, UINT8 err_code, UINT8 category,
-                         UINT8 num_seid, UINT8 *p_seid, BOOLEAN recfg_needed)
+                         UINT8 num_seid, UINT8 *p_seid, BOOLEAN recfg_needed, UINT8 avdt_handle)
 {
     tBTA_AV_CI_SETCONFIG  *p_buf;
 
@@ -81,6 +81,7 @@
         p_buf->category = category;
         p_buf->recfg_needed = recfg_needed;
         p_buf->num_seid = num_seid;
+        p_buf->avdt_handle= avdt_handle;
         if(p_seid && num_seid)
         {
             p_buf->p_seid   = (UINT8 *)(p_buf + 1);
diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h
index cd22bcb..5deed76 100644
--- a/bta/av/bta_av_int.h
+++ b/bta/av/bta_av_int.h
@@ -96,6 +96,9 @@
     BTA_AV_AVRC_CLOSE_EVT,
     BTA_AV_CONN_CHG_EVT,
     BTA_AV_DEREG_COMP_EVT,
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    BTA_AV_API_SINK_ENABLE_EVT,
+#endif
 #if (AVDT_REPORTING == TRUE)
     BTA_AV_AVDT_RPT_CONN_EVT,
 #endif
@@ -156,16 +159,15 @@
 /* function types for call-out functions */
 typedef BOOLEAN (*tBTA_AV_CO_INIT) (UINT8 *p_codec_type, UINT8 *p_codec_info,
                                    UINT8 *p_num_protect, UINT8 *p_protect_info, UINT8 index);
-
 typedef void (*tBTA_AV_CO_DISC_RES) (tBTA_AV_HNDL hndl, UINT8 num_seps,
-                                     UINT8 num_snk, BD_ADDR addr);
-
+                                     UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
 typedef UINT8 (*tBTA_AV_CO_GETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
                                      UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid,
                                      UINT8 *p_num_protect, UINT8 *p_protect_info);
 typedef void (*tBTA_AV_CO_SETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
-                                    UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
-                                    UINT8 num_protect, UINT8 *p_protect_info);
+                                     UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
+                                     UINT8 num_protect, UINT8 *p_protect_info,
+                                     UINT8 t_local_sep, UINT8 avdt_handle);
 typedef void (*tBTA_AV_CO_OPEN) (tBTA_AV_HNDL hndl,
                                  tBTA_AV_CODEC codec_type, UINT8 *p_codec_info,
                                    UINT16 mtu);
@@ -206,6 +208,7 @@
     BT_HDR              hdr;
     char                p_service_name[BTA_SERVICE_NAME_LEN+1];
     UINT8               app_id;
+    tBTA_AV_DATA_CBACK       *p_app_data_cback;
 } tBTA_AV_API_REG;
 
 
@@ -225,6 +228,7 @@
     BOOLEAN             use_rc;
     tBTA_SEC            sec_mask;
     tBTA_AV_RS_RES      switch_res;
+    UINT16              uuid;  /* uuid of initiator */
 } tBTA_AV_API_OPEN;
 
 /* data type for BTA_AV_API_STOP_EVT */
@@ -319,6 +323,7 @@
     UINT8               num_seid;
     UINT8               *p_seid;
     BOOLEAN             recfg_needed;
+    UINT8               avdt_handle;  /* local sep type for which this stream will be set up */
 } tBTA_AV_CI_SETCONFIG;
 
 /* data type for all stream events from AVDTP */
@@ -376,8 +381,10 @@
 /* type for SEP control block */
 typedef struct
 {
-    UINT8               av_handle;      /* AVDTP handle */
-    tBTA_AV_CODEC       codec_type;     /* codec type */
+    UINT8               av_handle;         /* AVDTP handle */
+    tBTA_AV_CODEC       codec_type;        /* codec type */
+    UINT8               tsep;              /* SEP type of local SEP */
+    tBTA_AV_DATA_CBACK  *p_app_data_cback; /* Application callback for media packets */
 } tBTA_AV_SEP;
 
 
@@ -483,6 +490,7 @@
     UINT8               hdi;            /* the index to SCB[] */
     UINT8               num_seps;       /* number of seps returned by stream discovery */
     UINT8               num_disc_snks;  /* number of discovered snks */
+    UINT8               num_disc_srcs;  /* number of discovered srcs */
     UINT8               sep_info_idx;   /* current index into sep_info */
     UINT8               sep_idx;        /* current index into local seps[] */
     UINT8               rcfg_idx;       /* reconfig requested index into sep_info */
@@ -505,6 +513,7 @@
     UINT8               wait;           /* set 0x1, when getting Caps as ACP, set 0x2, when started */
     UINT8               q_tag;          /* identify the associated q_info union member */
     BOOLEAN             no_rtp_hdr;     /* TRUE if add no RTP header*/
+    UINT16              uuid_int;       /*intended UUID of Initiator to connect to */
 } tBTA_AV_SCB;
 
 #define BTA_AV_RC_ROLE_MASK     0x10
@@ -554,6 +563,9 @@
     TIMER_LIST_ENT      sig_tmr;        /* link timer */
     TIMER_LIST_ENT      acp_sig_tmr;    /* timer to monitor signalling when accepting */
     UINT32              sdp_a2d_handle; /* SDP record handle for audio src */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    UINT32              sdp_a2d_snk_handle; /* SDP record handle for audio snk */
+#endif
     UINT32              sdp_vdp_handle; /* SDP record handle for video src */
     tBTA_AV_FEAT        features;       /* features mask */
     tBTA_SEC            sec_mask;       /* security mask */
@@ -601,6 +613,7 @@
 extern const tBTA_AV_CO_FUNCTS bta_av_a2d_cos;
 extern const tBTA_AV_SACT bta_av_vdp_action[];
 extern tAVDT_CTRL_CBACK * const bta_av_dt_cback[];
+extern void bta_av_stream_data_cback(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt);
 
 /*****************************************************************************
 **  Function prototypes
diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c
index 25c40a5..a8544c4 100644
--- a/bta/av/bta_av_main.c
+++ b/bta/av/bta_av_main.c
@@ -41,6 +41,8 @@
 *****************************************************************************/
 
 /* AVDTP protocol timeout values */
+#define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink"
+
 #ifndef BTA_AV_RET_TOUT
 #define BTA_AV_RET_TOUT     4
 #endif
@@ -150,6 +152,9 @@
 typedef void (*tBTA_AV_NSM_ACT)(tBTA_AV_DATA *p_data);
 static void bta_av_api_enable(tBTA_AV_DATA *p_data);
 static void bta_av_api_register(tBTA_AV_DATA *p_data);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data);
+#endif
 static void bta_av_ci_data(tBTA_AV_DATA *p_data);
 #if (AVDT_REPORTING == TRUE)
 static void bta_av_rpc_conn(tBTA_AV_DATA *p_data);
@@ -175,6 +180,9 @@
     bta_av_rc_closed,       /* BTA_AV_AVRC_CLOSE_EVT */
     bta_av_conn_chg,        /* BTA_AV_CONN_CHG_EVT */
     bta_av_dereg_comp,      /* BTA_AV_DEREG_COMP_EVT */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    bta_av_api_sink_enable, /* BTA_AV_API_SINK_ENABLE_EVT */
+#endif
 #if (AVDT_REPORTING == TRUE)
     bta_av_rpc_conn,        /* BTA_AV_AVDT_RPT_CONN_EVT */
 #endif
@@ -342,7 +350,7 @@
     {
         if(p_bta_av_cfg->p_act_tbl == NULL || p_bta_av_cfg->p_reg == NULL)
         {
-            APPL_TRACE_ERROR0("Video streaming not supported");
+            APPL_TRACE_ERROR("Video streaming not supported");
             sts = BTA_AV_FAIL;
         }
         else
@@ -350,14 +358,14 @@
             /* allow only one Video channel */
             if(bta_av_cb.reg_video)
             {
-                APPL_TRACE_ERROR0("Already registered");
+                APPL_TRACE_ERROR("Already registered");
                 sts = BTA_AV_FAIL;
             }
         }
     }
     else if(chnl != BTA_AV_CHNL_AUDIO)
     {
-        APPL_TRACE_ERROR1("bad channel: %d", chnl);
+        APPL_TRACE_ERROR("bad channel: %d", chnl);
         sts = BTA_AV_FAIL;
     }
 
@@ -407,7 +415,7 @@
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
         else if (AVDT_CONNECT_IND_EVT == event)
         {
-            APPL_TRACE_DEBUG1("CONN_IND is ACP:%d", p_data->hdr.err_param);
+            APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param);
         }
 #endif
 
@@ -425,10 +433,10 @@
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
             if(p_scb)
             {
-                APPL_TRACE_DEBUG2("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
+                APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role);
             }
 #endif
-            APPL_TRACE_DEBUG6("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+            APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                           bd_addr[0], bd_addr[1],
                           bd_addr[2], bd_addr[3],
                           bd_addr[4], bd_addr[5]);
@@ -459,6 +467,49 @@
 }
 #endif
 
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function         bta_av_api_sink_enable
+**
+** Description      activate, deactive A2DP Sink,
+**
+** Returns          void
+**
+*******************************************************************************/
+
+static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data)
+{
+    UINT16 activate_sink = 0;
+    activate_sink = p_data->hdr.layer_specific;
+    APPL_TRACE_DEBUG("bta_av_api_sink_enable %d ", activate_sink)
+    char p_service_name[BTA_SERVICE_NAME_LEN+1];
+    BCM_STRNCPY_S(p_service_name, sizeof(p_service_name),
+            BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
+
+    if(activate_sink)
+    {
+        AVDT_SINK_Activate();
+        if (bta_av_cb.sdp_a2d_snk_handle == 0)
+        {
+            bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
+            A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_service_name, NULL,
+                          A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
+            bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
+        }
+    }
+    else
+    {
+        AVDT_SINK_Deactivate();
+        if (bta_av_cb.sdp_a2d_snk_handle != 0)
+        {
+            SDP_DeleteRecord(bta_av_cb.sdp_a2d_snk_handle);
+            bta_av_cb.sdp_a2d_snk_handle = 0;
+            bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
+        }
+    }
+}
+#endif
 /*******************************************************************************
 **
 ** Function         bta_av_api_register
@@ -480,6 +531,8 @@
     tBTA_AV_CODEC   codec_type;
     tBTA_UTL_COD    cod;
     UINT8           index = 0;
+    char p_avk_service_name[BTA_SERVICE_NAME_LEN+1];
+    BCM_STRNCPY_S(p_avk_service_name, sizeof(p_avk_service_name), BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
 
     memset(&cs,0,sizeof(tAVDT_CS));
 
@@ -491,7 +544,7 @@
         p_scb = bta_av_alloc_scb(registr.chnl);
         if(p_scb == NULL)
         {
-            APPL_TRACE_ERROR0("failed to alloc SCB");
+            APPL_TRACE_ERROR("failed to alloc SCB");
             break;
         }
 
@@ -534,7 +587,11 @@
             }
 
             /* Set the Capturing service class bit */
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+            cod.service = BTM_COD_SERVICE_CAPTURING | BTM_COD_SERVICE_RENDERING;
+#else
             cod.service = BTM_COD_SERVICE_CAPTURING;
+#endif
             utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
         } /* if 1st channel */
 
@@ -550,7 +607,7 @@
         */
         cs.nsc_mask = AVDT_NSC_RECONFIG |
               ((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY);
-        APPL_TRACE_DEBUG1("nsc_mask: 0x%x", cs.nsc_mask);
+        APPL_TRACE_DEBUG("nsc_mask: 0x%x", cs.nsc_mask);
 
         if (p_data->api_reg.p_service_name[0] == 0)
         {
@@ -594,10 +651,28 @@
                 (*bta_av_a2d_cos.init)(&codec_type, cs.cfg.codec_info,
                 &cs.cfg.num_protect, cs.cfg.protect_info, index) == TRUE)
             {
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+            if(index == 1)
+            {
+                cs.tsep = AVDT_TSEP_SNK;
+                cs.p_data_cback = bta_av_stream_data_cback;
+            }
+                APPL_TRACE_DEBUG(" SEP Type = %d",cs.tsep);
+#endif
                 if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS)
                 {
                     p_scb->seps[index].codec_type = codec_type;
-                    APPL_TRACE_DEBUG3("audio[%d] av_handle: %d codec_type: %d",
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+                    p_scb->seps[index].tsep = cs.tsep;
+                    if(cs.tsep == AVDT_TSEP_SNK)
+                        p_scb->seps[index].p_app_data_cback = p_data->api_reg.p_app_data_cback;
+                    else
+                        p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */
+#endif
+
+                    APPL_TRACE_DEBUG("audio[%d] av_handle: %d codec_type: %d",
                         index, p_scb->seps[index].av_handle, p_scb->seps[index].codec_type);
                     index++;
                 }
@@ -613,6 +688,12 @@
                                   A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_handle);
                 bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
 
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+                bta_av_cb.sdp_a2d_snk_handle = SDP_CreateRecord();
+                A2D_AddRecord(UUID_SERVCLASS_AUDIO_SINK, p_avk_service_name, NULL,
+                                  A2D_SUPF_PLAYER, bta_av_cb.sdp_a2d_snk_handle);
+                bta_sys_add_uuid(UUID_SERVCLASS_AUDIO_SINK);
+#endif
                 /* start listening when A2DP is registered */
                 if (bta_av_cb.features & BTA_AV_FEAT_RCTG)
                     bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
@@ -641,7 +722,7 @@
                 }
             }
             bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi);
-            APPL_TRACE_DEBUG1("reg_audio: 0x%x",bta_av_cb.reg_audio);
+            APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
         }
         else
         {
@@ -805,7 +886,7 @@
     int     i;
     UINT8   mask;
 
-    APPL_TRACE_DEBUG1("reg_audio: 0x%x",bta_av_cb.reg_audio);
+    APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio);
     for(i=0; i<BTA_AV_NUM_STRS; i++)
     {
         mask = BTA_AV_HNDL_TO_MSK(i);
@@ -838,7 +919,7 @@
     UINT8       peer_idx = 0;
     UNUSED(status);
 
-    APPL_TRACE_DEBUG1("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx);
+    APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx);
     for(i=0; i<BTA_AV_NUM_STRS; i++)
     {
         /* loop through all the SCBs to find matching peer addresses and report the role change event */
@@ -847,7 +928,7 @@
         if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0) &&
             (p_buf = (tBTA_AV_ROLE_RES *) GKI_getbuf(sizeof(tBTA_AV_ROLE_RES))) != NULL)
         {
-            APPL_TRACE_DEBUG3("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
+            APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl);
             /*
             if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS))
             {
@@ -879,7 +960,7 @@
         p_scb = bta_av_cb.p_scb[bta_av_cb.rs_idx - 1];
         if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN)
         {
-            APPL_TRACE_DEBUG3 ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d",
+            APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d",
                 bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag);
 
             if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id)
@@ -915,7 +996,7 @@
     UNUSED(app_id);
     UNUSED(peer_addr);
 
-    APPL_TRACE_DEBUG2("bta_av_sco_chg_cback:%d status:%d", id, status);
+    APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status);
     if(id)
     {
         bta_av_cb.sco_occupied = TRUE;
@@ -927,7 +1008,7 @@
 
             if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE))
             {
-                APPL_TRACE_DEBUG1("suspending scb:%d", i);
+                APPL_TRACE_DEBUG("suspending scb:%d", i);
                 /* scb is used and started, not suspended automatically */
                 p_scb->sco_suspend = TRUE;
                 stop.flush   = FALSE;
@@ -946,7 +1027,7 @@
 
             if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */
             {
-                APPL_TRACE_DEBUG1("starting scb:%d", i);
+                APPL_TRACE_DEBUG("starting scb:%d", i);
                 bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL);
             }
         }
@@ -1020,7 +1101,7 @@
 
     if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS)
     {
-        APPL_TRACE_ERROR5("bta_av_link_role_ok hndl:x%x role:%d, conn_audio:x%x, bits:%d, features:x%x", p_scb->hndl, role, bta_av_cb.conn_audio, bits, bta_av_cb.features);
+        APPL_TRACE_ERROR("bta_av_link_role_ok hndl:x%x role:%d, conn_audio:x%x, bits:%d, features:x%x", p_scb->hndl, role, bta_av_cb.conn_audio, bits, bta_av_cb.features);
         if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER)))
         {
             if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
@@ -1070,7 +1151,7 @@
                 if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) )
                 {
                     mask = BTA_AV_HNDL_TO_MSK(i);
-                    APPL_TRACE_DEBUG3("[%d] mtu: %d, mask:0x%x",
+                    APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x",
                         i, p_scbi->stream_mtu, mask);
                     if(bta_av_cb.conn_audio & mask)
                     {
@@ -1080,7 +1161,7 @@
                 }
             }
         }
-        APPL_TRACE_DEBUG3("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d",
+        APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d",
             bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu);
     }
     return ret_mtu;
@@ -1153,10 +1234,10 @@
     UINT8               action;
 
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
-    APPL_TRACE_EVENT4("AV event=0x%x(%s) state=%d(%s)",
+    APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)",
         event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state));
 #else
-    APPL_TRACE_EVENT2("AV event=0x%x state=%d", event, p_cb->state);
+    APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state);
 #endif
 
     /* look up the state table for the current state */
@@ -1166,7 +1247,7 @@
 
     /* set next state */
     p_cb->state = state_table[event][BTA_AV_NEXT_STATE];
-    APPL_TRACE_EVENT1("next state=%d", p_cb->state);
+    APPL_TRACE_EVENT("next state=%d", p_cb->state);
 
     /* execute action functions */
     if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE)
@@ -1199,9 +1280,9 @@
     if(event >= first_event)
     {
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
-        APPL_TRACE_VERBOSE2("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event));
+        APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event));
 #else
-        APPL_TRACE_VERBOSE1("AV nsm event=0x%x", event);
+        APPL_TRACE_VERBOSE("AV nsm event=0x%x", event);
 #endif
         /* non state machine events */
         (*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg);
@@ -1209,16 +1290,16 @@
     else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT)
     {
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
-        APPL_TRACE_VERBOSE2("AV sm event=0x%x(%s)", event, bta_av_evt_code(event));
+        APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)", event, bta_av_evt_code(event));
 #else
-        APPL_TRACE_VERBOSE1("AV sm event=0x%x", event);
+        APPL_TRACE_VERBOSE("AV sm event=0x%x", event);
 #endif
         /* state machine events */
         bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg);
     }
     else
     {
-        APPL_TRACE_VERBOSE1("handle=0x%x", p_msg->layer_specific);
+        APPL_TRACE_VERBOSE("handle=0x%x", p_msg->layer_specific);
         /* stream state machine events */
         bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific),
                                 p_msg->event, (tBTA_AV_DATA *) p_msg);
@@ -1318,6 +1399,9 @@
     case BTA_AV_AVRC_CLOSE_EVT: return "AVRC_CLOSE";
     case BTA_AV_CONN_CHG_EVT: return "CONN_CHG";
     case BTA_AV_DEREG_COMP_EVT: return "DEREG_COMP";
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    case BTA_AV_API_SINK_ENABLE_EVT: return "SINK_ENABLE";
+#endif
 #if (AVDT_REPORTING == TRUE)
     case BTA_AV_AVDT_RPT_CONN_EVT: return "RPT_CONN";
 #endif
diff --git a/bta/av/bta_av_sbc.c b/bta/av/bta_av_sbc.c
index a570375..dec24df 100644
--- a/bta/av/bta_av_sbc.c
+++ b/bta/av/bta_av_sbc.c
@@ -441,7 +441,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: ch_mode(0x%02X) not supported", p_pref->ch_mode);
+        APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: ch_mode(0x%02X) not supported", p_pref->ch_mode);
         return A2D_FAIL;
     }
 
@@ -452,7 +452,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: samp_freq(0x%02X) not supported", p_pref->samp_freq);
+        APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: samp_freq(0x%02X) not supported", p_pref->samp_freq);
         return A2D_FAIL;
     }
 
@@ -463,7 +463,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: block_len(0x%02X) not supported", p_pref->block_len);
+        APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: block_len(0x%02X) not supported", p_pref->block_len);
         return A2D_FAIL;
     }
 
@@ -474,7 +474,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: num_subbands(0x%02X) not supported", p_pref->num_subbands);
+        APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: num_subbands(0x%02X) not supported", p_pref->num_subbands);
         return A2D_FAIL;
     }
 
@@ -485,7 +485,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: alloc_mthd(0x%02X) not supported", p_pref->alloc_mthd);
+        APPL_TRACE_ERROR("bta_av_sbc_cfg_for_cap: alloc_mthd(0x%02X) not supported", p_pref->alloc_mthd);
         return A2D_FAIL;
     }
 
@@ -511,6 +511,78 @@
 
 /*******************************************************************************
 **
+** Function         bta_av_sbc_cfg_matches_cap
+**
+** Description      This function checks whether an SBC codec configuration
+**                  matched with capabilities. Here we check subset.
+**
+** Returns          0 if ok, nonzero if error.
+**
+*******************************************************************************/
+UINT8 bta_av_sbc_cfg_matches_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap)
+{
+    UINT8           status = 0;
+    tA2D_SBC_CIE    cfg_cie;
+
+    /* parse configuration */
+    if ((status = A2D_ParsSbcInfo(&cfg_cie, p_cfg, TRUE)) != 0)
+    {
+        APPL_TRACE_ERROR(" bta_av_sbc_cfg_matches_cap Parsing Failed %d", status);
+        return status;
+    }
+
+    /* verify that each parameter is in range */
+
+    APPL_TRACE_DEBUG(" FREQ peer: 0%x, capability  0%x", cfg_cie.samp_freq, p_cap->samp_freq);
+    APPL_TRACE_DEBUG(" CH_MODE peer: 0%x, capability  0%x", cfg_cie.ch_mode, p_cap->ch_mode);
+    APPL_TRACE_DEBUG(" BLOCK_LEN peer: 0%x, capability  0%x", cfg_cie.block_len, p_cap->block_len);
+    APPL_TRACE_DEBUG(" SUB_BAND peer: 0%x, capability  0%x", cfg_cie.num_subbands, p_cap->num_subbands);
+    APPL_TRACE_DEBUG(" ALLOC_MTHD peer: 0%x, capability  0%x", cfg_cie.alloc_mthd, p_cap->alloc_mthd);
+    APPL_TRACE_DEBUG(" MAX_BitPool peer: 0%x, capability  0%x", cfg_cie.max_bitpool, p_cap->max_bitpool);
+    APPL_TRACE_DEBUG(" Min_bitpool peer: 0%x, capability  0%x", cfg_cie.min_bitpool, p_cap->min_bitpool);
+
+    /* sampling frequency */
+    if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
+    {
+        status = A2D_NS_SAMP_FREQ;
+    }
+    /* channel mode */
+    else if ((cfg_cie.ch_mode & p_cap->ch_mode) == 0)
+    {
+        status = A2D_NS_CH_MODE;
+    }
+    /* block length */
+    else if ((cfg_cie.block_len & p_cap->block_len) == 0)
+    {
+        status = A2D_BAD_BLOCK_LEN;
+    }
+    /* subbands */
+    else if ((cfg_cie.num_subbands & p_cap->num_subbands) == 0)
+    {
+        status = A2D_NS_SUBBANDS;
+    }
+    /* allocation method */
+    else if ((cfg_cie.alloc_mthd & p_cap->alloc_mthd) == 0)
+    {
+        status = A2D_NS_ALLOC_MTHD;
+    }
+    /* max bitpool */
+    else if (cfg_cie.max_bitpool > p_cap->max_bitpool)
+    {
+        status = A2D_NS_MAX_BITPOOL;
+    }
+    /* min bitpool */
+    else if (cfg_cie.min_bitpool < p_cap->min_bitpool)
+    {
+        status = A2D_NS_MIN_BITPOOL;
+    }
+
+    return status;
+}
+
+
+/*******************************************************************************
+**
 ** Function         bta_av_sbc_cfg_in_cap
 **
 ** Description      This function checks whether an SBC codec configuration
@@ -532,6 +604,7 @@
 
     /* verify that each parameter is in range */
 
+
     /* sampling frequency */
     if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
     {
diff --git a/bta/av/bta_av_ssm.c b/bta/av/bta_av_ssm.c
index 407146e..64ee42a 100644
--- a/bta/av/bta_av_ssm.c
+++ b/bta/av/bta_av_ssm.c
@@ -162,7 +162,7 @@
 /* API_RC_OPEN_EVT  */      {BTA_AV_SIGNORE,        BTA_AV_SIGNORE,        BTA_AV_INCOMING_SST },
 /* SRC_DATA_READY_EVT */    {BTA_AV_SIGNORE,        BTA_AV_SIGNORE,        BTA_AV_INCOMING_SST },
 /* CI_SETCONFIG_OK_EVT */   {BTA_AV_SETCONFIG_RSP,  BTA_AV_ST_RC_TIMER,    BTA_AV_INCOMING_SST },
-/* CI_SETCONFIG_FAIL_EVT */ {BTA_AV_SETCONFIG_RSP,  BTA_AV_CLEANUP,        BTA_AV_INIT_SST },
+/* CI_SETCONFIG_FAIL_EVT */ {BTA_AV_SETCONFIG_REJ,  BTA_AV_CLEANUP,        BTA_AV_INIT_SST },
 /* SDP_DISC_OK_EVT */       {BTA_AV_FREE_SDB,       BTA_AV_SIGNORE,        BTA_AV_INCOMING_SST },
 /* SDP_DISC_FAIL_EVT */     {BTA_AV_FREE_SDB,       BTA_AV_SIGNORE,        BTA_AV_INCOMING_SST },
 /* STR_DISC_OK_EVT */       {BTA_AV_DISC_RES_AS_ACP,BTA_AV_SIGNORE,        BTA_AV_INCOMING_SST },
@@ -410,7 +410,7 @@
     if(p_scb == NULL)
     {
         /* this stream is not registered */
-        APPL_TRACE_EVENT0("AV channel not registered");
+        APPL_TRACE_EVENT("AV channel not registered");
         return;
     }
 
@@ -436,10 +436,10 @@
     }
 
 #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
-    APPL_TRACE_VERBOSE5("AV Sevent(0x%x)=0x%x(%s) state=%d(%s)",
+    APPL_TRACE_VERBOSE("AV Sevent(0x%x)=0x%x(%s) state=%d(%s)",
         p_scb->hndl, event, bta_av_evt_code(event), p_scb->state, bta_av_sst_code(p_scb->state));
 #else
-    APPL_TRACE_VERBOSE2("AV Sevent=0x%x state=%d", event, p_scb->state);
+    APPL_TRACE_VERBOSE("AV Sevent=0x%x state=%d", event, p_scb->state);
 #endif
 
     /* look up the state table for the current state */
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
old mode 100755
new mode 100644
index ee1ba03..2ef728b
--- a/bta/dm/bta_dm_act.c
+++ b/bta/dm/bta_dm_act.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2003-2012 Broadcom Corporation
+ *  Copyright (C) 2003-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -38,6 +38,7 @@
 #include "l2c_api.h"
 #include "wbt_api.h"
 #include "utl.h"
+#include "gap_api.h"    /* For GAP_BleReadPeerPrefConnParams */
 #include <string.h>
 
 #if (GAP_INCLUDED == TRUE)
@@ -89,7 +90,7 @@
 static char *bta_dm_get_remname(void);
 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
 
-static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr);
+static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport);
 static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
 
 static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
@@ -108,9 +109,11 @@
 static void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr);
 static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
+extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
     #endif
 static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
 static void bta_dm_observe_cmpl_cb (void * p_result);
+static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
 
 #ifndef BTA_DM_BLE_ADV_CHNL_MAP
 #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
@@ -240,26 +243,6 @@
 
 /*******************************************************************************
 **
-** Function         bta_dm_app_ready_timer_cback
-**
-** Description      allow sending EIR to controller
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
-static void bta_dm_app_ready_timer_cback (TIMER_LIST_ENT *p_tle)
-{
-    UNUSED(p_tle);
-    bta_dm_set_eir (NULL);
-}
-#else
-#define bta_dm_app_ready_timer_cback (x)
-#endif
-
-/*******************************************************************************
-**
 ** Function         bta_dm_enable
 **
 ** Description      Initialises the BT device manager
@@ -276,7 +259,7 @@
     /* if already in use, return an error */
     if( bta_dm_cb.is_bta_dm_active == TRUE  )
     {
-        APPL_TRACE_WARNING0("bta_dm_enable - device already started by another application");
+        APPL_TRACE_WARNING("bta_dm_enable - device already started by another application");
         memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE ));
         sec_event.enable.status = BTA_FAILURE;
         if( p_data->enable.p_sec_cback != NULL  )
@@ -330,7 +313,7 @@
     tBTA_BLE_LOCAL_ID_KEYS  id_key;
     tBT_UUID                app_uuid = {LEN_UUID_128,{0}};
 #endif
-    APPL_TRACE_DEBUG1(" bta_dm_sys_hw_cback with event: %i" , status );
+    APPL_TRACE_DEBUG(" bta_dm_sys_hw_cback with event: %i" , status );
 
     /* On H/W error evt, report to the registered DM application callback */
     if (status == BTA_SYS_HW_ERROR_EVT) {
@@ -401,6 +384,11 @@
 #else
         BTM_AclRegisterForChanges(bta_dm_acl_change_cback);
 #endif
+
+#if BLE_VND_INCLUDED == TRUE
+        BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
+#endif
+
         /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
            from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
            But then we have a few HCI commands being invoked above which were still in progress
@@ -415,28 +403,6 @@
 
         bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
 
-
-        // BLUEDROID REMOVE ??
-#if 0
-#if 1
-        /* Create broadcom primary DI record */
-        if(WBT_ExtCreateRecord())
-        {
-#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )
-            /* while app_ready_timer is running, BTA DM doesn't send EIR to controller */
-            bta_dm_cb.app_ready_timer.p_cback = (TIMER_CBACK*)&bta_dm_app_ready_timer_cback;
-            bta_sys_start_timer(&bta_dm_cb.app_ready_timer, 0, 100);
-
-            bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
-#endif
-            bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = 0;    /* primary DI record */
-            bta_dm_di_cb.di_num ++;
-        }
-#else   /* Eventually implement pin code */
-        if (WBT_ExtCreateRecord())
-            WBT_ExtAddPinCode();
-#endif
-#endif
 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
         memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
         bta_dm_gattc_register();
@@ -444,7 +410,7 @@
 
     }
     else
-        APPL_TRACE_DEBUG0(" --- ignored event");
+        APPL_TRACE_DEBUG(" --- ignored event");
 
 }
 
@@ -476,6 +442,9 @@
     bta_dm_disable_search_and_disc();
     bta_dm_cb.disabling = TRUE;
 
+#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
+    BTM_BleClearBgConnDev();
+#endif
 
     if(BTM_GetNumAclLinks()==0)
     {
@@ -483,7 +452,7 @@
         /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
          * BTA_DISABLE_DELAY milliseconds
          */
-        APPL_TRACE_WARNING2("%s BTA_DISABLE_DELAY set to %d ms",
+        APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
                             __FUNCTION__, BTA_DISABLE_DELAY);
         bta_sys_stop_timer(&bta_dm_cb.disable_timer);
         bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
@@ -495,6 +464,7 @@
     else
     {
         bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
+        bta_dm_cb.disable_timer.param = 0;
         bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
     }
 
@@ -516,17 +486,31 @@
 {
     UNUSED(p_tle);
     UINT8 i;
+    tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+    BOOLEAN trigger_disc = FALSE;
 
-    APPL_TRACE_EVENT0(" bta_dm_disable_timer_cback  ");
 
-    if(BTM_GetNumAclLinks())
+    APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
+
+    if(BTM_GetNumAclLinks() && p_tle->param == 0)
     {
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
-            btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
-
+#if (BLE_INCLUDED == TRUE)
+            transport = bta_dm_cb.device_list.peer_device[i].transport;
+#endif
+            btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
+            trigger_disc = TRUE;
         }
 
+        /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
+            to be sent out to avoid jave layer disable timeout */
+        if (trigger_disc)
+        {
+            bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
+            bta_dm_cb.disable_timer.param = 1;
+            bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
+        }
     }
     else
     {
@@ -665,7 +649,7 @@
 {
     if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE)
     {
-        APPL_TRACE_ERROR1("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
+        APPL_TRACE_ERROR("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
     }
     return;
 }
@@ -688,22 +672,25 @@
     BTA_GATTC_CancelOpen(0, p_dev->bd_addr, FALSE);
 #endif
 
-    if (BTM_IsAclConnectionUp(p_dev->bd_addr))
+    if ( BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
+         BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR))
     {
+           APPL_TRACE_DEBUG("%s: ACL Up count  %d", __FUNCTION__,bta_dm_cb.device_list.count);
         /* Take the link down first, and mark the device for removal when disconnected */
-        btm_remove_acl( p_dev->bd_addr) ;
 
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
             if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
-            break;
-        }
-
-        if(i < bta_dm_cb.device_list.count)
-        {
-            bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
+            {
+                bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
+                btm_remove_acl( p_dev->bd_addr,bta_dm_cb.device_list.peer_device[i].transport);
+                APPL_TRACE_DEBUG("%s:transport = %d", __FUNCTION__,
+                                   bta_dm_cb.device_list.peer_device[i].transport);
+                break;
+            }
         }
     }
+
     else    /* Ok to remove the device in application layer */
     {
         BTM_SecDeleteDevice(p_dev->bd_addr);
@@ -770,7 +757,7 @@
     if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
                            trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
     {
-        APPL_TRACE_ERROR2 ("BTA_DM: Error adding device %08x%04x",
+        APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
                 (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
                 (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
     }
@@ -789,15 +776,23 @@
 {
     tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
     UINT8   index;
+    tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
 
-    APPL_TRACE_DEBUG0("bta_dm_close_acl");
+    APPL_TRACE_DEBUG("bta_dm_close_acl");
 
-    if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr))
+    if ( BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_LE) ||
+         BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_BR_EDR))
+
     {
         for (index = 0; index < bta_dm_cb.device_list.count; index ++)
         {
             if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
+            {
+#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
+                transport = bta_dm_cb.device_list.peer_device[index].transport;
+#endif
                 break;
+            }
         }
         if (index != bta_dm_cb.device_list.count)
         {
@@ -806,17 +801,17 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("unknown device, remove ACL failed");
+            APPL_TRACE_ERROR("unknown device, remove ACL failed");
         }
         /* Disconnect the ACL link */
-        btm_remove_acl(p_remove_acl->bd_addr);
+        btm_remove_acl(p_remove_acl->bd_addr, transport);
     }
     /* if to remove the device from security database ? do it now */
     else if (p_remove_acl->remove_dev)
     {
         if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
         {
-            APPL_TRACE_ERROR0("delete device from security database failed.");
+            APPL_TRACE_ERROR("delete device from security database failed.");
         }
 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
         /* need to remove all pending background connection if any */
@@ -844,7 +839,11 @@
     tBTA_DM_SEC sec_event;
     char        *p_name;
 
-    status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
+    if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
+        status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
+    else
+        status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
+
 
     if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
     {
@@ -892,7 +891,7 @@
     tBTM_STATUS status;
     tBTA_DM_SEC sec_event;
 
-    APPL_TRACE_EVENT0(" bta_dm_bond_cancel ");
+    APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
     status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
 
     if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
@@ -960,7 +959,7 @@
     if(!p_dev)
         return;
 
-    APPL_TRACE_DEBUG2(" bta_dm_link_policy set:%d, policy:0x%x",
+    APPL_TRACE_DEBUG(" bta_dm_link_policy set:%d, policy:0x%x",
         p_data->link_policy.set, p_data->link_policy.policy_mask);
     if(p_data->link_policy.set)
     {
@@ -1000,7 +999,7 @@
     if(peer_addr)
         p_dev = bta_dm_find_peer_device(peer_addr);
 
-    APPL_TRACE_DEBUG2(" bta_dm_policy_cback cmd:%d, policy:0x%x",
+    APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
         status, policy);
     switch(status)
     {
@@ -1204,7 +1203,7 @@
     UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
 #endif
 
-    APPL_TRACE_DEBUG1("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
+    APPL_TRACE_DEBUG("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
     if (bta_dm_cfg.avoid_scatter &&
         (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
     {
@@ -1225,7 +1224,7 @@
     {
         if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
         {
-            APPL_TRACE_ERROR0("bta_dm_search_start no resources");
+            APPL_TRACE_ERROR("bta_dm_search_start no resources");
 
             result.status = BTA_FAILURE;
             result.num_resp = 0;
@@ -1240,7 +1239,7 @@
                         bta_dm_inq_results_cb,
                         (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
 
-    APPL_TRACE_EVENT1("bta_dm_search_start status=%d", result.status);
+    APPL_TRACE_EVENT("bta_dm_search_start status=%d", result.status);
     if (result.status != BTM_CMD_STARTED)
     {
         result.num_resp = 0;
@@ -1305,7 +1304,7 @@
 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
     UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
 #endif
-    APPL_TRACE_EVENT2("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
+    APPL_TRACE_EVENT("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
                       p_data->discover.services, p_data->discover.sdp_search);
 
     /* save the search condition */
@@ -1334,6 +1333,7 @@
     bta_dm_search_cb.peer_name[0] = 0;
     bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
     bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
+    bta_dm_search_cb.transport = p_data->discover.transport;
 
     bta_dm_search_cb.name_discover_done = FALSE;
     memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
@@ -1479,7 +1479,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("No buffer to start DI discovery");
+        APPL_TRACE_ERROR("No buffer to start DI discovery");
     }
 
     if ( result == BTA_FAILURE &&
@@ -1501,27 +1501,28 @@
 ** Returns          TRUE if started to get remote name
 **
 *******************************************************************************/
-static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr)
+static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport)
 {
     tBTM_STATUS  btm_status;
 
-    APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name");
+    APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
 
     bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
     bta_dm_search_cb.peer_name[0] = 0;
 
     btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
-                                           (tBTM_CMPL_CB *) bta_dm_remname_cback);
+                                           (tBTM_CMPL_CB *) bta_dm_remname_cback,
+                                           transport);
 
     if ( btm_status == BTM_CMD_STARTED )
     {
-        APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
+        APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
 
         return (TRUE);
     }
     else if ( btm_status == BTM_BUSY )
     {
-        APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
+        APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
 
         /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
         /* adding callback to get notified that current reading remore name done */
@@ -1531,7 +1532,7 @@
     }
     else
     {
-        APPL_TRACE_WARNING1("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
+        APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
 
         return (FALSE);
     }
@@ -1551,7 +1552,7 @@
     tBTA_DM_MSG * p_msg;
     tBTA_DM_SEARCH  data;
 
-    APPL_TRACE_DEBUG0("bta_dm_inq_cmpl");
+    APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
 
     data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
     bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
@@ -1588,7 +1589,7 @@
 *******************************************************************************/
 void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
 {
-    APPL_TRACE_DEBUG0("bta_dm_rmt_name");
+    APPL_TRACE_DEBUG("bta_dm_rmt_name");
 
     if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
     {
@@ -1612,7 +1613,7 @@
 {
     tBTM_INQ_INFO *p_btm_inq_info;
 
-    APPL_TRACE_DEBUG0("bta_dm_disc_rmt_name");
+    APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
 
     p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
     if( p_btm_inq_info )
@@ -1658,7 +1659,7 @@
         || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
         || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
     {
-        APPL_TRACE_DEBUG1("sdp_result::0x%x", p_data->sdp_event.sdp_result);
+        APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
         do
         {
 
@@ -1775,7 +1776,7 @@
 
 //        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
 //        bta_dm_search_cb.p_sdp_db = NULL;
-        APPL_TRACE_DEBUG1("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
+        APPL_TRACE_DEBUG("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
 
         /* Collect the 128-bit services here and put them into the list */
         if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
@@ -1826,12 +1827,12 @@
                                num_uuids*MAX_UUID_SIZE);
                     } else {
                        p_msg->disc_result.result.disc_res.num_uuids = 0;
-                       APPL_TRACE_ERROR1("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
+                       APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
                     }
                 }
                 //copy the raw_data to the discovery result  structure
                 //
-                APPL_TRACE_DEBUG2("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
+                APPL_TRACE_DEBUG("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
 
                 if (  bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0   &&
                     bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
@@ -1846,7 +1847,7 @@
                             bta_dm_search_cb.p_sdp_db->raw_used;
 
                     } else {
-                        APPL_TRACE_DEBUG1("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
+                        APPL_TRACE_DEBUG("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
                     }
 
                     bta_dm_search_cb.p_sdp_db->raw_data = NULL;     //no need to free this - it is a global assigned.
@@ -1854,7 +1855,7 @@
                     bta_dm_search_cb.p_sdp_db->raw_size = 0;
                 }
                 else {
-                    APPL_TRACE_DEBUG0("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
+                    APPL_TRACE_DEBUG("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
                 }
                 /* Done with p_sdp_db. Free it */
                 bta_dm_free_sdp_db(NULL);
@@ -1866,7 +1867,7 @@
                   p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
                   p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
 
-                  APPL_TRACE_EVENT1(" Piggy back the SCN over result field  SCN=%d", bta_dm_search_cb.peer_scn);
+                  APPL_TRACE_EVENT(" Piggy back the SCN over result field  SCN=%d", bta_dm_search_cb.peer_scn);
 
                 }
                 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
@@ -1923,7 +1924,7 @@
 *******************************************************************************/
 void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
 {
-    APPL_TRACE_DEBUG0("bta_dm_search_cmpl");
+    APPL_TRACE_DEBUG("bta_dm_search_cmpl");
 
 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
     utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
@@ -1948,7 +1949,7 @@
 {
     tBTA_DM_MSG *      p_msg;
 
-    APPL_TRACE_DEBUG0("bta_dm_disc_result");
+    APPL_TRACE_DEBUG("bta_dm_disc_result");
 
 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
     /* if any BR/EDR service discovery has been done, report the event */
@@ -1976,7 +1977,7 @@
 *******************************************************************************/
 void bta_dm_search_result (tBTA_DM_MSG *p_data)
 {
-    APPL_TRACE_DEBUG2("bta_dm_search_result searching:0x%04x, result:0x%04x",
+    APPL_TRACE_DEBUG("bta_dm_search_result searching:0x%04x, result:0x%04x",
                        bta_dm_search_cb.services,
                        p_data->disc_result.result.disc_res.services);
 
@@ -2020,7 +2021,7 @@
 {
     UNUSED(p_tle);
 
-    APPL_TRACE_EVENT0(" bta_dm_search_timer_cback  ");
+    APPL_TRACE_EVENT(" bta_dm_search_timer_cback  ");
     bta_dm_search_cb.wait_disc = FALSE;
 
     /* proceed with next device */
@@ -2210,11 +2211,11 @@
         {
             if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
             {
-                APPL_TRACE_DEBUG1("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
+                APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
                 /* try to search all services by search based on L2CAP UUID */
                 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
                 {
-                    APPL_TRACE_ERROR1("services_to_search = %08x",bta_dm_search_cb.services_to_search);
+                    APPL_TRACE_ERROR("services_to_search = %08x",bta_dm_search_cb.services_to_search);
                     if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
                     {
                         uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
@@ -2276,7 +2277,7 @@
                 }
 
 
-                APPL_TRACE_ERROR1("****************search UUID = %04x***********", uuid.uu.uuid16);
+                APPL_TRACE_ERROR("****************search UUID = %04x***********", uuid.uu.uuid16);
                 //SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
                 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
 
@@ -2308,7 +2309,7 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("#### Failed to allocate SDP DB buffer! ####");
+                APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
             }
         }
 
@@ -2348,7 +2349,7 @@
 
     tBTA_DM_MSG * p_msg;
 
-    APPL_TRACE_DEBUG0("bta_dm_discover_next_device");
+    APPL_TRACE_DEBUG("bta_dm_discover_next_device");
 
     /* searching next device on inquiry result */
     if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
@@ -2383,21 +2384,36 @@
 static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
 {
     tBTA_DM_MSG * p_msg;
+    tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+        tBT_DEVICE_TYPE dev_type;
+        tBLE_ADDR_TYPE  addr_type;
 
-    APPL_TRACE_DEBUG6("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
+    if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN)
+    {
+        BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
+        if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM )
+            transport = BT_TRANSPORT_LE;
+    }
+    else
+        transport = bta_dm_search_cb.transport;
+#endif
+
+
+    APPL_TRACE_DEBUG("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
                         remote_bd_addr[0],remote_bd_addr[1],
                         remote_bd_addr[2],remote_bd_addr[3],
                         remote_bd_addr[4],remote_bd_addr[5]);
 
     bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
 
-    APPL_TRACE_DEBUG2("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
+    APPL_TRACE_DEBUG("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
                         bta_dm_search_cb.name_discover_done,
                         bta_dm_search_cb.p_btm_inq_info
                         );
     if ( bta_dm_search_cb.p_btm_inq_info ) {
 
-        APPL_TRACE_DEBUG1("bta_dm_discover_device appl_knows_rem_name %d",
+        APPL_TRACE_DEBUG("bta_dm_discover_device appl_knows_rem_name %d",
                             bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name
                             );
     }
@@ -2407,7 +2423,7 @@
        && (( bta_dm_search_cb.p_btm_inq_info == NULL )
             ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
     {
-        if( bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr) == TRUE )
+            if(bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE)
         {
             return;
         }
@@ -2446,7 +2462,7 @@
             /* check whether connection already exists to the device
                if connection exists, we don't have to wait for ACL
                link to go down to start search on next device */
-            if(BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr))
+            if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR))
                 bta_dm_search_cb.wait_disc = FALSE;
             else
                 bta_dm_search_cb.wait_disc = TRUE;
@@ -2454,14 +2470,13 @@
 #if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
             if ( bta_dm_search_cb.p_btm_inq_info )
             {
-                APPL_TRACE_DEBUG3("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
+                APPL_TRACE_DEBUG("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
                                     bta_dm_search_cb.p_btm_inq_info,
                                     bta_dm_search_cb.p_btm_inq_info->results.device_type,
                                     bta_dm_search_cb.services_to_search
                                     );
             }
-            if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
-            /*
+            if (transport == BT_TRANSPORT_LE)            /*
             if ( bta_dm_search_cb.p_btm_inq_info != NULL &&
                  bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE &&
                  (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/
@@ -2559,7 +2574,7 @@
     result.inq_res.ble_addr_type    = p_inq->ble_addr_type;
     result.inq_res.inq_result_type  = p_inq->inq_result_type;
     result.inq_res.device_type      = p_inq->device_type;
-
+    result.inq_res.flag             = p_inq->flag;
 #endif
 
     /* application will parse EIR to find out remote device name */
@@ -2602,7 +2617,7 @@
 
     tBTA_DM_MSG * p_msg;
 
-    APPL_TRACE_DEBUG0("bta_dm_inq_cmpl_cb");
+    APPL_TRACE_DEBUG("bta_dm_inq_cmpl_cb");
     if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
     {
         p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
@@ -2629,7 +2644,7 @@
     tBTM_STATUS             btm_status;
     UNUSED(dc);
 
-    APPL_TRACE_DEBUG1("bta_dm_service_search_remname_cback name=<%s>", bd_name);
+    APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
 
     /* if this is what we are looking for */
     if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
@@ -2649,16 +2664,17 @@
     {
         /* get name of device */
         btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
-                                                (tBTM_CMPL_CB *) bta_dm_remname_cback);
+                                                (tBTM_CMPL_CB *) bta_dm_remname_cback,
+                                                BT_TRANSPORT_BR_EDR);
         if ( btm_status == BTM_BUSY )
         {
             /* wait for next chance(notification of remote name discovery done) */
-            APPL_TRACE_DEBUG0("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
+            APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
         }
         else if ( btm_status != BTM_CMD_STARTED )
         {
             /* if failed to start getting remote name then continue */
-            APPL_TRACE_WARNING1("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
+            APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
 
             rem_name.length = 0;
             rem_name.remote_bd_name[0] = 0;
@@ -2682,7 +2698,7 @@
 {
     tBTA_DM_REM_NAME * p_msg;
 
-    APPL_TRACE_DEBUG2("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
+    APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
                       p_remote_name->remote_bd_name);
 
     /* remote name discovery is done but it could be failed */
@@ -2691,9 +2707,12 @@
     bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
 
     BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
+
 #if BLE_INCLUDED == TRUE
-    if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
-        GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
+    if (bta_dm_search_cb.transport == BT_TRANSPORT_LE )
+    {
+       GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
+    }
 #endif
     if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
     {
@@ -2856,10 +2875,10 @@
         bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
         bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
         BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
-        if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
+        if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
             return BTM_CMD_STARTED;
 
-        APPL_TRACE_WARNING0(" bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
+        APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
     }
 
     bdcpy(sec_event.pin_req.bd_addr, bd_addr);
@@ -2943,7 +2962,7 @@
     }
     else
     {
-        APPL_TRACE_WARNING0(" bta_dm_new_link_key_cback() Received AMP Key??  ");
+        APPL_TRACE_WARNING(" bta_dm_new_link_key_cback() Received AMP Key??  ");
     }
 
     return BTM_CMD_STARTED;
@@ -3004,7 +3023,7 @@
     tBTA_DM_SEC sec_event;
     tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
 
-    APPL_TRACE_EVENT1("bta_dm_sp_cback: %d", event);
+    APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
     if (!bta_dm_cb.p_sec_cback)
         return BTM_NOT_AUTHORIZED;
 
@@ -3021,7 +3040,7 @@
         status = BTM_SUCCESS;
 #endif
 
-        APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
+        APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
         break;
     case BTM_SP_IO_RSP_EVT:
 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
@@ -3044,22 +3063,56 @@
     /*case BTM_SP_KEY_REQ_EVT: */
     case BTM_SP_KEY_NOTIF_EVT:
 #endif
-        bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
-        /* If the device name is not known, save bdaddr and devclass and initiate a name request */
-        if (p_data->key_notif.bd_name[0] == 0)
+        if(BTM_SP_CFM_REQ_EVT == event)
         {
-            bta_dm_cb.pin_evt = pin_evt;
-            bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
-            BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
-            if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
-                return BTM_CMD_STARTED;
-
-            APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
+          /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
+             call remote name request using values from cfm_req */
+          if(p_data->cfm_req.bd_name[0] == 0)
+          {
+              bta_dm_cb.pin_evt = pin_evt;
+              bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
+              BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
+              if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
+                         BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+                  return BTM_CMD_STARTED;
+              APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
+          }
+          else
+          {
+              /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
+                 copy these values into key_notif from cfm_req */
+              bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
+              BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
+              BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
+                   (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1));
+              sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+           }
         }
-        bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
-        BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
-            BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
-            sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+
+        bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
+        if (BTM_SP_KEY_NOTIF_EVT == event)
+        {
+            /* If the device name is not known, save bdaddr and devclass
+               and initiate a name request with values from key_notif */
+            if(p_data->key_notif.bd_name[0] == 0)
+            {
+                bta_dm_cb.pin_evt = pin_evt;
+                bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
+                BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
+                if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
+                         BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+                return BTM_CMD_STARTED;
+                APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
+            }
+            else
+            {
+                bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
+                BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
+                BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
+                    (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
+                sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
+            }
+        }
 
         bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
 
@@ -3075,17 +3128,18 @@
         /* If the device name is not known, save bdaddr and devclass and initiate a name request */
         if (p_data->rmt_oob.bd_name[0] == 0)
         {
-            bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
-            bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
-            BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
-            if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
-                return BTM_CMD_STARTED;
+             bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
+             bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
+             BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
+             if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
+                      BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
+             return BTM_CMD_STARTED;
+             APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
+         }
 
-            APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
-        }
-        bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
-        BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
-            BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
+         bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
+         BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
+         BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
             sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
 
         bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
@@ -3110,7 +3164,7 @@
         status = BTM_NOT_AUTHORIZED;
         break;
     }
-    APPL_TRACE_EVENT1("dm status: %d", status);
+    APPL_TRACE_EVENT("dm status: %d", status);
     return status;
 }
 
@@ -3134,6 +3188,7 @@
 
     if(bta_dm_cb.p_sec_cback)
         bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
+
 }
 
 /*******************************************************************************
@@ -3227,9 +3282,17 @@
         case BTM_BL_CONN_EVT:
             p_msg->is_new = TRUE;
             bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
+#if BLE_INCLUDED == TRUE
+            p_msg->transport = p_data->conn.transport;
+            p_msg->handle = p_data->conn.handle;
+#endif
             break;
         case BTM_BL_DISCN_EVT:
             bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
+#if BLE_INCLUDED == TRUE
+            p_msg->transport = p_data->discn.transport;
+            p_msg->handle = p_data->discn.handle;
+#endif
             break;
         case BTM_BL_UPDATE_EVT:
             p_msg->busy_level = p_data->update.busy_level;
@@ -3240,9 +3303,9 @@
             p_msg->hci_status = p_data->role_chg.hci_status;
             bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
             break;
-            case BTM_BL_COLLISION_EVT:
-                bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
-                break;;
+        case BTM_BL_COLLISION_EVT:
+            bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
+            break;
         }
 
         p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
@@ -3264,7 +3327,8 @@
 **
 *******************************************************************************/
 static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
-                                     UINT8 *features, BOOLEAN is_new)
+                                     UINT8 *features, BOOLEAN is_new,UINT16 handle,
+                                     tBT_TRANSPORT transport)
 {
 
     tBTA_DM_ACL_CHANGE * p_msg;
@@ -3273,7 +3337,10 @@
     {
         bdcpy (p_msg->bd_addr, p_bda);
         p_msg->is_new = is_new;
-
+#if BLE_INCLUDED == TRUE
+        p_msg->handle   = handle;
+        p_msg->transport = transport;
+#endif
         /* This is collision case */
         if (features != NULL)
         {
@@ -3300,7 +3367,7 @@
 static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
 {
     UNUSED(p1);
-    APPL_TRACE_WARNING1("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
+    APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
     if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
     {
         bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
@@ -3336,13 +3403,13 @@
     }
 #endif
 
-    APPL_TRACE_WARNING1("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
+    APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
     if(bta_dm_cb.cur_av_count)
     {
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
             p_dev = &bta_dm_cb.device_list.peer_device[i];
-            APPL_TRACE_WARNING4("[%d]: state:%d, info:x%x, avoid_rs %d",
+            APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
                                 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
             if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
                (avoid_roleswitch == FALSE))
@@ -3386,6 +3453,7 @@
 
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
     tBTA_DM_PEER_DEVICE *p_dev;
+    memset(&conn, 0, sizeof(tBTA_DM_SEC));
 
     switch(p_data->acl_change.event)
     {
@@ -3402,7 +3470,7 @@
         p_dev = bta_dm_find_peer_device(p_bda);
         if(p_dev)
         {
-            APPL_TRACE_DEBUG3("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
+            APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
                 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
             if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
             {
@@ -3437,7 +3505,7 @@
             bdcpy(conn.role_chg.bd_addr, p_bda);
             conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
             if( bta_dm_cb.p_sec_cback )
-                bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, &conn);
+                bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn);
         }
         return;
     }
@@ -3454,7 +3522,11 @@
     {
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
-            if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
+            if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
+#if BLE_INCLUDED == TRUE
+                 && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
+#endif
+                 )
                 break;
 
         }
@@ -3464,19 +3536,29 @@
             bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
             bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
             bta_dm_cb.device_list.count++;
+#if BLE_INCLUDED == TRUE
+            bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
+            if (p_data->acl_change.transport == BT_TRANSPORT_LE)
+                bta_dm_cb.device_list.le_count++;
+#endif
         }
 
         bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
         bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
         bdcpy(conn.link_up.bd_addr, p_bda);
         bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
-        if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
-            ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) )
+#if BLE_INCLUDED == TRUE
+        conn.link_up.link_type = p_data->acl_change.transport;
+        bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
+#endif
+
+        if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
+            ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)))
         {
             /* both local and remote devices support SSR */
             bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
         }
-        APPL_TRACE_WARNING1("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
+        APPL_TRACE_WARNING("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
         if( bta_dm_cb.p_sec_cback )
             bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
 
@@ -3485,17 +3567,23 @@
     {
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
-            if(bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
+            if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
+#if BLE_INCLUDED == TRUE
+                 ||bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
+#endif
+               )
                 continue;
 
             if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
             {
-                BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
+                if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
+                {
 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
-                /* remove all cached GATT information */
-                BTA_GATTC_Refresh(p_bda);
+                    /* remove all cached GATT information */
+                    BTA_GATTC_Refresh(p_bda);
 #endif
-                issue_unpair_cb = TRUE;
+                    issue_unpair_cb = TRUE;
+                }
             }
 
             conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
@@ -3508,6 +3596,12 @@
         }
         if(bta_dm_cb.device_list.count)
             bta_dm_cb.device_list.count--;
+#if BLE_INCLUDED == TRUE
+        if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
+             (bta_dm_cb.device_list.le_count))
+            bta_dm_cb.device_list.le_count--;
+        conn.link_down.link_type = p_data->acl_change.transport;
+#endif
 
         if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
         {
@@ -3515,7 +3609,7 @@
 
             if(bta_dm_search_cb.sdp_results)
             {
-                APPL_TRACE_EVENT0(" timer stopped  ");
+                APPL_TRACE_EVENT(" timer stopped  ");
                 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
                 bta_dm_discover_next_device();
             }
@@ -3706,7 +3800,7 @@
             if(BTA_ID_AV == id)
                 bta_dm_cb.cur_av_count = app_id;
         }
-        APPL_TRACE_WARNING2("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
+        APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
     }
     else if ((status == BTA_SYS_CONN_BUSY) || (status == BTA_SYS_CONN_IDLE))
     {
@@ -3746,7 +3840,7 @@
                  ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) ==
                      bta_role_switch_blacklist[i].lmp_sub_version))
                 {
-                    APPL_TRACE_EVENT0("Black list F/W version matches.. Delay Role Switch...");
+                    APPL_TRACE_EVENT("Black list F/W version matches.. Delay Role Switch...");
                     return TRUE;
                 }
 
@@ -3767,7 +3861,7 @@
 static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
 {
     UNUSED(p_tle);
-    APPL_TRACE_EVENT0("bta_dm_delay_role_switch_cback: initiating Delayed RS");
+    APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
     bta_dm_adjust_roles (FALSE);
 }
 
@@ -3785,9 +3879,10 @@
 static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
 {
     UINT16 index = 0;
-    if (BTM_IsAclConnectionUp(remote_bd_addr))
+    if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
+         BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR))
     {
-         APPL_TRACE_DEBUG1("%s ACL is not down. Schedule for  Dev Removal when ACL closes",
+         APPL_TRACE_DEBUG("%s ACL is not down. Schedule for  Dev Removal when ACL closes",
                             __FUNCTION__);
         for (index = 0; index < bta_dm_cb.device_list.count; index ++)
         {
@@ -3800,7 +3895,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR1(" %s Device does not exist in DB", __FUNCTION__);
+            APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
         }
     }
     else
@@ -3831,14 +3926,18 @@
 
     UINT8 i;
     BOOLEAN set_master_role = FALSE;
-
-    if(bta_dm_cb.device_list.count)
+#if BLE_INCLUDED == TRUE
+    UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
+#else
+    UINT8 br_count = bta_dm_cb.device_list.count;
+#endif
+    if (br_count)
     {
 
         /* the configuration is no scatternet
          * or AV connection exists and there are more than one ACL link */
-        if( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
-            (bta_dm_cb.cur_av_count && bta_dm_cb.device_list.count > 1) )
+        if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
+             (bta_dm_cb.cur_av_count && br_count > 1) )
         {
 
             L2CA_SetDesireRole (HCI_ROLE_MASTER);
@@ -3848,7 +3947,11 @@
 
         for(i=0; i<bta_dm_cb.device_list.count; i++)
         {
-            if(bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+            if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
+#if BLE_INCLUDED == TRUE
+                && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
+#endif
+                )
             {
                 if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
                     && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
@@ -3858,7 +3961,7 @@
                 }
 
                 if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
-                    || (bta_dm_cb.device_list.count > 1))
+                    || (br_count > 1))
                 {
 
                 /* Initiating immediate role switch with certain remote devices
@@ -3988,7 +4091,7 @@
         {
             if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
             {
-                APPL_TRACE_ERROR0("No space to add UUID for EIR");
+                APPL_TRACE_ERROR("No space to add UUID for EIR");
                 return;
             }
             else
@@ -3998,7 +4101,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("UUID is already added for EIR");
+            APPL_TRACE_ERROR("UUID is already added for EIR");
             return;
         }
     }
@@ -4006,7 +4109,7 @@
     {
         if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
         {
-            APPL_TRACE_ERROR0("UUID is not found for EIR");
+            APPL_TRACE_ERROR("UUID is not found for EIR");
             return;
         }
         else
@@ -4087,7 +4190,7 @@
     {
         if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
         {
-            APPL_TRACE_ERROR0("Fail to read local device name for EIR");
+            APPL_TRACE_ERROR("Fail to read local device name for EIR");
         }
     }
 #endif
@@ -4095,14 +4198,14 @@
     /* Allocate a buffer to hold HCI command */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
     {
-        APPL_TRACE_ERROR0("bta_dm_set_eir couldn't allocate buffer");
+        APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
         return;
     }
     p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
 
     memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
 
-    APPL_TRACE_DEBUG0("BTA is generating EIR");
+    APPL_TRACE_DEBUG("BTA is generating EIR");
 
     if( local_name )
         local_name_len = strlen( local_name );
@@ -4127,7 +4230,7 @@
         /* if UUID doesn't fit remaing space, shorten local name */
         if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
         {
-            APPL_TRACE_WARNING0("BTA EIR: local name is shortened");
+            APPL_TRACE_WARNING("BTA EIR: local name is shortened");
             local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
             data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
         }
@@ -4161,7 +4264,7 @@
             }
             else /* not enough room for all UUIDs */
             {
-                APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+                APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
                 num_uuid = free_eir_length / LEN_UUID_16;
                 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
             }
@@ -4185,7 +4288,7 @@
 
         if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
         {
-            APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+            APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
         }
 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
         else
@@ -4202,7 +4305,7 @@
                     else
                     {
                         data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
-                        APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
+                        APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
                         break;
                     }
                 }
@@ -4239,7 +4342,7 @@
                 else
                 {
                     data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
-                    APPL_TRACE_WARNING0("BTA EIR: UUID 32-bit list is truncated");
+                    APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
                     break;
                 }
             }
@@ -4272,7 +4375,7 @@
                 else
                 {
                     data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
-                    APPL_TRACE_WARNING0("BTA EIR: UUID 128-bit list is truncated");
+                    APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
                     break;
                 }
             }
@@ -4352,12 +4455,12 @@
     tBTA_SERVICE_MASK       service_index = 0;
     tBTM_EIR_SEARCH_RESULT  result;
 
-    APPL_TRACE_DEBUG6("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
+    APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
                         p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
                         p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
                         p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
 
-    APPL_TRACE_DEBUG1("    with services_to_search=0x%08X", *p_services_to_search);
+    APPL_TRACE_DEBUG("    with services_to_search=0x%08X", *p_services_to_search);
 
 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
     /* always do GATT based service discovery by SDP instead of from EIR    */
@@ -4406,7 +4509,7 @@
         service_index++;
     }
 
-    APPL_TRACE_ERROR2("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
+    APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
                         *p_services_to_search, *p_services_found);
 }
 #endif
@@ -4429,20 +4532,20 @@
 
     if( adding )
     {
-        APPL_TRACE_EVENT1("Adding UUID=0x%04X into EIR", uuid16);
+        APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
 
         BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
     }
     else
     {
-        APPL_TRACE_EVENT1("Removing UUID=0x%04X from EIR", uuid16);
+        APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
 
         BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
     }
 
     bta_dm_set_eir (NULL);
 
-    APPL_TRACE_EVENT2("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
+    APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
                        bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
 }
 #endif
@@ -4508,13 +4611,26 @@
 ** Returns         None
 **
 *******************************************************************************/
-void bta_dm_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
 {
     tBTA_STATUS   bta_status = BTA_SUCCESS;
-    tBTA_DM_ENCRYPT_CBACK *p_callback = bta_dm_cb.p_encrypt_cback;
+    tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
+    UINT8   i ;
     UNUSED(p_ref_data);
 
-    bta_dm_cb.p_encrypt_cback = NULL;
+    for (i=0; i<bta_dm_cb.device_list.count; i++)
+    {
+        if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
+            bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+            break;
+    }
+
+    if (i < bta_dm_cb.device_list.count)
+    {
+        p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
+        bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
+    }
+
     switch (result)
     {
         case BTM_SUCCESS:
@@ -4533,11 +4649,11 @@
             break;
     }
 
-    APPL_TRACE_DEBUG2("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
+    APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
 
     if (p_callback)
     {
-        (*p_callback)(bd_addr, bta_status);
+        (*p_callback)(bd_addr, transport, bta_status);
     }
 }
 /*******************************************************************************
@@ -4551,24 +4667,44 @@
 *******************************************************************************/
 void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
 {
+    UINT8 i ;
 
-    APPL_TRACE_DEBUG0("bta_dm_set_encryption"); //todo
+    APPL_TRACE_DEBUG("bta_dm_set_encryption"); //todo
     if (!p_data->set_encryption.p_callback)
     {
-        APPL_TRACE_ERROR0("bta_dm_set_encryption callback is not provided");
+        APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
         return;
     }
 
-    if (bta_dm_cb.p_encrypt_cback)
+    for (i=0; i<bta_dm_cb.device_list.count; i++)
     {
-        (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, BTA_BUSY);
-        return;
+        if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
+            bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
+            break;
     }
+    if (i < bta_dm_cb.device_list.count)
+    {
+        if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback)
+        {
+            APPL_TRACE_ERROR("earlier enc was not done for same device");
+            (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
+                p_data->set_encryption.transport, BTA_BUSY);
+            return;
+        }
 
-
-    bta_dm_cb.p_encrypt_cback = p_data->set_encryption.p_callback;
-    bta_dm_cb.sec_act         = p_data->set_encryption.sec_act;
-    BTM_SetEncryption(p_data->set_encryption.bd_addr, bta_dm_encrypt_cback, &bta_dm_cb.sec_act);
+        if (BTM_SetEncryption(p_data->set_encryption.bd_addr,
+                              p_data->set_encryption.transport,
+                              bta_dm_encrypt_cback,
+                              &p_data->set_encryption.sec_act)
+                              == BTM_CMD_STARTED)
+        {
+            bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
+        }
+    }
+    else
+    {
+        APPL_TRACE_ERROR(" %s Device not found/not connected", __FUNCTION__);
+    }
 }
 
 /*******************************************************************************
@@ -4620,7 +4756,7 @@
     tBTA_DM_SEARCH     result;
     tBTM_INQ_INFO      *p_inq_info;
     UINT16             service_class;
-    APPL_TRACE_DEBUG0("bta_dm_observe_results_cb")
+    APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
 
     bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
     result.inq_res.rssi = p_inq->rssi;
@@ -4663,7 +4799,7 @@
 {
     tBTA_DM_SEARCH  data;
 
-    APPL_TRACE_DEBUG0("bta_dm_observe_cmpl_cb");
+    APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
 
     data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
     if (bta_dm_search_cb.p_scan_cback)
@@ -4690,7 +4826,7 @@
     char* p_name = NULL;
     UINT8 i;
 
-    APPL_TRACE_DEBUG0("bta_dm_ble_smp_cback");
+    APPL_TRACE_DEBUG("bta_dm_ble_smp_cback");
 
     if (!bta_dm_cb.p_sec_cback)
         return BTM_NOT_AUTHORIZED;
@@ -4712,7 +4848,7 @@
 #if BTM_OOB_INCLUDED == FALSE
             status = BTM_SUCCESS;
 #endif
-            APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
+            APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
 
             break;
 
@@ -4849,7 +4985,7 @@
             break;
 
         default:
-            APPL_TRACE_DEBUG1("Unknown key type %d", key_type);
+            APPL_TRACE_DEBUG("Unknown key type %d", key_type);
             break;
     }
     return;
@@ -4874,7 +5010,7 @@
                            (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
                            p_data->add_ble_key.key_type))
     {
-        APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Key for device %08x%04x",
+        APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
                            (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
                            (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
                            (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
@@ -4898,7 +5034,7 @@
                               p_data->add_ble_device.dev_type  ,
                               p_data->add_ble_device.addr_type))
     {
-        APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Device for device %08x%04x",
+        APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
                            (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
                            (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
                            (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
@@ -4920,7 +5056,6 @@
 {
     if (p_data->pin_reply.accept)
     {
-
         BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
     }
     else
@@ -4991,8 +5126,42 @@
     BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
                              p_data->ble_set_scan_params.scan_window);
 }
+/*******************************************************************************
+**
+** Function         bta_dm_ble_update_conn_params
+**
+** Description      This function update LE connection parameters.
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
+{
+    if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
+                                 p_data->ble_update_conn_params.min_int,
+                                 p_data->ble_update_conn_params.max_int,
+                                 p_data->ble_update_conn_params.latency,
+                                 p_data->ble_update_conn_params.timeout))
+    {
+        APPL_TRACE_ERROR("Update connection parameters failed!");
+    }
+}
 
-
+#if BLE_PRIVACY_SPT == TRUE
+/*******************************************************************************
+**
+** Function         bta_dm_ble_config_local_privacy
+**
+** Description      This function set the local device LE privacy settings.
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
+{
+    BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
+}
+#endif
 /*******************************************************************************
 **
 ** Function         bta_dm_ble_observe
@@ -5004,17 +5173,16 @@
 *******************************************************************************/
 void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
 {
-
     tBTM_STATUS status;
     if (p_data->ble_observe.start)
     {
         /*Save the  callback to be called when a scan results are available */
         bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
         if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
-                                bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_SUCCESS)
+                            bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED)
         {
             tBTA_DM_SEARCH  data;
-            APPL_TRACE_WARNING2(" %s BTM_BleObserve  failed. status %d",__FUNCTION__,status);
+            APPL_TRACE_WARNING(" %s BTM_BleObserve  failed. status %d",__FUNCTION__,status);
             data.inq_cmpl.num_resps = 0;
             if (bta_dm_search_cb.p_scan_cback)
             {
@@ -5056,8 +5224,16 @@
 *******************************************************************************/
 void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
 {
-    BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
-                        (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
+    tBTA_STATUS status = BTA_FAILURE;
+
+    if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
+                        (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
+    {
+        status = BTA_SUCCESS;
+    }
+
+    if (p_data->ble_set_adv_data.p_adv_data_cback)
+        (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
 }
 
 /*******************************************************************************
@@ -5071,8 +5247,16 @@
 *******************************************************************************/
 void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
 {
-    BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
-                        (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
+    tBTA_STATUS status = BTA_FAILURE;
+
+    if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
+                        (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
+    {
+        status = BTA_SUCCESS;
+    }
+
+    if (p_data->ble_set_adv_data.p_adv_data_cback)
+        (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
 }
 
 /*******************************************************************************
@@ -5089,6 +5273,509 @@
     BTM_BleBroadcast(p_data->ble_observe.start);
 }
 
+/*******************************************************************************
+**
+** Function         bta_dm_ble_multi_adv_enb
+**
+** Description      This function enables a single advertising instance
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
+    {
+        btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
+                                            p_data->ble_multi_adv_enb.p_params,
+                                            p_data->ble_multi_adv_enb.p_cback,
+                                            p_data->ble_multi_adv_enb.p_ref);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+        bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
+                                    p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
+    }
+}
+/*******************************************************************************
+**
+** Function         bta_dm_ble_multi_adv_param_upd
+**
+** Description      This function updates multiple advertising instance parameters
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
+        && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
+                         (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
+                                   p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
+    }
+}
+/*******************************************************************************
+**
+** Function         bta_dm_ble_multi_adv_data
+**
+** Description      This function write multiple advertising instance adv data
+**                  or scan response data
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
+        && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
+                        p_data->ble_multi_adv_data.is_scan_rsp,
+                        p_data->ble_multi_adv_data.data_mask,
+                        (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
+                                   p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
+    }
+
+}
+/*******************************************************************************
+**
+** Function         btm_dm_ble_multi_adv_disable
+**
+** Description      This function disable a single adv instance
+**
+** Parameters:
+**
+*******************************************************************************/
+void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
+        && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
+                                   p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_setup_storage
+**
+** Description      This function configures up the storage parameters for ADV batch scanning
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
+                                             p_data->ble_set_storage.batch_scan_trunc_max,
+                                             p_data->ble_set_storage.batch_scan_notify_threshold,
+                                             p_data->ble_set_storage.p_setup_cback,
+                                             p_data->ble_set_storage.p_thres_cback,
+                                             p_data->ble_set_storage.p_read_rep_cback,
+                                             p_data->ble_set_storage.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
+                             btm_status);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_enable_batch_scan
+**
+** Description      This function sets up the parameters and enables batch scan
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
+                                            p_data->ble_enable_scan.scan_int,
+                                            p_data->ble_enable_scan.scan_window,
+                                            p_data->ble_enable_scan.discard_rule,
+                                            p_data->ble_enable_scan.addr_type,
+                                            p_data->ble_enable_scan.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
+                             btm_status);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_disable_batch_scan
+**
+** Description      This function disables the batch scan
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
+{
+    UNUSED(p_data);
+    tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
+                             btm_status);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_read_scan_reports
+**
+** Description      This function reads the batch scan reports
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
+                                            p_data->ble_read_reports.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
+                             btm_status);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_track_advertiser
+**
+** Description      This function tracks the specific advertiser
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+    BD_ADDR bda;
+    memset(&bda, 0 , sizeof(BD_ADDR));
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
+                                            p_data->ble_track_advert.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       p_data->ble_track_advert.p_track_adv_cback(0, 0, bda, 0, p_data->ble_track_advert.ref_value);
+}
+
+/*******************************************************************************
+**
+** Function         bta_ble_scan_setup_cb
+**
+** Description      Handle the setup callback from BTM layer and forward it to app layer
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
+                                  tBTM_STATUS status)
+{
+    tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
+
+    APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
+                      ref_value, status);
+
+    switch(evt)
+    {
+        case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
+           bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
+           break;
+        case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
+           bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
+           break;
+        case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
+            bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
+            break;
+        case BTM_BLE_BATCH_SCAN_PARAM_EVT:
+            bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
+            break;
+        default:
+            break;
+    }
+
+    if(NULL != bta_dm_cb.p_setup_cback)
+       bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
+}
+
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+/*******************************************************************************
+**
+** Function         bta_ble_scan_pf_cmpl
+**
+** Description      ADV payload filtering operation complete callback
+**
+**
+** Returns         TRUE if handled, otherwise FALSE.
+**
+*******************************************************************************/
+static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
+                                 tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
+                                 tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+
+    APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
+
+    if(bta_dm_cb.p_scan_filt_cfg_cback)
+       bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
+}
+
+/*******************************************************************************
+**
+** Function         bta_ble_status_cmpl
+**
+** Description      ADV payload filtering enable / disable complete callback
+**
+**
+** Returns          None
+**
+*******************************************************************************/
+static void bta_ble_status_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_REF_VALUE ref_value,
+                                    tBTM_STATUS status)
+{
+    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+
+    APPL_TRACE_DEBUG("bta_ble_status_cmpl: %d, %d", action, status);
+
+    if(bta_dm_cb.p_scan_filt_status_cback)
+       bta_dm_cb.p_scan_filt_status_cback(action, ref_value, st);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_cfg_filter_cond
+**
+** Description      This function configure adv payload filtering condition
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+    tBTA_STATUS status = BTA_FAILURE;
+
+    tBTM_BLE_VSC_CB cmn_vsc_cb;
+
+    APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
+    BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+    if(0 != cmn_vsc_cb.filter_support)
+    {
+        if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
+                            p_data->ble_cfg_filter_cond.cond_type,
+                            (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
+                            (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
+                            bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
+                == BTM_CMD_STARTED)
+        {
+            bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
+            return;
+        }
+    }
+
+    if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback)
+        p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
+                                            p_data->ble_cfg_filter_cond.cond_type, 0, status,
+                                            p_data->ble_cfg_filter_cond.ref_value);
+    return;
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_enable_scan_filter
+**
+** Description      This function enable/disable adv payload filtering condition
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+    tBTA_STATUS status = BTA_FAILURE;
+
+    tBTM_BLE_VSC_CB cmn_vsc_cb;
+    APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
+    BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+
+    if(0 != cmn_vsc_cb.filter_support)
+    {
+        if((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
+                   p_data->ble_enable_scan_filt.p_filt_status_cback,
+                   (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED)
+        bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
+        return;
+    }
+
+    if (p_data->ble_enable_scan_filt.p_filt_status_cback)
+        p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
+                                            p_data->ble_enable_scan_filt.ref_value, status);
+
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_scan_filter_param_setup
+**
+** Description      This function sets up scan filter params
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
+    tBTA_STATUS status = BTA_FAILURE;
+
+    tBTM_BLE_VSC_CB cmn_vsc_cb;
+
+    APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
+    BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+    if(0 != cmn_vsc_cb.filter_support)
+    {
+        if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
+                   p_data->ble_scan_filt_param_setup.filt_index,
+                  (tBTM_BLE_PF_FILT_PARAMS *)p_data->ble_scan_filt_param_setup.p_filt_params,
+                   p_data->ble_scan_filt_param_setup.p_target,
+                   p_data->ble_scan_filt_param_setup.p_filt_param_cback,
+                   p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED)
+        {
+            bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
+            return;
+        }
+    }
+
+    if (p_data->ble_scan_filt_param_setup.p_filt_param_cback)
+        p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
+                                        p_data->ble_scan_filt_param_setup.ref_value, status);
+
+    return;
+}
+#endif
+
+/*******************************************************************************
+**
+** Function         bta_ble_enable_scan_cmpl
+**
+** Description      ADV payload filtering enable / disable complete callback
+**
+**
+** Returns          None
+**
+*******************************************************************************/
+static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
+                                        tBTM_BLE_RX_TIME_MS rx_time,
+                                        tBTM_BLE_IDLE_TIME_MS idle_time,
+                                        tBTM_BLE_ENERGY_USED  energy_used,
+                                        tBTM_STATUS status)
+{
+    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+    tBTA_DM_CONTRL_STATE ctrl_state = 0;
+
+    if (BTA_SUCCESS == st)
+       ctrl_state = bta_dm_pm_obtain_controller_state();
+
+    if (bta_dm_cb.p_energy_info_cback)
+        bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_get_energy_info
+**
+** Description      This function obtains the energy info
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+
+    bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
+    btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
+    if (BTM_CMD_STARTED != btm_status)
+        bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
+}
+
 #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
 #define BTA_DM_GATT_CLOSE_DELAY_TOUT    1000
@@ -5157,7 +5844,7 @@
 
     if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
     {
-        APPL_TRACE_DEBUG3("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
+        APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
 
         if(bta_dm_search_cb.p_ble_rawdata)
         {
@@ -5168,16 +5855,16 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("p_ble_rawdata is NULL");
+            APPL_TRACE_ERROR("p_ble_rawdata is NULL");
         }
 
     }
     else
     {
-        APPL_TRACE_ERROR3("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
+        APPL_TRACE_ERROR("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
     }
 
-    APPL_TRACE_ERROR1("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
+    APPL_TRACE_ERROR("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
     if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
     {
 
@@ -5204,7 +5891,7 @@
 {
     tBTA_DM_MSG *p_msg;
 
-    APPL_TRACE_DEBUG1("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
+    APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
 
     if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
 
@@ -5310,7 +5997,7 @@
         btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
     }
     else
-        BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE);
+        BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE, BTA_GATT_TRANSPORT_LE);
 }
 
 /*******************************************************************************
@@ -5349,14 +6036,14 @@
     p1 = bta_dm_search_cb.peer_bdaddr;
     p2 = p_data->remote_bda;
 
-    APPL_TRACE_DEBUG5("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
+    APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
                       bta_dm_search_cb.state,
                       ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
                       ((p1[4])<<8)+ p1[5],
                       ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
                       ((p2[4])<<8)+ p2[5]);
 
-    APPL_TRACE_DEBUG3("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
+    APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
                       p_data->conn_id,
                       p_data->client_if,
                       p_data->status);
@@ -5384,12 +6071,12 @@
 *******************************************************************************/
 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
 {
-    APPL_TRACE_DEBUG1("bta_dm_gattc_callback event = %d", event);
+    APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
 
     switch (event)
     {
         case BTA_GATTC_REG_EVT:
-            APPL_TRACE_DEBUG1("BTA_GATTC_REG_EVT client_if = %d",  p_data->reg_oper.client_if);
+            APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d",  p_data->reg_oper.client_if);
             if (p_data->reg_oper.status == BTA_GATT_OK)
                 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
             else
@@ -5410,7 +6097,7 @@
             break;
 
         case BTA_GATTC_CLOSE_EVT:
-            APPL_TRACE_DEBUG1("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
+            APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
             /* in case of disconnect before search is completed */
             if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
                  !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
@@ -5425,4 +6112,30 @@
 }
 
 #endif /* BTA_GATT_INCLUDED */
+
+/*******************************************************************************
+**
+** Function         bta_dm_ctrl_features_rd_cmpl_cback
+**
+** Description      callback to handle controller feature read complete
+**
+** Parameters:
+**
+*******************************************************************************/
+static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
+{
+    APPL_TRACE_DEBUG("%s  status = %d ", __FUNCTION__, result);
+    if (result == BTM_SUCCESS)
+    {
+        if(bta_dm_cb.p_sec_cback)
+            bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
+    }
+    else
+    {
+        APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
+    }
+
+}
+
+
 #endif  /* BLE_INCLUDED */
diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c
index 7db7f7b..9000207 100644
--- a/bta/dm/bta_dm_api.c
+++ b/bta/dm/bta_dm_api.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2003-2012 Broadcom Corporation
+ *  Copyright (C) 2003-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
 #include "btm_int.h"
 #include <string.h>
 #include "utl.h"
+#include "vendor_ble.h"
 
 /*****************************************************************************
 **  Constants
@@ -71,15 +72,12 @@
 
     memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
 
-    GKI_sched_lock();
     bta_sys_register (BTA_ID_DM, &bta_dm_reg );
     bta_sys_register (BTA_ID_DM_SEARCH, &bta_dm_search_reg );
 
     /* if UUID list is not provided as static data */
     bta_sys_eir_register(bta_dm_eir_update_uuid);
 
-    GKI_sched_unlock();
-
     if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL)
     {
         p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;
@@ -133,7 +131,7 @@
 {
     BT_HDR    *p_msg;
 
-    APPL_TRACE_API0("BTA_EnableTestMode");
+    APPL_TRACE_API("BTA_EnableTestMode");
 
     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
@@ -158,7 +156,7 @@
 {
     BT_HDR    *p_msg;
 
-    APPL_TRACE_API0("BTA_DisableTestMode");
+    APPL_TRACE_API("BTA_DisableTestMode");
 
     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
@@ -179,14 +177,7 @@
 *******************************************************************************/
 BOOLEAN BTA_DmIsDeviceUp(void)
 {
-
-    BOOLEAN status;
-
-    GKI_sched_lock();
-    status = BTM_IsDeviceUp();
-    GKI_sched_unlock();
-    return status;
-
+    return BTM_IsDeviceUp();
 }
 
 /*******************************************************************************
@@ -262,7 +253,7 @@
 void BTA_DmSetScanParam (UINT16 page_scan_interval, UINT16 page_scan_window,
                                   UINT16 inquiry_scan_interval, UINT16 inquiry_scan_window)
 {
-    APPL_TRACE_API4 ("BTA_DmSetScanParam: %d, %d, %d, %d",
+    APPL_TRACE_API ("BTA_DmSetScanParam: %d, %d, %d, %d",
             page_scan_interval, page_scan_window,
             inquiry_scan_interval, inquiry_scan_window);
 
@@ -505,7 +496,7 @@
     UINT8 link_role;
 
     BTM_GetRole(bd_addr, &link_role);
-    APPL_TRACE_API1("BTA_DmIsMaster role:x%x", link_role);
+    APPL_TRACE_API("BTA_DmIsMaster role:x%x", link_role);
     if(link_role == BTM_ROLE_MASTER)
     {
         is_master = TRUE;
@@ -526,12 +517,29 @@
 *******************************************************************************/
 void BTA_DmBond(BD_ADDR bd_addr)
 {
+    BTA_DmBondByTransport (bd_addr, BTA_TRANSPORT_UNKNOWN);
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBondByTransports
+**
+** Description      This function initiates a bonding procedure with a peer
+**                  device
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport)
+{
     tBTA_DM_API_BOND    *p_msg;
 
     if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL)
     {
         p_msg->hdr.event = BTA_DM_API_BOND_EVT;
         bdcpy(p_msg->bd_addr, bd_addr);
+        p_msg->transport = transport;
         bta_sys_sendmsg(p_msg);
     }
 
@@ -1085,6 +1093,22 @@
 }
 
 /*******************************************************************************
+**
+** Function         BTA_DmGetConnectionState
+**
+** Description      Returns whether the remote device is currently connected.
+**
+** Returns          0 if the device is NOT connected.
+**
+*******************************************************************************/
+UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr )
+{
+    tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr);
+    return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED);
+}
+
+
+/*******************************************************************************
 **                   Device Identification (DI) Server Functions
 *******************************************************************************/
 /*******************************************************************************
@@ -1210,7 +1234,7 @@
 {
     bta_sys_cb.sys_features = sys_features;
 
-    APPL_TRACE_API1("BTA_SysFeatures: sys_features = %d", sys_features);
+    APPL_TRACE_API("BTA_SysFeatures: sys_features = %d", sys_features);
 }
 
 /*******************************************************************************
@@ -1237,8 +1261,6 @@
     }
 }
 
-#if BLE_INCLUDED == TRUE
-
 /*******************************************************************************
 **
 ** Function         BTA_DmAddBleKey
@@ -1466,7 +1488,7 @@
 #if BLE_INCLUDED == TRUE
     tBTA_DM_API_BLE_ADV_PARAMS    *p_msg;
 
-    APPL_TRACE_API2 ("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max);
+    APPL_TRACE_API ("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max);
 
     if ((p_msg = (tBTA_DM_API_BLE_ADV_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_ADV_PARAMS))) != NULL)
     {
@@ -1487,6 +1509,9 @@
     }
 #endif
 }
+/*******************************************************************************
+**                      BLE ADV data management API
+********************************************************************************/
 
 #if BLE_INCLUDED == TRUE
 /*******************************************************************************
@@ -1495,19 +1520,26 @@
 **
 ** Description      This function is called to override the BTA default ADV parameters.
 **
-** Parameters       Pointer to User defined ADV data structure
+** Parameters       data_mask: adv data mask.
+**                  p_adv_cfg: Pointer to User defined ADV data structure. This
+**                             memory space can not be freed until p_adv_data_cback
+**                             is received.
+**                  p_adv_data_cback: set adv data complete callback.
 **
 ** Returns          None
 **
 *******************************************************************************/
-void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg)
+void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
+                            tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
 {
     tBTA_DM_API_SET_ADV_CONFIG  *p_msg;
 
-    if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
+    if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
+        GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
     {
         p_msg->hdr.event = BTA_DM_API_BLE_SET_ADV_CONFIG_EVT;
-		p_msg->data_mask = data_mask;
+        p_msg->data_mask = data_mask;
+        p_msg->p_adv_data_cback = p_adv_data_cback;
         p_msg->p_adv_cfg = p_adv_cfg;
 
         bta_sys_sendmsg(p_msg);
@@ -1525,14 +1557,17 @@
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg)
+BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
+                        tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
 {
     tBTA_DM_API_SET_ADV_CONFIG  *p_msg;
 
-    if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
+    if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
+        GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
     {
         p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT;
-		p_msg->data_mask = data_mask;
+        p_msg->data_mask = data_mask;
+        p_msg->p_adv_data_cback = p_adv_data_cback;
         p_msg->p_adv_cfg = p_adv_cfg;
 
         bta_sys_sendmsg(p_msg);
@@ -1541,6 +1576,163 @@
 
 /*******************************************************************************
 **
+** Function         BTA_DmBleSetStorageParams
+**
+** Description      This function is called to override the BTA scan response.
+**
+** Parameters       batch_scan_full_max -Max storage space (in %) allocated to full scanning
+**                  batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+**                  batch_scan_notify_threshold -Setup notification level based on total space
+**                  p_setup_cback - Setup callback pointer
+**                  p_thres_cback - Threshold callback pointer
+**                  p_rep_cback - Reports callback pointer
+**                  ref_value - Ref value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max,
+                                         UINT8 batch_scan_trunc_max,
+                                         UINT8 batch_scan_notify_threshold,
+                                         tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+                                         tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+                                         tBTA_BLE_SCAN_REP_CBACK* p_rep_cback,
+                                         tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    tBTA_DM_API_SET_STORAGE_CONFIG  *p_msg;
+    bta_dm_cb.p_setup_cback = p_setup_cback;
+    if ((p_msg = (tBTA_DM_API_SET_STORAGE_CONFIG *)
+          GKI_getbuf(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG))) != NULL)
+    {
+        p_msg->hdr.event = BTA_DM_API_BLE_SETUP_STORAGE_EVT;
+        p_msg->p_setup_cback=bta_ble_scan_setup_cb;
+        p_msg->p_thres_cback=p_thres_cback;
+        p_msg->p_read_rep_cback=p_rep_cback;
+        p_msg->ref_value = ref_value;
+        p_msg->batch_scan_full_max = batch_scan_full_max;
+        p_msg->batch_scan_trunc_max = batch_scan_trunc_max;
+        p_msg->batch_scan_notify_threshold = batch_scan_notify_threshold;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleEnableBatchScan
+**
+** Description      This function is called to enable the batch scan
+**
+** Parameters       scan_mode -Batch scan mode
+**                  scan_interval - Scan interval
+**                  scan_window - Scan window
+**                  discard_rule -Discard rules
+**                  addr_type - Address type
+**                  ref_value - Reference value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+                                         UINT32 scan_interval, UINT32 scan_window,
+                                         tBTA_BLE_DISCARD_RULE discard_rule,
+                                         tBLE_ADDR_TYPE        addr_type,
+                                         tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    tBTA_DM_API_ENABLE_SCAN  *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_ENABLE_SCAN *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_SCAN))) != NULL)
+    {
+        p_msg->hdr.event = BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT;
+        p_msg->scan_mode = scan_mode;
+        p_msg->scan_int = scan_interval;
+        p_msg->scan_window = scan_window;
+        p_msg->discard_rule = discard_rule;
+        p_msg->addr_type = addr_type;
+        p_msg->ref_value = ref_value;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleDisableBatchScan
+**
+** Description      This function is called to disable the batch scan
+**
+** Parameters       ref_value - Reference value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    tBTA_DM_API_DISABLE_SCAN  *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_DISABLE_SCAN *)
+         GKI_getbuf(sizeof(tBTA_DM_API_DISABLE_SCAN))) != NULL)
+    {
+        p_msg->hdr.event = BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT;
+        p_msg->ref_value = ref_value;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleReadScanReports
+**
+** Description      This function is called to read scan reports
+**
+** Parameters       scan_type -Batch scan mode
+**                  ref_value - Reference value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+                                             tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    tBTA_DM_API_READ_SCAN_REPORTS  *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_READ_SCAN_REPORTS *)
+          GKI_getbuf(sizeof(tBTA_DM_API_READ_SCAN_REPORTS))) != NULL)
+    {
+        p_msg->hdr.event = BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT;
+        p_msg->scan_type = scan_type;
+        p_msg->ref_value = ref_value;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleTrackAdvertiser
+**
+** Description      This function is called to track advertiser
+**
+** Parameters       ref_value - Reference value
+**                  p_track_adv_cback - Track ADV callback
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+                            tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback)
+{
+    tBTA_DM_API_TRACK_ADVERTISER  *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_TRACK_ADVERTISER *)
+         GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL)
+    {
+        p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT;
+        p_msg->p_track_adv_cback = p_track_adv_cback;
+        p_msg->ref_value = ref_value;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         BTA_DmBleBroadcast
 **
 ** Description      This function starts or stops LE broadcasting.
@@ -1554,7 +1746,7 @@
 {
     tBTA_DM_API_BLE_OBSERVE   *p_msg;
 
-    APPL_TRACE_API1("BTA_DmBleBroadcast: start = %d ", start);
+    APPL_TRACE_API("BTA_DmBleBroadcast: start = %d ", start);
 
     if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
     {
@@ -1599,6 +1791,81 @@
     }
 #endif
 }
+
+/*******************************************************************************
+**
+** Function         bta_dm_discover_send_msg
+**
+** Description      This function send discover message to BTA task.
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+                    tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+                    tBTA_TRANSPORT transport)
+{
+    tBTA_DM_API_DISCOVER    *p_msg;
+    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
+                                sizeof(tBT_UUID) * p_services->num_uuid) :
+                                sizeof(tBTA_DM_API_DISCOVER);
+
+    if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
+    {
+        memset(p_msg, 0, len);
+
+        p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
+        bdcpy(p_msg->bd_addr, bd_addr);
+        p_msg->p_cback = p_cback;
+        p_msg->sdp_search = sdp_search;
+        p_msg->transport    = transport;
+
+        if (p_services != NULL)
+        {
+#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
+            p_msg->services = p_services->srvc_mask;
+            p_msg->num_uuid = p_services->num_uuid;
+            if (p_services->num_uuid != 0)
+            {
+                p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
+                memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
+            }
+#endif
+        }
+
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmDiscoverByTransport
+**
+** Description      This function does service discovery on particular transport
+**                  for services of a
+**                  peer device. When services.num_uuid is 0, it indicates all
+**                  GATT based services are to be searched; otherwise a list of
+**                  UUID of interested services should be provided through
+**                  p_services->p_uuid.
+**
+** Parameters       bd_addr: Bluetooth address of remote device
+**                  p_services :bit mask of the list of services to be discovered
+**                  p_cback : Callback on which result will be received
+**                  sdp_search: if TRUE SDP search will be initiated, else services present in
+**                                     EIR structure of remote device will be returned.
+**                  transport : Physical transport BR/EDR or LE
+** Returns          void
+**
+*******************************************************************************/
+
+void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+                    tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+                    tBTA_TRANSPORT transport)
+{
+    bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport);
+}
+
+
 /*******************************************************************************
 **
 ** Function         BTA_DmDiscoverExt
@@ -1609,7 +1876,11 @@
 **                  UUID of interested services should be provided through
 **                  p_services->p_uuid.
 **
-**
+** Parameters       bd_addr: Bluetooth address of remote device
+**                  p_services :bit mask of the list of services to be discovered
+**                  p_cback : Callback on which result will be received
+**                  sdp_search: if TRUE SDP search will be initiated, else services present in
+**                                     EIR structure of remote device will be returned.
 **
 ** Returns          void
 **
@@ -1617,40 +1888,7 @@
 void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
 {
-#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
-    tBTA_DM_API_DISCOVER    *p_msg;
-    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + sizeof(tBT_UUID) * p_services->num_uuid) :
-                    sizeof(tBTA_DM_API_DISCOVER);
-
-    if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
-    {
-        memset(p_msg, 0, len);
-
-        p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
-        bdcpy(p_msg->bd_addr, bd_addr);
-        p_msg->p_cback = p_cback;
-        p_msg->sdp_search = sdp_search;
-
-        if (p_services != NULL)
-        {
-            p_msg->services = p_services->srvc_mask;
-            p_msg->num_uuid = p_services->num_uuid;
-
-            if (p_services->num_uuid != 0)
-            {
-                p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
-                memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
-            }
-        }
-
-        bta_sys_sendmsg(p_msg);
-    }
-#else
-    UNUSED(bd_addr);
-    UNUSED(p_services);
-    UNUSED(p_cback);
-    UNUSED(sdp_search);
-#endif
+    bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN);
 
 }
 
@@ -1745,7 +1983,454 @@
 *******************************************************************************/
 void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 {
-    UNUSED(privacy_enable);
+#if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
+    tBTA_DM_API_LOCAL_PRIVACY *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL)
+    {
+        memset (p_msg, 0, sizeof(tBTA_DM_API_LOCAL_PRIVACY));
+
+        p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT;
+        p_msg->privacy_enable   = privacy_enable;
+
+        bta_sys_sendmsg(p_msg);
+    }
+#else
+    UNUSED (privacy_enable);
+#endif
+}
+
+#if BLE_INCLUDED == TRUE
+/*******************************************************************************
+**
+** Function         BTA_BleEnableAdvInstance
+**
+** Description      This function enable a Multi-ADV instance with the specififed
+**                  adv parameters
+**
+** Parameters       p_params: pointer to the adv parameter structure.
+**                  p_cback: callback function associated to this adv instance.
+**                  p_ref: reference data pointer to this adv instance.
+**
+** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+                                tBTA_BLE_MULTI_ADV_CBACK *p_cback,
+                                void *p_ref)
+{
+    tBTA_DM_API_BLE_MULTI_ADV_ENB    *p_msg;
+    UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB);
+
+    APPL_TRACE_API ("BTA_BleEnableAdvInstance");
+
+    if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_ENB *) GKI_getbuf(len)) != NULL)
+    {
+        memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB));
+
+        p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_ENB_EVT;
+        p_msg->p_cback      = (void *)p_cback;
+        if (p_params != NULL)
+        {
+            p_msg->p_params =  (void *)(p_msg + 1);
+            memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
+        }
+        p_msg->p_ref        = p_ref;
+
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_BleUpdateAdvInstParam
+**
+** Description      This function update a Multi-ADV instance with the specififed
+**                  adv parameters.
+**
+** Parameters       inst_id: Adv instance to update the parameter.
+**                  p_params: pointer to the adv parameter structure.
+**
+** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
+{
+    tBTA_DM_API_BLE_MULTI_ADV_PARAM    *p_msg;
+    UINT16      len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM);
+
+    APPL_TRACE_API ("BTA_BleUpdateAdvInstParam");
+     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
+     {
+          memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
+          p_msg->inst_id        = inst_id;
+          p_msg->p_params =  (void *)(p_msg + 1);
+          memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
+
+          bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_BleCfgAdvInstData
+**
+** Description      This function configure a Multi-ADV instance with the specififed
+**                  adv data or scan response data.
+**
+** Parameter        inst_id: Adv instance to configure the adv data or scan response.
+**                  is_scan_rsp: is the data scan response or adv data.
+**                  data_mask: adv data type as bit mask.
+**                  p_data: pointer to the ADV data structure tBTA_BLE_ADV_DATA. This
+**                  memory space can not be freed until BTA_BLE_MULTI_ADV_DATA_EVT
+**                  is sent to application.
+**
+** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+                            tBTA_BLE_AD_MASK data_mask,
+                            tBTA_BLE_ADV_DATA *p_data)
+{
+    tBTA_DM_API_BLE_MULTI_ADV_DATA    *p_msg;
+    UINT16      len =  sizeof(tBTA_DM_API_BLE_MULTI_ADV_DATA) ;
+
+    APPL_TRACE_API ("BTA_BleCfgAdvInstData");
+
+    if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL)
+    {
+          memset(p_msg, 0, len);
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
+          p_msg->inst_id      = inst_id;
+          p_msg->is_scan_rsp  = is_scan_rsp;
+          p_msg->data_mask     = data_mask;
+          p_msg->p_data        = p_data;
+
+          bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_BleDisableAdvInstance
+**
+** Description      This function disable a Multi-ADV instance.
+**
+** Parameter        inst_id: instance ID to disable.
+**
+** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
+**
+*******************************************************************************/
+void BTA_BleDisableAdvInstance (UINT8  inst_id)
+{
+    tBTA_DM_API_BLE_MULTI_ADV_DISABLE    *p_msg;
+
+    APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id);
+    if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
+          GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
+    {
+         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
+         p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
+         p_msg->inst_id      = inst_id;
+         bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleCfgFilterCondition
+**
+** Description      This function is called to configure the adv data payload filter
+**                  condition.
+**
+** Parameters       action: to read/write/clear
+**                  cond_type: filter condition type
+**                  filt_index - Filter index
+**                  p_cond: filter condition parameter
+**                  p_cmpl_back - Command completed callback
+**                  ref_value - Reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
+                                 tBTA_DM_BLE_PF_COND_TYPE cond_type,
+                                 tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+                                 tBTA_DM_BLE_PF_COND_PARAM *p_cond,
+                                 tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                                 tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    tBTA_DM_API_CFG_FILTER_COND *p_msg;
+    APPL_TRACE_API ("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type);
+
+    UINT16  len = sizeof(tBTA_DM_API_CFG_FILTER_COND) +
+                  sizeof(tBTA_DM_BLE_PF_COND_PARAM);
+    UINT8 *p;
+
+    if (NULL != p_cond)
+    {
+        switch(cond_type)
+        {
+            case BTA_DM_BLE_PF_SRVC_DATA_PATTERN:
+            case BTA_DM_BLE_PF_MANU_DATA:
+                /* Length of pattern and pattern mask and other elements in */
+                /* tBTA_DM_BLE_PF_MANU_COND */
+                len += ((p_cond->manu_data.data_len) * 2) +
+                        sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8);
+                break;
+
+            case BTA_DM_BLE_PF_LOCAL_NAME:
+                len += ((p_cond->local_name.data_len) + sizeof(UINT8));
+                break;
+
+            case BTM_BLE_PF_SRVC_UUID:
+            case BTM_BLE_PF_SRVC_SOL_UUID:
+                len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK);
+                break;
+
+            default:
+                break;
+        }
+    }
+
+    if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL)
+    {
+        memset (p_msg, 0, len);
+        p_msg->hdr.event        = BTA_DM_API_CFG_FILTER_COND_EVT;
+        p_msg->action           = action;
+        p_msg->cond_type        = cond_type;
+        p_msg->filt_index       = filt_index;
+        p_msg->p_filt_cfg_cback = p_cmpl_cback;
+        p_msg->ref_value        = ref_value;
+
+        if (p_cond)
+        {
+            p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1);
+            memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
+
+            p = (UINT8 *)(p_msg->p_cond_param + 1);
+
+            if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN ||
+                cond_type == BTA_DM_BLE_PF_MANU_DATA)
+            {
+                p_msg->p_cond_param->manu_data.p_pattern = p;
+                p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
+                memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern,
+                    p_cond->manu_data.data_len);
+                p += p_cond->manu_data.data_len;
+
+                if (cond_type == BTA_DM_BLE_PF_MANU_DATA)
+                {
+                    p_msg->p_cond_param->manu_data.company_id_mask =
+                        p_cond->manu_data.company_id_mask;
+                    if ( p_cond->manu_data.p_pattern_mask != NULL)
+                    {
+                        p_msg->p_cond_param->manu_data.p_pattern_mask = p;
+                        memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask,
+                            p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
+                    }
+                }
+            }
+            else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME)
+            {
+                p_msg->p_cond_param->local_name.p_data = p;
+                p_msg->p_cond_param->local_name.data_len =
+                    p_cond->local_name.data_len;
+                memcpy(p_msg->p_cond_param->local_name.p_data,
+                    p_cond->local_name.p_data, p_cond->local_name.data_len);
+            }
+            else if ((cond_type == BTM_BLE_PF_SRVC_UUID
+                || cond_type == BTM_BLE_PF_SRVC_SOL_UUID))
+            {
+                if (p_cond->srvc_uuid.p_target_addr != NULL)
+                {
+                    p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p);
+                    p_msg->p_cond_param->srvc_uuid.p_target_addr->type =
+                        p_cond->srvc_uuid.p_target_addr->type;
+                    memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda,
+                        p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
+                    p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1);
+                }
+                if (p_cond->srvc_uuid.p_uuid_mask)
+                {
+                    p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p;
+                    memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask,
+                        p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK));
+                }
+            }
+        }
+
+        bta_sys_sendmsg(p_msg);
+    }
+#else
+    UNUSED(action);
+    UNUSED(cond_type);
+    UNUSED(filt_index);
+    UNUSED(p_cond);
+    UNUSED(p_cmpl_cback);
+    UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleScanFilterSetup
+**
+** Description      This function is called to setup the adv data payload filter param
+**
+** Parameters       p_target: enable the filter condition on a target device; if NULL
+**                  filt_index - Filter index
+**                  p_filt_params -Filter parameters
+**                  ref_value - Reference value
+**                  action - Add, delete or clear
+**                  p_cmpl_back - Command completed callback
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmBleScanFilterSetup(UINT8 action, tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+                                    tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params,
+                                    tBLE_BD_ADDR *p_target,
+                                    tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+                                    tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *p_msg;
+    APPL_TRACE_API ("BTA_DmBleScanFilterSetup: %d", action);
+
+    UINT16  len = sizeof(tBTA_DM_API_SCAN_FILTER_PARAM_SETUP) + sizeof(tBLE_BD_ADDR);
+
+    if ((p_msg = (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *) GKI_getbuf(len)) != NULL)
+    {
+        memset (p_msg, 0, len);
+
+        p_msg->hdr.event        = BTA_DM_API_SCAN_FILTER_SETUP_EVT;
+        p_msg->action       = action;
+        p_msg->filt_index = filt_index;
+        p_msg->p_filt_params = p_filt_params;
+        p_msg->p_filt_param_cback = p_cmpl_cback;
+        p_msg->ref_value        = ref_value;
+
+        if (p_target)
+        {
+            p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1);
+            memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR));
+        }
+
+        bta_sys_sendmsg(p_msg);
+    }
+#else
+    UNUSED(action);
+    UNUSED(filt_index);
+    UNUSED(p_filt_params);
+    UNUSED(p_target);
+    UNUSED(p_cmpl_cback);
+    UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleGetEnergyInfo
+**
+** Description      This function is called to obtain the energy info
+**
+** Parameters       p_cmpl_cback - Command complete callback
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback)
+{
+    tBTA_DM_API_ENERGY_INFO *p_msg;
+    APPL_TRACE_API ("BTA_DmBleGetEnergyInfo");
+
+    UINT16  len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR);
+
+    if ((p_msg = (tBTA_DM_API_ENERGY_INFO *) GKI_getbuf(len)) != NULL)
+    {
+        memset (p_msg, 0, len);
+        p_msg->hdr.event        = BTA_DM_API_BLE_ENERGY_INFO_EVT;
+        p_msg->p_energy_info_cback = p_cmpl_cback;
+        bta_sys_sendmsg(p_msg);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmEnableScanFilter
+**
+** Description      This function is called to enable the adv data payload filter
+**
+** Parameters       action - enable or disable the APCF feature
+**                  p_cmpl_cback - Command completed callback
+**                  ref_value - Reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback,
+                                    tBTA_DM_BLE_REF_VALUE ref_value)
+{
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg;
+    APPL_TRACE_API ("BTA_DmEnableScanFilter: %d", action);
+
+    UINT16  len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR);
+
+    if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL)
+    {
+        memset (p_msg, 0, len);
+
+        p_msg->hdr.event        = BTA_DM_API_SCAN_FILTER_ENABLE_EVT;
+        p_msg->action       = action;
+        p_msg->ref_value    = ref_value;
+        p_msg->p_filt_status_cback = p_cmpl_cback;
+
+        bta_sys_sendmsg(p_msg);
+    }
+#else
+    UNUSED(action);
+    UNUSED(p_cmpl_cback);
+    UNUSED(ref_value);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleUpdateConnectionParams
+**
+** Description      Update connection parameters, can only be used when connection is up.
+**
+** Parameters:      bd_addr   - BD address of the peer
+**                  min_int   -     minimum connection interval, [0x0004~ 0x4000]
+**                  max_int   -     maximum connection interval, [0x0004~ 0x4000]
+**                  latency   -     slave latency [0 ~ 500]
+**                  timeout   -     supervision timeout [0x000a ~ 0xc80]
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, UINT16 max_int,
+                                    UINT16 latency, UINT16 timeout)
+{
+    tBTA_DM_API_UPDATE_CONN_PARAM *p_msg;
+
+    if ((p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM))) != NULL)
+    {
+        memset (p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM));
+
+        p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT;
+        bdcpy(p_msg->bd_addr, bd_addr);
+        p_msg->min_int   = min_int;
+        p_msg->max_int   = max_int;
+        p_msg->latency   = latency;
+        p_msg->timeout   = timeout;
+
+        bta_sys_sendmsg(p_msg);
+    }
 }
 #endif
 
@@ -1759,6 +2444,7 @@
 **                  bring up unencrypted links, then later encrypt them.
 **
 ** Parameters:      bd_addr       - Address of the peer device
+**                  transport     - transport of the link to be encruypted
 **                  p_callback    - Pointer to callback function to indicat the
 **                                  link encryption status
 **                  sec_act       - This is the security action to indicate
@@ -1770,12 +2456,12 @@
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_DM_ENCRYPT_CBACK *p_callback,
+void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK *p_callback,
                             tBTA_DM_BLE_SEC_ACT sec_act)
 {
     tBTA_DM_API_SET_ENCRYPTION   *p_msg;
 
-    APPL_TRACE_API0("BTA_DmSetEncryption"); //todo
+    APPL_TRACE_API("BTA_DmSetEncryption"); //todo
     if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL)
     {
         memset(p_msg, 0, sizeof(tBTA_DM_API_SET_ENCRYPTION));
@@ -1783,6 +2469,7 @@
         p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT;
 
         memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
+        p_msg->transport    = transport;
         p_msg->p_callback      = p_callback;
         p_msg->sec_act         = sec_act;
 
@@ -1803,11 +2490,11 @@
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev)
+void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport)
 {
     tBTA_DM_API_REMOVE_ACL   *p_msg;
 
-    APPL_TRACE_API0("BTA_DmCloseACL");
+    APPL_TRACE_API("BTA_DmCloseACL");
 
     if ((p_msg = (tBTA_DM_API_REMOVE_ACL *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_ACL))) != NULL)
     {
@@ -1817,6 +2504,7 @@
 
         memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
         p_msg->remove_dev      = remove_dev;
+        p_msg->transport       = transport;
 
         bta_sys_sendmsg(p_msg);
     }
@@ -1841,11 +2529,9 @@
 BTA_API extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration,
                                      tBTA_DM_SEARCH_CBACK *p_results_cb)
 {
-#if BLE_INCLUDED == TRUE
-
     tBTA_DM_API_BLE_OBSERVE   *p_msg;
 
-    APPL_TRACE_API1("BTA_DmBleObserve:start = %d ", start);
+    APPL_TRACE_API("BTA_DmBleObserve:start = %d ", start);
 
     if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
     {
@@ -1858,6 +2544,49 @@
 
         bta_sys_sendmsg(p_msg);
     }
-#endif
 }
+
+/*******************************************************************************
+**
+** Function         BTA_VendorInit
+**
+** Description      This function initializes vendor specific
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorInit (void)
+{
+    APPL_TRACE_API("BTA_VendorInit");
+}
+
+/*******************************************************************************
+**
+** Function         BTA_VendorCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorCleanup (void)
+{
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+    if (cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filter_cleanup();
+        btm_ble_vendor_cleanup();
+    }
+
+    if (cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+        btm_ble_batchscan_cleanup();
+#endif
+
+   if(cmn_ble_vsc_cb.adv_inst_max > 0)
+      btm_ble_multi_adv_cleanup();
+}
+
 #endif
diff --git a/bta/dm/bta_dm_cfg.c b/bta/dm/bta_dm_cfg.c
index e4a1681..62ce9c6 100644
--- a/bta/dm/bta_dm_cfg.c
+++ b/bta/dm/bta_dm_cfg.c
@@ -111,14 +111,16 @@
 tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg;
 
 #if BLE_INCLUDED == TRUE
-#define BTA_DM_NUM_PM_ENTRY         (17+BTA_DM_NUM_JV_ID)  /* number of entries in bta_dm_pm_cfg except the first */
+#  define BTA_DM_NUM_PM_ENTRY         22  /* number of entries in bta_dm_pm_cfg except the first */
+#  define BTA_DM_NUM_PM_SPEC          14  /* number of entries in bta_dm_pm_spec */
 #else
-#define BTA_DM_NUM_PM_ENTRY         (15+BTA_DM_NUM_JV_ID)  /* number of entries in bta_dm_pm_cfg except the first */
+#  define BTA_DM_NUM_PM_ENTRY         20  /* number of entries in bta_dm_pm_cfg except the first */
+#  define BTA_DM_NUM_PM_SPEC          12  /* number of entries in bta_dm_pm_spec */
 #endif
 
-tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[] =
+tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] =
 {
-  {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0},
+  {BTA_ID_SYS, BTA_DM_NUM_PM_ENTRY, 0},  /* reserved: specifies length of this table. */
   {BTA_ID_AG,  BTA_ALL_APP_ID,      0},  /* ag uses first spec table for app id 0 */
   {BTA_ID_CT,  1,                   1},  /* ct (BTA_ID_CT,APP ID=1) spec table */
   {BTA_ID_CG,  BTA_ALL_APP_ID,      1},  /* cg resue ct spec table */
@@ -135,28 +137,16 @@
   {BTA_ID_MSE, BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
   {BTA_ID_JV,  BTA_JV_PM_ID_1,      6},  /* app BTA_JV_PM_ID_1, reuse ftc spec table */
   {BTA_ID_JV,  BTA_ALL_APP_ID,      7},  /* reuse fts spec table */
-  {BTA_ID_HL,  BTA_ALL_APP_ID,      8}   /* reuse fts spec table */
+  {BTA_ID_HL,  BTA_ALL_APP_ID,      8},  /* reuse fts spec table */
+  {BTA_ID_HS,  BTA_ALL_APP_ID,      9},  /* HS spec table */
+  {BTA_ID_PAN, BTUI_PAN_ID_PANU,   10},  /* PANU spec table */
+  {BTA_ID_PAN, BTUI_PAN_ID_NAP,    11}   /* NAP spec table */
 #if BLE_INCLUDED == TRUE
-  ,{BTA_ID_GATTC,  BTA_ALL_APP_ID,   9}   /* gattc spec table */
-  ,{BTA_ID_GATTS,  BTA_ALL_APP_ID,   10}  /* gatts spec table */
+  ,{BTA_ID_GATTC,  BTA_ALL_APP_ID,  12}   /* gattc spec table */
+  ,{BTA_ID_GATTS,  BTA_ALL_APP_ID,  13}  /* gatts spec table */
 #endif
 };
 
-#if BLE_INCLUDED == TRUE /* add GATT PM entry for GATT over BR/EDR  */
-#ifdef BTE_SIM_APP      /* For Insight builds only, see the detail below */
-#define BTA_DM_NUM_PM_SPEC      (11 + 2)  /* additional two */
-#else
-#define BTA_DM_NUM_PM_SPEC      11 /* additional JV*/
-#endif
-#else
-#ifdef BTE_SIM_APP      /* For Insight builds only, see the detail below */
-#define BTA_DM_NUM_PM_SPEC      (9 + 2)  /* additional two */
-#else
-#define BTA_DM_NUM_PM_SPEC      9  /* additional JV*/
-#endif
-#endif
-
-
 tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] =
 {
   /* AG */
@@ -166,12 +156,12 @@
   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn open sniff  */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff  */
       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
-      {{BTA_DM_PM_SNIFF3, 5000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco open, active */
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco close sniff  */
+      {{BTA_DM_PM_SNIFF_SCO_OPEN_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open, active */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close sniff  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
       {{BTA_DM_PM_RETRY,  5000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
@@ -189,7 +179,7 @@
       {{BTA_DM_PM_NO_PREF,   0},  {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
-      {{BTA_DM_PM_SNIFF,  5000},  {BTA_DM_PM_NO_ACTION, 0}},    /* sco open sniff */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open sniff */
       {{BTA_DM_PM_PARK,   5000},  {BTA_DM_PM_NO_ACTION, 0}},    /* sco close  park */
       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
       {{BTA_DM_PM_NO_ACTION, 0},  {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
@@ -223,14 +213,14 @@
   (BTA_DM_PM_SSR3),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF4, 5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  sniff */
+      {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open  sniff */
       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
-      {{BTA_DM_PM_SNIFF2, 5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
-      {{BTA_DM_PM_SNIFF4,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
+      {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+      {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
   }
  },
@@ -242,13 +232,13 @@
   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  sniff */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open  sniff */
       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
   }
@@ -261,14 +251,14 @@
   (BTA_DM_PM_SSR1),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF2, 30000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  sniff */
+      {{BTA_DM_PM_SNIFF_HH_OPEN_IDX, BTA_DM_PM_HH_OPEN_DELAY},{BTA_DM_PM_NO_ACTION, 0}}, /* conn open  sniff */
       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close, used for HH suspend   */
-      {{BTA_DM_PM_SNIFF2, 30000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
-      {{BTA_DM_PM_SNIFF2, 30000},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
+      {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+      {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
   }
  },
@@ -286,7 +276,7 @@
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
   }
@@ -305,7 +295,7 @@
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
-      {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
   }
@@ -318,7 +308,7 @@
   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF,  5000},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn open sniff  */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff  */
       {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
@@ -328,8 +318,64 @@
       {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
       {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
   }
- }
+ },
 
+  /* PANU */
+ {
+  (BTA_DM_PM_SNIFF),                                             /* allow sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+  (BTA_DM_PM_SSR2),                                              /* the SSR entry */
+#endif
+  {
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
+      {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
+  }
+ },
+
+  /* NAP */
+ {
+  (BTA_DM_PM_SNIFF),                                             /* allow sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+  (BTA_DM_PM_SSR2),                                              /* the SSR entry */
+#endif
+  {
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
+      {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}}     /* mode change retry */
+  }
+ },
+
+  /* HS */
+ {
+  (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK),                           /* allow park & sniff */
+#if (BTM_SSR_INCLUDED == TRUE)
+  (BTA_DM_PM_SSR2),                                              /* the SSR entry */
+#endif
+  {
+      {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn open sniff  */
+      {{BTA_DM_PM_NO_PREF,   0},   {BTA_DM_PM_NO_ACTION, 0}},   /* conn close  */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app open */
+      {{BTA_DM_PM_NO_ACTION, 0},   {BTA_DM_PM_NO_ACTION, 0}},   /* app close */
+      {{BTA_DM_PM_SNIFF3, 7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco open, active */
+      {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* sco close sniff  */
+      {{BTA_DM_PM_SNIFF,  7000},   {BTA_DM_PM_NO_ACTION, 0}},   /* idle */
+      {{BTA_DM_PM_ACTIVE,    0},   {BTA_DM_PM_NO_ACTION, 0}},   /* busy */
+      {{BTA_DM_PM_RETRY,  7000},   {BTA_DM_PM_NO_ACTION, 0}}    /* mode change retry */
+  }
+ }
 #if BLE_INCLUDED == TRUE
     /* GATTC */
  ,{
@@ -338,13 +384,13 @@
   (BTA_DM_PM_SSR2),                                              /* the SSR entry */
 #endif
   {
-      {{BTA_DM_PM_SNIFF,  10000},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn open  active */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open  active */
       {{BTA_DM_PM_NO_PREF,    0},   {BTA_DM_PM_NO_ACTION, 0}},    /* conn close  */
       {{BTA_DM_PM_ACTIVE,     0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app open */
       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* app close */
       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco open  */
       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},    /* sco close   */
-      {{BTA_DM_PM_SNIFF,  10000},   {BTA_DM_PM_NO_ACTION, 0}},    /* idle */
+      {{BTA_DM_PM_SNIFF_A2DP_IDX, 10000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */
       {{BTA_DM_PM_ACTIVE,     0},   {BTA_DM_PM_NO_ACTION, 0}},    /* busy */
 #if (AMP_INCLUDED == TRUE)
       {{BTA_DM_PM_NO_ACTION,  0},   {BTA_DM_PM_NO_ACTION, 0}},   /* amp */
@@ -387,21 +433,29 @@
 #endif  /* BTE_SIM_APP */
 };
 
+/* Please refer to the SNIFF table definitions in bta_api.h.
+ *
+ * Adding to or Modifying the Table
+ * Additional sniff parameter entries can be added for BTA_DM_PM_SNIFF5 - BTA_DM_PM_SNIFF7.
+ * Overrides of additional table entries can be specified in bdroid_buildcfg.h.  If additional
+ * sniff parameter entries are added or an override of an existing entry is specified in
+ * bdroid_buildcfg.h then the BTA_DM_PM_*_IDX defines in bta_api.h will need to be match the new
+ * ordering.
+ *
+ * Table Ordering
+ * Sniff Table entries must be ordered from highest latency (biggest interval) to lowest latency.
+ * If there is a conflict among the connected services the setting with the lowest latency will
+ * be selected.
+ */
 tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] =
 {
-/* more sniff parameter entries can be added for BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed
-When entries are added or removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index
-BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the bdroid_buildcfg.h settings.
-The SNIFF table entries must be in the order from highest latency (biggest interval) to lowest latency.
-If there's a conflict among the connected services, the setting with lowest latency wins.
-*/
 /* sniff modes: max interval, min interval, attempt, timeout */
-  {800, 400, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF - A2DP */
-  {400, 200, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF1 */
-  {180, 150, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF2- HD idle */
-  {150,  50, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF3- SCO open */
-  { 54,  30, 4, 1, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF4- HD active*/
-  {800, 400, 0, 0, BTM_PM_MD_PARK}
+  {BTA_DM_PM_SNIFF_MAX,  BTA_DM_PM_SNIFF_MIN,  BTA_DM_PM_SNIFF_ATTEMPT,  BTA_DM_PM_SNIFF_TIMEOUT,  BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF - A2DP */
+  {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF1 */
+  {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF2- HD idle */
+  {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF3- SCO open */
+  {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF4- HD active*/
+  {BTA_DM_PM_PARK_MAX,   BTA_DM_PM_PARK_MIN,   BTA_DM_PM_PARK_ATTEMPT,   BTA_DM_PM_PARK_TIMEOUT,   BTM_PM_MD_PARK}
 
 #ifdef BTE_SIM_APP      /* For Insight builds only */
   /* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable),
diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h
index dd3e16c..e54dcff 100644
--- a/bta/dm/bta_dm_int.h
+++ b/bta/dm/bta_dm_int.h
@@ -99,10 +99,30 @@
     BTA_DM_API_BLE_CONN_PARAM_EVT,
     BTA_DM_API_BLE_SCAN_PARAM_EVT,
     BTA_DM_API_BLE_OBSERVE_EVT,
+    BTA_DM_API_UPDATE_CONN_PARAM_EVT,
+#if BLE_PRIVACY_SPT == TRUE
+    BTA_DM_API_LOCAL_PRIVACY_EVT,
+#endif
     BTA_DM_API_BLE_ADV_PARAM_EVT,
     BTA_DM_API_BLE_SET_ADV_CONFIG_EVT,
     BTA_DM_API_BLE_SET_SCAN_RSP_EVT,
     BTA_DM_API_BLE_BROADCAST_EVT,
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    BTA_DM_API_CFG_FILTER_COND_EVT,
+    BTA_DM_API_SCAN_FILTER_SETUP_EVT,
+    BTA_DM_API_SCAN_FILTER_ENABLE_EVT,
+#endif
+    BTA_DM_API_BLE_MULTI_ADV_ENB_EVT,
+    BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT,
+    BTA_DM_API_BLE_MULTI_ADV_DATA_EVT,
+    BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT,
+    BTA_DM_API_BLE_SETUP_STORAGE_EVT,
+    BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT,
+    BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT,
+    BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT,
+    BTA_DM_API_BLE_TRACK_ADVERTISER_EVT,
+    BTA_DM_API_BLE_ENERGY_INFO_EVT,
 #endif
 
 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
@@ -209,6 +229,7 @@
     tBTA_SERVICE_MASK services;
     tBTA_DM_SEARCH_CBACK * p_cback;
     BOOLEAN         sdp_search;
+    tBTA_TRANSPORT  transport;
 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
     UINT8           num_uuid;
     tBT_UUID        *p_uuid;
@@ -231,6 +252,7 @@
 {
     BT_HDR      hdr;
     BD_ADDR bd_addr;
+    tBTA_TRANSPORT transport;
 } tBTA_DM_API_BOND;
 
 /* data type for BTA_DM_API_BOND_CANCEL_EVT */
@@ -238,6 +260,7 @@
 {
     BT_HDR          hdr;
     BD_ADDR         bd_addr;
+    tBTA_TRANSPORT  transport;
 } tBTA_DM_API_BOND_CANCEL;
 
 /* data type for BTA_DM_API_PIN_REPLY_EVT */
@@ -365,6 +388,10 @@
     UINT8           new_role;
     BD_ADDR         bd_addr;
     UINT8           hci_status;
+#if BLE_INCLUDED == TRUE
+    UINT16          handle;
+    tBT_TRANSPORT   transport;
+#endif
 } tBTA_DM_ACL_CHANGE;
 
 /* data type for BTA_DM_PM_BTM_STATUS_EVT */
@@ -424,6 +451,7 @@
 typedef struct
 {
     BT_HDR                    hdr;
+    tBTA_TRANSPORT            transport;
     tBTA_DM_ENCRYPT_CBACK     *p_callback;
     tBTA_DM_BLE_SEC_ACT       sec_act;
     BD_ADDR                   bd_addr;
@@ -526,11 +554,99 @@
 typedef struct
 {
     BT_HDR                  hdr;
+    BOOLEAN                 enable;
+
+}tBTA_DM_API_BLE_FEATURE;
+
+/* multi adv data structure */
+typedef struct
+{
+    BT_HDR                      hdr;
+    tBTA_BLE_MULTI_ADV_CBACK    *p_cback;
+    void                        *p_ref;
+    tBTA_BLE_ADV_PARAMS         *p_params;
+}tBTA_DM_API_BLE_MULTI_ADV_ENB;
+
+typedef struct
+{
+    BT_HDR                      hdr;
+    UINT8                        inst_id;
+    tBTA_BLE_ADV_PARAMS         *p_params;
+}tBTA_DM_API_BLE_MULTI_ADV_PARAM;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    UINT8                   inst_id;
+    BOOLEAN                 is_scan_rsp;
+    tBTA_BLE_AD_MASK        data_mask;
+    tBTA_BLE_ADV_DATA      *p_data;
+}tBTA_DM_API_BLE_MULTI_ADV_DATA;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    UINT8                   inst_id;
+}tBTA_DM_API_BLE_MULTI_ADV_DISABLE;
+
+typedef struct
+{
+    BT_HDR                  hdr;
     UINT16                  data_mask;
     tBTA_BLE_ADV_DATA       *p_adv_cfg;
+    tBTA_SET_ADV_DATA_CMPL_CBACK    *p_adv_data_cback;
 }tBTA_DM_API_SET_ADV_CONFIG;
 
-#endif
+typedef struct
+{
+    BT_HDR                  hdr;
+    UINT8                   batch_scan_full_max;
+    UINT8                   batch_scan_trunc_max;
+    UINT8                   batch_scan_notify_threshold;
+    tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback;
+    tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback;
+    tBTA_BLE_SCAN_REP_CBACK *p_read_rep_cback;
+    tBTA_DM_BLE_REF_VALUE    ref_value;
+} tBTA_DM_API_SET_STORAGE_CONFIG;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    tBTA_BLE_SCAN_MODE      scan_mode;
+    UINT32                  scan_int;
+    UINT32                  scan_window;
+    tBTA_BLE_DISCARD_RULE   discard_rule;
+    tBLE_ADDR_TYPE          addr_type;
+    tBTA_DM_BLE_REF_VALUE   ref_value;
+} tBTA_DM_API_ENABLE_SCAN;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    tBTA_DM_BLE_REF_VALUE    ref_value;
+} tBTA_DM_API_DISABLE_SCAN;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    tBTA_BLE_SCAN_MODE scan_type;
+    tBTA_DM_BLE_REF_VALUE    ref_value;
+} tBTA_DM_API_READ_SCAN_REPORTS;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    tBTA_DM_BLE_REF_VALUE ref_value;
+    tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback;
+} tBTA_DM_API_TRACK_ADVERTISER;
+
+typedef struct
+{
+    BT_HDR                  hdr;
+    tBTA_BLE_ENERGY_INFO_CBACK *p_energy_info_cback;
+} tBTA_DM_API_ENERGY_INFO;
+
+#endif /* BLE_INCLUDED */
 
 typedef struct
 {
@@ -563,7 +679,50 @@
     BT_HDR      hdr;
     BD_ADDR     bd_addr;
     BOOLEAN     remove_dev;
+    tBTA_TRANSPORT transport;
+
 }tBTA_DM_API_REMOVE_ACL;
+typedef struct
+{
+    BT_HDR      hdr;
+    BD_ADDR     bd_addr;
+    UINT16      min_int;
+    UINT16      max_int;
+    UINT16      latency;
+    UINT16      timeout;
+}tBTA_DM_API_UPDATE_CONN_PARAM;
+
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+typedef struct
+{
+    BT_HDR                          hdr;
+    tBTA_DM_BLE_SCAN_COND_OP        action;
+    tBTA_DM_BLE_PF_COND_TYPE        cond_type;
+    tBTA_DM_BLE_PF_FILT_INDEX       filt_index;
+    tBTA_DM_BLE_PF_COND_PARAM       *p_cond_param;
+    tBTA_DM_BLE_PF_CFG_CBACK      *p_filt_cfg_cback;
+    tBTA_DM_BLE_REF_VALUE            ref_value;
+}tBTA_DM_API_CFG_FILTER_COND;
+
+typedef struct
+{
+    BT_HDR                          hdr;
+    UINT8                           action;
+    tBTA_DM_BLE_PF_STATUS_CBACK    *p_filt_status_cback;
+    tBTA_DM_BLE_REF_VALUE            ref_value;
+}tBTA_DM_API_ENABLE_SCAN_FILTER;
+
+typedef struct
+{
+    BT_HDR                          hdr;
+    UINT8                           action;
+    tBTA_DM_BLE_PF_FILT_INDEX       filt_index;
+    tBTA_DM_BLE_PF_FILT_PARAMS      *p_filt_params;
+    tBLE_BD_ADDR                    *p_target;
+    tBTA_DM_BLE_PF_PARAM_CBACK      *p_filt_param_cback;
+    tBTA_DM_BLE_REF_VALUE            ref_value;
+}tBTA_DM_API_SCAN_FILTER_PARAM_SETUP;
+#endif
 
 /* union of all data types */
 typedef union
@@ -640,6 +799,23 @@
     tBTA_DM_API_LOCAL_PRIVACY           ble_local_privacy;
     tBTA_DM_API_BLE_ADV_PARAMS          ble_set_adv_params;
     tBTA_DM_API_SET_ADV_CONFIG          ble_set_adv_data;
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    tBTA_DM_API_SCAN_FILTER_PARAM_SETUP ble_scan_filt_param_setup;
+    tBTA_DM_API_CFG_FILTER_COND         ble_cfg_filter_cond;
+    tBTA_DM_API_ENABLE_SCAN_FILTER      ble_enable_scan_filt;
+#endif
+    tBTA_DM_API_UPDATE_CONN_PARAM       ble_update_conn_params;
+    tBTA_DM_API_BLE_MULTI_ADV_ENB       ble_multi_adv_enb;
+    tBTA_DM_API_BLE_MULTI_ADV_PARAM     ble_multi_adv_param;
+    tBTA_DM_API_BLE_MULTI_ADV_DATA      ble_multi_adv_data;
+    tBTA_DM_API_BLE_MULTI_ADV_DISABLE   ble_multi_adv_disable;
+
+    tBTA_DM_API_SET_STORAGE_CONFIG      ble_set_storage;
+    tBTA_DM_API_ENABLE_SCAN             ble_enable_scan;
+    tBTA_DM_API_READ_SCAN_REPORTS       ble_read_reports;
+    tBTA_DM_API_DISABLE_SCAN            ble_disable_scan;
+    tBTA_DM_API_TRACK_ADVERTISER        ble_track_advert;
+    tBTA_DM_API_ENERGY_INFO             ble_energy_info;
 #endif
 
     tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT set_afh_channel_assessment;
@@ -679,13 +855,15 @@
     tBTA_PREF_ROLES             pref_role;
     BOOLEAN                     in_use;
     tBTA_DM_DEV_INFO            info;
+    tBTA_DM_ENCRYPT_CBACK      *p_encrypt_cback;
 #if (BTM_SSR_INCLUDED == TRUE)
     tBTM_PM_STATUS              prev_low;   /* previous low power mode used */
 #endif
     tBTA_DM_PM_ACTTION          pm_mode_attempted;
     tBTA_DM_PM_ACTTION          pm_mode_failed;
     BOOLEAN                     remove_dev_pending;
-
+    UINT16                      conn_handle;
+    tBT_TRANSPORT               transport;
 } tBTA_DM_PEER_DEVICE;
 
 
@@ -696,7 +874,9 @@
 {
     tBTA_DM_PEER_DEVICE    peer_device[BTA_DM_NUM_PEER_DEVICE];
     UINT8                  count;
-
+#if BLE_INCLUDED == TRUE
+    UINT8                  le_count;
+#endif
 } tBTA_DM_ACTIVE_LINK;
 
 
@@ -738,6 +918,14 @@
     BOOLEAN                     is_bta_dm_active;
     tBTA_DM_ACTIVE_LINK         device_list;
     tBTA_DM_SEC_CBACK           *p_sec_cback;
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+    tBTA_BLE_SCAN_SETUP_CBACK   *p_setup_cback;
+    tBTA_DM_BLE_PF_CFG_CBACK     *p_scan_filt_cfg_cback;
+    tBTA_DM_BLE_PF_STATUS_CBACK  *p_scan_filt_status_cback;
+    tBTA_DM_BLE_PF_PARAM_CBACK   *p_scan_filt_param_cback;
+    tBTA_BLE_MULTI_ADV_CBACK     *p_multi_adv_cback;
+    tBTA_BLE_ENERGY_INFO_CBACK   *p_energy_info_cback;
+#endif
     TIMER_LIST_ENT              signal_strength_timer;
     tBTA_SIG_STRENGTH_MASK      signal_strength_mask;
     UINT16                      state;
@@ -777,8 +965,6 @@
 
 #endif
 
-    tBTA_DM_ENCRYPT_CBACK      *p_encrypt_cback;
-    tBTA_DM_BLE_SEC_ACT         sec_act;
     TIMER_LIST_ENT              switch_delay_timer;
 
 } tBTA_DM_CB;
@@ -809,7 +995,7 @@
     tSDP_UUID              uuid;
     UINT8                  peer_scn;
     BOOLEAN                sdp_search;
-
+    tBTA_TRANSPORT         transport;
 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     tBTA_DM_SEARCH_CBACK * p_scan_cback;
 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
@@ -996,11 +1182,30 @@
 extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data);
 
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+extern void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data);
+extern void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data);
+extern void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data);
+#endif
+extern void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data);
+
+extern void bta_dm_ble_setup_storage(tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_enable_batch_scan(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_disable_batch_scan(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_read_scan_reports(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_track_advertiser(tBTA_DM_MSG * p_data);
+extern void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data);
+
 #endif
 extern void bta_dm_set_encryption(tBTA_DM_MSG *p_data);
 extern void bta_dm_confirm(tBTA_DM_MSG *p_data);
@@ -1035,6 +1240,8 @@
 extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data);
 extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr);
 
+extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
+
 extern void bta_dm_pm_active(BD_ADDR peer_addr);
 
 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )
diff --git a/bta/dm/bta_dm_main.c b/bta/dm/bta_dm_main.c
index 0f6b91a..35835c7 100644
--- a/bta/dm/bta_dm_main.c
+++ b/bta/dm/bta_dm_main.c
@@ -96,10 +96,29 @@
     bta_dm_ble_set_conn_params,      /* BTA_DM_API_BLE_CONN_PARAM_EVT */
     bta_dm_ble_set_scan_params,      /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
     bta_dm_ble_observe,
+    bta_dm_ble_update_conn_params,   /* BTA_DM_API_UPDATE_CONN_PARAM_EVT */
+#if BLE_PRIVACY_SPT == TRUE
+    bta_dm_ble_config_local_privacy,   /* BTA_DM_API_LOCAL_PRIVACY_EVT */
+#endif
     bta_dm_ble_set_adv_params,     /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
     bta_dm_ble_set_adv_config,     /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */
     bta_dm_ble_set_scan_rsp,       /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */
     bta_dm_ble_broadcast,          /* BTA_DM_API_BLE_BROADCAST_EVT */
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+    bta_dm_cfg_filter_cond,         /* BTA_DM_API_CFG_FILTER_COND_EVT */
+    bta_dm_scan_filter_param_setup, /* BTA_DM_API_SCAN_FILTER_SETUP_EVT */
+    bta_dm_enable_scan_filter,      /* BTA_DM_API_SCAN_FILTER_ENABLE_EVT */
+#endif
+    bta_dm_ble_multi_adv_enb,           /*  BTA_DM_API_BLE_MULTI_ADV_ENB_EVT*/
+    bta_dm_ble_multi_adv_upd_param,     /*  BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT */
+    bta_dm_ble_multi_adv_data,          /*  BTA_DM_API_BLE_MULTI_ADV_DATA_EVT */
+    btm_dm_ble_multi_adv_disable,       /*  BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT */
+    bta_dm_ble_setup_storage,      /* BTA_DM_API_BLE_SETUP_STORAGE_EVT */
+    bta_dm_ble_enable_batch_scan,  /* BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT */
+    bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */
+    bta_dm_ble_read_scan_reports,  /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */
+    bta_dm_ble_track_advertiser,   /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
+    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 #endif
 
 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
@@ -300,7 +319,7 @@
 {
     UINT16  event = p_msg->event & 0x00ff;
 
-    APPL_TRACE_EVENT1("bta_dm_sm_execute event:0x%x", event);
+    APPL_TRACE_EVENT("bta_dm_sm_execute event:0x%x", event);
 
     /* execute action functions */
     if(event < BTA_DM_NUM_ACTIONS)
@@ -344,7 +363,7 @@
     UINT8               action;
     int                 i;
 
-    APPL_TRACE_EVENT2("bta_dm_search_sm_execute state:%d, event:0x%x",
+    APPL_TRACE_EVENT("bta_dm_search_sm_execute state:%d, event:0x%x",
         bta_dm_search_cb.state, p_msg->event);
 
     /* look up the state table for the current state */
diff --git a/bta/dm/bta_dm_pm.c b/bta/dm/bta_dm_pm.c
index 7008498..6bf1697 100644
--- a/bta/dm/bta_dm_pm.c
+++ b/bta/dm/bta_dm_pm.c
@@ -31,8 +31,6 @@
 #include "btm_api.h"
 
 #include <string.h>
-#include <cutils/properties.h>
-#include <utils/Log.h>
 
 
 static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
@@ -107,7 +105,7 @@
     {
         if(bta_dm_cb.pm_timer[i].in_use)
         {
-            APPL_TRACE_DEBUG1("stop dm_pm_timer:%d", i);
+            APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
             bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
             bta_dm_cb.pm_timer[i].in_use = FALSE;
         }
@@ -133,7 +131,7 @@
 
         if(bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
         {
-            APPL_TRACE_DEBUG1("stop dm_pm_timer:%d", i);
+            APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
             bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
             bta_dm_cb.pm_timer[i].in_use = FALSE;
             break;
@@ -164,7 +162,7 @@
 #endif
     tBTA_DM_PEER_DEVICE *p_dev;
 
-    APPL_TRACE_DEBUG3("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id);
+    APPL_TRACE_DEBUG("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id);
 
     btm_status = BTM_ReadLocalVersion (&vers);
     p_dev = bta_dm_find_peer_device(peer_addr);
@@ -243,7 +241,7 @@
         }
         else
         {
-            APPL_TRACE_WARNING0("bta_dm_act no entry for connected service cbs");
+            APPL_TRACE_WARNING("bta_dm_act no entry for connected service cbs");
             return;
         }
     }
@@ -252,7 +250,7 @@
         /* check if we have more connected service that cbs */
         if(bta_dm_conn_srvcs.count == BTA_DM_NUM_CONN_SRVS)
         {
-            APPL_TRACE_WARNING0("bta_dm_act no more connected service cbs");
+            APPL_TRACE_WARNING("bta_dm_act no more connected service cbs");
             return;
         }
 
@@ -261,7 +259,7 @@
         bta_dm_conn_srvcs.conn_srvc[j].app_id = app_id;
         bdcpy(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr);
 
-        APPL_TRACE_WARNING2("new conn_srvc id:%d, app_id:%d", id, app_id);
+        APPL_TRACE_WARNING("new conn_srvc id:%d, app_id:%d", id, app_id);
 
         bta_dm_conn_srvcs.count++;
         bta_dm_conn_srvcs.conn_srvc[j].state = status;
@@ -336,8 +334,6 @@
     tBTA_DM_PM_SPEC     *p_pm_spec;
     tBTA_DM_PM_ACTN     *p_act0, *p_act1;
     tBTA_DM_SRVCS       *p_srvcs;
-    char buf[PROPERTY_VALUE_MAX];
-    int len = 0, temp = 0;
 
 
     if(!bta_dm_cb.device_list.count)
@@ -372,7 +368,7 @@
             p_act0 = &p_pm_spec->actn_tbl[p_srvcs->state][0];
             p_act1 = &p_pm_spec->actn_tbl[p_srvcs->state][1];
 
-            APPL_TRACE_DEBUG3("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j);
+            APPL_TRACE_DEBUG("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j);
             allowed_modes |= p_pm_spec->allow_mask;
 
             /* PM actions are in the order of strictness */
@@ -436,14 +432,8 @@
                 bta_dm_cb.pm_timer[i].in_use = TRUE;
                 bdcpy(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr);
                 bta_dm_cb.pm_timer[i].timer.p_cback = bta_dm_pm_timer_cback;
-                len = property_get("bluetooth.force_pm_timer", buf, NULL);
-                if(len > 0)
-                {
-                    sscanf(buf, "%d", &temp);
-                    timeout = temp;
-                }
                 bta_sys_start_timer(&bta_dm_cb.pm_timer[i].timer, 0, timeout);
-                APPL_TRACE_DEBUG2("start dm_pm_timer:%d, %d", i, timeout);
+                APPL_TRACE_DEBUG("start dm_pm_timer:%d, %d", i, timeout);
                 return;
 
             }
@@ -453,7 +443,7 @@
         /* no more timers */
         if(i==BTA_DM_NUM_PM_TIMER)
         {
-            APPL_TRACE_WARNING0("bta_dm_act dm_pm_timer no more");
+            APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more");
             return;
         }
     }
@@ -479,7 +469,7 @@
         }
         else
         {
-            APPL_TRACE_DEBUG0("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request");
+            APPL_TRACE_DEBUG("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request");
         }
     }
     else if(pm_action == BTA_DM_PM_ACTIVE)
@@ -539,13 +529,13 @@
     BTM_ReadPowerMode(p_peer_dev->peer_bdaddr, &mode);
 
 #if (BTM_SSR_INCLUDED == TRUE)
-    APPL_TRACE_DEBUG3("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info);
+    APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info);
     if (mode != BTM_PM_MD_SNIFF ||
         (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) &&
          HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr)) &&
          !(p_peer_dev->info & BTA_DM_DI_USE_SSR)))
 #else
-    APPL_TRACE_DEBUG2("bta_dm_pm_sniff cur:%d, idx:%d", mode, index);
+    APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index);
     if(mode != BTM_PM_MD_SNIFF)
 #endif
     {
@@ -564,12 +554,12 @@
         }
         else if (status == BTM_SUCCESS)
         {
-            APPL_TRACE_DEBUG0("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS");
+            APPL_TRACE_DEBUG("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS");
             p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
         }
         else /* error */
         {
-            APPL_TRACE_ERROR1("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status);
+            APPL_TRACE_ERROR("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status);
             p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
         }
     }
@@ -607,7 +597,7 @@
                     && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID )
                     || (p_bta_dm_pm_cfg[j].app_id == bta_dm_conn_srvcs.conn_srvc[i].app_id)))
                 {
-                    APPL_TRACE_WARNING2("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d",
+                    APPL_TRACE_WARNING("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d",
                         bta_dm_conn_srvcs.conn_srvc[i].id, bta_dm_conn_srvcs.conn_srvc[i].app_id);
                     break;
                 }
@@ -635,7 +625,7 @@
     }
 
     p_spec = &p_bta_dm_ssr_spec[ssr];
-    APPL_TRACE_WARNING2("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat);
+    APPL_TRACE_WARNING("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat);
     if(p_spec->max_lat)
     {
         /* set the SSR parameters. */
@@ -708,7 +698,7 @@
     tBTA_DM_PM_TIMER  *p_buf;
     UINT8 i;
 
-    APPL_TRACE_WARNING0("dm_pm_timer expires");
+    APPL_TRACE_WARNING("dm_pm_timer expires");
 
     for(i=0; i<BTA_DM_NUM_PM_TIMER; i++)
     {
@@ -718,7 +708,7 @@
 
             if(&bta_dm_cb.pm_timer[i].timer == (TIMER_LIST_ENT*) p_tle)
             {
-                APPL_TRACE_WARNING1("dm_pm_timer expires %d", i);
+                APPL_TRACE_WARNING("dm_pm_timer expires %d", i);
                 bta_dm_cb.pm_timer[i].in_use = FALSE;
                 break;
             }
@@ -758,7 +748,7 @@
     tBTA_DM_PEER_DEVICE *p_dev;
     tBTA_DM_DEV_INFO    info;
 
-    APPL_TRACE_DEBUG1("bta_dm_pm_btm_status:%d", p_data->pm_status.status);
+    APPL_TRACE_DEBUG("bta_dm_pm_btm_status:%d", p_data->pm_status.status);
     p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr);
     if(NULL == p_dev)
         return;
@@ -772,7 +762,7 @@
             we should not try it again*/
             if (p_data->pm_status.hci_status != 0)
             {
-                APPL_TRACE_ERROR1("bta_dm_pm_btm_status  hci_status=%d", p_data->pm_status.hci_status);
+                APPL_TRACE_ERROR("bta_dm_pm_btm_status  hci_status=%d", p_data->pm_status.hci_status);
                 p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
 
                 if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF))
@@ -816,6 +806,16 @@
             break;
 #endif
         case BTM_PM_STS_SNIFF:
+            if (p_data->pm_status.hci_status == 0)
+            {
+                /* Stop PM timer now if already active for
+                 * particular device since link is already
+                 * put in sniff mode by remote device, and
+                 * PM timer sole purpose is to put the link
+                 * in sniff mode from host side.
+                 */
+                bta_dm_pm_stop_timer(p_data->pm_status.bd_addr);
+            }
             p_dev->info &= ~(BTA_DM_DI_SET_SNIFF|BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF);
             if (info & BTA_DM_DI_SET_SNIFF)
                 p_dev->info |= BTA_DM_DI_INT_SNIFF;
@@ -848,7 +848,7 @@
 void bta_dm_pm_timer(tBTA_DM_MSG *p_data)
 {
 
-    APPL_TRACE_WARNING0("proc dm_pm_timer expires");
+    APPL_TRACE_WARNING("proc dm_pm_timer expires");
     bta_dm_pm_set_mode(p_data->pm_status.bd_addr, TRUE);
 
 
@@ -904,7 +904,7 @@
         }
     }
 
-    APPL_TRACE_DEBUG1("bta_dm_is_sco_active: SCO active: %d", bScoActive);
+    APPL_TRACE_DEBUG("bta_dm_is_sco_active: SCO active: %d", bScoActive);
     return bScoActive;
 }
 
@@ -929,7 +929,7 @@
         /* check if an entry already present */
         if(bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_HH )
         {
-            APPL_TRACE_DEBUG2 ("SCO status change(Active: %d), modify HID link policy. state: %d",
+            APPL_TRACE_DEBUG ("SCO status change(Active: %d), modify HID link policy. state: %d",
                 bScoActive, bta_dm_conn_srvcs.conn_srvc[j].state);
             bta_dm_pm_set_sniff_policy( bta_dm_find_peer_device(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr), bScoActive);
 
@@ -980,3 +980,26 @@
     BTM_SetLinkPolicy(p_dev->peer_bdaddr, &policy_setting);
 
 }
+
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+/*******************************************************************************
+**
+** Function         bta_dm_pm_obtain_controller_state
+**
+** Description      This function obtains the consolidated controller power state
+**
+** Parameters:
+**
+*******************************************************************************/
+tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void)
+{
+    /*   Did not use counts as it is not sure, how accurate the count values are in
+     **  bta_dm_cb.device_list.count > 0 || bta_dm_cb.device_list.le_count > 0 */
+
+    tBTA_DM_CONTRL_STATE cur_state = BTA_DM_CONTRL_UNKNOWN;
+    cur_state = BTM_PM_ReadControllerState();
+
+    APPL_TRACE_DEBUG("bta_dm_pm_obtain_controller_state: %d", cur_state);
+    return cur_state;
+}
+#endif
diff --git a/bta/dm/bta_dm_sco.c b/bta/dm/bta_dm_sco.c
index 803242b..109140a 100644
--- a/bta/dm/bta_dm_sco.c
+++ b/bta/dm/bta_dm_sco.c
@@ -247,7 +247,7 @@
     SRC_TYPE        *pOv, *pOvEnd;
     INT16           *psBtOut = (INT16 *)pDst;
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG1("Convert_8M_ToBT_Filtered,  CurrentPos %d\n", CurrentPos);
+    APPL_TRACE_DEBUG("Convert_8M_ToBT_Filtered,  CurrentPos %d\n", CurrentPos);
 #endif
     memcpy (pOverlapArea + (BTA_DM_PCM_OVERLAP_SIZE * 2), pSrc, BTA_DM_PCM_OVERLAP_SIZE * 2);
 
@@ -411,7 +411,7 @@
     INT16           *psBtOut = (INT16 *)pDst;
 
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG5("Convert_8S_ToBT_Filtered CurrentPos %d, SRC_TYPE %d, SRC_CHANNELS %d, \
+    APPL_TRACE_DEBUG("Convert_8S_ToBT_Filtered CurrentPos %d, SRC_TYPE %d, SRC_CHANNELS %d, \
         dwSrcSamples %d,  dwSrcSps %d",  	CurrentPos, sizeof (SRC_TYPE), SRC_CHANNELS, \
         dwSrcSamples, dwSrcSps);
 #endif
@@ -608,7 +608,7 @@
          p_cb->can_be_filtered = 0;
 
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG2("bta_dm_pcm_init_samples: n_channels = %d bits = %d", n_channels, bits);
+    APPL_TRACE_DEBUG("bta_dm_pcm_init_samples: n_channels = %d bits = %d", n_channels, bits);
 #endif
     if(n_channels == 1)
     {
@@ -642,11 +642,11 @@
     }
 
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG2("bta_pcm_init_dwn_sample: cur_pos %d, src_sps %d", \
+    APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: cur_pos %d, src_sps %d", \
 		p_cb->cur_pos, p_cb->src_sps);
-    APPL_TRACE_DEBUG3("bta_pcm_init_dwn_sample: bits %d, n_channels %d, sample_size %d, ", \
+    APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: bits %d, n_channels %d, sample_size %d, ", \
 		p_cb->bits, p_cb->n_channels, p_cb->sample_size);
-    APPL_TRACE_DEBUG3("bta_pcm_init_dwn_sample: can_be_filtered %d, n_channels: %d, \
+    APPL_TRACE_DEBUG("bta_pcm_init_dwn_sample: can_be_filtered %d, n_channels: %d, \
         divisor %d", p_cb->can_be_filtered, p_cb->n_channels, p_cb->divisor);
 #endif
 
@@ -673,7 +673,7 @@
     UINT32 out_sample;
 
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG1("bta_pcm_resample : insamples  %d",  (in_bytes  / bta_dm_pcm_cb.divisor));
+    APPL_TRACE_DEBUG("bta_pcm_resample : insamples  %d",  (in_bytes  / bta_dm_pcm_cb.divisor));
 #endif
     if(bta_dm_pcm_cb.can_be_filtered)
     {
@@ -687,7 +687,7 @@
     }
 
 #if BTA_DM_SCO_DEBUG
-    APPL_TRACE_DEBUG1("bta_pcm_resample : outsamples  %d",  out_sample);
+    APPL_TRACE_DEBUG("bta_pcm_resample : outsamples  %d",  out_sample);
 #endif
 
     return (out_sample * bta_dm_pcm_cb.sample_size);
diff --git a/bta/gatt/bta_gattc_act.c b/bta/gatt/bta_gattc_act.c
old mode 100644
new mode 100755
index 44f88e4..546a56f
--- a/bta/gatt/bta_gattc_act.c
+++ b/bta/gatt/bta_gattc_act.c
@@ -45,14 +45,15 @@
 **  Constants
 *****************************************************************************/
 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
-                                 BOOLEAN connected, tGATT_DISCONN_REASON reason);
+                                 BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                 tBT_TRANSPORT transport);
 
 static void  bta_gattc_cmpl_cback(UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
                                   tGATT_CL_COMPLETE *p_data);
 
 static void bta_gattc_deregister_cmpl(tBTA_GATTC_RCB *p_clreg);
-
 static void bta_gattc_enc_cmpl_cback(tGATT_IF gattc_if, BD_ADDR bda);
+static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested);
 
 static tGATT_CBACK bta_gattc_cl_cback =
 {
@@ -61,7 +62,8 @@
     bta_gattc_disc_res_cback,
     bta_gattc_disc_cmpl_cback,
     NULL,
-    bta_gattc_enc_cmpl_cback
+    bta_gattc_enc_cmpl_cback,
+    bta_gattc_cong_cback
 };
 
 /* opcode(tGATTC_OPTYPE) order has to be comply with internal event order */
@@ -102,7 +104,7 @@
 *******************************************************************************/
 static void bta_gattc_enable(tBTA_GATTC_CB *p_cb)
 {
-    APPL_TRACE_DEBUG0("bta_gattc_enable");
+    APPL_TRACE_DEBUG("bta_gattc_enable");
 
     if (p_cb->state == BTA_GATTC_STATE_DISABLED)
     {
@@ -112,7 +114,7 @@
     }
     else
     {
-        APPL_TRACE_DEBUG0("GATTC is arelady enabled");
+        APPL_TRACE_DEBUG("GATTC is arelady enabled");
     }
 }
 
@@ -131,11 +133,11 @@
 {
     UINT8           i;
 
-    APPL_TRACE_DEBUG0("bta_gattc_disable");
+    APPL_TRACE_DEBUG("bta_gattc_disable");
 
     if (p_cb->state != BTA_GATTC_STATE_ENABLED)
     {
-        APPL_TRACE_ERROR0("not enabled or disable in pogress");
+        APPL_TRACE_ERROR("not enabled or disable in pogress");
         return;
     }
 
@@ -182,7 +184,7 @@
     tBTA_GATT_STATUS         status = BTA_GATT_NO_RESOURCES;
 
 
-    APPL_TRACE_DEBUG1("bta_gattc_register state %d",p_cb->state);
+    APPL_TRACE_DEBUG("bta_gattc_register state %d",p_cb->state);
     memset(&cb_data, 0, sizeof(cb_data));
     cb_data.reg_oper.status = BTA_GATT_NO_RESOURCES;
 
@@ -198,7 +200,7 @@
         {
             if ((p_app_uuid == NULL) || (p_cb->cl_rcb[i].client_if = GATT_Register(p_app_uuid, &bta_gattc_cl_cback)) == 0)
             {
-                APPL_TRACE_ERROR0("Register with GATT stack failed.");
+                APPL_TRACE_ERROR("Register with GATT stack failed.");
                 status = BTA_GATT_ERROR;
             }
             else
@@ -259,7 +261,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
+        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.client_if );
     }
 }
 /*******************************************************************************
@@ -315,7 +317,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("bta_gattc_deregister Deregister Failedm unknown client cif");
+        APPL_TRACE_ERROR("bta_gattc_deregister Deregister Failedm unknown client cif");
     }
 }
 /*******************************************************************************
@@ -339,19 +341,20 @@
         if (p_msg->api_conn.is_direct)
         {
             if ((p_clcb = bta_gattc_find_alloc_clcb(p_msg->api_conn.client_if,
-                                                    p_msg->api_conn.remote_bda)) != NULL)
+                                                    p_msg->api_conn.remote_bda,
+                                                    p_msg->api_conn.transport)) != NULL)
             {
                 bta_gattc_sm_execute(p_clcb, event, p_msg);
             }
             else
             {
-                APPL_TRACE_ERROR0("No resources to open a new connection.");
+                APPL_TRACE_ERROR("No resources to open a new connection.");
 
                 bta_gattc_send_open_cback(p_clreg,
                                           BTA_GATT_NO_RESOURCES,
                                           p_msg->api_conn.remote_bda,
                                           BTA_GATT_INVALID_CONN_ID,
-                                          0);
+                                          p_msg->api_conn.transport, 0);
             }
         }
         else
@@ -361,7 +364,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_gattc_process_api_open Failed, unknown client_if: %d",
+        APPL_TRACE_ERROR("bta_gattc_process_api_open Failed, unknown client_if: %d",
                         p_msg->api_conn.client_if);
     }
 }
@@ -385,13 +388,14 @@
     if (p_msg->api_cancel_conn.is_direct)
     {
         if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->api_cancel_conn.client_if,
-                                                 p_msg->api_cancel_conn.remote_bda)) != NULL)
+                                                 p_msg->api_cancel_conn.remote_bda,
+                                                 BTA_GATT_TRANSPORT_LE)) != NULL)
         {
             bta_gattc_sm_execute(p_clcb, event, p_msg);
         }
         else
         {
-            APPL_TRACE_ERROR0("No such connection need to be cancelled");
+            APPL_TRACE_ERROR("No such connection need to be cancelled");
 
             p_clreg = bta_gattc_cl_get_regcb(p_msg->api_cancel_conn.client_if);
 
@@ -470,12 +474,13 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_ERROR0("Connection already opened. wrong state");
+    APPL_TRACE_ERROR("Connection already opened. wrong state");
 
     bta_gattc_send_open_cback(p_clcb->p_rcb,
                               BTA_GATT_OK,
                               p_clcb->bda,
                               p_clcb->bta_conn_id,
+                              p_clcb->transport,
                               0);
 }
 /*******************************************************************************
@@ -495,8 +500,8 @@
                               BTA_GATT_ERROR,
                               p_clcb->bda,
                               p_clcb->bta_conn_id,
+                              p_clcb->transport,
                               0);
-
     /* open failure, remove clcb */
     bta_gattc_clcb_dealloc(p_clcb);
 }
@@ -515,9 +520,10 @@
     tBTA_GATTC_DATA gattc_data;
 
     /* open/hold a connection */
-    if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda, TRUE))
+    if (!GATT_Connect(p_clcb->p_rcb->client_if, p_data->api_conn.remote_bda,
+                      TRUE, p_data->api_conn.transport))
     {
-        APPL_TRACE_ERROR0("Connection open failure");
+        APPL_TRACE_ERROR("Connection open failure");
 
         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_OPEN_FAIL_EVT, p_data);
     }
@@ -526,7 +532,8 @@
         /* a connected remote device */
         if (GATT_GetConnIdIfConnected(p_clcb->p_rcb->client_if,
                                       p_data->api_conn.remote_bda,
-                                      &p_clcb->bta_conn_id))
+                                      &p_clcb->bta_conn_id,
+                                      p_data->api_conn.transport))
         {
             gattc_data.int_conn.hdr.layer_specific = p_clcb->bta_conn_id;
 
@@ -553,11 +560,11 @@
 
     if (bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, TRUE, FALSE))
     {
-        /* alwaya call open to hold a connection */
-        if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE))
+        /* always call open to hold a connection */
+        if (!GATT_Connect(p_data->client_if, p_data->remote_bda, FALSE, p_data->transport))
         {
             status = BTA_GATT_ERROR;
-            APPL_TRACE_ERROR0("bta_gattc_init_bk_conn failed");
+            APPL_TRACE_ERROR("bta_gattc_init_bk_conn failed");
         }
         else
         {
@@ -566,9 +573,11 @@
             /* if is a connected remote device */
             if (GATT_GetConnIdIfConnected(p_data->client_if,
                                           p_data->remote_bda,
-                                          &conn_id))
+                                          &conn_id,
+                                          p_data->transport))
             {
-                if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda)) != NULL)
+                if ((p_clcb = bta_gattc_find_alloc_clcb(p_data->client_if, p_data->remote_bda,
+                    BTA_GATT_TRANSPORT_LE)) != NULL)
                 {
                     gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
 
@@ -583,7 +592,8 @@
     /* open failure, report OPEN_EVT */
     if (status != BTA_GATT_OK)
     {
-        bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda, BTA_GATT_INVALID_CONN_ID, 0);
+        bta_gattc_send_open_cback(p_clreg, status, p_data->remote_bda,
+        BTA_GATT_INVALID_CONN_ID, BTA_GATT_TRANSPORT_LE, 0);
     }
 }
 /*******************************************************************************
@@ -610,7 +620,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("bta_gattc_cancel_bk_conn failed");
+            APPL_TRACE_ERROR("bta_gattc_cancel_bk_conn failed");
         }
     }
     p_clreg = bta_gattc_cl_get_regcb(p_data->client_if);
@@ -681,13 +691,15 @@
 void bta_gattc_conn(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
 {
     tBTA_GATTC_IF   gatt_if;
-    APPL_TRACE_DEBUG1("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
+    APPL_TRACE_DEBUG("bta_gattc_conn server cache state=%d",p_clcb->p_srcb->state);
 
     if (p_data != NULL)
     {
-        APPL_TRACE_DEBUG1("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
+        APPL_TRACE_DEBUG("bta_gattc_conn conn_id=%d",p_data->hdr.layer_specific);
         p_clcb->bta_conn_id  = p_data->int_conn.hdr.layer_specific;
-        GATT_GetConnectionInfor(p_data->int_conn.hdr.layer_specific, &gatt_if, p_clcb->bda);
+
+        GATT_GetConnectionInfor(p_data->hdr.layer_specific,
+                                &gatt_if, p_clcb->bda, &p_clcb->transport);
     }
 
         p_clcb->p_srcb->connected = TRUE;
@@ -721,14 +733,16 @@
 
         if (p_clcb->p_rcb)
         {
-            /* there is no RM for GATT */
-            if (!BTM_IsBleLink(p_clcb->bda))
-                bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
-            bta_gattc_send_open_cback(p_clcb->p_rcb,
-                                      BTA_GATT_OK,
-                                      p_clcb->bda,
-                                      p_clcb->bta_conn_id,
-                                      p_clcb->p_srcb->mtu);
+        /* there is no RM for GATT */
+        if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
+            bta_sys_conn_open(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+
+        bta_gattc_send_open_cback(p_clcb->p_rcb,
+                                  BTA_GATT_OK,
+                                  p_clcb->bda,
+                                  p_clcb->bta_conn_id,
+                                  p_clcb->transport,
+                                  p_clcb->p_srcb->mtu);
         }
     }
 /*******************************************************************************
@@ -772,7 +786,7 @@
     tBTA_GATTC_RCB      *p_clreg = p_clcb->p_rcb;
     tBTA_GATTC           cb_data;
 
-    APPL_TRACE_DEBUG1("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
+    APPL_TRACE_DEBUG("bta_gattc_close conn_id=%d",p_clcb->bta_conn_id);
 
     cb_data.close.client_if = p_clcb->p_rcb->client_if;
     cb_data.close.conn_id   = p_clcb->bta_conn_id;
@@ -780,13 +794,19 @@
     cb_data.close.status    = p_clcb->status;
     bdcpy(cb_data.close.remote_bda, p_clcb->bda);
 
-    if (!BTM_IsBleLink(p_clcb->bda))
+    if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
         bta_sys_conn_close( BTA_ID_GATTC ,BTA_ALL_APP_ID, p_clcb->bda);
 
     bta_gattc_clcb_dealloc(p_clcb);
 
     if (p_data->hdr.event == BTA_GATTC_API_CLOSE_EVT)
+    {
         cb_data.close.status = GATT_Disconnect(p_data->hdr.layer_specific);
+    }
+    else if (p_data->hdr.event == BTA_GATTC_INT_DISCONN_EVT)
+    {
+        cb_data.close.status = p_data->int_conn.reason;
+    }
 
     if(p_cback)
         (* p_cback)(BTA_GATTC_CLOSE_EVT,   (tBTA_GATTC *)&cb_data);
@@ -830,10 +850,11 @@
 *******************************************************************************/
 void bta_gattc_disc_close(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
 {
-    APPL_TRACE_DEBUG1("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
-
-    bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
-    bta_gattc_sm_execute(p_clcb, BTA_GATTC_API_CLOSE_EVT, p_data);
+    APPL_TRACE_DEBUG("Discovery cancel conn_id=%d",p_clcb->bta_conn_id);
+    if (p_clcb->disc_active)
+        bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_ERROR);
+    else
+        p_clcb->state = BTA_GATTC_CONN_ST;
 }
 /*******************************************************************************
 **
@@ -925,7 +946,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG2("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
+    APPL_TRACE_DEBUG("bta_gattc_start_discover conn_id=%d p_clcb->p_srcb->state = %d ",
         p_clcb->bta_conn_id, p_clcb->p_srcb->state);
 
     if (((p_clcb->p_q_cmd == NULL || p_clcb->auto_update == BTA_GATTC_REQ_WAITING) &&
@@ -942,22 +963,28 @@
             p_clcb->p_srcb->update_count = 0;
             p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC_ACT;
 
+            if (p_clcb->transport == BTA_TRANSPORT_LE)
+                L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, FALSE);
+
             /* set all srcb related clcb into discovery ST */
             bta_gattc_set_discover_st(p_clcb->p_srcb);
 
             if ((p_clcb->status = bta_gattc_init_cache(p_clcb->p_srcb)) == BTA_GATT_OK)
             {
-                p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id, p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
+                p_clcb->status = bta_gattc_discover_pri_service(p_clcb->bta_conn_id,
+                                                               p_clcb->p_srcb, GATT_DISC_SRVC_ALL);
             }
             if (p_clcb->status != BTA_GATT_OK)
             {
-                APPL_TRACE_ERROR0("discovery on server failed");
+                APPL_TRACE_ERROR("discovery on server failed");
                 bta_gattc_reset_discover_st(p_clcb->p_srcb, p_clcb->status);
             }
+            else
+                p_clcb->disc_active = TRUE;
         }
         else
         {
-            APPL_TRACE_ERROR0("unknown device, can not start discovery");
+            APPL_TRACE_ERROR("unknown device, can not start discovery");
         }
     }
     /* pending operation, wait until it finishes */
@@ -984,12 +1011,14 @@
     tBTA_GATTC_DATA *p_q_cmd = p_clcb->p_q_cmd;
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
+    APPL_TRACE_DEBUG("bta_gattc_disc_cmpl conn_id=%d",p_clcb->bta_conn_id);
 
 #if BLE_INCLUDED == TRUE
-    L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
+    if(p_clcb->transport == BTA_TRANSPORT_LE)
+        L2CA_EnableUpdateBleConnParams(p_clcb->p_srcb->server_bda, TRUE);
 #endif
     p_clcb->p_srcb->state = BTA_GATTC_SERV_IDLE;
+    p_clcb->disc_active = FALSE;
 
     if (p_clcb->status != GATT_SUCCESS)
     {
@@ -1020,9 +1049,13 @@
         p_clcb->p_q_cmd = NULL;
 
         bta_gattc_sm_execute(p_clcb, p_q_cmd->hdr.event, p_q_cmd);
-
-        utl_freebuf((void **)&p_q_cmd);
-
+        /* if the command executed requeued the cmd, we don't
+         * want to free the underlying buffer that's being
+         * referenced by p_clcb->p_q_cmd
+         */
+        if (p_q_cmd != p_clcb->p_q_cmd) {
+            utl_freebuf((void **)&p_q_cmd);
+        }
     }
 }
 /*******************************************************************************
@@ -1112,7 +1145,7 @@
             }
             else
             {
-                APPL_TRACE_ERROR1("invalud ID type: %d", p_id->id_type);
+                APPL_TRACE_ERROR("invalud ID type: %d", p_id->id_type);
             }
 
             if (handle == 0)
@@ -1240,20 +1273,23 @@
                                       &p_data->api_confirm.char_id,
                                       NULL)) == 0)
     {
-        APPL_TRACE_ERROR0("Can not map service/char ID into valid handle");
+        APPL_TRACE_ERROR("Can not map service/char ID into valid handle");
     }
     else
     {
         if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, handle)
             != GATT_SUCCESS)
         {
-            APPL_TRACE_ERROR1("bta_gattc_confirm to handle [0x%04x] failed", handle);
+            APPL_TRACE_ERROR("bta_gattc_confirm to handle [0x%04x] failed", handle);
         }
-        /* if over BR_EDR, inform PM for mode change */
-        else if (!BTM_IsBleLink(p_clcb->bda))
+        else
         {
-            bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
-            bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+            /* if over BR_EDR, inform PM for mode change */
+            if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
+            {
+                bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+                bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
+            }
         }
     }
 }
@@ -1286,7 +1322,8 @@
                                 &cb_data.read.descr_type) == FALSE)
         {
             cb_data.read.status = BTA_GATT_INTERNAL_ERROR;
-            APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", p_data->p_cmpl->att_value.handle);
+            APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x",
+                                p_data->p_cmpl->att_value.handle);
         }
         else
         {
@@ -1302,10 +1339,12 @@
         cb_data.read.srvc_id = p_clcb->p_q_cmd->api_read.srvc_id;
         cb_data.read.char_id = p_clcb->p_q_cmd->api_read.char_id;
         if (p_clcb->p_q_cmd->api_read.p_descr_type)
-            memcpy(&cb_data.read.descr_type, p_clcb->p_q_cmd->api_read.p_descr_type, sizeof(tBTA_GATT_ID));
+            memcpy(&cb_data.read.descr_type, p_clcb->p_q_cmd->api_read.p_descr_type,
+                   sizeof(tBTA_GATT_ID));
     }
 
-    event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ? BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
+    event = (p_clcb->p_q_cmd->api_read.p_descr_type == NULL) ?
+                    BTA_GATTC_READ_CHAR_EVT: BTA_GATTC_READ_DESCR_EVT;
     cb_data.read.conn_id = p_clcb->bta_conn_id;
 
     utl_freebuf((void **)&p_clcb->p_q_cmd);
@@ -1339,10 +1378,13 @@
     }
     else
     {
-        memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id, sizeof(tBTA_GATT_SRVC_ID));
-        memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id, sizeof(tBTA_GATT_ID));
+        memcpy(&cb_data.write.srvc_id, &p_clcb->p_q_cmd->api_write.srvc_id,
+                sizeof(tBTA_GATT_SRVC_ID));
+        memcpy(&cb_data.write.char_id, &p_clcb->p_q_cmd->api_write.char_id,
+                sizeof(tBTA_GATT_ID));
         if (p_clcb->p_q_cmd->api_write.p_descr_type)
-            memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type, sizeof(tBTA_GATT_ID));
+            memcpy(&cb_data.write.descr_type, p_clcb->p_q_cmd->api_write.p_descr_type,
+                   sizeof(tBTA_GATT_ID));
     }
 
     if (p_clcb->p_q_cmd->api_write.hdr.event == BTA_GATTC_API_WRITE_EVT &&
@@ -1430,17 +1472,17 @@
     UINT8           op = (UINT8)p_data->op_cmpl.op_code;
     UINT8           mapped_op = 0;
 
-    APPL_TRACE_DEBUG1("bta_gattc_op_cmpl op = %d", op);
+    APPL_TRACE_DEBUG("bta_gattc_op_cmpl op = %d", op);
 
     if (op == GATTC_OPTYPE_INDICATION || op == GATTC_OPTYPE_NOTIFICATION)
     {
-        APPL_TRACE_ERROR0("unexpected operation, ignored");
+        APPL_TRACE_ERROR("unexpected operation, ignored");
     }
     else if (op >= GATTC_OPTYPE_READ)
     {
         if (p_clcb->p_q_cmd == NULL)
         {
-            APPL_TRACE_ERROR0("No pending command");
+            APPL_TRACE_ERROR("No pending command");
             return;
         }
         if (p_clcb->p_q_cmd->hdr.event != bta_gattc_opcode_to_int_evt[op - GATTC_OPTYPE_READ])
@@ -1449,23 +1491,25 @@
             if ( mapped_op > GATTC_OPTYPE_INDICATION)   mapped_op = 0;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-            APPL_TRACE_ERROR3("expect op:(%s :0x%04x), receive unexpected operation (%s).",
+            APPL_TRACE_ERROR("expect op:(%s :0x%04x), receive unexpected operation (%s).",
                                 bta_gattc_op_code_name[mapped_op] , p_clcb->p_q_cmd->hdr.event,
                                 bta_gattc_op_code_name[op]);
 #else
-            APPL_TRACE_ERROR3("expect op:(%u :0x%04x), receive unexpected operation (%u).",
+            APPL_TRACE_ERROR("expect op:(%u :0x%04x), receive unexpected operation (%u).",
                                 mapped_op , p_clcb->p_q_cmd->hdr.event, op);
 #endif
             return;
         }
 
-        /* service handle change void the response, discard it */
-        if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
+        /* discard responses if service change indication is received before operation completed */
+        if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING && p_clcb->p_srcb->srvc_hdl_chg)
         {
-            p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
-            bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+            APPL_TRACE_DEBUG("Discard all responses when service change indication is received.");
+            p_data->op_cmpl.status = GATT_ERROR;
         }
-        else if (op == GATTC_OPTYPE_READ)
+
+        /* service handle change void the response, discard it */
+        if (op == GATTC_OPTYPE_READ)
             bta_gattc_read_cmpl(p_clcb, &p_data->op_cmpl);
 
         else if (op == GATTC_OPTYPE_WRITE)
@@ -1476,6 +1520,12 @@
 
         else if (op == GATTC_OPTYPE_CONFIG)
             bta_gattc_cfg_mtu_cmpl(p_clcb, &p_data->op_cmpl);
+
+        if (p_clcb->auto_update == BTA_GATTC_DISC_WAITING)
+        {
+            p_clcb->auto_update = BTA_GATTC_REQ_WAITING;
+            bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_DISCOVER_EVT, NULL);
+        }
     }
 }
 /*******************************************************************************
@@ -1493,7 +1543,7 @@
 
     /* receive op complete when discovery is started, ignore the response,
         and wait for discovery finish and resent */
-    APPL_TRACE_DEBUG1("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
+    APPL_TRACE_DEBUG("bta_gattc_ignore_op_cmpl op = %d", p_data->hdr.layer_specific);
 
 }
 /*******************************************************************************
@@ -1509,7 +1559,7 @@
 {
     tBTA_GATT_STATUS    status = GATT_INTERNAL_ERROR;
     tBTA_GATTC cb_data;
-    APPL_TRACE_DEBUG1("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
+    APPL_TRACE_DEBUG("bta_gattc_search conn_id=%d",p_clcb->bta_conn_id);
     if (p_clcb->p_srcb && p_clcb->p_srcb->p_srvc_cache)
     {
         status = BTA_GATT_OK;
@@ -1551,7 +1601,7 @@
 
     bta_gattc_set_discover_st(p_clcb->p_srcb);
 
-    APPL_TRACE_DEBUG1("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
+    APPL_TRACE_DEBUG("bta_gattc_cache_open conn_id=%d",p_clcb->bta_conn_id);
     bta_gattc_co_cache_open(p_clcb->p_srcb->server_bda, BTA_GATTC_CI_CACHE_OPEN_EVT,
                             p_clcb->bta_conn_id, FALSE);
 }
@@ -1566,7 +1616,7 @@
 *******************************************************************************/
 void bta_gattc_ci_open(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
 {
-    APPL_TRACE_DEBUG2("bta_gattc_ci_open conn_id=%d server state=%d" ,
+    APPL_TRACE_DEBUG("bta_gattc_ci_open conn_id=%d server state=%d" ,
                       p_clcb->bta_conn_id, p_clcb->p_srcb->state);
     if (p_clcb->p_srcb->state == BTA_GATTC_SERV_LOAD)
     {
@@ -1615,21 +1665,21 @@
 void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
 {
 
-    APPL_TRACE_DEBUG2("bta_gattc_ci_load conn_id=%d load status=%d" ,
-                      p_clcb->bta_conn_id, p_data->ci_load.status );
-    bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
+    APPL_TRACE_DEBUG("bta_gattc_ci_load conn_id=%d load status=%d",
+                      p_clcb->bta_conn_id, p_data->ci_load.status);
 
-    if ((p_data->ci_load.status == BTA_GATT_OK ||
-         p_data->ci_load.status == BTA_GATT_MORE) &&
-        p_data->ci_load.num_attr > 0)
+    if (p_data->ci_load.status == BTA_GATT_OK ||
+         p_data->ci_load.status == BTA_GATT_MORE)
     {
-        bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr, p_data->ci_load.attr, p_clcb->p_srcb->attr_index);
+        if (p_data->ci_load.num_attr != 0)
+            bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr,
+                                p_data->ci_load.attr, p_clcb->p_srcb->attr_index);
 
         if (p_data->ci_load.status == BTA_GATT_OK)
         {
             p_clcb->p_srcb->attr_index = 0;
             bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);
-
+            bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
         }
         else /* load more */
         {
@@ -1643,6 +1693,7 @@
     }
     else
     {
+        bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
         p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
         p_clcb->p_srcb->attr_index = 0;
         /* cache load failure, start discovery */
@@ -1651,7 +1702,7 @@
 }
 /*******************************************************************************
 **
-** Function         bta_gattc_ci_load
+** Function         bta_gattc_ci_save
 **
 ** Description      cache loading received.
 **
@@ -1662,7 +1713,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_DEBUG1("bta_gattc_ci_save conn_id=%d  " ,
+    APPL_TRACE_DEBUG("bta_gattc_ci_save conn_id=%d  " ,
                       p_clcb->bta_conn_id   );
 
     if (!bta_gattc_cache_save(p_clcb->p_srcb, p_clcb->bta_conn_id))
@@ -1687,7 +1738,7 @@
 
     if (p_clcb->status == BTA_GATT_OK)
     {
-        APPL_TRACE_ERROR1("operation not supported at current state [%d]", p_clcb->state);
+        APPL_TRACE_ERROR("operation not supported at current state [%d]", p_clcb->state);
     }
 }
 
@@ -1735,27 +1786,33 @@
 **
 *******************************************************************************/
 static void bta_gattc_conn_cback(tGATT_IF gattc_if, BD_ADDR bda, UINT16 conn_id,
-                                 BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                 BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                 tBT_TRANSPORT transport)
 {
     tBTA_GATTC_DATA *p_buf;
 
-    APPL_TRACE_DEBUG4("bta_gattc_conn_cback: cif = %d connected = %d conn_id = %d reaosn = 0x%04x",
-                      gattc_if, connected, conn_id, reason);
+    if (reason != 0)
+    {
+        APPL_TRACE_WARNING("%s() - cif=%d connected=%d conn_id=%d reason=0x%04x",
+                      __FUNCTION__, gattc_if, connected, conn_id, reason);
+    }
 
     if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
     {
         memset(p_buf, 0, sizeof(tBTA_GATTC_DATA));
 
-        p_buf->int_conn.hdr.event            = connected ? BTA_GATTC_INT_CONN_EVT: BTA_GATTC_INT_DISCONN_EVT;
+        p_buf->int_conn.hdr.event            = connected ? BTA_GATTC_INT_CONN_EVT:
+                                                           BTA_GATTC_INT_DISCONN_EVT;
         p_buf->int_conn.hdr.layer_specific   = conn_id;
         p_buf->int_conn.client_if            = gattc_if;
         p_buf->int_conn.role                 = L2CA_GetBleConnRole(bda);
         p_buf->int_conn.reason               = reason;
+        p_buf->int_conn.transport            = transport;
         bdcpy(p_buf->int_conn.remote_bda, bda);
 
-                bta_sys_sendmsg(p_buf);
-            }
-        }
+        bta_sys_sendmsg(p_buf);
+    }
+}
 
 /*******************************************************************************
 **
@@ -1771,7 +1828,7 @@
     tBTA_GATTC_DATA *p_buf;
     tBTA_GATTC_CLCB *p_clcb = NULL;
 
-    if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda)) == NULL)
+    if ((p_clcb = bta_gattc_find_clcb_by_cif(gattc_if, bda, BTA_GATT_TRANSPORT_LE)) == NULL)
     {
         return;
     }
@@ -1786,7 +1843,7 @@
     }
 #endif
 
-    APPL_TRACE_DEBUG1("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if);
+    APPL_TRACE_DEBUG("bta_gattc_enc_cmpl_cback: cif = %d", gattc_if);
 
     if ((p_buf = (tBTA_GATTC_DATA *) GKI_getbuf(sizeof(tBTA_GATTC_DATA))) != NULL)
     {
@@ -1934,10 +1991,10 @@
                                      tGATT_CL_COMPLETE *p_data,
                                      tBTA_GATTC_NOTIFY *p_notify)
 {
-    APPL_TRACE_DEBUG2("bta_gattc_proc_other_indication check \
+    APPL_TRACE_DEBUG("bta_gattc_proc_other_indication check \
                        p_data->att_value.handle=%d p_data->handle=%d",
                        p_data->att_value.handle, p_data->handle);
-    APPL_TRACE_DEBUG1("is_notify", p_notify->is_notify);
+    APPL_TRACE_DEBUG("is_notify", p_notify->is_notify);
 
     p_notify->is_notify = (op == GATTC_OPTYPE_INDICATION) ? FALSE : TRUE;
     p_notify->len = p_data->att_value.len;
@@ -1967,22 +2024,23 @@
     tBTA_GATTC_NOTIFY   notify;
     BD_ADDR             remote_bda;
     tBTA_GATTC_IF       gatt_if;
+    tBTA_TRANSPORT transport;
 
-    if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda))
+    if (!GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport))
     {
-        APPL_TRACE_ERROR0("indication/notif for unknown app");
+        APPL_TRACE_ERROR("indication/notif for unknown app");
         return;
     }
 
     if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) == NULL)
     {
-        APPL_TRACE_ERROR0("indication/notif for unregistered app");
+        APPL_TRACE_ERROR("indication/notif for unregistered app");
         return;
     }
 
     if ((p_srcb = bta_gattc_find_srcb(remote_bda)) == NULL)
     {
-        APPL_TRACE_ERROR0("indication/notif for unknown device, ignore");
+        APPL_TRACE_ERROR("indication/notif for unknown device, ignore");
         return;
     }
 
@@ -2002,15 +2060,16 @@
                 /* connection not open yet */
                 if (p_clcb == NULL)
                 {
-                    if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda)) != NULL)
+                    if ((p_clcb = bta_gattc_clcb_alloc(gatt_if, remote_bda, transport)) != NULL)
                     {
                         p_clcb->bta_conn_id = conn_id;
+                        p_clcb->transport   = transport;
 
                         bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, NULL);
                     }
                     else
                     {
-                        APPL_TRACE_ERROR0("No resources");
+                        APPL_TRACE_ERROR("No resources");
                     }
                 }
 
@@ -2020,14 +2079,15 @@
             /* no one intersted and need ack? */
             else if (op == GATTC_OPTYPE_INDICATION)
             {
-                APPL_TRACE_DEBUG0("no one interested, ack now");
+                APPL_TRACE_DEBUG("no one interested, ack now");
                 GATTC_SendHandleValueConfirm(conn_id, handle);
             }
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.", handle);
+        APPL_TRACE_ERROR("Indi/Notif for Unknown handle[0x%04x], can not find in local cache.",
+                          handle);
     }
 }
 /*******************************************************************************
@@ -2046,7 +2106,7 @@
     tBTA_GATTC_OP_CMPL  *p_buf;
     UINT16              len = sizeof(tBTA_GATTC_OP_CMPL) + sizeof(tGATT_CL_COMPLETE);
 
-    APPL_TRACE_DEBUG3("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
+    APPL_TRACE_DEBUG("bta_gattc_cmpl_cback: conn_id = %d op = %d status = %d",
                       conn_id, op, status);
 
     /* notification and indication processed right away */
@@ -2058,13 +2118,12 @@
     /* for all other operation, not expected if w/o connection */
     else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) == NULL)
     {
-        APPL_TRACE_ERROR1("bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
+        APPL_TRACE_ERROR("bta_gattc_cmpl_cback unknown conn_id =  %d, ignore data", conn_id);
         return;
     }
 
-
-/* if over BR_EDR, inform PM for mode change */
-    if (!BTM_IsBleLink(p_clcb->bda))
+    /* if over BR_EDR, inform PM for mode change */
+    if (p_clcb->transport == BTA_TRANSPORT_BR_EDR)
     {
         bta_sys_busy(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
         bta_sys_idle(BTA_ID_GATTC, BTA_ALL_APP_ID, p_clcb->bda);
@@ -2089,6 +2148,33 @@
 
     return;
 }
+
+/*******************************************************************************
+**
+** Function         bta_gattc_cong_cback
+**
+** Description      congestion callback for BTA GATT client.
+**
+** Returns          void
+**
+********************************************************************************/
+static void bta_gattc_cong_cback (UINT16 conn_id, BOOLEAN congested)
+{
+    tBTA_GATTC_CLCB *p_clcb;
+    tBTA_GATTC cb_data;
+
+    if ((p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id)) != NULL)
+    {
+        if (p_clcb->p_rcb->p_cback)
+        {
+            cb_data.congest.conn_id = conn_id;
+            cb_data.congest.congested = congested;
+
+            (*p_clcb->p_rcb->p_cback)(BTA_GATTC_CONGEST_EVT, &cb_data);
+        }
+    }
+}
+
 #if BLE_INCLUDED == TRUE
 /*******************************************************************************
 **
@@ -2106,14 +2192,14 @@
     UINT16              conn_id;
 
     /* should always get the connection ID */
-    if (GATT_GetConnIdIfConnected(cif, remote_bda,&conn_id) == FALSE)
+    if (GATT_GetConnIdIfConnected(cif, remote_bda, &conn_id, BTA_GATT_TRANSPORT_LE) == FALSE)
     {
-        APPL_TRACE_ERROR0("bta_gattc_init_clcb_conn ERROR: not a connected device");
+        APPL_TRACE_ERROR("bta_gattc_init_clcb_conn ERROR: not a connected device");
         return;
     }
 
     /* initaite a new connection here */
-    if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda)) != NULL)
+    if ((p_clcb = bta_gattc_clcb_alloc(cif, remote_bda, BTA_GATT_TRANSPORT_LE)) != NULL)
     {
         gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id;
 
@@ -2125,7 +2211,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("No resources");
+        APPL_TRACE_ERROR("No resources");
     }
 }
 /*******************************************************************************
@@ -2147,7 +2233,7 @@
     {
         if (p_conn->in_use )
         {
-            if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda) == NULL)
+            if (bta_gattc_find_clcb_by_cif(cif, p_conn->remote_bda, BTA_GATT_TRANSPORT_LE) == NULL)
             {
                 bta_gattc_init_clcb_conn(cif, p_conn->remote_bda);
             }
@@ -2175,7 +2261,7 @@
 
     if (p_clreg == NULL)
     {
-        APPL_TRACE_ERROR1("bta_gattc_listen failed, unknown client_if: %d",
+        APPL_TRACE_ERROR("bta_gattc_listen failed, unknown client_if: %d",
                             p_msg->api_listen.client_if);
         return;
     }
@@ -2189,7 +2275,7 @@
                          p_msg->api_listen.start,
                          p_msg->api_listen.remote_bda))
         {
-            APPL_TRACE_ERROR0("Listen failure");
+            APPL_TRACE_ERROR("Listen failure");
             (*p_clreg->p_cback)(BTA_GATTC_LISTEN_EVT, &cb_data);
         }
         else
@@ -2206,7 +2292,9 @@
 
                     /* if is a connected remote device */
                     if (L2CA_GetBleConnRole(p_msg->api_listen.remote_bda) == HCI_ROLE_SLAVE &&
-                        bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if, p_msg->api_listen.remote_bda) == NULL)
+                        bta_gattc_find_clcb_by_cif(p_msg->api_listen.client_if,
+                                                   p_msg->api_listen.remote_bda,
+                                                   BTA_GATT_TRANSPORT_LE) == NULL)
                     {
 
                         bta_gattc_init_clcb_conn(p_msg->api_listen.client_if,
@@ -2216,8 +2304,9 @@
                 /* if listen to all */
                 else
                 {
-                    APPL_TRACE_ERROR0("Listen For All now");
-                    /* go through all connected device and send callback for all connected slave connection */
+                    APPL_TRACE_ERROR("Listen For All now");
+                    /* go through all connected device and send
+                    callback for all connected slave connection */
                     bta_gattc_process_listen_all(p_msg->api_listen.client_if);
                 }
             }
@@ -2238,7 +2327,7 @@
 {
     tBTA_GATTC_RCB      *p_clreg = bta_gattc_cl_get_regcb(p_msg->api_listen.client_if);
     tBTA_GATTC          cb_data;
-    (void)(p_cb);
+    UNUSED(p_cb);
 
     cb_data.reg_oper.client_if = p_msg->api_listen.client_if;
     cb_data.reg_oper.status = BTM_BleBroadcast(p_msg->api_listen.start);
diff --git a/bta/gatt/bta_gattc_api.c b/bta/gatt/bta_gattc_api.c
index 0bc87ec..a91b20e 100644
--- a/bta/gatt/bta_gattc_api.c
+++ b/bta/gatt/bta_gattc_api.c
@@ -60,7 +60,7 @@
 
     if (bta_sys_is_register(BTA_ID_GATTC) == FALSE)
     {
-        APPL_TRACE_WARNING0("GATTC Module not enabled/already disabled");
+        APPL_TRACE_WARNING("GATTC Module not enabled/already disabled");
         return;
     }
     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
@@ -91,9 +91,7 @@
 
     if (bta_sys_is_register(BTA_ID_GATTC) == FALSE)
     {
-        GKI_sched_lock();
         bta_sys_register(BTA_ID_GATTC, &bta_gattc_reg);
-        GKI_sched_unlock();
     }
 
     if ((p_buf = (tBTA_GATTC_API_REG *) GKI_getbuf(sizeof(tBTA_GATTC_API_REG))) != NULL)
@@ -143,11 +141,13 @@
 ** Parameters       client_if: server interface.
 **                  remote_bda: remote device BD address.
 **                  is_direct: direct connection or background auto connection
+**                  transport: Transport to be used for GATT connection (BREDR/LE)
 **
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct)
+void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+                    BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport)
 {
     tBTA_GATTC_API_OPEN  *p_buf;
 
@@ -157,6 +157,7 @@
 
         p_buf->client_if = client_if;
         p_buf->is_direct = is_direct;
+        p_buf->transport = transport;
         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
 
 
@@ -414,7 +415,6 @@
         memcpy(&p_descr_result->descr_id, &p_descr_result->char_id.char_id, sizeof(tBTA_GATT_ID));
         memcpy(&p_descr_result->char_id, p_char_id, sizeof(tBTA_GATTC_CHAR_ID));
     }
-
     return status;
 
 }
@@ -426,7 +426,7 @@
 **                  of the characterisctic.
 **
 ** Parameters       conn_id: connection ID which identify the server.
-**                  p_start_descr_id: start the characteristic search from the next record
+**                  p_start_descr_id: start the descriptor search from the next record
 **                           after the one identified by p_start_descr_id.
 **                  p_descr_uuid_cond: Characteristic descriptor UUID, if NULL find
 **                               the first available characteristic descriptor.
@@ -860,7 +860,7 @@
 {
     tBTA_GATTC_API_CONFIRM  *p_buf;
 
-    APPL_TRACE_API3("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x",
+    APPL_TRACE_API("BTA_GATTC_SendIndConfirm conn_id=%d service uuid1=0x%x char uuid=0x%x",
                     conn_id, p_char_id->srvc_id.id.uuid.uu.uuid16, p_char_id->char_id.uuid.uu.uuid16);
 
     if ((p_buf = (tBTA_GATTC_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_GATTC_API_CONFIRM))) != NULL)
@@ -902,13 +902,10 @@
 
     if (!p_char_id)
     {
-        APPL_TRACE_ERROR0("deregistration failed, unknow char id");
+        APPL_TRACE_ERROR("deregistration failed, unknow char id");
         return status;
     }
 
-    /* lock other GKI task */
-    GKI_sched_lock();
-
     if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
     {
         for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
@@ -917,7 +914,7 @@
                  !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
                   bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
             {
-                APPL_TRACE_WARNING0("notification already registered");
+                APPL_TRACE_WARNING("notification already registered");
                 status = BTA_GATT_OK;
                 break;
             }
@@ -944,17 +941,15 @@
             if (i == BTA_GATTC_NOTIF_REG_MAX)
             {
                 status = BTA_GATT_NO_RESOURCES;
-                APPL_TRACE_ERROR0("Max Notification Reached, registration failed.");
+                APPL_TRACE_ERROR("Max Notification Reached, registration failed.");
             }
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
+        APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
     }
 
-    GKI_sched_unlock();
-
     return status;
 }
 
@@ -981,13 +976,10 @@
 
     if (!p_char_id)
     {
-        APPL_TRACE_ERROR0("deregistration failed, unknow char id");
+        APPL_TRACE_ERROR("deregistration failed, unknow char id");
         return status;
     }
 
-    /* lock other GKI task */
-    GKI_sched_lock();
-
     if ((p_clreg = bta_gattc_cl_get_regcb(client_if)) != NULL)
     {
         for (i = 0; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
@@ -996,7 +988,7 @@
                 !memcmp(p_clreg->notif_reg[i].remote_bda, bda, BD_ADDR_LEN) &&
                 bta_gattc_charid_compare(&p_clreg->notif_reg[i].char_id, p_char_id))
             {
-                APPL_TRACE_DEBUG0("Deregistered.");
+                APPL_TRACE_DEBUG("Deregistered.");
                 memset(&p_clreg->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
                 status = BTA_GATT_OK;
                 break;
@@ -1006,16 +998,14 @@
         {
             status = BTA_GATT_ERROR;
 
-            APPL_TRACE_ERROR0("registration not found");
+            APPL_TRACE_ERROR("registration not found");
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Client_if: %d Not Registered", client_if);
+        APPL_TRACE_ERROR("Client_if: %d Not Registered", client_if);
     }
 
-    GKI_sched_unlock();
-
     return status;
 }
 
diff --git a/bta/gatt/bta_gattc_cache.c b/bta/gatt/bta_gattc_cache.c
index 3d603c3..65026ba 100644
--- a/bta/gatt/bta_gattc_cache.c
+++ b/bta/gatt/bta_gattc_cache.c
@@ -70,11 +70,11 @@
     tBTA_GATTC_CACHE    *p_cur_srvc = p_cache;
     tBTA_GATTC_CACHE_ATTR   *p_attr;
 
-    APPL_TRACE_ERROR0("<================Start Server Cache =============>");
+    APPL_TRACE_ERROR("<================Start Server Cache =============>");
 
     while (p_cur_srvc)
     {
-        APPL_TRACE_ERROR6("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]",
+        APPL_TRACE_ERROR("Service[%d]: handle[%d ~ %d] %s[0x%04x] inst[%d]",
                           i, p_cur_srvc->s_handle, p_cur_srvc->e_handle,
                           ((p_cur_srvc->service_uuid.id.uuid.len == 2) ? "uuid16" : "uuid128"),
                           p_cur_srvc->service_uuid.id.uuid.uu.uuid16,
@@ -85,7 +85,7 @@
 
         for (j = 0; p_attr; j ++ )
         {
-            APPL_TRACE_ERROR6("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]",
+            APPL_TRACE_ERROR("\t Attr[0x%04x] handle[%d] uuid[0x%04x] inst[%d] type[%s] prop[0x%1x]",
                               j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id,
                               bta_gattc_attr_type[p_attr->attr_type], p_attr->property);
 
@@ -94,8 +94,8 @@
         p_cur_srvc = p_cur_srvc->p_next;
     }
 
-    APPL_TRACE_ERROR0("<================End Server Cache =============>");
-    APPL_TRACE_ERROR0(" ");
+    APPL_TRACE_ERROR("<================End Server Cache =============>");
+    APPL_TRACE_ERROR(" ");
 }
 
 /*******************************************************************************
@@ -112,14 +112,14 @@
     UINT8 i;
     tBTA_GATTC_ATTR_REC *pp = p_rec;
 
-    APPL_TRACE_ERROR0("<================Start Explore Queue =============>");
+    APPL_TRACE_ERROR("<================Start Explore Queue =============>");
     for (i = 0; i < num_rec; i ++, pp ++)
     {
-        APPL_TRACE_ERROR5("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]",
+        APPL_TRACE_ERROR("\t rec[%d] uuid[0x%04x] s_handle[%d] e_handle[%d] is_primary[%d]",
                           i + 1, pp->uuid.uu.uuid16, pp->s_handle, pp->e_handle, pp->is_primary);
     }
-    APPL_TRACE_ERROR0("<================ End Explore Queue =============>");
-    APPL_TRACE_ERROR0(" ");
+    APPL_TRACE_ERROR("<================ End Explore Queue =============>");
+    APPL_TRACE_ERROR(" ");
 
 }
 #endif  /* BTA_GATT_DEBUG == TRUE */
@@ -140,7 +140,7 @@
 
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL)
     {
-        APPL_TRACE_DEBUG0("No resources: GKI buffer allocation failed.");
+        APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed.");
         utl_freebuf((void **)&p_srvc_cb->p_srvc_list);
         p_srvc_cb->free_byte = 0;
     }
@@ -154,7 +154,7 @@
         GKI_enqueue(&p_srvc_cb->cache_buffer, p_buf);
     }
 #if BTA_GATT_DEBUG== TRUE
-    APPL_TRACE_DEBUG1("allocating new buffer: free byte = %d", p_srvc_cb->free_byte);
+    APPL_TRACE_DEBUG("allocating new buffer: free byte = %d", p_srvc_cb->free_byte);
 #endif
     return p_buf;
 }
@@ -178,7 +178,7 @@
 
     if ((p_srvc_cb->p_srvc_list = (tBTA_GATTC_ATTR_REC*)GKI_getbuf(BTA_GATTC_ATTR_LIST_SIZE)) == NULL)
     {
-        APPL_TRACE_DEBUG0("No resources: GKI buffer allocation failed.");
+        APPL_TRACE_DEBUG("No resources: GKI buffer allocation failed.");
         status = GATT_NO_RESOURCES;
     }
     else
@@ -301,8 +301,8 @@
     tBTA_GATT_STATUS    status = BTA_GATT_OK;
 
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("Add a service into Service");
-    APPL_TRACE_DEBUG2("free byte = %d,  req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE))
+    APPL_TRACE_DEBUG("Add a service into Service");
+    APPL_TRACE_DEBUG("free byte = %d,  req %d bytes.", p_srvc_cb->free_byte, sizeof(tBTA_GATTC_CACHE))
 #endif
 
     if (p_srvc_cb->free_byte < sizeof(tBTA_GATTC_CACHE))
@@ -357,14 +357,14 @@
     UINT8   *pp;
 
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("bta_gattc_add_attr_to_cache: Add a [%s] into Service", bta_gattc_attr_type[type]);
-    APPL_TRACE_DEBUG4("handle=%d uuid16=0x%x property=0x%x type=%d", handle, p_uuid->uu.uuid16, property, type);
-    APPL_TRACE_DEBUG2("free byte = %d,  req %d bytes.", p_srvc_cb->free_byte, len);
+    APPL_TRACE_DEBUG("bta_gattc_add_attr_to_cache: Add a [%s] into Service", bta_gattc_attr_type[type]);
+    APPL_TRACE_DEBUG("handle=%d uuid16=0x%x property=0x%x type=%d", handle, p_uuid->uu.uuid16, property, type);
+    APPL_TRACE_DEBUG("free byte = %d,  req %d bytes.", p_srvc_cb->free_byte, len);
 #endif
 
     if (p_srvc_cb->p_cur_srvc == NULL)
     {
-        APPL_TRACE_ERROR0("Illegal action to add char/descr/incl srvc before adding a service!");
+        APPL_TRACE_ERROR("Illegal action to add char/descr/incl srvc before adding a service!");
         return GATT_WRONG_STATE;
     }
 
@@ -447,7 +447,7 @@
 
     *p_e_hdl = p_rec->e_handle;
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-    APPL_TRACE_DEBUG2("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle);
+    APPL_TRACE_DEBUG("discover range [%d ~ %d]",p_rec->s_handle, p_rec->e_handle);
 #endif
     return;
 }
@@ -460,12 +460,21 @@
 ** Returns          status of the operation.
 **
 *******************************************************************************/
-tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type)
+tBTA_GATT_STATUS bta_gattc_discover_pri_service(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
+                                                    UINT8 disc_type)
 {
-    if (BTM_IsBleLink(p_server_cb->server_bda))
-        return bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type);
-    else
-        return bta_gattc_sdp_service_disc(conn_id, p_server_cb);
+    tBTA_GATTC_CLCB     *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
+    tBTA_GATT_STATUS    status =  BTA_GATT_ERROR;
+
+    if (p_clcb)
+    {
+        if (p_clcb->transport == BTA_TRANSPORT_LE)
+            status = bta_gattc_discover_procedure(conn_id, p_server_cb, disc_type);
+        else
+            status = bta_gattc_sdp_service_disc(conn_id, p_server_cb);
+    }
+
+    return status;
 }
 /*******************************************************************************
 **
@@ -476,7 +485,8 @@
 ** Returns          status of the operation.
 **
 *******************************************************************************/
-tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb, UINT8 disc_type)
+tBTA_GATT_STATUS bta_gattc_discover_procedure(UINT16 conn_id, tBTA_GATTC_SERV *p_server_cb,
+                                                   UINT8 disc_type)
 {
     tGATT_DISC_PARAM param;
     BOOLEAN is_service = TRUE;
@@ -542,7 +552,7 @@
 *******************************************************************************/
 void bta_gattc_start_disc_char_dscp(UINT16 conn_id, tBTA_GATTC_SERV *p_srvc_cb)
 {
-    APPL_TRACE_DEBUG0("starting discover characteristics descriptor");
+    APPL_TRACE_DEBUG("starting discover characteristics descriptor");
 
     if (bta_gattc_discover_procedure(conn_id, p_srvc_cb, GATT_DISC_CHAR_DSCPT) != 0)
         bta_gattc_char_dscpt_disc_cmpl(conn_id, p_srvc_cb);
@@ -562,13 +572,13 @@
     tBTA_GATTC_ATTR_REC *p_rec = p_srvc_cb->p_srvc_list + p_srvc_cb->cur_srvc_idx;
     tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
 
-    APPL_TRACE_DEBUG1("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx);
+    APPL_TRACE_DEBUG("Start service discovery: srvc_idx = %d", p_srvc_cb->cur_srvc_idx);
 
     p_srvc_cb->cur_char_idx = p_srvc_cb->next_avail_idx = p_srvc_cb->total_srvc;
 
     if (p_clcb == NULL)
     {
-        APPL_TRACE_ERROR0("unknown connection ID");
+        APPL_TRACE_ERROR("unknown connection ID");
         return;
     }
     /* start expore a service if there is service not been explored */
@@ -588,7 +598,7 @@
         }
     }
     /* no service found at all, the end of server discovery*/
-    APPL_TRACE_ERROR0("No More Service found");
+    APPL_TRACE_ERROR("No More Service found");
 
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
     bta_gattc_display_cache_server(p_srvc_cb->p_srvc_cache);
@@ -677,7 +687,7 @@
     /* all characteristic has been explored, start with next service if any */
     {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-        APPL_TRACE_ERROR0("all char has been explored");
+        APPL_TRACE_ERROR("all char has been explored");
 #endif
         p_srvc_cb->cur_srvc_idx ++;
         bta_gattc_explore_srvc (conn_id, p_srvc_cb);
@@ -694,7 +704,7 @@
 
     if (!GATT_HANDLE_IS_VALID(s_handle) || !GATT_HANDLE_IS_VALID(e_handle))
     {
-        APPL_TRACE_ERROR2("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle);
+        APPL_TRACE_ERROR("invalid included service handle: [0x%04x ~ 0x%04x]", s_handle, e_handle);
         exist_srvc = TRUE;
     }
     else
@@ -735,7 +745,7 @@
 
         p_srvc_cb->total_srvc ++;
 
-        APPL_TRACE_DEBUG2("bta_gattc_add_srvc_to_list handle = %d, service type = 0x%04x",
+        APPL_TRACE_DEBUG("bta_gattc_add_srvc_to_list handle = %d, service type = 0x%04x",
             s_handle, uuid.uu.uuid16);
 
         p_rec->s_handle     = s_handle;
@@ -751,7 +761,7 @@
     {   /* allocate bigger buffer ?? */
         status = GATT_DB_FULL;
 
-        APPL_TRACE_ERROR0("service not added, no resources or wrong state");
+        APPL_TRACE_ERROR("service not added, no resources or wrong state");
     }
     return status;
 }
@@ -773,7 +783,7 @@
 
     if (p_srvc_cb->p_srvc_list == NULL)
     {
-        APPL_TRACE_ERROR0("No service available, unexpected char discovery result");
+        APPL_TRACE_ERROR("No service available, unexpected char discovery result");
         status = BTA_GATT_INTERNAL_ERROR;
     }
     else if (p_srvc_cb->next_avail_idx < BTA_GATTC_MAX_CACHE_CHAR)
@@ -798,7 +808,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("char not added, no resources");
+        APPL_TRACE_ERROR("char not added, no resources");
         /* allocate bigger buffer ?? */
         status = BTA_GATT_DB_FULL;
     }
@@ -840,11 +850,11 @@
                         end_handle      = (UINT16) pe.params[1];
 
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                        APPL_TRACE_EVENT3("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]",
+                        APPL_TRACE_EVENT("Found ATT service [0x%04x] handle[0x%04x ~ 0x%04x]",
                                         service_uuid.uu.uuid16, start_handle, end_handle);
 #endif
 
-                        if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle) &&
+                        if (GATT_HANDLE_IS_VALID(start_handle) && GATT_HANDLE_IS_VALID(end_handle)&&
                             p_srvc_cb != NULL)
                         {
                             /* discover services result, add services into a service list */
@@ -856,7 +866,8 @@
                         }
                         else
                         {
-                            APPL_TRACE_ERROR2("invalid start_handle = %d end_handle = %d", start_handle, end_handle);
+                            APPL_TRACE_ERROR("invalid start_handle = %d end_handle = %d",
+                                                start_handle, end_handle);
                         }
                 }
 
@@ -871,7 +882,7 @@
         bta_gattc_explore_srvc(bta_gattc_cb.sdp_conn_id, p_srvc_cb);
     else
     {
-        APPL_TRACE_ERROR0("GATT service discovery is done on unknown connection");
+        APPL_TRACE_ERROR("GATT service discovery is done on unknown connection");
     }
 
     GKI_freebuf(bta_gattc_cb.p_sdp_db);
@@ -904,9 +915,11 @@
         attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
         attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
 
-        SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
+        SDP_InitDiscoveryDb (bta_gattc_cb.p_sdp_db, BTA_GATT_SDP_DB_SIZE, 1,
+                             &uuid, num_attrs, attr_list);
 
-        if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda, bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback))
+        if(!SDP_ServiceSearchAttributeRequest (p_server_cb->server_bda,
+                                              bta_gattc_cb.p_sdp_db, &bta_gattc_sdp_callback))
         {
             GKI_freebuf(bta_gattc_cb.p_sdp_db);
             bta_gattc_cb.p_sdp_db = NULL;
@@ -990,7 +1003,8 @@
                 break;
 
             case GATT_DISC_CHAR_DSCPT:
-                bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0, BTA_GATTC_ATTR_TYPE_CHAR_DESCR);
+                bta_gattc_add_attr_to_cache(p_srvc_cb, p_data->handle, &p_data->type, 0,
+                                            BTA_GATTC_ATTR_TYPE_CHAR_DESCR);
                 break;
         }
     }
@@ -1061,7 +1075,7 @@
     while (p_service_id && p_cache && !done)
     {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-        APPL_TRACE_DEBUG3("Service: handle[%d] uuid[0x%04x] inst[%d]",
+        APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]",
                           p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16,
                           p_cache->service_uuid.id.inst_id);
 #endif
@@ -1072,8 +1086,9 @@
             for (j = 0; p_attr; j ++)
             {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                APPL_TRACE_DEBUG5("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
-                                  j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, p_attr->attr_type);
+                APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+                                  j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16,
+                                    p_attr->inst_id, p_attr->attr_type);
 #endif
                 bta_gattc_pack_attr_uuid(p_attr, &attr_uuid);
 
@@ -1089,7 +1104,7 @@
                     else
                     {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                        APPL_TRACE_DEBUG0("found matching characteristic for the descriptor");
+                        APPL_TRACE_DEBUG("found matching characteristic for the descriptor");
 #endif
                         char_map = TRUE;
                     }
@@ -1104,7 +1119,7 @@
                             p_descr_uuid->inst_id == p_attr->inst_id)
                         {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                            APPL_TRACE_DEBUG0("found descriptor!!");
+                            APPL_TRACE_DEBUG("found descriptor!!");
 #endif
                             handle = p_attr->attr_handle;
                             done = TRUE;
@@ -1113,14 +1128,14 @@
                         else
                         {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                            APPL_TRACE_DEBUG0("descriptor UUID not matching");
+                            APPL_TRACE_DEBUG("descriptor UUID not matching");
 #endif
                         }
                     }
                     else /* another char */
                     {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                        APPL_TRACE_DEBUG0("no matching descriptor found!! start of next characteristic");
+                       APPL_TRACE_DEBUG("no matching descptr found!!start of next characteristic");
 #endif
                         char_map = FALSE;
                         done = TRUE;
@@ -1159,7 +1174,7 @@
     while (p_cache)
     {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-        APPL_TRACE_DEBUG3("Service: handle[%d] uuid[0x%04x] inst[%d]",
+        APPL_TRACE_DEBUG("Service: handle[%d] uuid[0x%04x] inst[%d]",
                           p_cache->s_handle, p_cache->service_uuid.id.uuid.uu.uuid16,
                           p_cache->service_uuid.id.inst_id);
 #endif
@@ -1177,8 +1192,9 @@
             for (j = 0; p_attr; j ++)
             {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                APPL_TRACE_DEBUG5("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
-                                  j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16, p_attr->inst_id, p_attr->attr_type);
+                APPL_TRACE_DEBUG("\t Attr[0x%04x] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+                                  j + 1, p_attr->attr_handle, p_attr->p_uuid->uuid16,
+                                  p_attr->inst_id, p_attr->attr_type);
 #endif
                 if (p_attr->attr_type == BTA_GATTC_ATTR_TYPE_CHAR)
                     p_char = p_attr;
@@ -1199,7 +1215,7 @@
                         }
                         else
                         {
-                            APPL_TRACE_ERROR0("descriptor does not belong to any chracteristic, error");
+                            APPL_TRACE_ERROR("descptr does not belong to any chracteristic");
                         }
                     }
                     else
@@ -1239,7 +1255,7 @@
         if (bta_gattc_uuid_compare(p_uuid, &p_cache->service_uuid.id.uuid, FALSE))
         {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-            APPL_TRACE_DEBUG3("found service [0x%04x], inst[%d] handle [%d]",
+            APPL_TRACE_DEBUG("found service [0x%04x], inst[%d] handle [%d]",
                               p_cache->service_uuid.id.uuid.uu.uuid16,
                               p_cache->service_uuid.id.inst_id,
                               p_cache->s_handle);
@@ -1249,7 +1265,8 @@
                 memset(&cb_data, 0, sizeof(tBTA_GATTC));
 
                 cb_data.srvc_res.conn_id = p_clcb->bta_conn_id;
-                memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid ,sizeof(tBTA_GATT_SRVC_ID));
+                memcpy(&cb_data.srvc_res.service_uuid, &p_cache->service_uuid,
+                        sizeof(tBTA_GATT_SRVC_ID));
 
                 (* p_clcb->p_rcb->p_cback)(BTA_GATTC_SEARCH_RES_EVT, &cb_data);
             }
@@ -1289,7 +1306,7 @@
         if (bta_gattc_srvcid_compare(p_service_id, &p_cache->service_uuid))
         {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-            APPL_TRACE_DEBUG2("found matching service [0x%04x], inst[%d]",
+            APPL_TRACE_DEBUG("found matching service [0x%04x], inst[%d]",
                               p_cache->service_uuid.id.uuid.uu.uuid16,
                               p_cache->service_uuid.id.inst_id);
 #endif
@@ -1298,7 +1315,7 @@
             for (j = 0; p_attr; j ++)
             {
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                APPL_TRACE_DEBUG5("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
+                APPL_TRACE_DEBUG("\t Attr[%d] handle[0x%04x] uuid[0x%04x] inst[%d] type[%d]",
                                   j + 1, p_attr->attr_handle,
                                   p_attr->p_uuid->uuid16,
                                   p_attr->inst_id,
@@ -1359,7 +1376,7 @@
                         {
 
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
-                            APPL_TRACE_DEBUG0("found char handle mapping characteristic");
+                            APPL_TRACE_DEBUG("found char handle mapping characteristic");
 #endif
                             p_result->inst_id = p_attr->inst_id;
 
@@ -1382,7 +1399,7 @@
 #if (defined BTA_GATT_DEBUG && BTA_GATT_DEBUG == TRUE)
             if (status)
             {
-                APPL_TRACE_ERROR0("In the given service, can not find matching record");
+                APPL_TRACE_ERROR("In the given service, can not find matching record");
             }
 #endif
             break;
@@ -1423,9 +1440,6 @@
     tBTA_GATTC_CLCB *p_clcb = bta_gattc_find_clcb_by_conn_id(conn_id);
     tBTA_GATT_STATUS status = BTA_GATT_ILLEGAL_PARAMETER;
 
-    /* lock other GKI task */
-    GKI_sched_lock();
-
     if (p_clcb != NULL )
     {
         if (p_clcb->state == BTA_GATTC_CONN_ST)
@@ -1445,21 +1459,20 @@
             else
             {
                 status = BTA_GATT_ERROR;
-                APPL_TRACE_ERROR0("No server cache available");
+                APPL_TRACE_ERROR("No server cache available");
             }
         }
         else
         {
-            APPL_TRACE_ERROR1("server cache not available, CLCB state = %d", p_clcb->state);
+            APPL_TRACE_ERROR("server cache not available, CLCB state = %d", p_clcb->state);
 
             status = (p_clcb->state == BTA_GATTC_DISCOVER_ST) ? BTA_GATT_BUSY : BTA_GATT_ERROR;
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Unknown conn ID: %d", conn_id);
+        APPL_TRACE_ERROR("Unknown conn ID: %d", conn_id);
     }
-    GKI_sched_unlock();
 
     return status;
 }
@@ -1479,7 +1492,7 @@
                              tBTA_GATTC_NV_ATTR *p_attr, UINT16 attr_index)
 {
     /* first attribute loading, initialize buffer */
-    APPL_TRACE_ERROR0("bta_gattc_rebuild_cache");
+    APPL_TRACE_ERROR("bta_gattc_rebuild_cache");
     if (attr_index == 0)
     {
         while (p_srvc_cb->cache_buffer.p_first)
@@ -1487,7 +1500,7 @@
 
         if (bta_gattc_alloc_cache_buf(p_srvc_cb) == NULL)
         {
-            APPL_TRACE_ERROR0("allocate cache buffer failed, no resources");
+            APPL_TRACE_ERROR("allocate cache buffer failed, no resources");
         }
         else
         {
@@ -1533,7 +1546,8 @@
 **
 *******************************************************************************/
 void bta_gattc_fill_nv_attr(tBTA_GATTC_NV_ATTR *p_attr, UINT8 type, UINT16 s_handle,
-                            UINT16 e_handle, UINT8 id, tBT_UUID uuid, UINT8 prop, BOOLEAN is_primary)
+                            UINT16 e_handle, UINT8 id, tBT_UUID uuid, UINT8 prop,
+                            BOOLEAN is_primary)
 {
     p_attr->s_handle    = s_handle;
     p_attr->e_handle    = e_handle;
diff --git a/bta/gatt/bta_gattc_int.h b/bta/gatt/bta_gattc_int.h
index 4f192cb..3b8430f 100644
--- a/bta/gatt/bta_gattc_int.h
+++ b/bta/gatt/bta_gattc_int.h
@@ -118,6 +118,7 @@
     BD_ADDR                 remote_bda;
     tBTA_GATTC_IF           client_if;
     BOOLEAN                 is_direct;
+    tBTA_TRANSPORT          transport;
 } tBTA_GATTC_API_OPEN;
 
 typedef tBTA_GATTC_API_OPEN tBTA_GATTC_API_CANCEL_OPEN;
@@ -202,6 +203,7 @@
     BD_ADDR                 remote_bda;
     tBTA_GATTC_IF           client_if;
     UINT8                   role;
+    tBT_TRANSPORT           transport;
     tGATT_DISCONN_REASON    reason;
 }tBTA_GATTC_INT_CONN;
 
@@ -340,7 +342,7 @@
 } tBTA_GATTC_SERV;
 
 #ifndef BTA_GATTC_NOTIF_REG_MAX
-#define BTA_GATTC_NOTIF_REG_MAX     7
+#define BTA_GATTC_NOTIF_REG_MAX     15
 #endif
 
 typedef struct
@@ -366,6 +368,7 @@
 {
     UINT16              bta_conn_id;    /* client channel ID, unique for clcb */
     BD_ADDR             bda;
+    tBTA_TRANSPORT      transport;      /* channel transport */
     tBTA_GATTC_RCB      *p_rcb;         /* pointer to the registration CB */
     tBTA_GATTC_SERV     *p_srcb;    /* server cache CB */
     tBTA_GATTC_DATA     *p_q_cmd;   /* command in queue waiting for execution */
@@ -375,6 +378,7 @@
 #define BTA_GATTC_REQ_WAITING       0x10
 
     UINT8               auto_update; /* auto update is waiting */
+    BOOLEAN             disc_active;
     BOOLEAN             in_use;
     tBTA_GATTC_STATE    state;
     tBTA_GATT_STATUS    status;
@@ -444,7 +448,7 @@
 **  Function prototypes
 *****************************************************************************/
 extern BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg);
-extern void bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data);
+extern BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data);
 
 /* function processed outside SM */
 extern void bta_gattc_disable(tBTA_GATTC_CB *p_cb);
@@ -491,7 +495,7 @@
 extern void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN *p_data, tBTA_GATTC_RCB *p_clreg);
 extern void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN *p_data);
 extern void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status,
-                                       BD_ADDR remote_bda, UINT16 conn_id, UINT16 mtu);
+                                       BD_ADDR remote_bda, UINT16 conn_id, tBTA_TRANSPORT transport,  UINT16 mtu);
 extern void bta_gattc_process_api_refresh(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg);
 extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data);
 #if BLE_INCLUDED == TRUE
@@ -499,11 +503,11 @@
 extern void bta_gattc_broadcast(tBTA_GATTC_CB *p_cb, tBTA_GATTC_DATA * p_msg);
 #endif
 /* utility functions */
-extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
 extern tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_conn_id (UINT16 conn_id);
-extern tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
 extern void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB *p_clcb);
-extern tBTA_GATTC_CLCB * bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda);
+extern tBTA_GATTC_CLCB * bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, tBTA_TRANSPORT transport);
 extern tBTA_GATTC_RCB * bta_gattc_cl_get_regcb(UINT8 client_if);
 extern tBTA_GATTC_SERV * bta_gattc_find_srcb(BD_ADDR bda);
 extern tBTA_GATTC_SERV * bta_gattc_srcb_alloc(BD_ADDR bda);
diff --git a/bta/gatt/bta_gattc_main.c b/bta/gatt/bta_gattc_main.c
index 932a1d7..7885fa6 100644
--- a/bta/gatt/bta_gattc_main.c
+++ b/bta/gatt/bta_gattc_main.c
@@ -288,18 +288,20 @@
 ** Description      State machine event handling function for GATTC
 **
 **
-** Returns          void
+** Returns          BOOLEAN  : TRUE if queued client request buffer can be immediately released
+**                                        else FALSE
 **
 *******************************************************************************/
-void bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data)
+BOOLEAN bta_gattc_sm_execute(tBTA_GATTC_CLCB *p_clcb, UINT16 event, tBTA_GATTC_DATA *p_data)
 {
     tBTA_GATTC_ST_TBL     state_table;
     UINT8               action;
     int                 i;
+    BOOLEAN             rt = TRUE;
 #if BTA_GATT_DEBUG == TRUE
     tBTA_GATTC_STATE in_state = p_clcb->state;
     UINT16         in_event = event;
-    APPL_TRACE_DEBUG4("bta_gattc_sm_execute: State 0x%02x [%s], Event 0x%x[%s]", in_state,
+    APPL_TRACE_DEBUG("bta_gattc_sm_execute: State 0x%02x [%s], Event 0x%x[%s]", in_state,
                       gattc_state_code(in_state),
                       in_event,
                       gattc_evt_code(in_event));
@@ -320,6 +322,12 @@
         if ((action = state_table[event][i]) != BTA_GATTC_IGNORE)
         {
             (*bta_gattc_action[action])(p_clcb, p_data);
+            if (p_clcb->p_q_cmd == p_data) {
+                /* buffer is queued, don't free in the bta dispatcher.
+                 * we free it ourselves when a completion event is received.
+                 */
+                rt = FALSE;
+            }
         }
         else
         {
@@ -330,12 +338,13 @@
 #if BTA_GATT_DEBUG == TRUE
     if (in_state != p_clcb->state)
     {
-        APPL_TRACE_DEBUG3("GATTC State Change: [%s] -> [%s] after Event [%s]",
+        APPL_TRACE_DEBUG("GATTC State Change: [%s] -> [%s] after Event [%s]",
                           gattc_state_code(in_state),
                           gattc_state_code(p_clcb->state),
                           gattc_evt_code(in_event));
     }
 #endif
+    return rt;
 }
 
 /*******************************************************************************
@@ -345,7 +354,7 @@
 ** Description      GATT client main event handling function.
 **
 **
-** Returns          void
+** Returns          BOOLEAN
 **
 *******************************************************************************/
 BOOLEAN bta_gattc_hdl_event(BT_HDR *p_msg)
@@ -353,8 +362,9 @@
     tBTA_GATTC_CB *p_cb = &bta_gattc_cb;
     tBTA_GATTC_CLCB *p_clcb = NULL;
     tBTA_GATTC_RCB      *p_clreg;
+    BOOLEAN             rt = TRUE;
 #if BTA_GATT_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_gattc_hdl_event: Event [%s]", gattc_evt_code(p_msg->event));
+    APPL_TRACE_DEBUG("bta_gattc_hdl_event: Event [%s]", gattc_evt_code(p_msg->event));
 #endif
     switch (p_msg->event)
     {
@@ -410,18 +420,18 @@
 
             if (p_clcb != NULL)
             {
-                bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg);
+                rt = bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA *) p_msg);
             }
             else
             {
-                APPL_TRACE_DEBUG1("Ignore unknown conn ID: %d", p_msg->layer_specific);
+                APPL_TRACE_DEBUG("Ignore unknown conn ID: %d", p_msg->layer_specific);
             }
 
             break;
     }
 
 
-    return(TRUE);
+    return rt;
 }
 
 
diff --git a/bta/gatt/bta_gattc_utils.c b/bta/gatt/bta_gattc_utils.c
index b52e52c..a7a9557 100644
--- a/bta/gatt/bta_gattc_utils.c
+++ b/bta/gatt/bta_gattc_utils.c
@@ -163,7 +163,8 @@
 ** Returns          pointer to the clcb
 **
 *******************************************************************************/
-tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB * bta_gattc_find_clcb_by_cif (UINT8 client_if, BD_ADDR remote_bda,
+                                              tBTA_TRANSPORT transport)
 {
     tBTA_GATTC_CLCB *p_clcb = &bta_gattc_cb.clcb[0];
     UINT8   i;
@@ -172,6 +173,7 @@
     {
         if (p_clcb->in_use &&
             p_clcb->p_rcb->client_if == client_if &&
+            p_clcb->transport == transport &&
             bdcmp(p_clcb->bda, remote_bda) == 0)
             return p_clcb;
     }
@@ -209,7 +211,8 @@
 ** Returns          pointer to the clcb
 **
 *******************************************************************************/
-tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB * bta_gattc_clcb_alloc(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+                                       tBTA_TRANSPORT transport)
 {
     UINT8               i_clcb = 0;
     tBTA_GATTC_CLCB     *p_clcb = NULL;
@@ -219,11 +222,12 @@
         if (!bta_gattc_cb.clcb[i_clcb].in_use)
         {
 #if BTA_GATT_DEBUG == TRUE
-            APPL_TRACE_DEBUG1("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb);
+            APPL_TRACE_DEBUG("bta_gattc_clcb_alloc: found clcb[%d] available",i_clcb);
 #endif
             p_clcb                  = &bta_gattc_cb.clcb[i_clcb];
             p_clcb->in_use          = TRUE;
             p_clcb->status          = BTA_GATT_OK;
+            p_clcb->transport       = transport;
             bdcpy(p_clcb->bda, remote_bda);
 
             p_clcb->p_rcb = bta_gattc_cl_get_regcb(client_if);
@@ -256,13 +260,14 @@
 ** Returns          pointer to the clcb
 **
 *******************************************************************************/
-tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda)
+tBTA_GATTC_CLCB *bta_gattc_find_alloc_clcb(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+                                           tBTA_TRANSPORT transport)
 {
     tBTA_GATTC_CLCB *p_clcb ;
 
-    if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda)) == NULL)
+    if ((p_clcb = bta_gattc_find_clcb_by_cif(client_if, remote_bda, transport)) == NULL)
     {
-        p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda);
+        p_clcb = bta_gattc_clcb_alloc(client_if, remote_bda, transport);
     }
     return p_clcb;
 }
@@ -303,7 +308,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("bta_gattc_clcb_dealloc p_clcb=NULL");
+        APPL_TRACE_ERROR("bta_gattc_clcb_dealloc p_clcb=NULL");
     }
 }
 
@@ -427,168 +432,20 @@
 *******************************************************************************/
 BOOLEAN bta_gattc_enqueue(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
 {
-    BOOLEAN in_q = FALSE;
 
-    if (p_clcb->p_q_cmd == NULL && p_data)
-    {
-        UINT16 len;
-        switch (p_data->hdr.event)
-        {
-            case BTA_GATTC_API_SEARCH_EVT:
-            {
-                if (p_data->api_search.p_srvc_uuid)
-                {
-                    len = sizeof(tBTA_GATTC_API_SEARCH) + sizeof(tBT_UUID);
-                }
-                else
-                {
-                    len = sizeof(tBTA_GATTC_API_SEARCH);
-                }
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_SEARCH));
-                if (p_data->api_search.p_srvc_uuid)
-                {
-                    tBTA_GATTC_API_SEARCH *p_buf;
-                    p_buf = &(p_clcb->p_q_cmd->api_search);
-                    p_buf->p_srvc_uuid = (tBT_UUID *)(p_buf + 1);
-                    memcpy(p_buf->p_srvc_uuid, p_data->api_search.p_srvc_uuid,
-                           sizeof(tBT_UUID));
-                }
-                break;
-            }
-            case BTA_GATTC_API_READ_EVT:
-            {
-                if (p_data->api_read.p_descr_type)
-                {
-                    len = sizeof(tBTA_GATT_ID) + sizeof(tBTA_GATTC_API_READ);
-                }
-                else
-                {
-                    len = sizeof(tBTA_GATTC_API_READ);
-                }
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_READ));
-                if (p_data->api_read.p_descr_type)
-                {
-                    tBTA_GATTC_API_READ *p_buf;
-                    p_buf = &(p_clcb->p_q_cmd->api_read);
-                    p_buf->p_descr_type = (tBTA_GATT_ID *)(p_buf + 1);
-                    memcpy(p_buf->p_descr_type, p_data->api_read.p_descr_type,
-                           sizeof(tBTA_GATT_ID));
-                }
-                break;
-            }
-            case BTA_GATTC_API_WRITE_EVT:
-            {
-                tBTA_GATTC_API_WRITE  *p_buf;
-                len = sizeof(tBTA_GATTC_API_WRITE) + p_data->api_write.len;
-                if (p_data->api_write.p_descr_type)
-                {
-                    len += sizeof(tBTA_GATT_ID);
-                }
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_WRITE));
-                p_buf = &(p_clcb->p_q_cmd->api_write);
-                if (p_data->api_write.p_descr_type)
-                {
-                    p_buf->p_descr_type = (tBTA_GATT_ID *)(p_buf + 1);
-                    memcpy(p_buf->p_descr_type, p_data->api_write.p_descr_type,
-                           sizeof(tBTA_GATT_ID));
-                    if (p_buf->len && p_buf->p_value)
-                    {
-                        p_buf->p_value  = (UINT8 *)(p_buf->p_descr_type + 1);
-                        memcpy(p_buf->p_value, p_data->api_write.p_value,
-                               p_data->api_write.len);
-                    }
-                }
-                else if (p_buf->len && p_buf->p_value)
-                {
-                    p_buf->p_value = (UINT8 *)(p_buf + 1);
-                    memcpy(p_buf->p_value, p_data->api_write.p_value,
-                           p_data->api_write.len);
-                }
-                break;
-            }
-            case BTA_GATTC_API_EXEC_EVT:
-            {
-                len = sizeof(tBTA_GATTC_API_EXEC);
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, len);
-                break;
-            }
-            case BTA_GATTC_API_READ_MULTI_EVT:
-            {
-                len = sizeof(tBTA_GATTC_API_READ_MULTI) +
-                      p_data->api_read_multi.num_attr * sizeof(tBTA_GATTC_ATTR_ID);
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, sizeof(tBTA_GATTC_API_READ_MULTI));
-                if (p_data->api_read_multi.num_attr &&
-                    p_data->api_read_multi.p_id_list)
-                {
-                    tBTA_GATTC_API_READ_MULTI *p_buf;
-                    p_buf = &(p_clcb->p_q_cmd->api_read_multi);
-                    p_buf->p_id_list = (tBTA_GATTC_ATTR_ID *)(p_buf + 1);
-                    memcpy(p_buf->p_id_list, p_data->api_read_multi.p_id_list,
-                        p_data->api_read_multi.num_attr * sizeof(tBTA_GATTC_ATTR_ID));
-                }
-                break;
-            }
-            case BTA_GATTC_API_CFG_MTU_EVT:
-            {
-                len = sizeof(tBTA_GATTC_API_CFG_MTU);
-                p_clcb->p_q_cmd = (tBTA_GATTC_DATA *)GKI_getbuf(len);
-                if (p_clcb->p_q_cmd == NULL)
-                {
-                    APPL_TRACE_ERROR0("allocate buffer failed for p_q_cmd");
-                    return FALSE;
-                }
-                memcpy(p_clcb->p_q_cmd, p_data, len);
-                break;
-            }
-            default:
-                APPL_TRACE_ERROR1("queue unsupported command %d", p_data->hdr.event);
-                return FALSE;
-        }
+ if (p_clcb->p_q_cmd == NULL)
+ {
+     p_clcb->p_q_cmd = p_data;
+ }
+ else
+ {
+     APPL_TRACE_ERROR("already has a pending command!!");
+     /* skip the callback now. ----- need to send callback ? */
+ }
+ return (p_clcb->p_q_cmd != NULL) ? TRUE : FALSE;
 
-        in_q = TRUE;
-    }
-    else if (p_clcb->p_q_cmd)
-    {
-        APPL_TRACE_ERROR0("already has a pending command!!");
-        /* skip the callback now. ----- need to send callback ? */
-    }
-    else
-    {
-        APPL_TRACE_ERROR0("queue a null command");
-    }
-
-    return in_q;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_gattc_pack_attr_uuid
@@ -716,7 +573,7 @@
             bdcmp(p_clreg->notif_reg[i].remote_bda, p_srcb->server_bda) == 0 &&
             bta_gattc_charid_compare (&p_clreg->notif_reg[i].char_id, &p_notify->char_id))
         {
-            APPL_TRACE_DEBUG0("Notification registered!");
+            APPL_TRACE_DEBUG("Notification registered!");
             return TRUE;
         }
     }
@@ -738,21 +595,23 @@
     tBTA_GATTC_IF       gatt_if;
     tBTA_GATTC_RCB      *p_clrcb ;
     UINT8       i;
+    tGATT_TRANSPORT     transport;
 
-    if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda))
+    if (GATT_GetConnectionInfor(conn_id, &gatt_if, remote_bda, &transport))
     {
         if ((p_clrcb = bta_gattc_cl_get_regcb(gatt_if)) != NULL)
         {
             for (i = 0 ; i < BTA_GATTC_NOTIF_REG_MAX; i ++)
             {
-                if (p_clrcb->notif_reg[i].in_use && !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda))
+                if (p_clrcb->notif_reg[i].in_use &&
+                    !bdcmp(p_clrcb->notif_reg[i].remote_bda, remote_bda))
                     memset(&p_clrcb->notif_reg[i], 0, sizeof(tBTA_GATTC_NOTIF_REG));
             }
         }
     }
     else
     {
-        APPL_TRACE_ERROR0("can not clear indication/notif registration for unknown app");
+        APPL_TRACE_ERROR("can not clear indication/notif registration for unknown app");
     }
     return;
 }
@@ -790,7 +649,7 @@
                                     &p_value->aggre_value.pre_format[i].descr_id) == FALSE)
             {
                 status = BTA_GATT_INTERNAL_ERROR;
-                APPL_TRACE_ERROR1("can not map to GATT ID. handle = 0x%04x", handle);
+                APPL_TRACE_ERROR("can not map to GATT ID. handle = 0x%04x", handle);
                 break;
             }
             i ++;
@@ -851,7 +710,7 @@
     }
     if (!add)
     {
-        APPL_TRACE_ERROR0("Do not find the bg connection mask for the remote device");
+        APPL_TRACE_ERROR("Do not find the bg connection mask for the remote device");
         return FALSE;
     }
     else /* adding a new device mask */
@@ -873,7 +732,7 @@
                 return TRUE;
             }
         }
-        APPL_TRACE_ERROR0("no available space to mark the bg connection status");
+        APPL_TRACE_ERROR("no available space to mark the bg connection status");
         return FALSE;
     }
 }
@@ -919,7 +778,8 @@
 **
 *******************************************************************************/
 void bta_gattc_send_open_cback( tBTA_GATTC_RCB *p_clreg, tBTA_GATT_STATUS status,
-                                BD_ADDR remote_bda, UINT16 conn_id, UINT16 mtu)
+                                BD_ADDR remote_bda, UINT16 conn_id,
+                                tBTA_TRANSPORT transport, UINT16 mtu)
 {
     tBTA_GATTC      cb_data;
 
@@ -931,6 +791,7 @@
         cb_data.open.client_if = p_clreg->client_if;
         cb_data.open.conn_id = conn_id;
         cb_data.open.mtu = mtu;
+        cb_data.open.transport = transport;
         bdcpy(cb_data.open.remote_bda, remote_bda);
 
         (*p_clreg->p_cback)(BTA_GATTC_OPEN_EVT, &cb_data);
@@ -955,7 +816,7 @@
         if (!p_conn->in_use)
         {
 #if BTA_GATT_DEBUG == TRUE
-            APPL_TRACE_DEBUG1("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn);
+            APPL_TRACE_DEBUG("bta_gattc_conn_alloc: found conn_track[%d] available",i_conn);
 #endif
             p_conn->in_use          = TRUE;
             bdcpy(p_conn->remote_bda, remote_bda);
@@ -984,7 +845,7 @@
         if (p_conn->in_use && bdcmp(remote_bda, p_conn->remote_bda) == 0)
         {
 #if BTA_GATT_DEBUG == TRUE
-            APPL_TRACE_DEBUG1("bta_gattc_conn_find: found conn_track[%d] matched",i_conn);
+            APPL_TRACE_DEBUG("bta_gattc_conn_find: found conn_track[%d] matched",i_conn);
 #endif
             return p_conn;
         }
@@ -1053,16 +914,19 @@
 
     /* try to locate a logic channel */
     if ((p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if,
-                                             p_msg->int_conn.remote_bda)) == NULL)
+                                             p_msg->int_conn.remote_bda,
+                                             p_msg->int_conn.transport)) == NULL)
     {
         /* for a background connection or listening connection */
-        if (p_msg->int_conn.role == HCI_ROLE_SLAVE ||
+        if (/*p_msg->int_conn.role == HCI_ROLE_SLAVE ||  */
             bta_gattc_check_bg_conn(p_msg->int_conn.client_if,
                                     p_msg->int_conn.remote_bda,
                                     p_msg->int_conn.role))
         {
             /* allocate a new channel */
-            p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if, p_msg->int_conn.remote_bda);
+            p_clcb = bta_gattc_clcb_alloc(p_msg->int_conn.client_if,
+                                          p_msg->int_conn.remote_bda,
+                                          p_msg->int_conn.transport);
         }
     }
     return p_clcb;
@@ -1083,16 +947,17 @@
     tGATT_DISCONN_REASON    reason = p_msg->int_conn.reason;
 
     bta_gattc_conn_dealloc(p_msg->int_conn.remote_bda);
-    /* connection attempt timeout, send connection callback event */
-    if (reason == GATT_CONN_CANCEL || reason == GATT_CONN_L2C_FAILURE)
+    if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL)
     {
+        /* connection attempt failed, send connection callback event */
         p_clcb = bta_gattc_find_clcb_by_cif(p_msg->int_conn.client_if,
-                                            p_msg->int_conn.remote_bda);
+                                            p_msg->int_conn.remote_bda,
+                                            p_msg->int_conn.transport);
     }
-    else if ((p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->int_conn.hdr.layer_specific)) == NULL)
+    if (p_clcb == NULL)
     {
-        APPL_TRACE_DEBUG1("disconnection ID: [%d] not used by BTA",
-                           p_msg->int_conn.hdr.layer_specific);
+        APPL_TRACE_DEBUG(" disconnection ID: [%d] not used by BTA",
+            p_msg->int_conn.hdr.layer_specific);
     }
     return p_clcb;
 }
diff --git a/bta/gatt/bta_gatts_act.c b/bta/gatt/bta_gatts_act.c
index be03655..20faa62 100644
--- a/bta/gatt/bta_gatts_act.c
+++ b/bta/gatt/bta_gatts_act.c
@@ -37,12 +37,17 @@
 #include <string.h>
 
 static void bta_gatts_nv_save_cback(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
-static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp);
+static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
+                                                tGATTS_SRV_CHG_RSP *p_rsp);
 
-static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
+                                      BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                      tGATT_TRANSPORT transport);
 static void bta_gatts_send_request_cback (UINT16 conn_id,
                                           UINT32 trans_id,
                                           tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
+static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested);
+
 static tGATT_CBACK bta_gatts_cback =
 {
     bta_gatts_conn_cback,
@@ -50,7 +55,8 @@
     NULL,
     NULL,
     bta_gatts_send_request_cback,
-    NULL
+    NULL,
+    bta_gatts_cong_cback
 };
 
 tGATT_APPL_INFO bta_gatts_nv_cback =
@@ -85,7 +91,8 @@
 ** Returns          none.
 **
 *******************************************************************************/
-static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
+static BOOLEAN bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
+                                              tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
 {
     return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
                                 (tBTA_GATTS_SRV_CHG_REQ *) p_req,
@@ -110,7 +117,7 @@
 
     if (p_cb->enabled)
     {
-        APPL_TRACE_DEBUG0("GATTS already enabled.");
+        APPL_TRACE_DEBUG("GATTS already enabled.");
     }
     else
     {
@@ -125,11 +132,11 @@
             index++;
         }
 
-        APPL_TRACE_DEBUG1("bta_gatts_enable: num of handle range added=%d", index);
+        APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
 
         if (!GATTS_NVRegister(&bta_gatts_nv_cback))
         {
-            APPL_TRACE_ERROR0("BTA GATTS NV register failed.");
+            APPL_TRACE_ERROR("BTA GATTS NV register failed.");
             status = BTA_GATT_ERROR;
         }
     }
@@ -162,7 +169,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("GATTS not enabled");
+        APPL_TRACE_ERROR("GATTS not enabled");
     }
 }
 
@@ -193,7 +200,7 @@
         {
             if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
             {
-                APPL_TRACE_ERROR0("application already registered.");
+                APPL_TRACE_ERROR("application already registered.");
                 status = BTA_GATT_DUP_REG;
                 break;
             }
@@ -217,20 +224,22 @@
 // btla-specific --
         if (first_unuse != 0xff)
         {
-            APPL_TRACE_ERROR1("register application first_unuse rcb_idx = %d", first_unuse);
+            APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
 
             p_cb->rcb[first_unuse].in_use = TRUE;
             p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
             memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
             cb_data.reg_oper.server_if      =
-            p_cb->rcb[first_unuse].gatt_if  = GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
+            p_cb->rcb[first_unuse].gatt_if  =
+            GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
             if ( !p_cb->rcb[first_unuse].gatt_if)
             {
                 status = BTA_GATT_NO_RESOURCES;
             }
             else
             {
-                if ((p_buf = (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
+                if ((p_buf =
+                  (tBTA_GATTS_INT_START_IF *) GKI_getbuf(sizeof(tBTA_GATTS_INT_START_IF))) != NULL)
                 {
                     p_buf->hdr.event    = BTA_GATTS_INT_START_IF_EVT;
                     p_buf->server_if    = p_cb->rcb[first_unuse].gatt_if;
@@ -275,7 +284,8 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Unable to start app.: Unknown interface =%d",p_msg->int_start_if.server_if );
+        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
+            p_msg->int_start_if.server_if );
     }
 }
 /*******************************************************************************
@@ -320,7 +330,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("application not registered.");
+        APPL_TRACE_ERROR("application not registered.");
     }
 }
 /*******************************************************************************
@@ -343,7 +353,7 @@
 
     rcb_idx = bta_gatts_find_app_rcb_idx_by_app_if(p_cb, p_msg->api_create_svc.server_if);
 
-    APPL_TRACE_ERROR1("create service rcb_idx = %d", rcb_idx);
+    APPL_TRACE_ERROR("create service rcb_idx = %d", rcb_idx);
 
     if (rcb_idx != BTA_GATTS_INVALID_APP)
     {
@@ -358,7 +368,8 @@
 
             if (service_id != 0)
             {
-                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
+                memcpy(&p_cb->srvc_cb[srvc_idx].service_uuid,
+                    &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
                 p_cb->srvc_cb[srvc_idx].service_id   = service_id;
                 p_cb->srvc_cb[srvc_idx].inst_num     = p_msg->api_create_svc.inst;
                 p_cb->srvc_cb[srvc_idx].idx          = srvc_idx;
@@ -374,7 +385,7 @@
             {
                 cb_data.status  = BTA_GATT_ERROR;
                 memset(&p_cb->srvc_cb[srvc_idx], 0, sizeof(tBTA_GATTS_SRVC_CB));
-                APPL_TRACE_ERROR0("service creation failed.");
+                APPL_TRACE_ERROR("service creation failed.");
             }
 // btla-specific ++
             memcpy(&cb_data.create.uuid, &p_msg->api_create_svc.service_uuid, sizeof(tBT_UUID));
@@ -386,7 +397,7 @@
     }
     else /* application not registered */
     {
-        APPL_TRACE_ERROR0("Application not registered");
+        APPL_TRACE_ERROR("Application not registered");
     }
 }
 /*******************************************************************************
@@ -554,7 +565,7 @@
                            p_srvc_cb->service_id,
                            p_msg->api_start.transport) ==  GATT_SUCCESS)
     {
-        APPL_TRACE_DEBUG1("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
+        APPL_TRACE_DEBUG("bta_gatts_start_service service_id= %d", p_srvc_cb->service_id);
         cb_data.srvc_oper.status = BTA_GATT_OK;
     }
     else
@@ -585,7 +596,7 @@
     cb_data.srvc_oper.server_if = p_rcb->gatt_if;
     cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
     cb_data.srvc_oper.status = BTA_GATT_OK;
-    APPL_TRACE_ERROR1("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
+    APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
 
     if (p_rcb->p_cback)
         (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
@@ -609,7 +620,7 @@
                         p_msg->api_rsp.status,
                         (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
     {
-        APPL_TRACE_ERROR0("Sending response failed");
+        APPL_TRACE_ERROR("Sending response failed");
     }
 
 }
@@ -617,11 +628,7 @@
 **
 ** Function         bta_gatts_indicate_handle
 **
-<<<<<<< HEAD
-** Description      GATTS indicate handel value
-=======
 ** Description      GATTS send handle value indication or notification.
->>>>>>> 6ea30bf... LE: UPF 45 bug fixes
 **
 ** Returns          none.
 **
@@ -629,17 +636,22 @@
 void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
 {
     tBTA_GATTS_SRVC_CB  *p_srvc_cb;
+    tBTA_GATTS_RCB      *p_rcb = NULL;
     tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
     tGATT_IF            gatt_if;
     BD_ADDR             remote_bda;
-
+    tBTA_TRANSPORT transport;
+    tBTA_GATTS          cb_data;
 
     p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
 
     if (p_srvc_cb )
     {
-        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific, &gatt_if, remote_bda))
+        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
+            &gatt_if, remote_bda, &transport))
         {
+            p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
+
             if (p_msg->api_indicate.need_confirm)
 
                 status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
@@ -653,7 +665,7 @@
                                                         p_msg->api_indicate.value);
 
             /* if over BR_EDR, inform PM for mode change */
-            if (!BTM_IsBleLink(remote_bda))
+            if (transport == BTA_TRANSPORT_BR_EDR)
             {
                 bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
                 bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
@@ -661,19 +673,22 @@
         }
         else
         {
-            APPL_TRACE_ERROR1("Unknown connection ID: %d fail sending notification",
+            APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
                               p_msg->api_indicate.hdr.layer_specific);
         }
 
-        if (status != GATT_SUCCESS && p_msg->api_indicate.need_confirm &&
-            p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
+        if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
+            p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
         {
-            (*p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)(BTA_GATTS_CONF_EVT, (tBTA_GATTS *)&status);
+            cb_data.req_data.status = status;
+            cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
+
+            (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Not an registered servce attribute ID: 0x%04x",
+        APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
                           p_msg->api_indicate.attr_id);
     }
 }
@@ -692,18 +707,27 @@
 {
     tBTA_GATTS_RCB      *p_rcb=NULL;
     tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
+    UINT16              conn_id;
     UNUSED(p_cb);
 
     if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
     {
-        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda, p_msg->api_open.is_direct))
+        /* should always get the connection ID */
+        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
+                        p_msg->api_open.is_direct, p_msg->api_open.transport))
         {
             status = BTA_GATT_OK;
+
+            if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
+                                            &conn_id, p_msg->api_open.transport))
+            {
+                status = BTA_GATT_ALREADY_OPEN;
+            }
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_open.server_if);
+        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
     }
 
     if (p_rcb && p_rcb->p_cback)
@@ -727,9 +751,10 @@
 
     if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
     {
-        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda, p_msg->api_cancel_open.is_direct))
+        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
+                                p_msg->api_cancel_open.is_direct))
         {
-            APPL_TRACE_ERROR0("bta_gatts_cancel_open failed for open request");
+            APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
         }
         else
         {
@@ -738,7 +763,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
+        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
     }
 
     if (p_rcb && p_rcb->p_cback)
@@ -759,13 +784,15 @@
     tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
     tGATT_IF            gatt_if;
     BD_ADDR             remote_bda;
+    tBTA_GATT_TRANSPORT transport;
+
     UNUSED(p_cb);
 
-    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda))
+    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
     {
         if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
         {
-            APPL_TRACE_ERROR1("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
+            APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
         }
         else
         {
@@ -776,7 +803,7 @@
 
         if (p_rcb && p_rcb->p_cback)
         {
-            if (!BTM_IsBleLink(remote_bda))
+            if (transport == BTA_TRANSPORT_BR_EDR)
                 bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
 
             (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
@@ -784,7 +811,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Unknown connection ID: %d", p_msg->hdr.layer_specific);
+        APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
     }
 
 }
@@ -808,7 +835,7 @@
 
     if (p_rcb == NULL)
     {
-        APPL_TRACE_ERROR0("Unknown GATTS application");
+        APPL_TRACE_ERROR("Unknown GATTS application");
         return;
     }
 
@@ -817,7 +844,7 @@
                      p_msg->api_listen.remote_bda))
     {
         cb_data.status = BTA_GATT_ERROR;
-        APPL_TRACE_ERROR0("bta_gatts_listen Listen failed");
+        APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
     }
 
     if (p_rcb->p_cback)
@@ -840,19 +867,21 @@
     tBTA_GATTS          cb_data;
     tBTA_GATTS_RCB     *p_rcb;
     tGATT_IF            gatt_if;
+    tBTA_GATT_TRANSPORT transport;
 
     memset(&cb_data, 0 , sizeof(tBTA_GATTS));
 
-    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda))
+    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
     {
         p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
 
-        APPL_TRACE_DEBUG3 ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d", conn_id, trans_id, req_type);
+        APPL_TRACE_DEBUG ("bta_gatts_send_request_cback conn_id=%d trans_id=%d req_type=%d",
+                            conn_id, trans_id, req_type);
 
         if (p_rcb && p_rcb->p_cback)
         {
             /* if over BR_EDR, inform PM for mode change */
-            if (!BTM_IsBleLink(cb_data.req_data.remote_bda))
+            if (transport == BTA_TRANSPORT_BR_EDR)
             {
                 bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
                 bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
@@ -866,12 +895,12 @@
         }
         else
         {
-            APPL_TRACE_ERROR1("connection request on gatt_if[%d] is not interested", gatt_if);
+            APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
         }
     }
     else
     {
-        APPL_TRACE_ERROR1("request received on unknown connectino ID: %d", conn_id);
+        APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
     }
 }
 
@@ -885,15 +914,16 @@
 **
 *******************************************************************************/
 static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
-                                  BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                  BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                  tGATT_TRANSPORT transport)
 {
     tBTA_GATTS      cb_data;
     UINT8           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
     tBTA_GATTS_RCB  *p_reg;
 
-    APPL_TRACE_DEBUG4 ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
+    APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
                         gatt_if, conn_id, connected, reason);
-    APPL_TRACE_DEBUG6("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
+    APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
                       bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
 
     p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
@@ -901,7 +931,7 @@
     if (p_reg && p_reg->p_cback)
     {
         /* there is no RM for GATT */
-        if (!BTM_IsBleLink(bda))
+        if (transport == BTA_TRANSPORT_BR_EDR)
         {
             if (connected)
                 bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
@@ -912,12 +942,43 @@
         cb_data.conn.conn_id = conn_id;
         cb_data.conn.server_if = gatt_if;
         cb_data.conn.reason = reason;
+        cb_data.conn.transport = transport;
         memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
         (*p_reg->p_cback)(evt, &cb_data);
     }
     else
     {
-        APPL_TRACE_ERROR1("bta_gatts_conn_cback server_if=%d not found",gatt_if);
+        APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_gatts_cong_cback
+**
+** Description      congestion callback.
+**
+** Returns          none.
+**
+*******************************************************************************/
+static void bta_gatts_cong_cback (UINT16 conn_id, BOOLEAN congested)
+{
+    tBTA_GATTS_RCB *p_rcb;
+    tGATT_IF gatt_if;
+    tBTA_GATT_TRANSPORT transport;
+    tBTA_GATTS cb_data;
+
+    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
+    {
+        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
+
+        if (p_rcb && p_rcb->p_cback)
+        {
+            cb_data.congest.conn_id = conn_id;
+            cb_data.congest.congested = congested;
+
+            (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
+        }
     }
 }
 #endif /* BTA_GATT_INCLUDED */
diff --git a/bta/gatt/bta_gatts_api.c b/bta/gatt/bta_gatts_api.c
index ad30d73..e2f1874 100644
--- a/bta/gatt/bta_gatts_api.c
+++ b/bta/gatt/bta_gatts_api.c
@@ -59,7 +59,7 @@
 
     if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
     {
-        APPL_TRACE_WARNING0("GATTS Module not enabled/already disabled");
+        APPL_TRACE_WARNING("GATTS Module not enabled/already disabled");
         return;
     }
 
@@ -90,11 +90,9 @@
     tBTA_GATTS_API_REG  *p_buf;
 
     /* register with BTA system manager */
-   if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
-   {
-        GKI_sched_lock();
+    if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
+    {
         bta_sys_register(BTA_ID_GATTS, &bta_gatts_reg);
-        GKI_sched_unlock();
     }
 
     if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL)
@@ -464,11 +462,13 @@
 ** Parameters       server_if: server interface.
 **                  remote_bda: remote device BD address.
 **                  is_direct: direct connection or background auto connection
+**                  transport : Transport on which GATT connection to be opened (BR/EDR or LE)
 **
 ** Returns          void
 **
 *******************************************************************************/
-void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct)
+void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct,
+                    tBTA_GATT_TRANSPORT transport)
 {
     tBTA_GATTS_API_OPEN  *p_buf;
 
@@ -477,6 +477,7 @@
         p_buf->hdr.event = BTA_GATTS_API_OPEN_EVT;
         p_buf->server_if = server_if;
         p_buf->is_direct = is_direct;
+        p_buf->transport = transport;
         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
 
         bta_sys_sendmsg(p_buf);
diff --git a/bta/gatt/bta_gatts_int.h b/bta/gatt/bta_gatts_int.h
index ce9553a..9a12dfd 100644
--- a/bta/gatt/bta_gatts_int.h
+++ b/bta/gatt/bta_gatts_int.h
@@ -139,10 +139,12 @@
 
 typedef struct
 {
-    BT_HDR              hdr;
-    BD_ADDR             remote_bda;
-    tBTA_GATTS_IF       server_if;
-    BOOLEAN             is_direct;
+    BT_HDR                  hdr;
+    BD_ADDR                 remote_bda;
+    tBTA_GATTS_IF           server_if;
+    BOOLEAN                 is_direct;
+    tBTA_GATT_TRANSPORT     transport;
+
 }tBTA_GATTS_API_OPEN;
 
 typedef tBTA_GATTS_API_OPEN tBTA_GATTS_API_CANCEL_OPEN;
diff --git a/bta/gatt/bta_gatts_main.c b/bta/gatt/bta_gatts_main.c
index 02810fc..9bcb471 100644
--- a/bta/gatt/bta_gatts_main.c
+++ b/bta/gatt/bta_gatts_main.c
@@ -128,7 +128,7 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("service not created");
+                APPL_TRACE_ERROR("service not created");
             }
             break;
 
diff --git a/bta/gatt/bta_gatts_utils.c b/bta/gatt/bta_gatts_utils.c
index 5145c95..e7ac1e3 100644
--- a/bta/gatt/bta_gatts_utils.c
+++ b/bta/gatt/bta_gatts_utils.c
@@ -133,13 +133,13 @@
 tBTA_GATTS_SRVC_CB * bta_gatts_find_srvc_cb_by_srvc_id(tBTA_GATTS_CB *p_cb, UINT16 service_id)
 {
     UINT8 i;
-    APPL_TRACE_DEBUG1("bta_gatts_find_srvc_cb_by_srvc_id  service_id=%d", service_id);
+    APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id  service_id=%d", service_id);
     for (i = 0; i < BTA_GATTS_MAX_SRVC_NUM; i ++)
     {
         if (p_cb->srvc_cb[i].in_use &&
             p_cb->srvc_cb[i].service_id == service_id)
         {
-            APPL_TRACE_DEBUG1("bta_gatts_find_srvc_cb_by_srvc_id  found service cb index =%d", i);
+            APPL_TRACE_DEBUG("bta_gatts_find_srvc_cb_by_srvc_id  found service cb index =%d", i);
             return &p_cb->srvc_cb[i];
         }
     }
diff --git a/bta/hf_client/bta_hf_client_act.c b/bta/hf_client/bta_hf_client_act.c
new file mode 100644
index 0000000..8e37909
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_act.c
@@ -0,0 +1,768 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 action functions for the handsfree client.
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "bta_dm_int.h"
+#include "l2c_api.h"
+#include "port_api.h"
+#include "bta_sys.h"
+#include "utl.h"
+#include "bt_utils.h"
+#include <string.h>
+
+/*****************************************************************************
+**  Constants
+*****************************************************************************/
+
+/* maximum length of data to read from RFCOMM */
+#define BTA_HF_CLIENT_RFC_READ_MAX     512
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_register
+**
+** Description      This function initializes values of the scb and sets up
+**                  the SDP record for the services.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_register(tBTA_HF_CLIENT_DATA *p_data)
+{
+    tBTA_HF_CLIENT evt;
+    tBTA_UTL_COD   cod;
+
+    memset(&evt, 0, sizeof(evt));
+
+    /* initialize control block */
+    bta_hf_client_scb_init();
+
+    bta_hf_client_cb.scb.serv_sec_mask = p_data->api_register.sec_mask;
+    bta_hf_client_cb.scb.features = p_data->api_register.features;
+
+    /* initialize AT control block */
+    bta_hf_client_at_init();
+
+    /* create SDP records */
+    bta_hf_client_create_record(p_data);
+
+    /* Set the Audio service class bit */
+    cod.service = BTM_COD_SERVICE_AUDIO;
+    utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
+
+    /* start RFCOMM server */
+    bta_hf_client_start_server();
+
+    /* call app callback with register event */
+    evt.reg.status = BTA_HF_CLIENT_SUCCESS;
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_REGISTER_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_deregister
+**
+** Description      This function removes the sdp records, closes the RFCOMM
+**                  servers, and deallocates the service control block.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_deregister(tBTA_HF_CLIENT_DATA *p_data)
+{
+    bta_hf_client_cb.scb.deregister = TRUE;
+
+    /* remove sdp record */
+    bta_hf_client_del_record(p_data);
+
+    /* remove rfcomm server */
+    bta_hf_client_close_server();
+
+    /* disable */
+    bta_hf_client_scb_disable();
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_start_dereg
+**
+** Description      Start a deregister event.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_start_dereg(tBTA_HF_CLIENT_DATA *p_data)
+{
+    bta_hf_client_cb.scb.deregister = TRUE;
+
+    /* remove sdp record */
+    bta_hf_client_del_record(p_data);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_start_close
+**
+** Description      Start the process of closing SCO and RFCOMM connection.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_start_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+    /* Take the link out of sniff and set L2C idle time to 0 */
+    bta_dm_pm_active(bta_hf_client_cb.scb.peer_addr);
+    L2CA_SetIdleTimeoutByBdAddr(bta_hf_client_cb.scb.peer_addr, 0);
+
+    /* if SCO is open close SCO and wait on RFCOMM close */
+    if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_OPEN_ST)
+    {
+        bta_hf_client_cb.scb.sco_close_rfc = TRUE;
+    }
+    else
+    {
+        bta_hf_client_rfc_do_close(p_data);
+    }
+
+    /* always do SCO shutdown to handle all SCO corner cases */
+    bta_hf_client_sco_shutdown(NULL);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_start_open
+**
+** Description      This starts an HF Client open.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_start_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    BD_ADDR pending_bd_addr;
+
+    /* store parameters */
+    if (p_data)
+    {
+        bdcpy(bta_hf_client_cb.scb.peer_addr, p_data->api_open.bd_addr);
+        bta_hf_client_cb.scb.cli_sec_mask = p_data->api_open.sec_mask;
+    }
+
+    /* Check if RFCOMM has any incoming connection to avoid collision. */
+    if (PORT_IsOpening (pending_bd_addr))
+    {
+        /* Let the incoming connection goes through.                        */
+        /* Issue collision for now.                                         */
+        /* We will decide what to do when we find incoming connection later.*/
+        bta_hf_client_collision_cback (0, BTA_ID_HS, 0, bta_hf_client_cb.scb.peer_addr);
+        return;
+    }
+
+    /* close server */
+    bta_hf_client_close_server();
+
+    /* set role */
+    bta_hf_client_cb.scb.role = BTA_HF_CLIENT_INT;
+
+    /* do service search */
+    bta_hf_client_do_disc();
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_cback_open
+**
+** Description      Send open callback event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_cback_open(tBTA_HF_CLIENT_DATA *p_data, tBTA_HF_CLIENT_STATUS status)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    /* call app callback with open event */
+    evt.open.status = status;
+    if(p_data)
+    {
+        /* if p_data is provided then we need to pick the bd address from the open api structure */
+        bdcpy(evt.open.bd_addr, p_data->api_open.bd_addr);
+    }
+    else
+    {
+        bdcpy(evt.open.bd_addr, bta_hf_client_cb.scb.peer_addr);
+    }
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_OPEN_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_open
+**
+** Description      Handle RFCOMM channel open.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    bta_sys_conn_open(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+    bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_SUCCESS);
+
+    /* start SLC procedure */
+    bta_hf_client_slc_seq(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_acp_open
+**
+** Description      Handle RFCOMM channel open when accepting connection.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_acp_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UINT16          lcid;
+    int             i;
+    BD_ADDR         dev_addr;
+    int             status;
+
+    /* set role */
+    bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+
+    APPL_TRACE_DEBUG ("bta_hf_client_rfc_acp_open: serv_handle = %d rfc.port_handle = %d",
+            bta_hf_client_cb.scb.serv_handle, p_data->rfc.port_handle);
+
+    /* get bd addr of peer */
+    if (PORT_SUCCESS != (status=PORT_CheckConnection(p_data->rfc.port_handle, dev_addr, &lcid)))
+    {
+        APPL_TRACE_DEBUG ("bta_hf_client_rfc_acp_open error PORT_CheckConnection returned status %d", status);
+    }
+
+    /* Collision Handling */
+    if (bta_hf_client_cb.scb.colli_tmr_on)
+    {
+        /* stop collision timer */
+        bta_hf_client_cb.scb.colli_tmr_on = FALSE;
+        bta_sys_stop_timer (&bta_hf_client_cb.scb.colli_timer);
+
+        if (bdcmp (dev_addr, bta_hf_client_cb.scb.peer_addr) == 0)
+        {
+            /* If incoming and outgoing device are same, nothing more to do.            */
+            /* Outgoing conn will be aborted because we have successful incoming conn.  */
+        }
+        else
+        {
+            /* Resume outgoing connection. */
+            bta_hf_client_resume_open ();
+        }
+    }
+
+    bdcpy (bta_hf_client_cb.scb.peer_addr, dev_addr);
+    bta_hf_client_cb.scb.conn_handle = p_data->rfc.port_handle;
+
+    /* do service discovery to get features */
+    bta_hf_client_do_disc();
+
+    /* continue with open processing */
+    bta_hf_client_rfc_open(p_data);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_fail
+**
+** Description      RFCOMM connection failed.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    /* reinitialize stuff */
+    bta_hf_client_cb.scb.conn_handle = 0;
+    bta_hf_client_cb.scb.peer_features = 0;
+    bta_hf_client_cb.scb.chld_features = 0;
+    bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+    bta_hf_client_cb.scb.svc_conn = FALSE;
+    bta_hf_client_cb.scb.send_at_reply = FALSE;
+    bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+    bta_hf_client_at_reset();
+
+    /* reopen server */
+    bta_hf_client_start_server();
+
+    /* call open cback w. failure */
+    bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_FAIL_RFCOMM);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_disc_fail
+**
+** Description      This function handles a discovery failure.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_disc_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    /* reopen server */
+    bta_hf_client_start_server();
+
+    /* reinitialize stuff */
+
+    /* call open cback w. failure */
+    bta_hf_client_cback_open(NULL, BTA_HF_CLIENT_FAIL_SDP);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_open_fail
+**
+** Description      open connection failed.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_open_fail(tBTA_HF_CLIENT_DATA *p_data)
+{
+    /* call open cback w. failure */
+    bta_hf_client_cback_open(p_data, BTA_HF_CLIENT_FAIL_RESOURCES);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_close
+**
+** Description      RFCOMM connection closed.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+    int i, num_active_conn = 0;
+    UNUSED(p_data);
+
+    /* reinitialize stuff */
+    bta_hf_client_cb.scb.peer_features = 0;
+    bta_hf_client_cb.scb.chld_features = 0;
+    bta_hf_client_cb.scb.role = BTA_HF_CLIENT_ACP;
+    bta_hf_client_cb.scb.svc_conn = FALSE;
+    bta_hf_client_cb.scb.send_at_reply = FALSE;
+    bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+    bta_hf_client_at_reset();
+
+    bta_sys_conn_close(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+    /* call close cback */
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLOSE_EVT, NULL);
+
+    /* if not deregistering reopen server */
+    if (bta_hf_client_cb.scb.deregister == FALSE)
+    {
+        /* Clear peer bd_addr so instance can be reused */
+        bdcpy(bta_hf_client_cb.scb.peer_addr, bd_addr_null);
+
+        /* start server as it might got closed on open*/
+        bta_hf_client_start_server();
+
+        bta_hf_client_cb.scb.conn_handle = 0;
+
+        /* Make sure SCO is shutdown */
+        bta_hf_client_sco_shutdown(NULL);
+
+        bta_sys_sco_unuse(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+    }
+    /* else close port and deallocate scb */
+    else
+    {
+        bta_hf_client_close_server();
+        bta_hf_client_scb_disable();
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_disc_int_res
+**
+** Description      This function handles a discovery result when initiator.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_disc_int_res(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UINT16 event = BTA_HF_CLIENT_DISC_FAIL_EVT;
+
+    APPL_TRACE_DEBUG ("bta_hf_client_disc_int_res: Status: %d", p_data->disc_result.status);
+
+    /* if found service */
+    if (p_data->disc_result.status == SDP_SUCCESS ||
+        p_data->disc_result.status == SDP_DB_FULL)
+    {
+        /* get attributes */
+        if (bta_hf_client_sdp_find_attr())
+        {
+            event = BTA_HF_CLIENT_DISC_OK_EVT;
+        }
+    }
+
+    /* free discovery db */
+    bta_hf_client_free_db(p_data);
+
+    /* send ourselves sdp ok/fail event */
+    bta_hf_client_sm_execute(event, p_data);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_disc_acp_res
+**
+** Description      This function handles a discovery result when acceptor.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_disc_acp_res(tBTA_HF_CLIENT_DATA *p_data)
+{
+    /* if found service */
+    if (p_data->disc_result.status == SDP_SUCCESS ||
+        p_data->disc_result.status == SDP_DB_FULL)
+    {
+        /* get attributes */
+        bta_hf_client_sdp_find_attr();
+    }
+
+    /* free discovery db */
+    bta_hf_client_free_db(p_data);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_data
+**
+** Description      Read and process data from RFCOMM.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_data(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UINT16  len;
+    char    buf[BTA_HF_CLIENT_RFC_READ_MAX];
+    UNUSED(p_data);
+
+    memset(buf, 0, sizeof(buf));
+
+    /* read data from rfcomm; if bad status, we're done */
+    while (PORT_ReadData(bta_hf_client_cb.scb.conn_handle, buf, BTA_HF_CLIENT_RFC_READ_MAX, &len) == PORT_SUCCESS)
+    {
+        /* if no data, we're done */
+        if (len == 0)
+        {
+            break;
+        }
+
+        bta_hf_client_at_parse(buf, len);
+
+        /* no more data to read, we're done */
+        if (len < BTA_HF_CLIENT_RFC_READ_MAX)
+        {
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_svc_conn_open
+**
+** Description      Service level connection opened
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_svc_conn_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    tBTA_HF_CLIENT evt;
+    UNUSED(p_data);
+
+    memset(&evt, 0, sizeof(evt));
+
+    if (!bta_hf_client_cb.scb.svc_conn)
+    {
+        /* set state variable */
+        bta_hf_client_cb.scb.svc_conn = TRUE;
+
+        /* call callback */
+        evt.conn.peer_feat = bta_hf_client_cb.scb.peer_features;
+        evt.conn.chld_feat = bta_hf_client_cb.scb.chld_features;
+
+        (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CONN_EVT, &evt);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_cback_ind
+**
+** Description      Send indicator callback event to application.
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_ind(tBTA_HF_CLIENT_IND_TYPE type, UINT16 value)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    evt.ind.type = type;
+    evt.ind.value = value;
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_IND_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_evt_val
+**
+** Description      Send event to application.
+**                  This is a generic helper for events with common data.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_evt_val(tBTA_HF_CLIENT_EVT type, UINT16 value)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    evt.val.value = value;
+
+    (*bta_hf_client_cb.p_cback)(type, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_operator_name
+**
+** Description      Send operator name event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_operator_name(char *name)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    strlcpy(evt.operator.name, name, BTA_HF_CLIENT_OPERATOR_NAME_LEN + 1);
+    evt.operator.name[BTA_HF_CLIENT_OPERATOR_NAME_LEN] = '\0';
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_OPERATOR_NAME_EVT, &evt);
+}
+
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_clip
+**
+** Description      Send CLIP event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_clip(char *number)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+    evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLIP_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_ccwa
+**
+** Description      Send CLIP event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_ccwa(char *number)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+    evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CCWA_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_at_result
+**
+** Description      Send AT result event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_at_result(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    evt.result.type = type;
+    evt.result.cme = cme;
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_AT_RESULT_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_clcc
+**
+** Description      Send clcc event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_clcc(UINT32 idx, BOOLEAN incoming, UINT8 status, BOOLEAN mpty, char *number)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    evt.clcc.idx = idx;
+    evt.clcc.inc = incoming;
+    evt.clcc.status = status;
+    evt.clcc.mpty = mpty;
+
+    if (number)
+    {
+        evt.clcc.number_present = TRUE;
+        strlcpy(evt.clcc.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+        evt.clcc.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+    }
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CLCC_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_cnum
+**
+** Description      Send cnum event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_cnum(char *number, UINT16 service)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    evt.cnum.service = service;
+    strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+    evt.cnum.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_CNUM_EVT, &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_binp
+**
+** Description      Send BINP event to application.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_binp(char *number)
+{
+    tBTA_HF_CLIENT evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    strlcpy(evt.number.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1);
+    evt.number.number[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_BINP_EVT, &evt);
+}
diff --git a/bta/hf_client/bta_hf_client_api.c b/bta/hf_client/bta_hf_client_api.c
new file mode 100644
index 0000000..6fdad9a
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_api.c
@@ -0,0 +1,289 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 is the implementation of the API for the handsfree (HF role)
+ *  subsystem of BTA
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "bd.h"
+
+/*****************************************************************************
+**  Constants and data types
+*****************************************************************************/
+static const tBTA_SYS_REG bta_hf_client_reg =
+{
+    bta_hf_client_hdl_event,
+    BTA_HfClientDisable
+};
+
+
+/*****************************************************************************
+**  External Function Declarations
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientEnable
+**
+** Description      Enable the HF CLient service. When the enable
+**                  operation is complete the callback function will be
+**                  called with a BTA_HF_CLIENT_ENABLE_EVT. This function must
+**                  be called before other function in the HF CLient API are
+**                  called.
+**
+** Returns          BTA_SUCCESS if OK, BTA_FAILURE otherwise.
+**
+*******************************************************************************/
+BTA_API tBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK *p_cback)
+{
+    tBTA_HF_CLIENT_API_ENABLE  *p_buf;
+    UINT8       idx;
+
+    if (bta_sys_is_register (BTA_ID_HS))
+    {
+        APPL_TRACE_ERROR("BTA HF Client is already enabled, ignoring ...");
+        return BTA_FAILURE;
+    }
+
+    /* register with BTA system manager */
+    bta_sys_register(BTA_ID_HS, &bta_hf_client_reg);
+
+    if ((p_buf = (tBTA_HF_CLIENT_API_ENABLE *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_ENABLE))) != NULL)
+    {
+        p_buf->hdr.event = BTA_HF_CLIENT_API_ENABLE_EVT;
+        p_buf->p_cback = p_cback;
+        bta_sys_sendmsg(p_buf);
+    }
+
+    return BTA_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientDisable
+**
+** Description      Disable the HF Client service
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDisable(void)
+{
+    BT_HDR  *p_buf;
+
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_HF_CLIENT_API_DISABLE_EVT;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientRegister
+**
+** Description      Register an HF Client service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientRegister(tBTA_SEC sec_mask, tBTA_HF_CLIENT_FEAT features,
+                                                        char *p_service_name)
+{
+    tBTA_HF_CLIENT_API_REGISTER    *p_buf;
+
+    if ((p_buf = (tBTA_HF_CLIENT_API_REGISTER *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_REGISTER))) != NULL)
+    {
+        p_buf->hdr.event = BTA_HF_CLIENT_API_REGISTER_EVT;
+        p_buf->features = features;
+        p_buf->sec_mask = sec_mask;
+        if(p_service_name)
+        {
+            BCM_STRNCPY_S(p_buf->name, BTA_SERVICE_NAME_LEN+1, p_service_name, BTA_SERVICE_NAME_LEN);
+            p_buf->name[BTA_SERVICE_NAME_LEN] = 0;
+        }
+        else
+        {
+            p_buf->name[0] = '\0';
+        }
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientDeregister
+**
+** Description      Deregister an HF Client service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDeregister(UINT16 handle)
+{
+    BT_HDR  *p_buf;
+
+     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+     {
+         p_buf->event = BTA_HF_CLIENT_API_DEREGISTER_EVT;
+         p_buf->layer_specific = handle;
+         bta_sys_sendmsg(p_buf);
+     }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientOpen
+**
+** Description      Opens a connection to an audio gateway.
+**                  When connection is open callback function is called
+**                  with a BTA_AG_OPEN_EVT. Only the data connection is
+**                  opened. The audio connection is not opened.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask)
+{
+    tBTA_HF_CLIENT_API_OPEN  *p_buf;
+
+    if ((p_buf = (tBTA_HF_CLIENT_API_OPEN *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_API_OPEN))) != NULL)
+    {
+        p_buf->hdr.event = BTA_HF_CLIENT_API_OPEN_EVT;
+        p_buf->hdr.layer_specific = handle;
+        bdcpy(p_buf->bd_addr, bd_addr);
+        p_buf->sec_mask = sec_mask;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientClose
+**
+** Description      Close the current connection to an audio gateway.
+**                  Any current audio connection will also be closed
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientClose(UINT16 handle)
+{
+    BT_HDR  *p_buf;
+
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_HF_CLIENT_API_CLOSE_EVT;
+        p_buf->layer_specific = handle;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfCllientAudioOpen
+**
+** Description      Opens an audio connection to the currently connected
+**                 audio gateway
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioOpen(UINT16 handle)
+{
+    BT_HDR  *p_buf;
+
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_HF_CLIENT_API_AUDIO_OPEN_EVT;
+        p_buf->layer_specific = handle;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientAudioClose
+**
+** Description      Close the currently active audio connection to an audio
+**                  gateway. The data connection remains open
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioClose(UINT16 handle)
+{
+    BT_HDR  *p_buf;
+
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT;
+        p_buf->layer_specific = handle;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientSendAT
+**
+** Description      send AT command
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientSendAT(UINT16 handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, UINT32 val1, UINT32 val2, const char *str)
+{
+    tBTA_HF_CLIENT_DATA_VAL  *p_buf;
+
+    if ((p_buf = (tBTA_HF_CLIENT_DATA_VAL *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DATA_VAL))) != NULL)
+    {
+        p_buf->hdr.event = BTA_HF_CLIENT_SEND_AT_CMD_EVT;
+        p_buf->uint8_val = at;
+        p_buf->uint32_val1 = val1;
+        p_buf->uint32_val2 = val2;
+
+        if (str)
+        {
+            strlcpy(p_buf->str, str, BTA_HF_CLIENT_NUMBER_LEN + 1);
+            p_buf->str[BTA_HF_CLIENT_NUMBER_LEN] = '\0';
+        }
+        else
+        {
+            p_buf->str[0] = '\0';
+        }
+
+        p_buf->hdr.layer_specific = handle;
+        bta_sys_sendmsg(p_buf);
+    }
+}
diff --git a/bta/hf_client/bta_hf_client_at.c b/bta/hf_client/bta_hf_client_at.c
new file mode 100644
index 0000000..462b287
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_at.c
@@ -0,0 +1,1816 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+#include "port_api.h"
+
+/* Uncomment to enable AT traffic dumping */
+/* #define BTA_HF_CLIENT_AT_DUMP 1 */
+
+/* minimum length of AT event */
+#define BTA_HF_CLIENT_AT_EVENT_MIN_LEN 3
+
+/* timeout for AT response  */
+#define BTA_HF_CLIENT_AT_TIMEOUT 29989
+
+/* timeout for AT hold timer  */
+#define BTA_HF_CLIENT_AT_HOLD_TIMEOUT 41
+
+/******************************************************************************
+**
+**          DATA TYPES AND CONTAINERS
+**
+*******************************************************************************/
+/* BRSF: store received values here */
+extern tBTA_HF_CLIENT_CB  bta_hf_client_cb;
+
+/******************************************************************************
+**       SUPPORTED EVENT MESSAGES
+*******************************************************************************/
+
+/* CIND: supported indicator names                        */
+#define BTA_HF_CLIENT_INDICATOR_BATTERYCHG  "battchg"
+#define BTA_HF_CLIENT_INDICATOR_SIGNAL      "signal"
+#define BTA_HF_CLIENT_INDICATOR_SERVICE     "service"
+#define BTA_HF_CLIENT_INDICATOR_CALL        "call"
+#define BTA_HF_CLIENT_INDICATOR_ROAM        "roam"
+#define BTA_HF_CLIENT_INDICATOR_CALLSETUP   "callsetup"
+#define BTA_HF_CLIENT_INDICATOR_CALLHELD    "callheld"
+
+/* CIND: represents each indicators boundaries */
+typedef struct
+{
+    char* name;
+    UINT8 min;
+    UINT8 max;
+    UINT8 namelen;
+} tBTA_HF_CLIENT_INDICATOR;
+
+#define BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT 7
+
+/* CIND: storage room for indicators value range and their statuses */
+static const tBTA_HF_CLIENT_INDICATOR bta_hf_client_indicators[BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT] =
+{
+    /* name                                | min | max | name length - used by parser */
+     {BTA_HF_CLIENT_INDICATOR_BATTERYCHG,     0,   5,    sizeof(BTA_HF_CLIENT_INDICATOR_BATTERYCHG)},
+     {BTA_HF_CLIENT_INDICATOR_SIGNAL,         0,   5,    sizeof(BTA_HF_CLIENT_INDICATOR_SIGNAL)},
+     {BTA_HF_CLIENT_INDICATOR_SERVICE,        0,   1,    sizeof(BTA_HF_CLIENT_INDICATOR_SERVICE)},
+     {BTA_HF_CLIENT_INDICATOR_CALL,           0,   1,    sizeof(BTA_HF_CLIENT_INDICATOR_CALL)},
+     {BTA_HF_CLIENT_INDICATOR_ROAM,           0,   1,    sizeof(BTA_HF_CLIENT_INDICATOR_ROAM)},
+     {BTA_HF_CLIENT_INDICATOR_CALLSETUP,      0,   3,    sizeof(BTA_HF_CLIENT_INDICATOR_CALLSETUP)},
+     {BTA_HF_CLIENT_INDICATOR_CALLHELD,       0,   2,    sizeof(BTA_HF_CLIENT_INDICATOR_CALLHELD)}
+};
+
+/* +VGM/+VGS - gain min/max values  */
+#define BTA_HF_CLIENT_VGS_MIN   0
+#define BTA_HF_CLIENT_VGS_MAX  15
+#define BTA_HF_CLIENT_VGM_MIN   0
+#define BTA_HF_CLIENT_VGM_MAX  15
+
+UINT32 service_index = 0;
+BOOLEAN service_availability = TRUE;
+/* helper functions for handling AT commands queueing */
+
+static void bta_hf_client_clear_queued_at(void)
+{
+    tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd;
+    tBTA_HF_CLIENT_AT_QCMD *next;
+
+    while (cur != NULL) {
+        next = cur->next;
+        GKI_freebuf(cur);
+        cur = next;
+    }
+
+    bta_hf_client_cb.scb.at_cb.queued_cmd = NULL;
+}
+
+static void bta_hf_client_queue_at(tBTA_HF_CLIENT_AT_CMD cmd, const char *buf, UINT16 buf_len)
+{
+    tBTA_HF_CLIENT_AT_QCMD *new_cmd;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if ((new_cmd = (tBTA_HF_CLIENT_AT_QCMD *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_AT_QCMD))) != NULL)
+    {
+        new_cmd->cmd = cmd;
+        new_cmd->buf_len = buf_len;
+        new_cmd->next = NULL;
+        memcpy(new_cmd->buf, buf, buf_len);
+
+        if (bta_hf_client_cb.scb.at_cb.queued_cmd != NULL)
+        {
+            tBTA_HF_CLIENT_AT_QCMD *qcmd = bta_hf_client_cb.scb.at_cb.queued_cmd;
+
+            while (qcmd->next != NULL)
+                qcmd = qcmd->next;
+
+            qcmd->next = new_cmd;
+        }
+        else
+        {
+            bta_hf_client_cb.scb.at_cb.queued_cmd = new_cmd;
+        }
+    }
+}
+
+static void bta_hf_client_at_resp_timer_cback (TIMER_LIST_ENT *p_tle)
+{
+    if (p_tle)
+    {
+        bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE;
+
+        APPL_TRACE_ERROR("HFPClient: AT response timeout, disconnecting");
+
+        bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+    }
+}
+
+static void bta_hf_client_stop_at_resp_timer(void)
+{
+    if (bta_hf_client_cb.scb.at_cb.resp_timer_on)
+    {
+        bta_hf_client_cb.scb.at_cb.resp_timer_on = FALSE;
+        bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer);
+    }
+}
+
+static void bta_hf_client_start_at_resp_timer(void)
+{
+    if (bta_hf_client_cb.scb.at_cb.resp_timer_on)
+    {
+        bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.resp_timer);
+    }
+
+    bta_hf_client_cb.scb.at_cb.resp_timer.p_cback = (TIMER_CBACK*)&bta_hf_client_at_resp_timer_cback;
+    bta_sys_start_timer(&bta_hf_client_cb.scb.at_cb.resp_timer, 0, BTA_HF_CLIENT_AT_TIMEOUT);
+    bta_hf_client_cb.scb.at_cb.resp_timer_on = TRUE;
+}
+
+static void bta_hf_client_send_at(tBTA_HF_CLIENT_AT_CMD cmd, char *buf, UINT16 buf_len)
+{
+    if ((bta_hf_client_cb.scb.at_cb.current_cmd == BTA_HF_CLIENT_AT_NONE ||
+            bta_hf_client_cb.scb.svc_conn == FALSE) &&
+            bta_hf_client_cb.scb.at_cb.hold_timer_on == FALSE)
+    {
+        UINT16  len;
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+        APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buf_len - 1, buf);
+#endif
+
+        bta_hf_client_cb.scb.at_cb.current_cmd = cmd;
+        PORT_WriteData(bta_hf_client_cb.scb.conn_handle, buf, buf_len, &len);
+
+        bta_hf_client_start_at_resp_timer();
+
+        return;
+    }
+
+    bta_hf_client_queue_at(cmd, buf, buf_len);
+}
+
+static void bta_hf_client_send_queued_at(void)
+{
+    tBTA_HF_CLIENT_AT_QCMD *cur = bta_hf_client_cb.scb.at_cb.queued_cmd;
+    tBTA_HF_CLIENT_AT_QCMD *next;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (cur != NULL)
+    {
+        next = cur->next;
+
+        bta_hf_client_send_at(cur->cmd, cur->buf, cur->buf_len);
+
+        GKI_freebuf(cur);
+
+        bta_hf_client_cb.scb.at_cb.queued_cmd = next;
+    }
+}
+
+static void bta_hf_client_at_hold_timer_cback(TIMER_LIST_ENT *p_tle)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (p_tle)
+    {
+        bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE;
+        bta_hf_client_send_queued_at();
+    }
+}
+
+static void bta_hf_client_stop_at_hold_timer(void)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (bta_hf_client_cb.scb.at_cb.hold_timer_on)
+    {
+        bta_hf_client_cb.scb.at_cb.hold_timer_on = FALSE;
+        bta_sys_stop_timer (&bta_hf_client_cb.scb.at_cb.hold_timer);
+    }
+}
+
+static void bta_hf_client_start_at_hold_timer(void)
+{
+    TIMER_LIST_ENT *timer = &bta_hf_client_cb.scb.at_cb.hold_timer;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (bta_hf_client_cb.scb.at_cb.hold_timer_on)
+    {
+        bta_sys_stop_timer (timer);
+    }
+
+    timer->p_cback = (TIMER_CBACK*)&bta_hf_client_at_hold_timer_cback;
+    bta_sys_start_timer(timer, 0, BTA_HF_CLIENT_AT_HOLD_TIMEOUT);
+    bta_hf_client_cb.scb.at_cb.hold_timer_on = TRUE;
+}
+
+/******************************************************************************
+**
+**          COMMON AT EVENT HANDLING FUNCTIONS
+**
+**   Receives data (strings, ints, etc.) from the parser and processes this data.
+**   No buffer parsing is being done here.
+*******************************************************************************/
+
+static void bta_hf_client_handle_ok()
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_stop_at_resp_timer();
+
+    if (!bta_hf_client_cb.scb.svc_conn)
+    {
+        bta_hf_client_slc_seq(FALSE);
+        return;
+    }
+
+    switch(bta_hf_client_cb.scb.at_cb.current_cmd)
+    {
+        case BTA_HF_CLIENT_AT_BIA:
+        case BTA_HF_CLIENT_AT_BCC:
+            break;
+        case BTA_HF_CLIENT_AT_BCS:
+            bta_hf_client_start_at_hold_timer();
+            bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+            return;
+        case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq
+            if (bta_hf_client_cb.scb.send_at_reply == FALSE)
+            {
+                bta_hf_client_cb.scb.send_at_reply = TRUE;
+            }
+            break;
+        case BTA_HF_CLIENT_AT_NONE:
+            bta_hf_client_stop_at_hold_timer();
+            break;
+        default:
+            if (bta_hf_client_cb.scb.send_at_reply)
+            {
+                bta_hf_client_at_result(BTA_HF_CLIENT_AT_RESULT_OK, 0);
+            }
+            break;
+    }
+
+    bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+    bta_hf_client_send_queued_at();
+}
+
+static void bta_hf_client_handle_error(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme)
+{
+    APPL_TRACE_DEBUG("%s %u %u", __FUNCTION__, type, cme);
+
+    bta_hf_client_stop_at_resp_timer();
+
+    if (!bta_hf_client_cb.scb.svc_conn)
+    {
+        bta_hf_client_slc_seq(TRUE);
+        return;
+    }
+
+    switch(bta_hf_client_cb.scb.at_cb.current_cmd)
+    {
+        case BTA_HF_CLIENT_AT_BIA:
+            break;
+        case BTA_HF_CLIENT_AT_BCC:
+        case BTA_HF_CLIENT_AT_BCS:
+            bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
+            break;
+        case BTA_HF_CLIENT_AT_CLIP: //last cmd is post slc seq
+            if (bta_hf_client_cb.scb.send_at_reply == FALSE)
+            {
+                bta_hf_client_cb.scb.send_at_reply = TRUE;
+            }
+            break;
+        default:
+            if (bta_hf_client_cb.scb.send_at_reply)
+            {
+                bta_hf_client_at_result(type, cme);
+            }
+            break;
+    }
+
+    bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+    bta_hf_client_send_queued_at();
+}
+
+static void bta_hf_client_handle_ring()
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+    bta_hf_client_evt_val(BTA_HF_CLIENT_RING_INDICATION,0);
+}
+
+static void bta_hf_client_handle_brsf(UINT32 value)
+{
+    APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, value);
+    bta_hf_client_cb.scb.peer_features = value;
+}
+
+/* handles a single indicator descriptor - registers it for value changing events */
+static void bta_hf_client_handle_cind_list_item(char *name, UINT32 min, UINT32 max, UINT32 index)
+{
+
+    UINT8 i = 0;
+
+    APPL_TRACE_DEBUG("%s %lu.%s <%lu:%lu>", __FUNCTION__, index, name, min, max);
+
+    /* look for a matching indicator on list of supported ones */
+    for(i = 0; i < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT; i++)
+    {
+        if (strcmp(name,BTA_HF_CLIENT_INDICATOR_SERVICE) == 0)
+        {
+            service_index = index;
+        }
+        /* look for a match - search one sign further than indicators name to check for string end */
+        /* It will distinguish 'callheld' which could be matched by strncmp as 'call'.               */
+        if (strncmp(name, bta_hf_client_indicators[i].name, bta_hf_client_indicators[i].namelen) != 0)
+            continue;
+
+        /* index - enumerates value position in the incoming sequence                      */
+        /* if name matches one of the known indicators, add its incoming position          */
+        /* to lookup table for easy value->indicator matching later, when only values come  */
+        bta_hf_client_cb.scb.at_cb.indicator_lookup[index] = i;
+
+        return;
+    }
+}
+
+static void bta_hf_client_handle_cind_value(UINT32 index, UINT32 value)
+{
+    APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value);
+
+    if (index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT)
+    {
+        return;
+    }
+
+    if (service_index == index)
+    {
+        if (value == 0)
+        {
+            service_availability = FALSE;
+        }
+        else
+        {
+            service_availability = TRUE;
+        }
+    }
+    if (bta_hf_client_cb.scb.at_cb.indicator_lookup[index] == -1)
+    {
+        return;
+    }
+
+    /* get the real array index from lookup table */
+    index = bta_hf_client_cb.scb.at_cb.indicator_lookup[index];
+
+    /* Ignore out of range values */
+    if(value > bta_hf_client_indicators[index].max ||
+       value < bta_hf_client_indicators[index].min)
+    {
+        return;
+    }
+
+    /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */
+    bta_hf_client_ind(index, value);
+}
+
+static void bta_hf_client_handle_chld(UINT32 mask)
+{
+    APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, mask);
+
+    bta_hf_client_cb.scb.chld_features |= mask;
+}
+
+static void bta_hf_client_handle_ciev(UINT32 index, UINT32 value)
+{
+    INT8 realind = -1;
+
+    APPL_TRACE_DEBUG("%s index: %u value: %u", __FUNCTION__, index, value);
+
+    if(index == 0 || index >= BTA_HF_CLIENT_AT_INDICATOR_COUNT)
+    {
+        return;
+    }
+
+    realind = bta_hf_client_cb.scb.at_cb.indicator_lookup[index - 1];
+
+    if(realind >= 0 && realind < BTA_HF_CLIENT_AT_SUPPORTED_INDICATOR_COUNT)
+    {
+        /* get the real in-array index from lookup table by index it comes at */
+        /* if there is no bug it should automatically be correctly calculated    */
+        if(value > bta_hf_client_indicators[realind].max || value < bta_hf_client_indicators[realind].min)
+        {
+            return;
+        }
+
+        /* tBTA_HF_CLIENT_IND_TYPE match index in bta_hf_client_indicators */
+        bta_hf_client_ind(realind, value);
+    }
+}
+
+static void bta_hf_client_handle_bcs(UINT32 codec)
+{
+    APPL_TRACE_DEBUG("%s %u", __FUNCTION__, codec);
+
+    if (codec == BTM_SCO_CODEC_CVSD ||
+            (codec == BTM_SCO_CODEC_MSBC && bta_hf_client_cb.msbc_enabled == TRUE))
+    {
+        bta_hf_client_cb.scb.negotiated_codec = codec;
+        bta_hf_client_send_at_bcs(codec);
+    }
+    else
+    {
+        bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+        bta_hf_client_send_at_bac();
+    }
+}
+
+static void bta_hf_client_handle_bsir(UINT32 provided)
+{
+    APPL_TRACE_DEBUG("%s %u", __FUNCTION__, provided);
+
+    bta_hf_client_evt_val(BTA_HF_CLIENT_BSIR_EVT, provided);
+}
+
+static void bta_hf_client_handle_cmeerror(UINT32 code)
+{
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_CME, code);
+}
+
+static void bta_hf_client_handle_vgm(UINT32 value)
+{
+    APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+    if(value <= BTA_HF_CLIENT_VGM_MAX)
+    {
+        bta_hf_client_evt_val(BTA_HF_CLIENT_MIC_EVT, value);
+    }
+}
+
+static void bta_hf_client_handle_vgs(UINT32 value)
+{
+    APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+    if(value <= BTA_HF_CLIENT_VGS_MAX)
+    {
+        bta_hf_client_evt_val(BTA_HF_CLIENT_SPK_EVT, value);
+    }
+}
+
+static void bta_hf_client_handle_bvra(UINT32 value)
+{
+    APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, value);
+
+    if (value > 1)
+    {
+        return;
+    }
+
+    bta_hf_client_evt_val(BTA_HF_CLIENT_VOICE_REC_EVT, value);
+}
+
+static void bta_hf_client_handle_clip(char *numstr, UINT32 type)
+{
+    APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr);
+
+    bta_hf_client_clip(numstr);
+}
+
+static void bta_hf_client_handle_ccwa(char *numstr, UINT32 type)
+{
+    APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, type, numstr);
+
+    bta_hf_client_ccwa(numstr);
+}
+
+static void bta_hf_client_handle_cops(char *opstr, UINT32 mode)
+{
+    APPL_TRACE_DEBUG("%s %u %s", __FUNCTION__, mode, opstr);
+
+    bta_hf_client_operator_name(opstr);
+}
+
+static void bta_hf_client_handle_binp(char *numstr)
+{
+    APPL_TRACE_DEBUG("%s %s", __FUNCTION__, numstr);
+
+    bta_hf_client_binp(numstr);
+}
+
+static void bta_hf_client_handle_clcc(UINT16 idx, UINT16 dir, UINT16 status, UINT16 mode, UINT16 mpty, char *numstr, UINT16 type)
+{
+    APPL_TRACE_DEBUG("%s idx: %u dir: %u status: %u mode: %u mpty: %u",
+                        __FUNCTION__, idx, dir, status, mode, mpty);
+
+    if (numstr)
+    {
+        APPL_TRACE_DEBUG("%s number: %s  type: %u", __FUNCTION__, numstr, type);
+    }
+
+    bta_hf_client_clcc(idx, dir, status, mpty, numstr);
+}
+
+static void bta_hf_client_handle_cnum( char *numstr, UINT16 type, UINT16 service)
+{
+    APPL_TRACE_DEBUG("%s number: %s type: %u service: %u", __FUNCTION__, numstr, type, service);
+
+    /* TODO: should number be modified according to type? */
+    bta_hf_client_cnum(numstr, service);
+}
+
+static void bta_hf_client_handle_btrh( UINT16 code)
+{
+    APPL_TRACE_DEBUG("%s %lu", __FUNCTION__, code);
+
+    bta_hf_client_evt_val(BTA_HF_CLIENT_BTRH_EVT, code);
+}
+
+/******************************************************************************
+**
+**          COMMON AT EVENTS PARSING FUNCTIONS
+**
+*******************************************************************************/
+
+/* Check if prefix match and skip spaces if any */
+#define AT_CHECK_EVENT(buf, event) \
+    if (strncmp("\r\n"event, buf,sizeof("\r\n"event) - 1) != 0) return buf; \
+    buf += sizeof("\r\n"event) - 1; \
+    while (*buf == ' ') buf++;
+
+/* check for <cr><lf> and forward buffer if match */
+#define AT_CHECK_RN(buf) \
+    if (strncmp("\r\n", buf, sizeof("\r\n") - 1) != 0) { \
+        APPL_TRACE_DEBUG("%s missing end <cr><lf>", __FUNCTION__); \
+        return NULL;} \
+    buf += sizeof("\r\n") - 1;
+
+/* skip rest of AT string up to <cr> */
+#define AT_SKIP_REST(buf) while(*buf != '\r') buf++;
+
+static char *bta_hf_client_parse_ok(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "OK");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_ok();
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_error(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "ERROR");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_ERROR, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_ring(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "RING");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_ring();
+
+    return buffer;
+}
+
+/* generic uint32 parser */
+static char *bta_hf_client_parse_uint32(char *buffer, void (*handler_callback)(UINT32))
+{
+    UINT32 value;
+    int res;
+    int offset;
+
+    res = sscanf(buffer, "%u%n", &value, &offset);
+    if (res < 1)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_CHECK_RN(buffer);
+
+    handler_callback(value);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_brsf(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+BRSF:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_brsf);
+}
+
+static char *bta_hf_client_parse_cind_values(char *buffer)
+{
+    /* value and its position */
+    UINT16 index = 0;
+    UINT32 value = 0;
+
+    int offset;
+    int res;
+
+    while((res = sscanf(buffer, "%u%n", &value, &offset)) > 0)
+    {
+        /* decides if its valid index and value, if yes stores it */
+        bta_hf_client_handle_cind_value(index, value);
+
+        buffer += offset;
+
+        /* check if more values are present */
+        if (*buffer != ',')
+        {
+            break;
+        }
+
+        index++;
+        buffer++;
+    }
+
+    if (res > 0)
+    {
+        AT_CHECK_RN(buffer);
+        return buffer;
+    }
+
+    return NULL;
+}
+
+static char *bta_hf_client_parse_cind_list(char *buffer)
+{
+    int offset;
+    char name[129];
+    UINT32 min, max;
+    UINT32 index = 0;
+    int res;
+
+    while ((res = sscanf(buffer, "(\"%128[^\"]\",(%u%*[-,]%u))%n", name, &min, &max, &offset)) > 2)
+    {
+        bta_hf_client_handle_cind_list_item(name, min, max, index);
+        buffer += offset;
+        index++;
+
+        if (*buffer != ',')
+        {
+            break;
+        }
+
+        buffer++;
+    }
+
+    if (res > 2)
+    {
+        AT_CHECK_RN(buffer);
+        return buffer;
+    }
+
+    return NULL;
+}
+
+static char *bta_hf_client_parse_cind(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+CIND:");
+
+    if(*buffer == '(')
+        return bta_hf_client_parse_cind_list(buffer);
+
+    return bta_hf_client_parse_cind_values(buffer);
+}
+
+static char *bta_hf_client_parse_chld(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+CHLD:");
+
+    if (*buffer != '(')
+    {
+        return NULL;
+    }
+
+    buffer++;
+
+    while(*buffer != '\0')
+    {
+        if(strncmp("0",buffer, 1) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL);
+            buffer++;
+        }
+        else if(strncmp("1x",buffer, 2) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_X);
+            buffer += 2;
+        }
+        else if(strncmp("1",buffer, 1) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_REL_ACC);
+            buffer++;
+        }
+        else if(strncmp("2x",buffer, 2) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_PRIV_X);
+            buffer += 2;
+        }
+        else if(strncmp("2",buffer, 1) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_HOLD_ACC);
+            buffer++;
+        }
+        else if(strncmp("3",buffer, 1) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE);
+            buffer++;
+        }
+        else if(strncmp("4",buffer, 1) == 0)
+        {
+            bta_hf_client_handle_chld(BTA_HF_CLIENT_CHLD_MERGE_DETACH);
+            buffer++;
+        }
+        else
+        {
+            return NULL;
+        }
+
+        if (*buffer == ',')
+        {
+            buffer++;
+            continue;
+        }
+
+        if (*buffer == ')')
+        {
+            buffer++;
+            break;
+        }
+
+        return NULL;
+    }
+
+    AT_CHECK_RN(buffer);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_ciev(char *buffer)
+{
+    UINT32 index, value;
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+CIEV:");
+
+    res = sscanf(buffer, "%u,%u%n", &index, &value, &offset);
+    if(res < 2)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_ciev(index, value);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_bcs(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+BCS:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bcs);
+}
+
+static char *bta_hf_client_parse_bsir(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+BSIR:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bsir);
+}
+
+static char *bta_hf_client_parse_cmeerror(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+CME ERROR:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_cmeerror);
+}
+
+static char *bta_hf_client_parse_vgm(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+VGM:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm);
+}
+
+static char *bta_hf_client_parse_vgme(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+VGM=");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgm);
+}
+
+static char *bta_hf_client_parse_vgs(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+VGS:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs);
+}
+
+static char *bta_hf_client_parse_vgse(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+VGS=");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_vgs);
+}
+
+static char *bta_hf_client_parse_bvra(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "+BVRA:");
+
+    return bta_hf_client_parse_uint32(buffer, bta_hf_client_handle_bvra);
+}
+
+static char *bta_hf_client_parse_clip(char *buffer)
+{
+    /* spec forces 32 chars, plus \0 here */
+    char number[33];
+    UINT32 type = 0;
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+CLIP:");
+
+    /* there might be something more after %lu but HFP doesn't care */
+    res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset);
+    if(res < 2)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_SKIP_REST(buffer);
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_clip(number, type);
+    return buffer;
+}
+
+/* in HFP context there is no difference between ccwa and clip */
+static char *bta_hf_client_parse_ccwa(char *buffer)
+{
+    /* ac to spec 32 chars max, plus \0 here */
+    char number[33];
+    UINT32 type = 0;
+    int res ;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+CCWA:");
+
+    /* there might be something more after %lu but HFP doesn't care */
+    res = sscanf(buffer, "\"%32[^\"]\",%u%n", number, &type, &offset);
+    if(res < 2)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_SKIP_REST(buffer);
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_ccwa(number, type);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_cops(char *buffer)
+{
+    UINT8 mode;
+    /* spec forces 16 chars max, plus \0 here */
+    char opstr[17];
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+COPS:");
+
+    /* TODO: Not sure if operator string actually can contain escaped " char inside */
+    res = sscanf(buffer, "%hhi,0,\"%16[^\"]\"%n", &mode, opstr, &offset);
+    if(res < 2)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_SKIP_REST(buffer);
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_cops(opstr, mode);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_binp(char *buffer)
+{
+    /* HFP only supports phone number as BINP data */
+    /* phone number is 32 chars plus one for \0*/
+    char numstr[33];
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+BINP:");
+
+    res = sscanf(buffer, "\"%32[^\"]\"\r\n%n", numstr, &offset);
+    if(res < 1)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    /* some phones might sent type as well, just skip it */
+    AT_SKIP_REST(buffer);
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_binp(numstr);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_clcc(char *buffer)
+{
+    UINT16 idx, dir, status, mode, mpty;
+    char numstr[33];     /* spec forces 32 chars, plus one for \0*/
+    UINT16 type;
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+CLCC:");
+
+    res = sscanf(buffer, "%hu,%hu,%hu,%hu,%hu%n",
+                    &idx, &dir, &status, &mode, &mpty, &offset);
+    if (res < 5)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    /* check optional part */
+    if (*buffer == ',')
+    {
+        int res2;
+
+        res2 = sscanf(buffer, ",\"%32[^\"]\",%hu%n", numstr, &type, &offset);
+        if (res2 < 0)
+        {
+            return NULL;
+        }
+
+        if (res2 == 0)
+        {
+            res2 = sscanf(buffer, ",\"\",%hu%n", &type, &offset);
+            if (res < 0)
+            {
+                return NULL;
+            }
+
+            /* numstr is not matched in second attempt, correct this */
+            res2++;
+            numstr[0] = '\0';
+        }
+
+        if (res2 < 2)
+        {
+            return NULL;
+        }
+
+        res += res2;
+        buffer += offset;
+    }
+
+    AT_CHECK_RN(buffer);
+
+    if(res > 6)
+    {
+        /* we also have last two optional parameters */
+        bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, numstr, type);
+    }
+    else
+    {
+        /* we didn't get the last two parameters */
+        bta_hf_client_handle_clcc(idx, dir, status, mode, mpty, NULL, 0);
+    }
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_cnum(char *buffer)
+{
+    char numstr[33];     /* spec forces 32 chars, plus one for \0*/
+    UINT16 type;
+    UINT16 service = 0; /* 0 in case this optional parameter is not being sent */
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+CNUM:");
+
+    res = sscanf(buffer, ",\"%32[^\"]\",%hu,,%hu%n", numstr, &type, &service, &offset);
+    if(res < 0)
+    {
+        return NULL;
+    }
+
+    if (res == 0)
+    {
+        res = sscanf(buffer, ",\"\",%hu,,%hu%n", &type, &service, &offset);
+        if (res < 0)
+        {
+            return NULL;
+        }
+
+        /* numstr is not matched in second attempt, correct this */
+        res++;
+        numstr[0] = '\0';
+    }
+
+    if (res < 3)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_CHECK_RN(buffer);
+
+    /* service is optional */
+    if(res == 2)
+    {
+        bta_hf_client_handle_cnum(numstr, type, service);
+        return buffer;
+    }
+
+    if (service != 4 && service != 5)
+    {
+        return NULL;
+    }
+
+    bta_hf_client_handle_cnum(numstr, type, service);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_btrh(char *buffer)
+{
+    UINT16 code = 0;
+    int res;
+    int offset;
+
+    AT_CHECK_EVENT(buffer, "+BTRH:");
+
+    res = sscanf(buffer, "%hu%n", &code, &offset);
+    if(res < 1)
+    {
+        return NULL;
+    }
+
+    buffer += offset;
+
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_btrh(code);
+    return buffer;
+}
+
+static char *bta_hf_client_parse_busy(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "BUSY");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BUSY, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_delayed(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "DELAYED");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_DELAY, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_no_carrier(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "NO CARRIER");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_CARRIER, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_no_answer(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "NO ANSWER");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_NO_ANSWER, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_parse_blacklisted(char *buffer)
+{
+    AT_CHECK_EVENT(buffer, "BLACKLISTED");
+    AT_CHECK_RN(buffer);
+
+    bta_hf_client_handle_error(BTA_HF_CLIENT_AT_RESULT_BLACKLISTED, 0);
+
+    return buffer;
+}
+
+static char *bta_hf_client_skip_unknown(char *buffer)
+{
+    char *start;
+    char *tmp;
+
+    tmp = strstr(buffer, "\r\n");
+    if (tmp == NULL)
+    {
+        return NULL;
+    }
+
+    buffer += 2;
+    start = buffer;
+
+    tmp = strstr(buffer, "\r\n");
+    if (tmp == NULL)
+    {
+        return NULL;
+    }
+
+    buffer = tmp + 2;
+
+    APPL_TRACE_DEBUG("%s %.*s", __FUNCTION__, buffer - start - 2, start);
+
+    return buffer;
+}
+
+
+/******************************************************************************
+**       SUPPORTED EVENT MESSAGES
+*******************************************************************************/
+
+/* returned values are as follow:
+ * != NULL && != buf  : match and parsed ok
+ * == NULL            : match but parse failed
+ * != NULL && == buf  : no match
+ */
+typedef char* (*tBTA_HF_CLIENT_PARSER_CALLBACK)(char*);
+
+static const tBTA_HF_CLIENT_PARSER_CALLBACK bta_hf_client_parser_cb[] =
+{
+    bta_hf_client_parse_ok,
+    bta_hf_client_parse_error,
+    bta_hf_client_parse_ring,
+    bta_hf_client_parse_brsf,
+    bta_hf_client_parse_cind,
+    bta_hf_client_parse_ciev,
+    bta_hf_client_parse_chld,
+    bta_hf_client_parse_bcs,
+    bta_hf_client_parse_bsir,
+    bta_hf_client_parse_cmeerror,
+    bta_hf_client_parse_vgm,
+    bta_hf_client_parse_vgme,
+    bta_hf_client_parse_vgs,
+    bta_hf_client_parse_vgse,
+    bta_hf_client_parse_bvra,
+    bta_hf_client_parse_clip,
+    bta_hf_client_parse_ccwa,
+    bta_hf_client_parse_cops,
+    bta_hf_client_parse_binp,
+    bta_hf_client_parse_clcc,
+    bta_hf_client_parse_cnum,
+    bta_hf_client_parse_btrh,
+    bta_hf_client_parse_busy,
+    bta_hf_client_parse_delayed,
+    bta_hf_client_parse_no_carrier,
+    bta_hf_client_parse_no_answer,
+    bta_hf_client_parse_blacklisted,
+    bta_hf_client_skip_unknown
+};
+
+/* calculate supported event list length */
+static const UINT16 bta_hf_client_psraser_cb_count =
+        sizeof(bta_hf_client_parser_cb) / sizeof(bta_hf_client_parser_cb[0]);
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+static void bta_hf_client_dump_at(void)
+{
+    char dump[(4 * BTA_HF_CLIENT_AT_PARSER_MAX_LEN) + 1];
+    char *p1, *p2;
+
+    p1 = bta_hf_client_cb.scb.at_cb.buf;
+    p2 = dump;
+
+    while (*p1 != '\0')
+    {
+        if (*p1 == '\r')
+        {
+            strlcpy(p2, "<cr>", 4);
+            p2 += 4;
+        }
+        else if (*p1 == '\n')
+        {
+            strlcpy(p2, "<lf>", 4);
+            p2 += 4;
+        }
+        else
+        {
+            *p2 = *p1;
+            p2++;
+        }
+        p1++;
+    }
+
+    *p2 = '\0';
+
+    APPL_TRACE_DEBUG("%s %s", __FUNCTION__, dump);
+}
+#endif
+
+static void bta_hf_client_at_parse_start(void)
+{
+    char *buf = bta_hf_client_cb.scb.at_cb.buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+#ifdef BTA_HF_CLIENT_AT_DUMP
+    bta_hf_client_dump_at();
+#endif
+
+    while(*buf != '\0')
+    {
+        int i;
+        char *tmp = NULL;
+
+        for(i = 0; i < bta_hf_client_psraser_cb_count; i++)
+        {
+            tmp = bta_hf_client_parser_cb[i](buf);
+            if (tmp == NULL)
+            {
+                APPL_TRACE_ERROR("HFPCient: AT event/reply parsing failed, skipping");
+                tmp = bta_hf_client_skip_unknown(buf);
+                break;
+            }
+
+            /* matched or unknown skipped, if unknown failed tmp is NULL so
+               this is also handled */
+            if (tmp != buf)
+            {
+                buf = tmp;
+                break;
+            }
+        }
+
+        /* could not skip unknown (received garbage?)... disconnect */
+        if (tmp == NULL)
+        {
+            APPL_TRACE_ERROR("HFPCient: could not skip unknown AT event, disconnecting");
+            bta_hf_client_at_reset();
+            bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+            return;
+        }
+
+        buf = tmp;
+    }
+}
+
+static BOOLEAN bta_hf_client_check_at_complete(void)
+{
+    BOOLEAN ret = FALSE;
+    tBTA_HF_CLIENT_AT_CB *at_cb = &bta_hf_client_cb.scb.at_cb;
+
+    if (at_cb->offset >= BTA_HF_CLIENT_AT_EVENT_MIN_LEN)
+    {
+        if (at_cb->buf[at_cb->offset - 2] == '\r' && at_cb->buf[at_cb->offset - 1] == '\n')
+        {
+            ret = TRUE;
+        }
+    }
+
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, ret);
+
+    return ret;
+}
+
+static void bta_hf_client_at_clear_buf(void)
+{
+    memset(bta_hf_client_cb.scb.at_cb.buf, 0, sizeof(bta_hf_client_cb.scb.at_cb.buf));
+    bta_hf_client_cb.scb.at_cb.offset = 0;
+}
+
+/******************************************************************************
+**
+**          MAIN PARSING FUNCTION
+**
+**
+*******************************************************************************/
+void bta_hf_client_at_parse(char *buf, unsigned int len)
+{
+    APPL_TRACE_DEBUG("%s offset: %u len: %u", __FUNCTION__, bta_hf_client_cb.scb.at_cb.offset, len);
+
+    if (len + bta_hf_client_cb.scb.at_cb.offset > BTA_HF_CLIENT_AT_PARSER_MAX_LEN)
+    {
+        char tmp_buff[BTA_HF_CLIENT_AT_PARSER_MAX_LEN];
+        unsigned int tmp = bta_hf_client_cb.scb.at_cb.offset;
+        unsigned int space_left = BTA_HF_CLIENT_AT_PARSER_MAX_LEN - bta_hf_client_cb.scb.at_cb.offset;
+
+        APPL_TRACE_DEBUG("%s overrun, trying to recover", __FUNCTION__);
+
+        /* fill up parser buffer */
+        memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, space_left);
+        len -= space_left;
+        buf += space_left;
+        bta_hf_client_cb.scb.at_cb.offset += space_left;
+
+        /* find end of last complete command before proceeding */
+        while(bta_hf_client_check_at_complete() == FALSE)
+        {
+            if (bta_hf_client_cb.scb.at_cb.offset == 0) {
+                APPL_TRACE_ERROR("HFPClient: AT parser buffer overrun, disconnecting");
+
+                bta_hf_client_at_reset();
+                bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+                return;
+            }
+
+            bta_hf_client_cb.scb.at_cb.offset--;
+        }
+
+        /* cut buffer to complete AT event and keep cut data */
+        tmp += space_left - bta_hf_client_cb.scb.at_cb.offset;
+        memcpy(tmp_buff, bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, tmp);
+        bta_hf_client_cb.scb.at_cb.buf[bta_hf_client_cb.scb.at_cb.offset] = '\0';
+
+        /* parse */
+        bta_hf_client_at_parse_start();
+        bta_hf_client_at_clear_buf();
+
+        /* recover cut data */
+        memcpy(bta_hf_client_cb.scb.at_cb.buf, tmp_buff, tmp);
+        bta_hf_client_cb.scb.at_cb.offset += tmp;
+    }
+
+    memcpy(bta_hf_client_cb.scb.at_cb.buf + bta_hf_client_cb.scb.at_cb.offset, buf, len);
+    bta_hf_client_cb.scb.at_cb.offset += len;
+
+    /* If last event is complete, parsing can be started */
+    if (bta_hf_client_check_at_complete() == TRUE)
+    {
+        bta_hf_client_at_parse_start();
+        bta_hf_client_at_clear_buf();
+    }
+}
+
+void bta_hf_client_send_at_brsf(void)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+BRSF=%u\r", bta_hf_client_cb.scb.features);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BRSF , buf, at_len);
+}
+
+void bta_hf_client_send_at_bac(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (bta_hf_client_cb.msbc_enabled)
+    {
+        buf = "AT+BAC=1,2\r";
+    }
+    else
+    {
+        buf = "AT+BAC=1\r";
+    }
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BAC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_bcs(UINT32 codec)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+BCS=%u\r", codec);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCS, buf, at_len);
+}
+
+void bta_hf_client_send_at_cind(BOOLEAN status)
+{
+    char *buf;
+    tBTA_HF_CLIENT_AT_CMD cmd;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (status)
+    {
+        buf = "AT+CIND?\r";
+        cmd = BTA_HF_CLIENT_AT_CIND_STATUS;
+    }
+    else
+    {
+        buf = "AT+CIND=?\r";
+        cmd = BTA_HF_CLIENT_AT_CIND;
+    }
+
+    bta_hf_client_send_at(cmd, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cmer(BOOLEAN activate)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (activate)
+        buf = "AT+CMER=3,0,0,1\r";
+    else
+        buf = "AT+CMER=3,0,0,0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMER, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_chld(char cmd, UINT32 idx)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (idx > 0)
+        at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c%u\r", cmd, idx);
+    else
+        at_len = snprintf(buf, sizeof(buf), "AT+CHLD=%c\r", cmd);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHLD, buf, at_len);
+}
+
+void bta_hf_client_send_at_clip(BOOLEAN activate)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (activate)
+        buf = "AT+CLIP=1\r";
+    else
+        buf = "AT+CLIP=0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLIP, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_ccwa(BOOLEAN activate)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (activate)
+        buf = "AT+CCWA=1\r";
+    else
+        buf = "AT+CCWA=0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CCWA, buf, strlen(buf));
+}
+
+
+void bta_hf_client_send_at_cmee(BOOLEAN activate)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (activate)
+        buf = "AT+CMEE=1\r";
+    else
+        buf = "AT+CMEE=0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CMEE, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cops(BOOLEAN query)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (!service_availability)
+    {
+        APPL_TRACE_DEBUG("Skip AT+COPS no service");
+        return;
+    }
+    if (query)
+        buf = "AT+COPS?\r";
+    else
+        buf = "AT+COPS=3,0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_COPS, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_clcc(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    buf = "AT+CLCC\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CLCC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_bvra(BOOLEAN enable)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (enable)
+        buf = "AT+BVRA=1\r";
+    else
+        buf = "AT+BVRA=0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BVRA, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_vgs(UINT32 volume)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+VGS=%u\r", volume);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGS, buf, at_len);
+}
+
+void bta_hf_client_send_at_vgm(UINT32 volume)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+VGM=%u\r", volume);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_VGM, buf, at_len);
+}
+
+void bta_hf_client_send_at_atd(char *number, UINT32 memory)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (number[0] != '\0')
+    {
+        at_len = snprintf(buf, sizeof(buf), "ATD%s;\r", number);
+    }
+    else
+    {
+        at_len = snprintf(buf, sizeof(buf), "ATD>%u;\r", memory);
+    }
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATD, buf, at_len);
+}
+
+void bta_hf_client_send_at_bldn(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    buf = "AT+BLDN\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BLDN, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_ata(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    buf = "ATA\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_ATA, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_chup(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    buf = "AT+CHUP\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CHUP, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_btrh(BOOLEAN query, UINT32 val)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (query == TRUE)
+    {
+        at_len = snprintf(buf, sizeof(buf), "AT+BTRH?\r");
+    }
+    else
+    {
+        at_len = snprintf(buf, sizeof(buf), "AT+BTRH=%u\r", val);
+    }
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BTRH, buf, at_len);
+}
+
+void bta_hf_client_send_at_vts(char code)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+VTS=%c\r", code);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_VTS, buf, at_len);
+}
+
+void bta_hf_client_send_at_bcc(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    buf = "AT+BCC\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BCC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_cnum(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (!service_availability)
+    {
+        APPL_TRACE_DEBUG("Skip AT+CNUM no Service");
+        return;
+    }
+    buf = "AT+CNUM\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_CNUM, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_nrec(void)
+{
+    char *buf;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (!(bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_FEAT_ECNR))
+    {
+        APPL_TRACE_DEBUG("Remote does not support NREC.");
+        return;
+    }
+
+    buf = "AT+NREC=0\r";
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_NREC, buf, strlen(buf));
+}
+
+void bta_hf_client_send_at_binp(UINT32 action)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    at_len = snprintf(buf, sizeof(buf), "AT+BINP=%u\r", action);
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BINP, buf, at_len);
+}
+
+void bta_hf_client_send_at_bia(void)
+{
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    int at_len;
+    int i;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+    if (bta_hf_client_cb.scb.peer_version < HFP_VERSION_1_6)
+    {
+        APPL_TRACE_DEBUG("Remote does not Support AT+BIA");
+        return;
+    }
+
+    at_len = snprintf(buf, sizeof(buf), "AT+BIA=");
+
+    for(i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++)
+    {
+        int sup = bta_hf_client_cb.scb.at_cb.indicator_lookup[i] == -1 ? 0 : 1;
+
+        at_len += snprintf(buf + at_len, sizeof(buf) - at_len, "%u,", sup);
+    }
+
+    buf[at_len - 1] = '\r';
+
+    bta_hf_client_send_at(BTA_HF_CLIENT_AT_BIA, buf, at_len);
+}
+
+void bta_hf_client_at_init(void)
+{
+    memset(&bta_hf_client_cb.scb.at_cb, 0, sizeof(tBTA_HF_CLIENT_AT_CB));
+    bta_hf_client_at_reset();
+}
+
+void bta_hf_client_at_reset(void)
+{
+    int i;
+
+    bta_hf_client_stop_at_resp_timer();
+    bta_hf_client_stop_at_hold_timer();
+
+    bta_hf_client_clear_queued_at();
+
+    bta_hf_client_at_clear_buf();
+
+    for (i = 0; i < BTA_HF_CLIENT_AT_INDICATOR_COUNT; i++)
+    {
+        bta_hf_client_cb.scb.at_cb.indicator_lookup[i] = -1;
+    }
+
+    bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+}
diff --git a/bta/hf_client/bta_hf_client_at.h b/bta/hf_client/bta_hf_client_at.h
new file mode 100644
index 0000000..917c605
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_at.h
@@ -0,0 +1,117 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**  Data types
+*****************************************************************************/
+
+/* ASCII character string of arguments to the AT command */
+#define BTA_HF_CLIENT_AT_MAX_LEN        512
+
+/* AT command table element */
+typedef struct
+{
+    const char  *p_cmd;         /* AT command string */
+    UINT8       arg_type;       /* allowable argument type syntax */
+    UINT8       fmt;            /* whether arg is int or string */
+    UINT8       min;            /* minimum value for int arg */
+    INT16       max;            /* maximum value for int arg */
+} tBTA_AG_AT_CMD;
+
+/* callback function executed when command is parsed */
+typedef void (tBTA_AG_AT_CMD_CBACK)(void *p_user, UINT16 cmd, UINT8 arg_type,
+                                    char *p_arg, INT16 int_arg);
+
+/* callback function executed to send "ERROR" result code */
+typedef void (tBTA_AG_AT_ERR_CBACK)(void *p_user, BOOLEAN unknown, char *p_arg);
+
+enum
+{
+    BTA_HF_CLIENT_AT_NONE,
+    BTA_HF_CLIENT_AT_BRSF,
+    BTA_HF_CLIENT_AT_BAC,
+    BTA_HF_CLIENT_AT_CIND,
+    BTA_HF_CLIENT_AT_CIND_STATUS,
+    BTA_HF_CLIENT_AT_CMER,
+    BTA_HF_CLIENT_AT_CHLD,
+    BTA_HF_CLIENT_AT_CMEE,
+    BTA_HF_CLIENT_AT_BIA,
+    BTA_HF_CLIENT_AT_CLIP,
+    BTA_HF_CLIENT_AT_CCWA,
+    BTA_HF_CLIENT_AT_COPS,
+    BTA_HF_CLIENT_AT_CLCC,
+    BTA_HF_CLIENT_AT_BVRA,
+    BTA_HF_CLIENT_AT_VGS,
+    BTA_HF_CLIENT_AT_VGM,
+    BTA_HF_CLIENT_AT_ATD,
+    BTA_HF_CLIENT_AT_BLDN,
+    BTA_HF_CLIENT_AT_ATA,
+    BTA_HF_CLIENT_AT_CHUP,
+    BTA_HF_CLIENT_AT_BTRH,
+    BTA_HF_CLIENT_AT_VTS,
+    BTA_HF_CLIENT_AT_BCC,
+    BTA_HF_CLIENT_AT_BCS,
+    BTA_HF_CLIENT_AT_CNUM,
+    BTA_HF_CLIENT_AT_NREC,
+    BTA_HF_CLIENT_AT_BINP,
+};
+
+typedef UINT8 tBTA_HF_CLIENT_AT_CMD;
+
+/* Maximum combined buffer for received AT events string */
+#define BTA_HF_CLIENT_AT_PARSER_MAX_LEN        4096
+
+/* This structure holds prepared AT command queued for sending */
+struct queued_at_cmd{
+    tBTA_HF_CLIENT_AT_CMD cmd;
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+    UINT16 buf_len;
+    struct queued_at_cmd *next;
+};
+typedef struct queued_at_cmd tBTA_HF_CLIENT_AT_QCMD;
+
+/* Maximum number of indicators */
+#define BTA_HF_CLIENT_AT_INDICATOR_COUNT 20
+
+/* AT command parsing control block */
+typedef struct
+{
+    char                    buf[BTA_HF_CLIENT_AT_PARSER_MAX_LEN + 1]; /* extra byte to always have \0 at the end */
+    unsigned int            offset;
+    tBTA_HF_CLIENT_AT_CMD   current_cmd;
+    tBTA_HF_CLIENT_AT_QCMD  *queued_cmd;
+
+    TIMER_LIST_ENT          resp_timer;    /* AT response timer */
+    BOOLEAN                 resp_timer_on; /* TRUE if AT response timer is active */
+
+    TIMER_LIST_ENT          hold_timer;    /* AT hold timer */
+    BOOLEAN                 hold_timer_on; /* TRUE if AT hold timer is active */
+
+    /* CIND: lookup table to store the sequence of incoming indicators and their values
+       so when their values come later, we know which value in sequence match certain indicator */
+    int                     indicator_lookup[BTA_HF_CLIENT_AT_INDICATOR_COUNT];
+
+} tBTA_HF_CLIENT_AT_CB;
+
+/*****************************************************************************
+**  Functions
+*****************************************************************************/
+
+void bta_hf_client_at_init(void);
+void bta_hf_client_at_reset(void);
diff --git a/bta/hf_client/bta_hf_client_cmd.c b/bta/hf_client/bta_hf_client_cmd.c
new file mode 100644
index 0000000..59d7b5f
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_cmd.c
@@ -0,0 +1,88 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_hf_client_int.h"
+#include "stdio.h"
+
+void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA *p_data)
+{
+    tBTA_HF_CLIENT_DATA_VAL *p_val = (tBTA_HF_CLIENT_DATA_VAL *)p_data;
+    char buf[BTA_HF_CLIENT_AT_MAX_LEN];
+
+    switch(p_val->uint8_val)
+    {
+        case BTA_HF_CLIENT_AT_CMD_VTS:
+            bta_hf_client_send_at_vts((char)p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_BTRH:
+            bta_hf_client_send_at_btrh(FALSE, p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_CHUP:
+            bta_hf_client_send_at_chup();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_CHLD:
+            /* expects ascii code for command */
+            bta_hf_client_send_at_chld('0' + p_val->uint32_val1, p_val->uint32_val2);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_BCC:
+            bta_hf_client_send_at_bcc();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_CNUM:
+            bta_hf_client_send_at_cnum();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_ATA:
+            bta_hf_client_send_at_ata();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_COPS:
+            bta_hf_client_send_at_cops(TRUE);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_ATD:
+            bta_hf_client_send_at_atd(p_val->str, p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_VGM:
+            bta_hf_client_send_at_vgm(p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_VGS:
+            bta_hf_client_send_at_vgs(p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_BVRA:
+            bta_hf_client_send_at_bvra(p_val->uint32_val1 == 0 ? FALSE : TRUE);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_CLCC:
+            bta_hf_client_send_at_clcc();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_BINP:
+            bta_hf_client_send_at_binp(p_val->uint32_val1);
+            break;
+        case BTA_HF_CLIENT_AT_CMD_BLDN:
+            bta_hf_client_send_at_bldn();
+            break;
+        case BTA_HF_CLIENT_AT_CMD_NREC:
+            bta_hf_client_send_at_nrec();
+            break;
+        default:
+            APPL_TRACE_ERROR("Default case");
+            snprintf(buf,BTA_HF_CLIENT_AT_MAX_LEN,
+                "Cmd %d 1st arg %u 2nd arg %u string arg %s",
+                p_val->uint8_val, p_val->uint32_val1,
+                p_val->uint32_val2, p_val->str);
+            APPL_TRACE_ERROR("%s ", buf);
+            break;
+    }
+}
diff --git a/bta/hf_client/bta_hf_client_int.h b/bta/hf_client/bta_hf_client_int.h
new file mode 100644
index 0000000..fbd5082
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_int.h
@@ -0,0 +1,294 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_at.h"
+
+/*****************************************************************************
+**  Constants
+*****************************************************************************/
+#define HFP_VERSION_1_1         0x0101
+#define HFP_VERSION_1_5         0x0105
+#define HFP_VERSION_1_6         0x0106
+
+/* RFCOMM MTU SIZE */
+#define BTA_HF_CLIENT_MTU       256
+
+/* profile role for connection */
+#define BTA_HF_CLIENT_ACP       0       /* accepted connection */
+#define BTA_HF_CLIENT_INT       1       /* initiating connection */
+
+/* Timer to wait for retry in case of collision */
+#ifndef BTA_HF_CLIENT_COLLISION_TIMER
+#define BTA_HF_CLIENT_COLLISION_TIMER  2411
+#endif
+
+enum
+{
+    /* these events are handled by the state machine */
+    BTA_HF_CLIENT_API_REGISTER_EVT = BTA_SYS_EVT_START(BTA_ID_HS),
+    BTA_HF_CLIENT_API_DEREGISTER_EVT,
+    BTA_HF_CLIENT_API_OPEN_EVT,
+    BTA_HF_CLIENT_API_CLOSE_EVT,
+    BTA_HF_CLIENT_API_AUDIO_OPEN_EVT,
+    BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT,
+    BTA_HF_CLIENT_RFC_OPEN_EVT,
+    BTA_HF_CLIENT_RFC_CLOSE_EVT,
+    BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT,
+    BTA_HF_CLIENT_RFC_DATA_EVT,
+    BTA_HF_CLIENT_DISC_ACP_RES_EVT,
+    BTA_HF_CLIENT_DISC_INT_RES_EVT,
+    BTA_HF_CLIENT_DISC_OK_EVT,
+    BTA_HF_CLIENT_DISC_FAIL_EVT,
+    BTA_HF_CLIENT_SCO_OPEN_EVT,
+    BTA_HF_CLIENT_SCO_CLOSE_EVT,
+    BTA_HF_CLIENT_SEND_AT_CMD_EVT,
+    BTA_HF_CLIENT_MAX_EVT,
+
+    /* these events are handled outside of the state machine */
+    BTA_HF_CLIENT_API_ENABLE_EVT,
+    BTA_HF_CLIENT_API_DISABLE_EVT
+};
+
+/*****************************************************************************
+**  Data types
+*****************************************************************************/
+
+/* data type for BTA_HF_CLIENT_API_ENABLE_EVT */
+typedef struct
+{
+    BT_HDR                     hdr;
+    tBTA_HF_CLIENT_CBACK      *p_cback;
+} tBTA_HF_CLIENT_API_ENABLE;
+
+/* data type for BTA_HF_CLIENT_API_REGISTER_EVT */
+typedef struct
+{
+    BT_HDR                     hdr;
+    tBTA_HF_CLIENT_CBACK      *p_cback;
+    tBTA_SEC                   sec_mask;
+    tBTA_HF_CLIENT_FEAT        features;
+    char                       name[BTA_SERVICE_NAME_LEN+1];
+} tBTA_HF_CLIENT_API_REGISTER;
+
+/* data type for BTA_HF_CLIENT_API_OPEN_EVT */
+typedef struct
+{
+    BT_HDR              hdr;
+    BD_ADDR             bd_addr;
+    tBTA_SEC            sec_mask;
+} tBTA_HF_CLIENT_API_OPEN;
+
+/* data type for BTA_HF_CLIENT_DISC_RESULT_EVT */
+typedef struct
+{
+    BT_HDR          hdr;
+    UINT16          status;
+} tBTA_HF_CLIENT_DISC_RESULT;
+
+/* data type for RFCOMM events */
+typedef struct
+{
+    BT_HDR          hdr;
+    UINT16          port_handle;
+} tBTA_HF_CLIENT_RFC;
+
+/* generic purpose data type for other events */
+typedef struct
+{
+    BT_HDR          hdr;
+    BOOLEAN         bool_val;
+    UINT8           uint8_val;
+    UINT32          uint32_val1;
+    UINT32          uint32_val2;
+    char            str[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_DATA_VAL;
+
+/* union of all event datatypes */
+typedef union
+{
+    BT_HDR                         hdr;
+    tBTA_HF_CLIENT_API_ENABLE      api_enable;
+    tBTA_HF_CLIENT_API_REGISTER    api_register;
+    tBTA_HF_CLIENT_API_OPEN        api_open;
+    tBTA_HF_CLIENT_DISC_RESULT     disc_result;
+    tBTA_HF_CLIENT_RFC             rfc;
+    tBTA_HF_CLIENT_DATA_VAL        val;
+
+} tBTA_HF_CLIENT_DATA;
+
+/* type for each service control block */
+typedef struct
+{
+    UINT16              serv_handle;    /* RFCOMM server handle */
+    BD_ADDR             peer_addr;      /* peer bd address */
+    tSDP_DISCOVERY_DB   *p_disc_db;     /* pointer to discovery database */
+    UINT16              conn_handle;    /* RFCOMM handle of connected service */
+    tBTA_SEC            serv_sec_mask;  /* server security mask */
+    tBTA_SEC            cli_sec_mask;   /* client security mask */
+    tBTA_HF_CLIENT_FEAT        features;       /* features registered by application */
+    tBTA_HF_CLIENT_PEER_FEAT   peer_features;  /* peer device features */
+    tBTA_HF_CLIENT_CHLD_FEAT   chld_features;  /* call handling features */
+    UINT16              peer_version;   /* profile version of peer device */
+    UINT8               peer_scn;       /* peer scn */
+    UINT8               role;           /* initiator/acceptor role */
+    UINT16              sco_idx;        /* SCO handle */
+    UINT8               sco_state;      /* SCO state variable */
+    BOOLEAN             sco_close_rfc;   /* TRUE if also close RFCOMM after SCO */
+    BOOLEAN             retry_with_sco_only;
+    BOOLEAN             deregister;     /* TRUE if service shutting down */
+    BOOLEAN             svc_conn;       /* set to TRUE when service level connection is up */
+    BOOLEAN             send_at_reply;  /* set to TRUE to notify framework about AT results */
+    tBTA_HF_CLIENT_AT_CB at_cb;         /* AT Parser control block */
+    UINT8               state;          /* state machine state */
+    tBTM_SCO_CODEC_TYPE negotiated_codec; /* negotiated codec */
+    TIMER_LIST_ENT      colli_timer;    /* Collision timer */
+    BOOLEAN             colli_tmr_on;   /* TRUE if collision timer is active */
+} tBTA_HF_CLIENT_SCB;
+
+/* sco states */
+enum
+{
+    BTA_HF_CLIENT_SCO_SHUTDOWN_ST,  /* no listening, no connection */
+    BTA_HF_CLIENT_SCO_LISTEN_ST,    /* listening */
+    BTA_HF_CLIENT_SCO_OPENING_ST,   /* connection opening */
+    BTA_HF_CLIENT_SCO_OPEN_CL_ST,   /* opening connection being closed */
+    BTA_HF_CLIENT_SCO_OPEN_ST,      /* open */
+    BTA_HF_CLIENT_SCO_CLOSING_ST,   /* closing */
+    BTA_HF_CLIENT_SCO_CLOSE_OP_ST,  /* closing sco being opened */
+    BTA_HF_CLIENT_SCO_SHUTTING_ST   /* sco shutting down */
+};
+
+/* type for AG control block */
+typedef struct
+{
+    tBTA_HF_CLIENT_SCB         scb;             /* service control block */
+    UINT32                     sdp_handle;
+    UINT8                      scn;
+    tBTA_HF_CLIENT_CBACK       *p_cback;        /* application callback */
+    BOOLEAN                    msbc_enabled;
+} tBTA_HF_CLIENT_CB;
+
+/*****************************************************************************
+**  Global data
+*****************************************************************************/
+
+/* control block declaration */
+extern tBTA_HF_CLIENT_CB bta_hf_client_cb;
+
+/*****************************************************************************
+**  Function prototypes
+*****************************************************************************/
+
+/* main functions */
+extern void bta_hf_client_scb_init(void);
+extern void bta_hf_client_scb_disable(void);
+extern BOOLEAN bta_hf_client_hdl_event(BT_HDR *p_msg);
+extern void bta_hf_client_sm_execute(UINT16 event,
+                                        tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_slc_seq(BOOLEAN error);
+extern void bta_hf_client_collision_cback (tBTA_SYS_CONN_STATUS status, UINT8 id,
+                                    UINT8 app_id, BD_ADDR peer_addr);
+extern void bta_hf_client_resume_open ();
+
+/* SDP functions */
+extern BOOLEAN bta_hf_client_add_record(char *p_service_name,
+                                        UINT8 scn, tBTA_HF_CLIENT_FEAT features,
+                                        UINT32 sdp_handle);
+extern void bta_hf_client_create_record(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_del_record(tBTA_HF_CLIENT_DATA *p_data);
+extern BOOLEAN bta_hf_client_sdp_find_attr(void);
+extern void bta_hf_client_do_disc(void);
+extern void bta_hf_client_free_db(tBTA_HF_CLIENT_DATA *p_data);
+
+/* RFCOMM functions */
+extern void bta_hf_client_setup_port(UINT16 handle);
+extern void bta_hf_client_start_server(void);
+extern void bta_hf_client_close_server(void);
+extern void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data);
+
+/* SCO functions */
+extern void bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_cback_sco(UINT8 event);
+
+/* AT command functions */
+extern void bta_hf_client_at_parse(char *buf, unsigned int len);
+extern void bta_hf_client_send_at_brsf(void);
+extern void bta_hf_client_send_at_bac(void);
+extern void bta_hf_client_send_at_cind(BOOLEAN status);
+extern void bta_hf_client_send_at_cmer(BOOLEAN activate);
+extern void bta_hf_client_send_at_chld(char cmd, UINT32 idx);
+extern void bta_hf_client_send_at_clip(BOOLEAN activate);
+extern void bta_hf_client_send_at_ccwa(BOOLEAN activate);
+extern void bta_hf_client_send_at_cmee(BOOLEAN activate);
+extern void bta_hf_client_send_at_cops(BOOLEAN query);
+extern void bta_hf_client_send_at_clcc(void);
+extern void bta_hf_client_send_at_bvra(BOOLEAN enable);
+extern void bta_hf_client_send_at_vgs(UINT32 volume);
+extern void bta_hf_client_send_at_vgm(UINT32 volume);
+extern void bta_hf_client_send_at_atd(char *number, UINT32 memory);
+extern void bta_hf_client_send_at_bldn(void);
+extern void bta_hf_client_send_at_ata(void);
+extern void bta_hf_client_send_at_chup(void);
+extern void bta_hf_client_send_at_btrh(BOOLEAN query, UINT32 val);
+extern void bta_hf_client_send_at_vts(char code);
+extern void bta_hf_client_send_at_bcc(void);
+extern void bta_hf_client_send_at_bcs(UINT32 codec);
+extern void bta_hf_client_send_at_cnum(void);
+extern void bta_hf_client_send_at_nrec(void);
+extern void bta_hf_client_send_at_binp(UINT32 action);
+extern void bta_hf_client_send_at_bia(void);
+
+/* Action functions */
+extern void bta_hf_client_register(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_deregister(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_dereg(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_start_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_acp_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_open_fail(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_close(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_acp_res(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_rfc_data(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_disc_int_res(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_svc_conn_open(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_ind(tBTA_HF_CLIENT_IND_TYPE type, UINT16 value);
+extern void bta_hf_client_evt_val(tBTA_HF_CLIENT_EVT type, UINT16 value);
+extern void bta_hf_client_operator_name(char *name);
+extern void bta_hf_client_clip(char *number);
+extern void bta_hf_client_ccwa(char *number);
+extern void bta_hf_client_at_result(tBTA_HF_CLIENT_AT_RESULT_TYPE type, UINT16 cme);
+extern void bta_hf_client_clcc(UINT32 idx, BOOLEAN incoming, UINT8 status, BOOLEAN mpty, char *number);
+extern void bta_hf_client_cnum(char *number, UINT16 service);
+extern void bta_hf_client_binp(char *number);
+
+/* Commands handling functions */
+extern void bta_hf_client_dial(tBTA_HF_CLIENT_DATA *p_data);
+extern void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA *p_data);
diff --git a/bta/hf_client/bta_hf_client_main.c b/bta/hf_client/bta_hf_client_main.c
new file mode 100644
index 0000000..27c00cb
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_main.c
@@ -0,0 +1,668 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+#include "bt_utils.h"
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+
+/* uncomment to enable extra debug */
+/* #define BTA_HF_CLIENT_DEBUG TRUE */
+
+#ifndef BTA_HF_CLIENT_DEBUG
+#define BTA_HF_CLIENT_DEBUG FALSE
+#endif
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+static char *bta_hf_client_evt_str(UINT16 event);
+static char *bta_hf_client_state_str(UINT8 state);
+#endif
+
+/* state machine states */
+enum
+{
+    BTA_HF_CLIENT_INIT_ST,
+    BTA_HF_CLIENT_OPENING_ST,
+    BTA_HF_CLIENT_OPEN_ST,
+    BTA_HF_CLIENT_CLOSING_ST
+};
+
+/* state machine action enumeration list */
+enum
+{
+    BTA_HF_CLIENT_REGISTER,
+    BTA_HF_CLIENT_DEREGISTER,
+    BTA_HF_CLIENT_START_DEREG,
+    BTA_HF_CLIENT_RFC_DO_CLOSE,
+    BTA_HF_CLIENT_START_CLOSE,
+    BTA_HF_CLIENT_START_OPEN,
+    BTA_HF_CLIENT_RFC_ACP_OPEN,
+    BTA_HF_CLIENT_SCO_LISTEN,
+    BTA_HF_CLIENT_SCO_CONN_OPEN,
+    BTA_HF_CLIENT_SCO_CONN_CLOSE,
+    BTA_HF_CLIENT_SCO_OPEN,
+    BTA_HF_CLIENT_SCO_CLOSE,
+    BTA_HF_CLIENT_SCO_SHUTDOWN,
+    BTA_HF_CLIENT_FREE_DB,
+    BTA_HF_CLIENT_OPEN_FAIL,
+    BTA_HF_CLIENT_RFC_OPEN,
+    BTA_HF_CLIENT_RFC_FAIL,
+    BTA_HF_CLIENT_DISC_INT_RES,
+    BTA_HF_CLIENT_RFC_DO_OPEN,
+    BTA_HF_CLIENT_DISC_FAIL,
+    BTA_HF_CLIENT_RFC_CLOSE,
+    BTA_HF_CLIENT_RFC_DATA,
+    BTA_HF_CLIENT_DISC_ACP_RES,
+    BTA_HF_CLIENT_SVC_CONN_OPEN,
+    BTA_HF_CLIENT_SEND_AT_CMD,
+    BTA_HF_CLIENT_NUM_ACTIONS,
+};
+
+#define BTA_HF_CLIENT_IGNORE BTA_HF_CLIENT_NUM_ACTIONS
+
+/* type for action functions */
+typedef void (*tBTA_HF_CLIENT_ACTION)(tBTA_HF_CLIENT_DATA *p_data);
+
+/* action functions table, indexed with action enum */
+const tBTA_HF_CLIENT_ACTION bta_hf_client_action[] =
+{
+/* BTA_HF_CLIENT_REGISTER */      bta_hf_client_register,
+/* BTA_HF_CLIENT_DEREGISTER */    bta_hf_client_deregister,
+/* BTA_HF_CLIENT_START_DEREG */   bta_hf_client_start_dereg,
+/* BTA_HF_CLIENT_RFC_DO_CLOSE */  bta_hf_client_rfc_do_close,
+/* BTA_HF_CLIENT_START_CLOSE */   bta_hf_client_start_close,
+/* BTA_HF_CLIENT_START_OPEN */    bta_hf_client_start_open,
+/* BTA_HF_CLIENT_RFC_ACP_OPEN */  bta_hf_client_rfc_acp_open,
+/* BTA_HF_CLIENT_SCO_LISTEN */    bta_hf_client_sco_listen,
+/* BTA_HF_CLIENT_SCO_CONN_OPEN */ bta_hf_client_sco_conn_open,
+/* BTA_HF_CLIENT_SCO_CONN_CLOSE*/ bta_hf_client_sco_conn_close,
+/* BTA_HF_CLIENT_SCO_OPEN */      bta_hf_client_sco_open,
+/* BTA_HF_CLIENT_SCO_CLOSE */     bta_hf_client_sco_close,
+/* BTA_HF_CLIENT_SCO_SHUTDOWN */  bta_hf_client_sco_shutdown,
+/* BTA_HF_CLIENT_FREE_DB */       bta_hf_client_free_db,
+/* BTA_HF_CLIENT_OPEN_FAIL */     bta_hf_client_open_fail,
+/* BTA_HF_CLIENT_RFC_OPEN */      bta_hf_client_rfc_open,
+/* BTA_HF_CLIENT_RFC_FAIL */      bta_hf_client_rfc_fail,
+/* BTA_HF_CLIENT_DISC_INT_RES */  bta_hf_client_disc_int_res,
+/* BTA_HF_CLIENT_RFC_DO_OPEN */   bta_hf_client_rfc_do_open,
+/* BTA_HF_CLIENT_DISC_FAIL */     bta_hf_client_disc_fail,
+/* BTA_HF_CLIENT_RFC_CLOSE */     bta_hf_client_rfc_close,
+/* BTA_HF_CLIENT_RFC_DATA */      bta_hf_client_rfc_data,
+/* BTA_HF_CLIENT_DISC_ACP_RES */  bta_hf_client_disc_acp_res,
+/* BTA_HF_CLIENT_SVC_CONN_OPEN */ bta_hf_client_svc_conn_open,
+/* BTA_HF_CLIENT_SEND_AT_CMD */   bta_hf_client_send_at_cmd,
+};
+
+/* state table information */
+#define BTA_HF_CLIENT_ACTIONS              2       /* number of actions */
+#define BTA_HF_CLIENT_NEXT_STATE           2       /* position of next state */
+#define BTA_HF_CLIENT_NUM_COLS             3       /* number of columns in state tables */
+
+/* state table for init state */
+const UINT8 bta_hf_client_st_init[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event                    Action 1                       Action 2                       Next state */
+/* API_REGISTER_EVT */      {BTA_HF_CLIENT_REGISTER,       BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* API_DEREGISTER_EVT */    {BTA_HF_CLIENT_DEREGISTER,     BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* API_OPEN_EVT */          {BTA_HF_CLIENT_START_OPEN,     BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* API_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* API_AUDIO_OPEN_EVT */    {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* API_AUDIO_CLOSE_EVT */   {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_OPEN_EVT */          {BTA_HF_CLIENT_RFC_ACP_OPEN,   BTA_HF_CLIENT_SCO_LISTEN,      BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */     {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_DATA_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* DISC_ACP_RES_EVT */      {BTA_HF_CLIENT_FREE_DB,        BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* DISC_INT_RES_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* DISC_OK_EVT */           {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* DISC_FAIL_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* SCO_OPEN_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* SCO_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* SEND_AT_CMD_EVT */       {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+};
+
+/* state table for opening state */
+const UINT8 bta_hf_client_st_opening[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event                    Action 1                       Action 2                       Next state */
+/* API_REGISTER_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* API_DEREGISTER_EVT */    {BTA_HF_CLIENT_RFC_DO_CLOSE,   BTA_HF_CLIENT_START_DEREG,     BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */          {BTA_HF_CLIENT_OPEN_FAIL,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* API_CLOSE_EVT */         {BTA_HF_CLIENT_RFC_DO_CLOSE,   BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */    {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* API_AUDIO_CLOSE_EVT */   {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* RFC_OPEN_EVT */          {BTA_HF_CLIENT_RFC_OPEN,       BTA_HF_CLIENT_SCO_LISTEN,      BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */         {BTA_HF_CLIENT_RFC_FAIL,       BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */     {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* RFC_DATA_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* DISC_ACP_RES_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* DISC_INT_RES_EVT */      {BTA_HF_CLIENT_DISC_INT_RES,   BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* DISC_OK_EVT */           {BTA_HF_CLIENT_RFC_DO_OPEN,    BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* DISC_FAIL_EVT */         {BTA_HF_CLIENT_DISC_FAIL,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* SCO_OPEN_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* SCO_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+/* SEND_AT_CMD_EVT */       {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPENING_ST},
+};
+
+/* state table for open state */
+const UINT8 bta_hf_client_st_open[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event                    Action 1                       Action 2                       Next state */
+/* API_REGISTER_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* API_DEREGISTER_EVT */    {BTA_HF_CLIENT_START_CLOSE,    BTA_HF_CLIENT_START_DEREG,     BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */          {BTA_HF_CLIENT_OPEN_FAIL,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* API_CLOSE_EVT */         {BTA_HF_CLIENT_START_CLOSE,    BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */    {BTA_HF_CLIENT_SCO_OPEN,       BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* API_AUDIO_CLOSE_EVT */   {BTA_HF_CLIENT_SCO_CLOSE,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* RFC_OPEN_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* RFC_CLOSE_EVT */         {BTA_HF_CLIENT_RFC_CLOSE,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */     {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* RFC_DATA_EVT */          {BTA_HF_CLIENT_RFC_DATA,       BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* DISC_ACP_RES_EVT */      {BTA_HF_CLIENT_DISC_ACP_RES,   BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* DISC_INT_RES_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* DISC_OK_EVT */           {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* DISC_FAIL_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* SCO_OPEN_EVT */          {BTA_HF_CLIENT_SCO_CONN_OPEN,  BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* SCO_CLOSE_EVT */         {BTA_HF_CLIENT_SCO_CONN_CLOSE, BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+/* SEND_AT_CMD_EVT */       {BTA_HF_CLIENT_SEND_AT_CMD,    BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_OPEN_ST},
+};
+
+/* state table for closing state */
+const UINT8 bta_hf_client_st_closing[][BTA_HF_CLIENT_NUM_COLS] =
+{
+/* Event                    Action 1                       Action 2                       Next state */
+/* API_REGISTER_EVT */      {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_DEREGISTER_EVT */    {BTA_HF_CLIENT_START_DEREG,    BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_OPEN_EVT */          {BTA_HF_CLIENT_OPEN_FAIL,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_OPEN_EVT */    {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* API_AUDIO_CLOSE_EVT */   {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_OPEN_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_CLOSE_EVT */         {BTA_HF_CLIENT_RFC_CLOSE,      BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* RFC_SRV_CLOSE_EVT */     {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* RFC_DATA_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_ACP_RES_EVT */      {BTA_HF_CLIENT_FREE_DB,        BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_INT_RES_EVT */      {BTA_HF_CLIENT_FREE_DB,        BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_INIT_ST},
+/* DISC_OK_EVT */           {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* DISC_FAIL_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* SCO_OPEN_EVT */          {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* SCO_CLOSE_EVT */         {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+/* SEND_AT_CMD_EVT */       {BTA_HF_CLIENT_IGNORE,         BTA_HF_CLIENT_IGNORE,          BTA_HF_CLIENT_CLOSING_ST},
+};
+
+/* type for state table */
+typedef const UINT8 (*tBTA_HF_CLIENT_ST_TBL)[BTA_HF_CLIENT_NUM_COLS];
+
+/* state table */
+const tBTA_HF_CLIENT_ST_TBL bta_hf_client_st_tbl[] =
+{
+    bta_hf_client_st_init,
+    bta_hf_client_st_opening,
+    bta_hf_client_st_open,
+    bta_hf_client_st_closing
+};
+
+/* HF Client control block */
+tBTA_HF_CLIENT_CB  bta_hf_client_cb;
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_scb_init
+**
+** Description      Initialize an HF_Client service control block.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_scb_init(void)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    memset(&bta_hf_client_cb.scb, 0, sizeof(tBTA_HF_CLIENT_SCB));
+    bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+    bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_scb_disable
+**
+** Description      Disable a service control block.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_scb_disable(void)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_scb_init();
+
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_DISABLE_EVT, NULL);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_resume_open
+**
+** Description      Resume opening process.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_resume_open (void)
+{
+    APPL_TRACE_DEBUG ("%s", __FUNCTION__);
+
+    /* resume opening process.  */
+    if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_INIT_ST)
+    {
+        bta_hf_client_cb.scb.state = BTA_HF_CLIENT_OPENING_ST;
+        bta_hf_client_start_open (NULL);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_colli_timer_cback
+**
+** Description      HF Client connection collision timer callback
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_colli_timer_cback (TIMER_LIST_ENT *p_tle)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (p_tle)
+    {
+        bta_hf_client_cb.scb.colli_tmr_on = FALSE;
+
+        /* If the peer haven't opened connection, restart opening process */
+        bta_hf_client_resume_open ();
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_collision_cback
+**
+** Description      Get notified about collision.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_collision_cback (tBTA_SYS_CONN_STATUS status, UINT8 id,
+                                    UINT8 app_id, BD_ADDR peer_addr)
+{
+    UNUSED(status);
+    UNUSED(app_id);
+    UNUSED(peer_addr);
+
+    if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_OPENING_ST)
+    {
+        if (id == BTA_ID_SYS)   /* ACL collision */
+        {
+            APPL_TRACE_WARNING ("HF Client found collision (ACL) ...");
+        }
+        else if (id == BTA_ID_HS)   /* RFCOMM collision */
+        {
+            APPL_TRACE_WARNING ("HF Client found collision (RFCOMM) ...");
+        }
+        else
+        {
+            APPL_TRACE_WARNING ("HF Client found collision (\?\?\?) ...");
+        }
+
+        bta_hf_client_cb.scb.state = BTA_HF_CLIENT_INIT_ST;
+
+        /* Cancel SDP if it had been started. */
+        if(bta_hf_client_cb.scb.p_disc_db)
+        {
+            (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db);
+            bta_hf_client_free_db(NULL);
+        }
+
+        /* reopen registered server */
+        /* Collision may be detected before or after we close servers. */
+        bta_hf_client_start_server();
+
+        /* Start timer to handle connection opening restart */
+        bta_hf_client_cb.scb.colli_timer.p_cback = (TIMER_CBACK*)&bta_hf_client_colli_timer_cback;
+        bta_sys_start_timer(&bta_hf_client_cb.scb.colli_timer, 0, BTA_HF_CLIENT_COLLISION_TIMER);
+        bta_hf_client_cb.scb.colli_tmr_on = TRUE;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_api_enable
+**
+** Description      Handle an API enable event.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_api_enable(tBTA_HF_CLIENT_DATA *p_data)
+{
+    char value[PROPERTY_VALUE_MAX];
+
+    /* initialize control block */
+    memset(&bta_hf_client_cb, 0, sizeof(tBTA_HF_CLIENT_CB));
+
+    /* store callback function */
+    bta_hf_client_cb.p_cback = p_data->api_enable.p_cback;
+
+    /* check if mSBC support enabled */
+    property_get("ro.bluetooth.hfp.ver", value, "0");
+    if (strcmp(value,"1.6") == 0)
+    {
+       bta_hf_client_cb.msbc_enabled = TRUE;
+    }
+
+    bta_hf_client_cb.scb.negotiated_codec = BTM_SCO_CODEC_CVSD;
+
+    /* set same setting as AG does */
+    BTM_WriteVoiceSettings(AG_VOICE_SETTINGS);
+
+    bta_sys_collision_register (BTA_ID_HS, bta_hf_client_collision_cback);
+
+    /* call callback with enable event */
+    (*bta_hf_client_cb.p_cback)(BTA_HF_CLIENT_ENABLE_EVT, NULL);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_api_disable
+**
+** Description      Handle an API disable event.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_api_disable(tBTA_HF_CLIENT_DATA *p_data)
+{
+    if (!bta_sys_is_register (BTA_ID_HS))
+    {
+        APPL_TRACE_ERROR("BTA HF Client is already disabled, ignoring ...");
+        return;
+    }
+
+    /* De-register with BTA system manager */
+    bta_sys_deregister(BTA_ID_HS);
+
+    bta_hf_client_sm_execute(BTA_HF_CLIENT_API_DEREGISTER_EVT, p_data);
+
+    bta_sys_collision_register (BTA_ID_HS, NULL);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_hdl_event
+**
+** Description      Data HF Client main event handling function.
+**
+**
+** Returns          BOOLEAN
+**
+*******************************************************************************/
+BOOLEAN bta_hf_client_hdl_event(BT_HDR *p_msg)
+{
+#if BTA_HF_CLIENT_DEBUG == TRUE
+    APPL_TRACE_DEBUG("bta_hf_client_hdl_event %s (0x%x)", bta_hf_client_evt_str(p_msg->event), p_msg->event);
+#endif
+
+    switch (p_msg->event)
+    {
+        /* handle enable event */
+        case BTA_HF_CLIENT_API_ENABLE_EVT:
+            bta_hf_client_api_enable((tBTA_HF_CLIENT_DATA *) p_msg);
+            break;
+
+        /* handle disable event */
+        case BTA_HF_CLIENT_API_DISABLE_EVT:
+            bta_hf_client_api_disable((tBTA_HF_CLIENT_DATA *) p_msg);
+            break;
+
+        default:
+                bta_hf_client_sm_execute(p_msg->event, (tBTA_HF_CLIENT_DATA *) p_msg);
+            break;
+    }
+    return TRUE;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sm_execute
+**
+** Description      State machine event handling function for HF Client
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sm_execute(UINT16 event, tBTA_HF_CLIENT_DATA *p_data)
+{
+    tBTA_HF_CLIENT_ST_TBL      state_table;
+    UINT8               action;
+    int                 i;
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+    UINT16  in_event = event;
+    UINT8 in_state =  bta_hf_client_cb.scb.state;
+
+    /* Ignore displaying of AT results when not connected (Ignored in state machine) */
+    if (bta_hf_client_cb.scb.state == BTA_HF_CLIENT_OPEN_ST)
+    {
+        APPL_TRACE_EVENT("HF Client evt : State %d (%s), Event 0x%04x (%s)",
+                           bta_hf_client_cb.scb.state,
+                           bta_hf_client_state_str(bta_hf_client_cb.scb.state),
+                           event, bta_hf_client_evt_str(event));
+    }
+#endif
+
+    event &= 0x00FF;
+    if (event >= (BTA_HF_CLIENT_MAX_EVT & 0x00FF))
+    {
+        APPL_TRACE_ERROR("HF Client evt out of range, ignoring...");
+        return;
+    }
+
+    /* look up the state table for the current state */
+    state_table = bta_hf_client_st_tbl[bta_hf_client_cb.scb.state];
+
+    /* set next state */
+    bta_hf_client_cb.scb.state = state_table[event][BTA_HF_CLIENT_NEXT_STATE];
+
+    /* execute action functions */
+    for (i = 0; i < BTA_HF_CLIENT_ACTIONS; i++)
+    {
+        if ((action = state_table[event][i]) != BTA_HF_CLIENT_IGNORE)
+        {
+            (*bta_hf_client_action[action])(p_data);
+        }
+        else
+        {
+            break;
+        }
+    }
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+    if (bta_hf_client_cb.scb.state != in_state)
+    {
+        APPL_TRACE_EVENT("BTA HF Client State Change: [%s] -> [%s] after Event [%s]",
+                              bta_hf_client_state_str(in_state),
+                              bta_hf_client_state_str(bta_hf_client_cb.scb.state),
+                              bta_hf_client_evt_str(in_event));
+    }
+#endif
+}
+
+static void send_post_slc_cmd(void)
+{
+    bta_hf_client_cb.scb.at_cb.current_cmd = BTA_HF_CLIENT_AT_NONE;
+
+    bta_hf_client_send_at_bia();
+    bta_hf_client_send_at_ccwa(TRUE);
+    bta_hf_client_send_at_cmee(TRUE);
+    bta_hf_client_send_at_cops(FALSE);
+    bta_hf_client_send_at_btrh(TRUE, 0);
+    bta_hf_client_send_at_clip(TRUE);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_slc_seq
+**
+** Description      Handles AT commands sequence required for SLC creation
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_slc_seq(BOOLEAN error)
+{
+    APPL_TRACE_DEBUG("bta_hf_client_slc_seq cmd: %u", bta_hf_client_cb.scb.at_cb.current_cmd);
+
+    if (error) {
+        /* SLC establishment error, sent close rfcomm event */
+        APPL_TRACE_ERROR("HFPClient: Failed to create SLC due to AT error, disconnecting (%u)",
+                bta_hf_client_cb.scb.at_cb.current_cmd);
+
+        bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+        return;
+    }
+
+    if (bta_hf_client_cb.scb.svc_conn)
+        return;
+
+    switch (bta_hf_client_cb.scb.at_cb.current_cmd)
+    {
+    case BTA_HF_CLIENT_AT_NONE:
+        bta_hf_client_send_at_brsf();
+        break;
+
+    case BTA_HF_CLIENT_AT_BRSF:
+        if (bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_CODEC)
+        {
+            bta_hf_client_send_at_bac();
+            break;
+        }
+
+        bta_hf_client_send_at_cind(FALSE);
+        break;
+
+    case BTA_HF_CLIENT_AT_BAC:
+        bta_hf_client_send_at_cind(FALSE);
+        break;
+
+    case BTA_HF_CLIENT_AT_CIND:
+        bta_hf_client_send_at_cind(TRUE);
+        break;
+
+    case BTA_HF_CLIENT_AT_CIND_STATUS:
+        bta_hf_client_send_at_cmer(TRUE);
+        break;
+
+    case BTA_HF_CLIENT_AT_CMER:
+        if (bta_hf_client_cb.scb.peer_features & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+        {
+            bta_hf_client_send_at_chld('?', 0);
+        }
+        else
+        {
+            bta_hf_client_svc_conn_open(NULL);
+            send_post_slc_cmd();
+        }
+        break;
+
+    case BTA_HF_CLIENT_AT_CHLD:
+        bta_hf_client_svc_conn_open(NULL);
+        send_post_slc_cmd();
+        break;
+
+    default:
+        /* If happen there is a bug in SLC creation procedure... */
+        APPL_TRACE_ERROR("HFPClient: Failed to create SLCdue to unexpected AT command, disconnecting (%u)",
+                            bta_hf_client_cb.scb.at_cb.current_cmd);
+
+        bta_hf_client_sm_execute(BTA_HF_CLIENT_API_CLOSE_EVT, NULL);
+        break;
+    }
+}
+
+#if BTA_HF_CLIENT_DEBUG == TRUE
+
+#ifndef CASE_RETURN_STR
+#define CASE_RETURN_STR(const) case const: return #const;
+#endif
+
+static char *bta_hf_client_evt_str(UINT16 event)
+{
+    switch (event)
+    {
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_REGISTER_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_DEREGISTER_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_OPEN_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_CLOSE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_AUDIO_OPEN_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_AUDIO_CLOSE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_RFC_OPEN_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_RFC_CLOSE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_RFC_DATA_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_DISC_ACP_RES_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_DISC_INT_RES_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_DISC_OK_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_DISC_FAIL_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_ENABLE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_API_DISABLE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_SCO_OPEN_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_SCO_CLOSE_EVT)
+    CASE_RETURN_STR(BTA_HF_CLIENT_SEND_AT_CMD_EVT)
+    default:
+        return "Unknown HF Client Event";
+    }
+}
+
+static char *bta_hf_client_state_str(UINT8 state)
+{
+    switch (state)
+    {
+    CASE_RETURN_STR(BTA_HF_CLIENT_INIT_ST)
+    CASE_RETURN_STR(BTA_HF_CLIENT_OPENING_ST)
+    CASE_RETURN_STR(BTA_HF_CLIENT_OPEN_ST)
+    CASE_RETURN_STR(BTA_HF_CLIENT_CLOSING_ST)
+    default:
+        return "Unknown HF Client State";
+    }
+}
+#endif
diff --git a/bta/hf_client/bta_hf_client_rfc.c b/bta/hf_client/bta_hf_client_rfc.c
new file mode 100644
index 0000000..4c73b5a
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_rfc.c
@@ -0,0 +1,268 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2004-2012 Broadcom Corporation
+ *
+ *  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 the audio gateway functions controlling the RFCOMM
+ *  connections.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_api.h"
+#include "bta_hf_client_int.h"
+#include "port_api.h"
+#include "bd.h"
+#include "bt_utils.h"
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_port_cback
+**
+** Description      RFCOMM Port callback
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_port_cback(UINT32 code, UINT16 port_handle)
+{
+    BT_HDR      *p_buf;
+    UNUSED(code);
+
+    /* ignore port events for port handles other than connected handle */
+    if (port_handle != bta_hf_client_cb.scb.conn_handle)
+    {
+        APPL_TRACE_DEBUG("bta_hf_client_port_cback ignoring handle:%d conn_handle = %d",
+                          port_handle, bta_hf_client_cb.scb.conn_handle);
+        return;
+    }
+
+    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+    {
+        p_buf->event = BTA_HF_CLIENT_RFC_DATA_EVT;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_mgmt_cback
+**
+** Description      RFCOMM management callback
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_mgmt_cback(UINT32 code, UINT16 port_handle)
+{
+    tBTA_HF_CLIENT_RFC     *p_buf;
+    UINT16                  event;
+
+    APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback : code = %d, port_handle = %d, conn_handle = %d, serv_handle = %d",
+                        code, port_handle, bta_hf_client_cb.scb.conn_handle, bta_hf_client_cb.scb.serv_handle);
+
+    /* ignore close event for port handles other than connected handle */
+    if ((code != PORT_SUCCESS) && (port_handle != bta_hf_client_cb.scb.conn_handle))
+    {
+        APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback ignoring handle:%d", port_handle);
+        return;
+    }
+
+    if (code == PORT_SUCCESS)
+    {
+        if ((bta_hf_client_cb.scb.conn_handle && (port_handle == bta_hf_client_cb.scb.conn_handle)) || /* outgoing connection */
+                (port_handle == bta_hf_client_cb.scb.serv_handle))                       /* incoming connection */
+        {
+            event = BTA_HF_CLIENT_RFC_OPEN_EVT;
+        }
+        else
+        {
+            APPL_TRACE_ERROR ("bta_hf_client_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
+            return;
+        }
+    }
+    /* distinguish server close events */
+    else if (port_handle == bta_hf_client_cb.scb.conn_handle)
+    {
+        event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
+    }
+    else
+    {
+        event = BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT;
+    }
+
+    if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
+    {
+        p_buf->hdr.event = event;
+        p_buf->port_handle = port_handle;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_setup_port
+**
+** Description      Setup RFCOMM port for use by HF Client.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_setup_port(UINT16 handle)
+{
+    PORT_SetEventMask(handle, PORT_EV_RXCHAR);
+    PORT_SetEventCallback(handle, bta_hf_client_port_cback);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_start_server
+**
+** Description      Setup RFCOMM server for use by HF Client.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_start_server(void)
+{
+    int i;
+    int port_status;
+
+    if (bta_hf_client_cb.scb.serv_handle > 0)
+    {
+        APPL_TRACE_DEBUG("%s already started, handle: %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);
+        return;
+    }
+
+    BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HF_HANDSFREE, bta_hf_client_cb.scb.serv_sec_mask,
+        BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scn);
+
+    port_status =  RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scn,
+        TRUE, BTA_HF_CLIENT_MTU, (UINT8 *) bd_addr_any, &(bta_hf_client_cb.scb.serv_handle),
+        bta_hf_client_mgmt_cback);
+
+    if (port_status  == PORT_SUCCESS)
+    {
+        bta_hf_client_setup_port(bta_hf_client_cb.scb.serv_handle);
+    }
+    else
+    {
+        /* TODO: can we handle this better? */
+        APPL_TRACE_DEBUG("bta_hf_client_start_server: RFCOMM_CreateConnection returned error:%d", port_status);
+    }
+
+    APPL_TRACE_DEBUG("bta_hf_client_start_server handle: %d", bta_hf_client_cb.scb.serv_handle);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_close_server
+**
+** Description      Close RFCOMM server port for use by HF Client.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_close_server(void)
+{
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);
+
+    if (bta_hf_client_cb.scb.serv_handle == 0)
+    {
+        APPL_TRACE_DEBUG("%s already stopped", __FUNCTION__);
+        return;
+    }
+
+    RFCOMM_RemoveServer(bta_hf_client_cb.scb.serv_handle);
+    bta_hf_client_cb.scb.serv_handle = 0;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_do_open
+**
+** Description      Open an RFCOMM connection to the peer device.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HF_HANDSFREE,
+                            bta_hf_client_cb.scb.cli_sec_mask, BT_PSM_RFCOMM,
+                            BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scb.peer_scn);
+
+    if (RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scb.peer_scn,
+            FALSE, BTA_HF_CLIENT_MTU, bta_hf_client_cb.scb.peer_addr, &(bta_hf_client_cb.scb.conn_handle),
+            bta_hf_client_mgmt_cback) == PORT_SUCCESS)
+    {
+        bta_hf_client_setup_port(bta_hf_client_cb.scb.conn_handle);
+        APPL_TRACE_DEBUG("bta_hf_client_rfc_do_open : conn_handle = %d", bta_hf_client_cb.scb.conn_handle);
+    }
+    /* RFCOMM create connection failed; send ourselves RFCOMM close event */
+    else
+    {
+        bta_hf_client_sm_execute(BTA_HF_CLIENT_RFC_CLOSE_EVT, p_data);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_rfc_do_close
+**
+** Description      Close RFCOMM connection.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+    tBTA_HF_CLIENT_RFC     *p_buf;
+    UNUSED(p_data);
+
+    if (bta_hf_client_cb.scb.conn_handle)
+    {
+        RFCOMM_RemoveConnection(bta_hf_client_cb.scb.conn_handle);
+    }
+    else
+    {
+        /* Close API was called while HF Client is in Opening state.        */
+        /* Need to trigger the state machine to send callback to the app    */
+        /* and move back to INIT state.                                     */
+        if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
+        {
+            p_buf->hdr.event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
+            bta_sys_sendmsg(p_buf);
+        }
+
+        /* Cancel SDP if it had been started. */
+        if(bta_hf_client_cb.scb.p_disc_db)
+        {
+            (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db);
+            bta_hf_client_free_db(NULL);
+        }
+    }
+}
diff --git a/bta/hf_client/bta_hf_client_sco.c b/bta/hf_client/bta_hf_client_sco.c
new file mode 100644
index 0000000..eb0929c
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_sco.c
@@ -0,0 +1,734 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2004-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "bta_hf_client_int.h"
+#include <bt_trace.h>
+#include <bd.h>
+#include <string.h>
+#include "bt_utils.h"
+
+#define BTA_HF_CLIENT_NO_EDR_ESCO  (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | \
+                                    BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \
+                                    BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \
+                                    BTM_SCO_PKT_TYPES_MASK_NO_3_EV5)
+
+static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = {
+        /* SCO CVSD */
+        {
+                .rx_bw = BTM_64KBITS_RATE,
+                .tx_bw = BTM_64KBITS_RATE,
+                .max_latency = 10,
+                .voice_contfmt = BTM_VOICE_SETTING_CVSD,
+                .packet_types = (BTM_SCO_LINK_ONLY_MASK          |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+                 .retrans_effort = BTM_ESCO_RETRANS_POWER,
+        },
+        /* ESCO CVSD */
+        {
+                .rx_bw = BTM_64KBITS_RATE,
+                .tx_bw = BTM_64KBITS_RATE,
+                .max_latency = 10,
+                .voice_contfmt = BTM_VOICE_SETTING_CVSD,
+                /* Allow controller to use all types available except 5-slot EDR */
+                .packet_types = (BTM_SCO_LINK_ALL_PKT_MASK |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+                .retrans_effort = BTM_ESCO_RETRANS_POWER,
+        },
+        /* ESCO mSBC */
+        {
+                .rx_bw = BTM_64KBITS_RATE,
+                .tx_bw = BTM_64KBITS_RATE,
+                .max_latency = 13,
+                .voice_contfmt = BTM_VOICE_SETTING_TRANS,
+                /* Packet Types : EV3 + 2-EV3               */
+                .packet_types = (BTM_SCO_PKT_TYPES_MASK_EV3  |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
+                                 BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
+                .retrans_effort = BTM_ESCO_RETRANS_QUALITY,
+        }
+};
+
+enum
+{
+    BTA_HF_CLIENT_SCO_LISTEN_E,
+    BTA_HF_CLIENT_SCO_OPEN_E,          /* open request */
+    BTA_HF_CLIENT_SCO_CLOSE_E,         /* close request */
+    BTA_HF_CLIENT_SCO_SHUTDOWN_E,      /* shutdown request */
+    BTA_HF_CLIENT_SCO_CONN_OPEN_E,     /* sco opened */
+    BTA_HF_CLIENT_SCO_CONN_CLOSE_E,    /* sco closed */
+};
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_remove_sco
+**
+** Description      Removes the specified SCO from the system.
+**                  If only_active is TRUE, then SCO is only removed if connected
+**
+** Returns          BOOLEAN   - TRUE if Sco removal was started
+**
+*******************************************************************************/
+static BOOLEAN bta_hf_client_sco_remove(BOOLEAN only_active)
+{
+    BOOLEAN     removed_started = FALSE;
+    tBTM_STATUS status;
+
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, only_active);
+
+    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+    {
+        status = BTM_RemoveSco(bta_hf_client_cb.scb.sco_idx);
+
+        APPL_TRACE_DEBUG("%s idx 0x%04x, status:0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx, status);
+
+        if (status == BTM_CMD_STARTED)
+        {
+            removed_started = TRUE;
+        }
+        /* If no connection reset the sco handle */
+        else if ( (status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR) )
+        {
+            bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+        }
+    }
+    return removed_started;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_cback_sco
+**
+** Description      Call application callback function with SCO event.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_cback_sco(UINT8 event)
+{
+    tBTA_HF_CLIENT    evt;
+
+    memset(&evt, 0, sizeof(evt));
+
+    /* call app cback */
+    (*bta_hf_client_cb.p_cback)(event, (tBTA_HF_CLIENT *) &evt);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_conn_rsp
+**
+** Description      Process the SCO connection request
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_conn_rsp(tBTM_ESCO_CONN_REQ_EVT_DATA *p_data)
+{
+    tBTM_ESCO_PARAMS    resp;
+    UINT8               hci_status = HCI_SUCCESS;
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST)
+    {
+        if (p_data->link_type == BTM_LINK_TYPE_SCO)
+        {
+            resp = bta_hf_client_esco_params[0];
+        }
+        else
+        {
+            resp = bta_hf_client_esco_params[bta_hf_client_cb.scb.negotiated_codec];
+        }
+
+        /* tell sys to stop av if any */
+        bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+    }
+    else
+    {
+        hci_status = HCI_ERR_HOST_REJECT_DEVICE;
+    }
+
+    BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_connreq_cback
+**
+** Description      BTM eSCO connection requests and eSCO change requests
+**                  Only the connection requests are processed by BTA.
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_esco_connreq_cback(tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data)
+{
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, event);
+
+    if (event != BTM_ESCO_CONN_REQ_EVT)
+    {
+        return;
+    }
+
+    /* TODO check remote bdaddr, should allow connect only from device with
+     * active SLC  */
+
+    bta_hf_client_cb.scb.sco_idx = p_data->conn_evt.sco_inx;
+
+    bta_hf_client_sco_conn_rsp(&p_data->conn_evt);
+
+    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_conn_cback
+**
+** Description      BTM SCO connection callback.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_conn_cback(UINT16 sco_idx)
+{
+    BT_HDR  *p_buf;
+    UINT8 *rem_bd;
+
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, sco_idx);
+
+    rem_bd = BTM_ReadScoBdAddr(sco_idx);
+
+    if (rem_bd && bdcmp(bta_hf_client_cb.scb.peer_addr, rem_bd) == 0 &&
+            bta_hf_client_cb.scb.svc_conn && bta_hf_client_cb.scb.sco_idx == sco_idx)
+    {
+        if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+        {
+            p_buf->event = BTA_HF_CLIENT_SCO_OPEN_EVT;
+            p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;
+            bta_sys_sendmsg(p_buf);
+        }
+    }
+    /* no match found; disconnect sco, init sco variables */
+    else
+    {
+        bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+        BTM_RemoveSco(sco_idx);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_disc_cback
+**
+** Description      BTM SCO disconnection callback.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_disc_cback(UINT16 sco_idx)
+{
+    BT_HDR  *p_buf;
+
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, sco_idx);
+
+    if (bta_hf_client_cb.scb.sco_idx == sco_idx)
+    {
+        if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
+        {
+            p_buf->event = BTA_HF_CLIENT_SCO_CLOSE_EVT;
+            p_buf->layer_specific = bta_hf_client_cb.scb.conn_handle;;
+            bta_sys_sendmsg(p_buf);
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_create_sco
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_create(BOOLEAN is_orig)
+{
+    tBTM_STATUS       status;
+    UINT8            *p_bd_addr = NULL;
+    tBTM_ESCO_PARAMS params;
+
+    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, is_orig);
+
+    /* Make sure this sco handle is not already in use */
+    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+    {
+        APPL_TRACE_WARNING("%s: Index 0x%04x already in use", __FUNCTION__,
+                            bta_hf_client_cb.scb.sco_idx);
+        return;
+    }
+
+    params = bta_hf_client_esco_params[1];
+
+    /* if initiating set current scb and peer bd addr */
+    if (is_orig)
+    {
+        /* Attempt to use eSCO if remote host supports HFP >= 1.5 */
+        if (bta_hf_client_cb.scb.peer_version >= HFP_VERSION_1_5 && !bta_hf_client_cb.scb.retry_with_sco_only)
+        {
+            BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, &params);
+            /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
+            if((params.packet_types & BTM_ESCO_LINK_ONLY_MASK)
+               ||!((params.packet_types & ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ BTA_HF_CLIENT_NO_EDR_ESCO))
+            {
+                bta_hf_client_cb.scb.retry_with_sco_only = TRUE;
+                APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
+            }
+        }
+        else
+        {
+            if(bta_hf_client_cb.scb.retry_with_sco_only)
+                APPL_TRACE_API("retrying with SCO only");
+            bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+
+            BTM_SetEScoMode(BTM_LINK_TYPE_SCO, &params);
+        }
+
+        /* tell sys to stop av if any */
+        bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+    }
+    else
+    {
+        bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+    }
+
+    p_bd_addr = bta_hf_client_cb.scb.peer_addr;
+
+    status = BTM_CreateSco(p_bd_addr, is_orig, params.packet_types,
+                           &bta_hf_client_cb.scb.sco_idx, bta_hf_client_sco_conn_cback,
+                           bta_hf_client_sco_disc_cback);
+    if (status == BTM_CMD_STARTED && !is_orig)
+    {
+        if(!BTM_RegForEScoEvts(bta_hf_client_cb.scb.sco_idx, bta_hf_client_esco_connreq_cback))
+            APPL_TRACE_DEBUG("%s SCO registration success", __FUNCTION__);
+    }
+
+    APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
+                      __FUNCTION__, is_orig, bta_hf_client_cb.scb.sco_idx,
+                      status, params.packet_types);
+}
+
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_event
+**
+** Description      Handle SCO events
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sco_event(UINT8 event)
+{
+    APPL_TRACE_DEBUG("%s state: %d event: %d", __FUNCTION__,
+                        bta_hf_client_cb.scb.sco_state, event);
+
+    switch (bta_hf_client_cb.scb.sco_state)
+    {
+        case BTA_HF_CLIENT_SCO_SHUTDOWN_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_LISTEN_E:
+                    /* create sco listen connection */
+                    bta_hf_client_sco_create(FALSE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTDOWN_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_LISTEN_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_LISTEN_E:
+                    /* create sco listen connection (Additional channel) */
+                    bta_hf_client_sco_create(FALSE);
+                    break;
+
+                case BTA_HF_CLIENT_SCO_OPEN_E:
+                    /* remove listening connection */
+                    bta_hf_client_sco_remove(FALSE);
+
+                    /* create sco connection to peer */
+                    bta_hf_client_sco_create(TRUE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    /* remove listening connection */
+                    bta_hf_client_sco_remove(FALSE);
+
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CLOSE_E:
+                    /* remove listening connection */
+                    /* Ignore the event. We need to keep listening SCO for the active SLC */
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* sco failed; create sco listen connection */
+                    bta_hf_client_sco_create(FALSE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_OPENING_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_CLOSE_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_CL_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPEN_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* sco failed; create sco listen connection */
+                    bta_hf_client_sco_create(FALSE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPENING_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_OPEN_CL_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_OPEN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+                    /* close sco connection */
+                    bta_hf_client_sco_remove(TRUE);
+
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* sco failed; create sco listen connection */
+
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_CL_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_OPEN_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_CLOSE_E:
+                    /* close sco connection if active */
+                    if (bta_hf_client_sco_remove(TRUE))
+                    {
+                        bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+                    }
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    /* remove all listening connections */
+                    bta_hf_client_sco_remove(FALSE);
+
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* peer closed sco; create sco listen connection */
+                    bta_hf_client_sco_create(FALSE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_OPEN_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_CLOSING_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_OPEN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSE_OP_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* peer closed sco; create sco listen connection */
+                    bta_hf_client_sco_create(FALSE);
+
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSING_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_CLOSE_OP_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_CLOSE_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    /* open sco connection */
+                    bta_hf_client_sco_create(TRUE);
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_OPENING_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_CLOSE_OP_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        case BTA_HF_CLIENT_SCO_SHUTTING_ST:
+            switch (event)
+            {
+                case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
+                    /* close sco connection; wait for conn close event */
+                    bta_hf_client_sco_remove(TRUE);
+                    break;
+
+                case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+                    break;
+
+                case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
+                    bta_hf_client_cb.scb.sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
+                    break;
+
+                default:
+                    APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTTING_ST: Ignoring event %d", event);
+                    break;
+            }
+            break;
+
+        default:
+            break;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_listen
+**
+** Description      Initialize SCO listener
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_listen(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_LISTEN_E);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_shutdown
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_shutdown(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_SHUTDOWN_E);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_conn_open
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_conn_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_OPEN_E);
+
+    bta_sys_sco_open(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+    if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_MSBC)
+    {
+        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT);
+    }
+    else
+    {
+        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_OPEN_EVT);
+    }
+
+    bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_conn_close
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_conn_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    /* clear current scb */
+    bta_hf_client_cb.scb.sco_idx = BTM_INVALID_SCO_INDEX;
+
+    /* retry_with_sco_only, will be set only when initiator
+    ** and HFClient is first trying to establish an eSCO connection */
+    if (bta_hf_client_cb.scb.retry_with_sco_only && bta_hf_client_cb.scb.svc_conn)
+    {
+        bta_hf_client_sco_create(TRUE);
+    }
+    else
+    {
+        bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CONN_CLOSE_E);
+
+        bta_sys_sco_close(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+        bta_sys_sco_unuse(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
+
+        /* call app callback */
+        bta_hf_client_cback_sco(BTA_HF_CLIENT_AUDIO_CLOSE_EVT);
+
+        if (bta_hf_client_cb.scb.sco_close_rfc == TRUE)
+        {
+            bta_hf_client_cb.scb.sco_close_rfc = FALSE;
+            bta_hf_client_rfc_do_close(p_data);
+        }
+    }
+    bta_hf_client_cb.scb.retry_with_sco_only = FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_open
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_open(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
+
+    bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_OPEN_E);
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sco_close
+**
+** Description
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_sco_close(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("%s  0x%x", __FUNCTION__, bta_hf_client_cb.scb.sco_idx);
+
+    if (bta_hf_client_cb.scb.sco_idx != BTM_INVALID_SCO_INDEX)
+    {
+        bta_hf_client_sco_event(BTA_HF_CLIENT_SCO_CLOSE_E);
+    }
+}
diff --git a/bta/hf_client/bta_hf_client_sdp.c b/bta/hf_client/bta_hf_client_sdp.c
new file mode 100644
index 0000000..a19912c
--- /dev/null
+++ b/bta/hf_client/bta_hf_client_sdp.c
@@ -0,0 +1,383 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 the audio gateway functions performing SDP
+ *  operations.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bt_utils.h"
+#include "bta_hf_client_api.h"
+#include "bta_hf_client_int.h"
+
+/* Number of protocol elements in protocol element list. */
+#define BTA_HF_CLIENT_NUM_PROTO_ELEMS      2
+
+/* Number of elements in service class id list. */
+#define BTA_HF_CLIENT_NUM_SVC_ELEMS        2
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sdp_cback
+**
+** Description      SDP callback function.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_hf_client_sdp_cback(UINT16 status)
+{
+    tBTA_HF_CLIENT_DISC_RESULT *p_buf;
+    UINT16                     event;
+
+    APPL_TRACE_DEBUG("bta_hf_client_sdp_cback status:0x%x", status);
+
+    /* set event according to int/acp */
+    if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_ACP)
+    {
+        event = BTA_HF_CLIENT_DISC_ACP_RES_EVT;
+    }
+    else
+    {
+        event = BTA_HF_CLIENT_DISC_INT_RES_EVT;
+    }
+
+    if ((p_buf = (tBTA_HF_CLIENT_DISC_RESULT *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DISC_RESULT))) != NULL)
+    {
+        p_buf->hdr.event = event;
+        p_buf->status = status;
+        bta_sys_sendmsg(p_buf);
+    }
+}
+
+/******************************************************************************
+**
+** Function         bta_hf_client_add_record
+**
+** Description      This function is called by a server application to add
+**                  HFP Client information to an SDP record.  Prior to
+**                  calling this function the application must call
+**                  SDP_CreateRecord() to create an SDP record.
+**
+** Returns          TRUE if function execution succeeded,
+**                  FALSE if function execution failed.
+**
+******************************************************************************/
+BOOLEAN bta_hf_client_add_record(char *p_service_name, UINT8 scn,
+                          tBTA_HF_CLIENT_FEAT features, UINT32 sdp_handle)
+{
+    tSDP_PROTOCOL_ELEM  proto_elem_list[BTA_HF_CLIENT_NUM_PROTO_ELEMS];
+    UINT16              svc_class_id_list[BTA_HF_CLIENT_NUM_SVC_ELEMS];
+    UINT16              browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP};
+    UINT16              version;
+    UINT16              profile_uuid;
+    BOOLEAN             result = TRUE;
+    BOOLEAN             codec_supported = FALSE;
+    UINT8               buf[2];
+    UINT16              sdp_features = 0;
+
+    APPL_TRACE_DEBUG("bta_hf_client_add_record");
+
+    memset( proto_elem_list, 0 , BTA_HF_CLIENT_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM));
+
+    /* add the protocol element sequence */
+    proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
+    proto_elem_list[0].num_params = 0;
+    proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM;
+    proto_elem_list[1].num_params = 1;
+    proto_elem_list[1].params[0] = scn;
+    result &= SDP_AddProtocolList(sdp_handle, BTA_HF_CLIENT_NUM_PROTO_ELEMS, proto_elem_list);
+
+    /* add service class id list */
+    svc_class_id_list[0] = UUID_SERVCLASS_HF_HANDSFREE;
+    svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO;
+    result &= SDP_AddServiceClassIdList(sdp_handle, BTA_HF_CLIENT_NUM_SVC_ELEMS, svc_class_id_list);
+
+    /* add profile descriptor list */
+    profile_uuid = UUID_SERVCLASS_HF_HANDSFREE;
+    version = HFP_VERSION_1_6;
+
+    result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);
+
+    /* add service name */
+    if (p_service_name != NULL && p_service_name[0] != 0)
+    {
+        result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
+                    (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name);
+    }
+
+    /* add features */
+    if (features & BTA_HF_CLIENT_FEAT_ECNR)
+       sdp_features |= BTA_HF_CLIENT_FEAT_ECNR;
+
+    if (features & BTA_HF_CLIENT_FEAT_3WAY)
+       sdp_features |= BTA_HF_CLIENT_FEAT_3WAY;
+
+    if (features & BTA_HF_CLIENT_FEAT_CLI)
+       sdp_features |= BTA_HF_CLIENT_FEAT_CLI;
+
+    if (features & BTA_HF_CLIENT_FEAT_VREC)
+       sdp_features |= BTA_HF_CLIENT_FEAT_VREC;
+
+    if (features & BTA_HF_CLIENT_FEAT_VOL)
+       sdp_features |= BTA_HF_CLIENT_FEAT_VOL;
+
+    /* Codec bit position is different in SDP (bit 5) and in BRSF (bit 7) */
+    if (features & BTA_HF_CLIENT_FEAT_CODEC)
+       sdp_features |= 0x0020;
+
+    UINT16_TO_BE_FIELD(buf, sdp_features);
+    result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf);
+
+    /* add browse group list */
+    result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list);
+
+    return result;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_create_record
+**
+** Description      Create SDP record for registered service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_create_record(tBTA_HF_CLIENT_DATA *p_data)
+{
+    /* add sdp record if not already registered */
+    if (bta_hf_client_cb.sdp_handle == 0)
+    {
+        bta_hf_client_cb.sdp_handle = SDP_CreateRecord();
+        bta_hf_client_cb.scn = BTM_AllocateSCN();
+        bta_hf_client_add_record(p_data->api_register.name,
+                                 bta_hf_client_cb.scn,
+                                 p_data->api_register.features,
+                                 bta_hf_client_cb.sdp_handle);
+
+        bta_sys_add_uuid(UUID_SERVCLASS_HF_HANDSFREE);
+    }
+
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_del_record
+**
+** Description      Delete SDP record for registered service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_del_record(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    APPL_TRACE_DEBUG("bta_hf_client_del_record");
+
+    if (bta_hf_client_cb.sdp_handle != 0)
+    {
+        SDP_DeleteRecord(bta_hf_client_cb.sdp_handle);
+        bta_hf_client_cb.sdp_handle = 0;
+        BTM_FreeSCN(bta_hf_client_cb.scn);
+        BTM_SecClrService(BTM_SEC_SERVICE_HF_HANDSFREE);
+        bta_sys_remove_uuid(UUID_SERVCLASS_HF_HANDSFREE);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_sdp_find_attr
+**
+** Description      Process SDP discovery results to find requested attribute
+**
+**
+** Returns          TRUE if results found, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN bta_hf_client_sdp_find_attr(void)
+{
+    tSDP_DISC_REC       *p_rec = NULL;
+    tSDP_DISC_ATTR      *p_attr;
+    tSDP_PROTOCOL_ELEM  pe;
+    BOOLEAN             result = FALSE;
+
+    bta_hf_client_cb.scb.peer_version = HFP_VERSION_1_1;   /* Default version */
+
+    /* loop through all records we found */
+    while (TRUE)
+    {
+        /* get next record; if none found, we're done */
+        if ((p_rec = SDP_FindServiceInDb(bta_hf_client_cb.scb.p_disc_db, UUID_SERVCLASS_AG_HANDSFREE, p_rec)) == NULL)
+        {
+            break;
+        }
+
+        /* get scn from proto desc list if initiator */
+        if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT)
+        {
+            if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe))
+            {
+                bta_hf_client_cb.scb.peer_scn = (UINT8) pe.params[0];
+            }
+            else
+            {
+                continue;
+            }
+        }
+
+        /* get profile version (if failure, version parameter is not updated) */
+        SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_HF_HANDSFREE, &bta_hf_client_cb.scb.peer_version);
+
+        /* get features */
+        if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL)
+        {
+            /* Found attribute. Get value. */
+            /* There might be race condition between SDP and BRSF.  */
+            /* Do not update if we already received BRSF.           */
+            if (bta_hf_client_cb.scb.peer_features == 0)
+            {
+                bta_hf_client_cb.scb.peer_features = p_attr->attr_value.v.u16;
+
+                /* SDP and BRSF WBS bit are different, correct it if set */
+                if (bta_hf_client_cb.scb.peer_features & 0x0020)
+                {
+                    bta_hf_client_cb.scb.peer_features &= ~0x0020;
+                    bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_CODEC;
+                }
+
+                /* get network for ability to reject calls */
+                if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK)) != NULL)
+                {
+                    if (p_attr->attr_value.v.u16 == 0x01)
+                    {
+                        bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_REJECT;
+                    }
+                }
+            }
+        }
+
+        /* found what we needed */
+        result = TRUE;
+        break;
+    }
+
+    APPL_TRACE_DEBUG("%s peer_version=0x%x peer_features=0x%x",
+                      __FUNCTION__, bta_hf_client_cb.scb.peer_version,
+                      bta_hf_client_cb.scb.peer_features);
+
+    return result;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_do_disc
+**
+** Description      Do service discovery.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_do_disc(void)
+{
+    tSDP_UUID       uuid_list[2];
+    UINT16          num_uuid = 1;
+    UINT16          attr_list[4];
+    UINT8           num_attr;
+    BOOLEAN         db_inited = FALSE;
+
+    /* initiator; get proto list and features */
+    if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT)
+    {
+        attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
+        attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
+        attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST;
+        attr_list[3] = ATTR_ID_SUPPORTED_FEATURES;
+        num_attr = 4;
+        uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE;
+    }
+    /* acceptor; get features */
+    else
+    {
+        attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
+        attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST;
+        attr_list[2] = ATTR_ID_SUPPORTED_FEATURES;
+        num_attr = 3;
+        uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE;
+    }
+
+    /* allocate buffer for sdp database */
+    bta_hf_client_cb.scb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(GKI_MAX_BUF_SIZE);
+
+    if (bta_hf_client_cb.scb.p_disc_db)
+    {
+        /* set up service discovery database; attr happens to be attr_list len */
+        uuid_list[0].len = LEN_UUID_16;
+        uuid_list[1].len = LEN_UUID_16;
+        db_inited = SDP_InitDiscoveryDb(bta_hf_client_cb.scb.p_disc_db, GKI_MAX_BUF_SIZE, num_uuid,
+                            uuid_list, num_attr, attr_list);
+    }
+
+    if (db_inited)
+    {
+        /*Service discovery not initiated */
+        db_inited = SDP_ServiceSearchAttributeRequest(bta_hf_client_cb.scb.peer_addr,
+                            bta_hf_client_cb.scb.p_disc_db, bta_hf_client_sdp_cback);
+    }
+
+    if (!db_inited)
+    {
+        /*free discover db */
+        bta_hf_client_free_db(NULL);
+        /* sent failed event */
+        bta_hf_client_sm_execute(BTA_HF_CLIENT_DISC_FAIL_EVT, NULL);
+    }
+
+}
+
+/*******************************************************************************
+**
+** Function         bta_hf_client_free_db
+**
+** Description      Free discovery database.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void bta_hf_client_free_db(tBTA_HF_CLIENT_DATA *p_data)
+{
+    UNUSED(p_data);
+
+    if (bta_hf_client_cb.scb.p_disc_db != NULL)
+    {
+        GKI_freebuf(bta_hf_client_cb.scb.p_disc_db);
+        bta_hf_client_cb.scb.p_disc_db = NULL;
+    }
+}
diff --git a/bta/hh/bta_hh_act.c b/bta/hh/bta_hh_act.c
index 8ec2698..3c5cf73 100644
--- a/bta/hh/bta_hh_act.c
+++ b/bta/hh/bta_hh_act.c
@@ -200,7 +200,7 @@
             attr_mask |= HID_SEC_REQUIRED;
 
 #if BTA_HH_DEBUG
-        APPL_TRACE_EVENT4("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
+        APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
                             attr_mask 0x%02x, handle %x", \
                             p_cb, result, attr_mask,p_cb->hid_handle);
 #endif
@@ -273,7 +273,7 @@
     tSDP_DI_GET_RECORD  di_rec;
     tHID_STATUS ret;
 #if BTA_HH_DEBUG
-    APPL_TRACE_EVENT2("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
+    APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
 #endif
 
     /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be
@@ -306,7 +306,7 @@
         else
         {
 #if BTA_HH_DEBUG
-            APPL_TRACE_DEBUG1 ("bta_hh_di_sdp_cback:  HID_HostGetSDPRecord failed: Status 0x%2x",
+            APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback:  HID_HostGetSDPRecord failed: Status 0x%2x",
                                ret);
 #endif
         }
@@ -358,7 +358,7 @@
     {
         status = BTA_HH_OK;
 #if BTA_HH_DEBUG
-        APPL_TRACE_DEBUG0("bta_hh_start_sdp:: skip SDP for known devices");
+        APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices");
 #endif
         if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
         {
@@ -400,7 +400,7 @@
                                          bta_hh_di_sdp_cback) != SDP_SUCCESS)
             {
 #if BTA_HH_DEBUG
-                APPL_TRACE_DEBUG1 ("bta_hh_start_sdp:  SDP_DiDiscover failed: \
+                APPL_TRACE_DEBUG ("bta_hh_start_sdp:  SDP_DiDiscover failed: \
                     Status 0x%2X",status);
 #endif
                 status = BTA_HH_ERR_SDP;
@@ -434,7 +434,7 @@
     tBTA_HH_STATUS          status = p_data->status;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
+    APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
 #endif
 
     /* initialize call back data */
@@ -456,7 +456,7 @@
             if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS)
             {
 #if BTA_HH_DEBUG
-                APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl:  HID_HostOpenDev failed: \
+                APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  HID_HostOpenDev failed: \
                     Status 0x%2X",ret);
 #endif
                 /* open fail, remove device from management device list */
@@ -483,7 +483,7 @@
         if ((status == BTA_HH_ERR_SDP) &&
            (p_cb->incoming_conn) &&(p_cb->app_id == 0))
         {
-            APPL_TRACE_DEBUG1 ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
+            APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
                                 p_cb->incoming_hid_handle);
             HID_HostRemoveDev( p_cb->incoming_hid_handle);
         }
@@ -625,7 +625,7 @@
                         p_cb->hid_handle;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_EVENT1 ("bta_hh_open_act:  Device[%d] connected", dev_handle);
+    APPL_TRACE_EVENT ("bta_hh_open_act:  Device[%d] connected", dev_handle);
 #endif
 
     /* SDP has been done */
@@ -689,7 +689,7 @@
     tBTA_HH_CONN    conn ;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG2("HANDSHAKE received for: event = %s data= %d",
+    APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
         bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
 #endif
 
@@ -737,7 +737,7 @@
 
         default:
             /* unknow transaction handshake response */
-            APPL_TRACE_DEBUG0("unknown transaction type");
+            APPL_TRACE_DEBUG("unknown transaction type");
             break;
     }
 
@@ -762,7 +762,7 @@
     tBTA_HH_HSDATA    hs_data;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("Ctrl DATA received w4: event[%s]",
+    APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
                         bta_hh_get_w4_event(p_cb->w4_evt));
 #endif
     hs_data.status  = BTA_HH_OK;
@@ -781,7 +781,7 @@
         hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
                     BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
 #if BTA_HH_DEBUG
-        APPL_TRACE_DEBUG1("GET_PROTOCOL Mode = [%s]",
+        APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
             (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
 #endif
         break;
@@ -794,7 +794,7 @@
         /* fall through */
     default:
 #if BTA_HH_DEBUG
-        APPL_TRACE_DEBUG1("invalid  transaction type for DATA payload: 4_evt[%s]",
+        APPL_TRACE_DEBUG("invalid  transaction type for DATA payload: 4_evt[%s]",
                         bta_hh_get_w4_event(p_cb->w4_evt));
 #endif
         break;
@@ -1060,7 +1060,7 @@
         break;
 
     default:
-        APPL_TRACE_DEBUG0("invalid command");
+        APPL_TRACE_DEBUG("invalid command");
         break;
     }
 
@@ -1104,7 +1104,7 @@
                        p_data->api_sndcmd.rpt_id,
                        p_data->api_sndcmd.p_data) != HID_SUCCESS)
     {
-        APPL_TRACE_ERROR0("HID_HostWriteDev Error ");
+        APPL_TRACE_ERROR("HID_HostWriteDev Error ");
         cbdata.status = BTA_HH_ERR;
 
         if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
@@ -1143,7 +1143,7 @@
         /* currently not expected */
         case HID_TRANS_DATAC:
         default:
-            APPL_TRACE_DEBUG1("bta_hh_write_dev_act:: cmd type = %d",
+            APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
                             p_data->api_sndcmd.t_type);
             break;
         }
@@ -1190,7 +1190,7 @@
     UINT8   xx = 0;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
+    APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
 #endif
 
     switch (event)
diff --git a/bta/hh/bta_hh_api.c b/bta/hh/bta_hh_api.c
index df41a52..58090f6 100644
--- a/bta/hh/bta_hh_api.c
+++ b/bta/hh/bta_hh_api.c
@@ -63,11 +63,9 @@
     tBTA_HH_API_ENABLE *p_buf;
 
     /* register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_register(BTA_ID_HH, &bta_hh_reg);
-    GKI_sched_unlock();
 
-    APPL_TRACE_ERROR0("Calling BTA_HhEnable");
+    APPL_TRACE_ERROR("Calling BTA_HhEnable");
     p_buf = (tBTA_HH_API_ENABLE *)GKI_getbuf((UINT16)sizeof(tBTA_HH_API_ENABLE));
 
     if (p_buf != NULL)
@@ -157,7 +155,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("No resource to send HID host Connect request.");
+        APPL_TRACE_ERROR("No resource to send HID host Connect request.");
     }
 }
 
@@ -310,7 +308,7 @@
 #if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
     if (p_data->layer_specific != BTA_HH_RPTT_OUTPUT)
     {
-        APPL_TRACE_ERROR0("ERROR! Wrong report type! Write Command only valid for output report!");
+        APPL_TRACE_ERROR("ERROR! Wrong report type! Write Command only valid for output report!");
         return;
     }
 #endif
@@ -484,7 +482,7 @@
             break;
 
         default:
-            APPL_TRACE_DEBUG1("Unknown boot report: %d", p_report[0]);;
+            APPL_TRACE_DEBUG("Unknown boot report: %d", p_report[0]);;
             break;
         }
     }
diff --git a/bta/hh/bta_hh_int.h b/bta/hh/bta_hh_int.h
index 1ac40da..ac9bb61 100644
--- a/bta/hh/bta_hh_int.h
+++ b/bta/hh/bta_hh_int.h
@@ -194,12 +194,12 @@
     BOOLEAN                 in_use;
     UINT8                   inst_id;    /* share service instance ID and report instance ID, as
                                            hi 4 for service instance ID, low 4 as charatceristic instance ID */
-    tBTA_HH_RPT_TYPE	    rpt_type;
+    tBTA_HH_RPT_TYPE        rpt_type;
     UINT16                  uuid;
-    UINT16				    prop;
-    UINT8				    rpt_id;
-    BOOLEAN			        client_cfg_exist;
-    UINT16				    client_cfg_value;
+    UINT8                   prop;
+    UINT8                   rpt_id;
+    BOOLEAN                 client_cfg_exist;
+    UINT16                  client_cfg_value;
 }tBTA_HH_LE_RPT;
 
 #ifndef BTA_HH_LE_RPT_MAX
@@ -209,19 +209,15 @@
 typedef struct
 {
     BOOLEAN                 in_use;
-    tBTA_HH_LE_RPT		    report[BTA_HH_LE_RPT_MAX];
+    tBTA_HH_LE_RPT          report[BTA_HH_LE_RPT_MAX];
 
 #define BTA_HH_LE_PROTO_MODE_BIT        0x01
 #define BTA_HH_LE_CP_BIT                0x02
-    UINT8		            option_char; /* control point char exisit or not */
+    UINT8                   option_char; /* control point char exisit or not */
 
     BOOLEAN                 expl_incl_srvc;
     UINT8                   incl_srvc_inst; /* assuming only one included service : battery service */
     UINT8                   cur_expl_char_idx; /* currently discovering service index */
-
-#define BTA_HH_LE_REMOTE_WAKE   0x01
-#define BTA_HH_LE_NORMAL_CONN   0x02
-    UINT8                   flag;           /* HID Information flag */
     UINT8                   *rpt_map;
     UINT16                  ext_rpt_ref;
     tBTA_HH_DEV_DESCR       descriptor;
@@ -270,6 +266,7 @@
 
     UINT8               disc_active;
     tBTA_HH_STATUS      status;
+    tBTA_GATT_REASON    reason;
     BOOLEAN             is_le_device;
     tBTA_HH_LE_HID_SRVC hid_srvc[BTA_HH_LE_HID_SRVC_MAX];
     UINT16              conn_id;
@@ -408,6 +405,7 @@
 extern void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
 extern void bta_hh_le_update_scpp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
 extern void bta_hh_le_notify_enc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data);
+extern void bta_hh_ci_load_rpt (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf);
 
 #if BTA_HH_DEBUG
 extern void bta_hh_trace_dev_db(void);
diff --git a/bta/hh/bta_hh_le.c b/bta/hh/bta_hh_le.c
index 4f297ee..7cbf09c 100644
--- a/bta/hh/bta_hh_le.c
+++ b/bta/hh/bta_hh_le.c
@@ -81,6 +81,9 @@
 static void bta_hh_le_register_scpp_notif(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
 static void bta_hh_le_register_scpp_notif_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATT_STATUS status);
 static void bta_hh_le_add_dev_bg_conn(tBTA_HH_DEV_CB *p_cb, BOOLEAN check_bond);
+static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb,
+                                      tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache,
+                                      UINT8 num_rpt);
 
 #define BTA_HH_LE_SRVC_DEF      0
 
@@ -109,14 +112,14 @@
     tBTA_HH_LE_RPT  *p_rpt;
     char *  rpt_name;
 
-    APPL_TRACE_DEBUG0("HID Report DB");
+    APPL_TRACE_DEBUG("HID Report DB");
     for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++)
     {
         if (p_cb->hid_srvc[i].in_use)
         {
             p_rpt = &p_cb->hid_srvc[i].report[0];
 
-            APPL_TRACE_DEBUG1("\t HID serivce inst: %d", i);
+            APPL_TRACE_DEBUG("\t HID serivce inst: %d", i);
 
             for (j = 0; j < BTA_HH_LE_RPT_MAX; j ++, p_rpt++)
             {
@@ -133,7 +136,7 @@
                         rpt_name = "Boot MI Input";
 
 
-                    APPL_TRACE_DEBUG6("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d]  [Clt_cfg: %d]",
+                    APPL_TRACE_DEBUG("\t\t [%s- 0x%04x] [Type: %s], [ReportID: %d] [inst_id: %d]  [Clt_cfg: %d]",
                         rpt_name,
                         p_rpt->uuid ,
                         ((p_rpt->rpt_type < 4) ? bta_hh_le_rpt_name[p_rpt->rpt_type] : "UNKNOWN"),
@@ -149,6 +152,7 @@
             break;
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_uuid_to_str
@@ -188,6 +192,7 @@
             return "Unknown UUID";
     }
 }
+
 #endif
 /*******************************************************************************
 **
@@ -219,6 +224,7 @@
 
     return;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_register_cmpl
@@ -289,22 +295,7 @@
 
     return p_cb->is_le_device;
 }
-/*******************************************************************************
-**
-** Function         bta_hh_le_hid_srvc_cached
-**
-** Description      Check to see if LE HID service has been discovered and cached
-**
-** Parameters:      TRUE : has cache; FALSE: none.
-**
-*******************************************************************************/
-BOOLEAN bta_hh_le_hid_srvc_cached(tBTA_HH_DEV_CB *p_dev_cb)
-{
-    if (p_dev_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
-        return TRUE;
-    else
-        return FALSE;
-}
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_add_hid_srvc_entry
@@ -325,11 +316,11 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("DB full,max HID service entry!");
+        APPL_TRACE_ERROR("DB full,max HID service entry!");
     }
     return added;
-
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_open_conn
@@ -347,8 +338,9 @@
     bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
     p_cb->in_use = TRUE;
 
-    BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE);
+    BTA_GATTC_Open(bta_hh_cb.gatt_if, remote_bda, TRUE, BTA_GATT_TRANSPORT_LE);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_fill_16bits_gatt_id
@@ -362,6 +354,7 @@
     p_output->uuid.len       = LEN_UUID_16;
     p_output->uuid.uu.uuid16 = uuid;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_fill_16bits_srvc_id
@@ -378,6 +371,7 @@
     bta_hh_le_fill_16bits_gatt_id(inst_id, srvc_uuid, &p_output->id);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_fill_16bits_char_id
@@ -392,6 +386,7 @@
     memset((void *)p_output, 0, sizeof(tBTA_GATT_ID));
     bta_hh_le_fill_16bits_gatt_id(inst_id, char_uuid, p_output);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_find_dev_cb_by_conn_id
@@ -411,6 +406,7 @@
     }
     return NULL;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_find_dev_cb_by_bda
@@ -431,6 +427,14 @@
     }
     return NULL;
 }
+
+/*******************************************************************************
+**
+** Function         bta_hh_le_find_service_inst_by_battery_inst_id
+**
+** Description      find HID service instance ID by battery service instance ID
+**
+*******************************************************************************/
 UINT8 bta_hh_le_find_service_inst_by_battery_inst_id(tBTA_HH_DEV_CB *p_cb, UINT8 ba_inst_id)
 {
     UINT8   i;
@@ -445,6 +449,7 @@
     }
     return BTA_HH_IDX_INVALID;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_find_report_entry
@@ -484,6 +489,7 @@
     return NULL;
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_find_rpt_by_idtype
@@ -500,7 +506,7 @@
     UINT8   i;
 
 #if BTA_HH_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hh_le_find_rpt_by_idtype: r_tpye: %d rpt_id: %d", r_type, rpt_id);
+    APPL_TRACE_DEBUG("bta_hh_le_find_rpt_by_idtype: r_type: %d rpt_id: %d", r_type, rpt_id);
 #endif
 
     for (i = 0 ; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt++)
@@ -521,6 +527,7 @@
     }
     return NULL;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_find_alloc_report_entry
@@ -577,7 +584,6 @@
                     }
                 }
             }
-
             return p_rpt;
         }
     }
@@ -620,12 +626,13 @@
     else
     {
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_ERROR2("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)",
+        APPL_TRACE_ERROR("bta_hh_le_read_char_dscrpt: No such descrpt exists: %s(0x%04x)",
             bta_hh_uuid_to_str(char_descp_uuid), char_descp_uuid);
 #endif
     }
     return status;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_read_rpt_ref_descr
@@ -640,7 +647,8 @@
 
     while (p_rpt != NULL)
     {
-        if (!p_rpt->in_use) break;
+        if(!p_rpt->in_use)
+            break;
 
         if (p_rpt->rpt_type == BTA_HH_RPTT_INPUT)
         {
@@ -648,7 +656,7 @@
             if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
             {
 #if BTA_HH_DEBUG == TRUE
-                APPL_TRACE_DEBUG0("read battery level report reference descriptor");
+                APPL_TRACE_DEBUG("read battery level report reference descriptor");
 #endif
                 srvc_uuid = UUID_SERVCLASS_BATTERY;
                 char_uuid = GATT_UUID_BATTERY_LEVEL;
@@ -656,7 +664,7 @@
             else
             {
 #if BTA_HH_DEBUG == TRUE
-                APPL_TRACE_DEBUG0("read HID report reference descriptor");
+                APPL_TRACE_DEBUG("read HID report reference descriptor");
 #endif
                 srvc_uuid = UUID_SERVCLASS_LE_HID;
                 char_uuid = GATT_UUID_HID_REPORT;
@@ -674,8 +682,6 @@
                 break;
             }
         }
-        else
-            break;
 
         if (p_rpt->index == BTA_HH_LE_RPT_MAX - 1)
             break;
@@ -691,6 +697,7 @@
         bta_hh_le_search_hid_chars(p_dev_cb);
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_save_rpt_ref
@@ -703,7 +710,8 @@
 void bta_hh_le_save_rpt_ref(tBTA_HH_DEV_CB *p_dev_cb, tBTA_HH_LE_RPT  *p_rpt,
                             tBTA_GATTC_READ *p_data)
 {
-    UINT8 *pp;
+    UINT8                       *pp;
+    tBTA_HH_RPT_CACHE_ENTRY     rpt_entry;
 
     /* if the length of the descriptor value is right, parse it */
     if (p_data->status == BTA_GATT_OK &&
@@ -718,18 +726,37 @@
             p_rpt->rpt_type = BTA_HH_RPTT_RESRV;
 
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_DEBUG1("report ID: %d", p_rpt->rpt_id);
+        APPL_TRACE_DEBUG("report ID: %d", p_rpt->rpt_id);
 #endif
+        rpt_entry.rpt_id    = p_rpt->rpt_id;
+        rpt_entry.rpt_type  = p_rpt->rpt_type;
+        rpt_entry.rpt_uuid  = p_rpt->uuid;
+        rpt_entry.prop      = p_rpt->prop;
+        rpt_entry.inst_id   = p_rpt->inst_id;
+
+        bta_hh_le_co_rpt_info(p_dev_cb->addr,
+                              &rpt_entry,
+                              p_dev_cb->app_id);
+    }
+    else if (p_data->status == BTA_GATT_INSUF_AUTHENTICATION)
+    {
+        /* close connection right away */
+        p_dev_cb->status = BTA_HH_ERR_AUTH_FAILED;
+        /* close the connection and report service discovery complete with error */
+        bta_hh_le_api_disc_act(p_dev_cb);
+        return;
     }
 
     if (p_rpt->index < BTA_HH_LE_RPT_MAX - 1)
         p_rpt ++;
     else
         p_rpt = NULL;
+
     /* read next report reference descriptor  */
     bta_hh_le_read_rpt_ref_descr(p_dev_cb, p_rpt);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_save_rpt_ref
@@ -753,13 +780,14 @@
         STREAM_TO_UINT16(p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref, pp);
 
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_DEBUG1("External Report Reference UUID 0x%04x",
+        APPL_TRACE_DEBUG("External Report Reference UUID 0x%04x",
                     p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].ext_rpt_ref);
 #endif
     }
     bta_hh_le_search_hid_chars(p_dev_cb);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_register_input_notif
@@ -779,7 +807,7 @@
     UINT16  srvc_uuid;
 
 #if BTA_HH_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hh_le_register_input_notif mode: %d", proto_mode);
+    APPL_TRACE_DEBUG("bta_hh_le_register_input_notif mode: %d", proto_mode);
 #endif
 
     for (i = 0; i < BTA_HH_LE_RPT_MAX; i ++, p_rpt ++)
@@ -806,7 +834,7 @@
                 if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
                     p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
                 {
-                    APPL_TRACE_DEBUG1("---> Deregister Report ID: %d", p_rpt->rpt_id);
+                    APPL_TRACE_DEBUG("---> Deregister Report ID: %d", p_rpt->rpt_id);
                     BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
                                                        p_dev_cb->addr,
                                                        &char_id);
@@ -815,7 +843,7 @@
                 else if (p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
                          p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT)
                 {
-                    APPL_TRACE_DEBUG1("<--- Register Boot Report ID: %d", p_rpt->rpt_id);
+                    APPL_TRACE_DEBUG("<--- Register Boot Report ID: %d", p_rpt->rpt_id);
                     BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
                                                        p_dev_cb->addr,
                                                        &char_id);
@@ -828,7 +856,7 @@
                     p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
                 {
 
-                    APPL_TRACE_DEBUG1("---> Deregister Boot Report ID: %d", p_rpt->rpt_id);
+                    APPL_TRACE_DEBUG("---> Deregister Boot Report ID: %d", p_rpt->rpt_id);
                     BTA_GATTC_DeregisterForNotifications(bta_hh_cb.gatt_if,
                                                        p_dev_cb->addr,
                                                        &char_id);
@@ -836,7 +864,7 @@
                 else if (p_rpt->uuid == GATT_UUID_HID_REPORT &&
                          p_rpt->client_cfg_value == BTA_GATT_CLT_CONFIG_NOTIFICATION)
                 {
-                    APPL_TRACE_DEBUG1("<--- Register Report ID: %d", p_rpt->rpt_id);
+                    APPL_TRACE_DEBUG("<--- Register Report ID: %d", p_rpt->rpt_id);
                     BTA_GATTC_RegisterForNotifications(bta_hh_cb.gatt_if,
                                                        p_dev_cb->addr,
                                                        &char_id);
@@ -864,6 +892,7 @@
 #endif
         bta_hh_le_register_input_notif(p_cb, 0, p_cb->mode, TRUE);
         bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
+
 #if (BTA_HH_LE_RECONN == TRUE)
         if (p_cb->status == BTA_HH_OK)
         {
@@ -872,6 +901,7 @@
 #endif
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_write_char_clt_cfg
@@ -909,7 +939,7 @@
     {
         BTA_GATTC_WriteCharDescr(p_cb->conn_id,
                             &descr_id,
-                            BTA_GATTC_TYPE_WRITE_NO_RSP,
+                            BTA_GATTC_TYPE_WRITE,
                             &value,
                             BTA_GATT_AUTH_REQ_NONE);
 
@@ -917,6 +947,7 @@
     }
     return FALSE;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_write_rpt_clt_cfg
@@ -979,21 +1010,20 @@
 {
     tBTA_GATTC_CHAR_ID  char_id;
     tBTA_HH_CBDATA      cback_data ;
-    BOOLEAN             exec = TRUE;
+    BOOLEAN             exec = FALSE;
 
-    APPL_TRACE_DEBUG1("bta_hh_le_set_protocol_mode attempt mode: %s",
+    APPL_TRACE_DEBUG("bta_hh_le_set_protocol_mode attempt mode: %s",
                       (mode == BTA_HH_PROTO_RPT_MODE)? "Report": "Boot");
 
     cback_data.handle  = p_cb->hid_handle;
     /* boot mode is not supported in the remote device */
     if ((p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].option_char & BTA_HH_LE_PROTO_MODE_BIT) == 0)
     {
-        exec        = FALSE;
         p_cb->mode  = BTA_HH_PROTO_RPT_MODE;
 
         if (mode == BTA_HH_PROTO_BOOT_MODE)
         {
-            APPL_TRACE_ERROR0("Set Boot Mode failed!! No PROTO_MODE Char!");
+            APPL_TRACE_ERROR("Set Boot Mode failed!! No PROTO_MODE Char!");
             cback_data.status = BTA_HH_ERR;
         }
         else
@@ -1009,7 +1039,7 @@
         else
             (* bta_hh_cb.p_cback)(BTA_HH_SET_PROTO_EVT, (tBTA_HH *)&cback_data);
     }
-    else
+    else if (p_cb->mode != mode)
     {
         bta_hh_le_fill_16bits_srvc_id(TRUE, 0, UUID_SERVCLASS_LE_HID, &char_id.srvc_id);
         bta_hh_le_fill_16bits_char_id(0, GATT_UUID_HID_PROTO_MODE, &char_id.char_id);
@@ -1023,7 +1053,9 @@
                                  1,
                                  &mode,
                                  BTA_GATT_AUTH_REQ_NONE);
+        exec        = TRUE;
     }
+
     return exec;
 }
 
@@ -1067,6 +1099,7 @@
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_expl_rpt
@@ -1089,11 +1122,11 @@
                                           p_char_id->char_id.inst_id,
                                           prop) == NULL)
         {
-            APPL_TRACE_ERROR0("Add report entry failed !!!");
+            APPL_TRACE_ERROR("Add report entry failed !!!");
             break;
         }
 
-        APPL_TRACE_DEBUG0("Find more REPORT");
+        APPL_TRACE_DEBUG("Find more REPORT");
 
         if (BTA_GATTC_GetNextChar(p_dev_cb->conn_id,
                           p_char_id,
@@ -1106,13 +1139,14 @@
     }
     while (1);
 
-    APPL_TRACE_ERROR0("all report searched");
+    APPL_TRACE_ERROR("all report searched");
     bta_hh_le_read_rpt_ref_descr(p_dev_cb,
                                  &p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].report[0]);
 
 
     return ;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_expl_boot_rpt
@@ -1130,11 +1164,12 @@
                                       prop) == NULL)
 
     {
-        APPL_TRACE_ERROR0("Add report entry failed !!!");
+        APPL_TRACE_ERROR("Add report entry failed !!!");
     }
 
     return;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_dis_cback
@@ -1151,7 +1186,7 @@
 
     if (p_cb == NULL || p_dis_value == NULL)
     {
-        APPL_TRACE_ERROR0("received unexpected/error DIS callback");
+        APPL_TRACE_ERROR("received unexpected/error DIS callback");
         return;
     }
 
@@ -1160,7 +1195,7 @@
     if (p_dis_value->attr_mask & DIS_ATTR_PNP_ID_BIT)
     {
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_DEBUG3("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x",
+        APPL_TRACE_DEBUG("Plug in PnP info: product_id = %02x, vendor_id = %04x, version = %04x",
                 p_dis_value->pnp_id.product_id,
                 p_dis_value->pnp_id.vendor_id,
                 p_dis_value->pnp_id.product_version);
@@ -1171,6 +1206,7 @@
     }
     bta_hh_le_open_cmpl(p_cb);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_pri_service_discovery
@@ -1185,12 +1221,14 @@
 {
     tBT_UUID        pri_srvc;
 
+    bta_hh_le_co_reset_rpt_cache(p_cb->addr, p_cb->app_id);
+
     p_cb->disc_active |= (BTA_HH_LE_DISC_HIDS|BTA_HH_LE_DISC_DIS);
 
     /* read DIS info */
-    if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback))
+    if (!DIS_ReadDISInfo(p_cb->addr, bta_hh_le_dis_cback, DIS_ATTR_PNP_ID_BIT))
     {
-        APPL_TRACE_ERROR0("read DIS failed");
+        APPL_TRACE_ERROR("read DIS failed");
         p_cb->disc_active &= ~BTA_HH_LE_DISC_DIS;
     }
 
@@ -1201,6 +1239,7 @@
     BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &pri_srvc);
     return;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_encrypt_cback
@@ -1210,25 +1249,27 @@
 ** Returns          None
 **
 *******************************************************************************/
-void bta_hh_le_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void bta_hh_le_encrypt_cback(BD_ADDR bd_addr, tBTA_GATT_TRANSPORT transport,
+                                    void *p_ref_data, tBTM_STATUS result)
 {
     UINT8   idx = bta_hh_find_cb(bd_addr);
     tBTA_HH_DEV_CB *p_dev_cb;
     UNUSED(p_ref_data);
-
-    APPL_TRACE_ERROR0("bta_hh_le_encrypt_cback");
+    UNUSED (transport);
 
     if (idx != BTA_HH_IDX_INVALID)
         p_dev_cb = &bta_hh_cb.kdev[idx];
     else
     {
-        APPL_TRACE_ERROR0("unexpected encryption callback, ignore");
+        APPL_TRACE_ERROR("unexpected encryption callback, ignore");
         return;
     }
     p_dev_cb->status = (result == BTM_SUCCESS) ? BTA_HH_OK : BTA_HH_ERR_SEC;
+    p_dev_cb->reason = result;
 
     bta_hh_sm_execute(p_dev_cb, BTA_HH_ENC_CMPL_EVT, NULL);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_security_cmpl
@@ -1241,17 +1282,29 @@
 *******************************************************************************/
 void bta_hh_security_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_buf)
 {
+    tBTA_HH_RPT_CACHE_ENTRY     *p_rpt_cache;
+    UINT8                       num_rpt = 0;
     UNUSED(p_buf);
 
     if (p_cb->status == BTA_HH_OK)
     {
+        APPL_TRACE_DEBUG("bta_hh_security_cmpl OK");
+        if (!p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
+        {
+            APPL_TRACE_DEBUG("bta_hh_security_cmpl no reports loaded, try to load");
+            /* start loading the cache if not in stack */
+            if ((p_rpt_cache = bta_hh_le_co_cache_load(p_cb->addr, &num_rpt, p_cb->app_id)) != NULL)
+            {
+                bta_hh_process_cache_rpt(p_cb, p_rpt_cache, num_rpt);
+            }
+        }
         /*  discovery has been done for HID service */
-        if (p_cb->app_id != 0 && bta_hh_le_hid_srvc_cached(p_cb))
+        if (p_cb->app_id != 0 && p_cb->hid_srvc[BTA_HH_LE_SRVC_DEF].in_use)
         {
             /* configure protocol mode */
             if (bta_hh_le_set_protocol_mode(p_cb, p_cb->mode) == FALSE)
             {
-                APPL_TRACE_ERROR0("bta_hh_security_cmpl");
+                APPL_TRACE_ERROR("bta_hh_security_cmpl");
                 bta_hh_le_open_cmpl(p_cb);
             }
         }
@@ -1262,8 +1315,12 @@
         }
     }
     else
-        bta_hh_le_api_disc_act(p_cb);
-
+    {
+        APPL_TRACE_ERROR("%s() - encryption failed; status=0x%04x, reason=0x%04x",
+                __FUNCTION__, p_cb->status, p_cb->reason);
+        if (!(p_cb->status == BTA_HH_ERR_SEC && p_cb->reason == BTM_ERR_PROCESSING))
+            bta_hh_le_api_disc_act(p_cb);
+    }
 }
 
 /*******************************************************************************
@@ -1289,6 +1346,31 @@
 
 /*******************************************************************************
 **
+** Function         bta_hh_clear_service_cache
+**
+** Description      clear the service cache
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_hh_clear_service_cache(tBTA_HH_DEV_CB *p_cb)
+{
+    UINT8 i;
+    tBTA_HH_LE_HID_SRVC     *p_hid_srvc = &p_cb->hid_srvc[0];
+
+    p_cb->app_id = 0;
+    p_cb->total_srvc = 0;
+    p_cb->dscp_info.descriptor.dsc_list = NULL;
+
+    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++)
+    {
+        utl_freebuf((void **)&p_hid_srvc->rpt_map);
+        memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         bta_hh_start_security
 **
 ** Description      start the security check of the established connection
@@ -1315,7 +1397,7 @@
     }
 
     /* verify bond */
-    BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
+    BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE);
 
     /* if link has been encrypted */
     if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
@@ -1327,14 +1409,15 @@
     {
         sec_flag = BTM_BLE_SEC_ENCRYPT;
         p_cb->status = BTA_HH_ERR_AUTH_FAILED;
-        BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
+        BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag);
     }
     /* unbonded device, report security error here */
     else if (p_cb->sec_mask != BTA_SEC_NONE)
     {
         sec_flag = BTM_BLE_SEC_ENCRYPT_NO_MITM;
         p_cb->status = BTA_HH_ERR_AUTH_FAILED;
-        BTM_SetEncryption(p_cb->addr, bta_hh_le_encrypt_cback, &sec_flag);
+        bta_hh_clear_service_cache(p_cb);
+        BTM_SetEncryption(p_cb->addr, BTA_TRANSPORT_LE, bta_hh_le_encrypt_cback, &sec_flag);
     }
     /* otherwise let it go through */
     else
@@ -1344,6 +1427,7 @@
 
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_gatt_open
@@ -1365,13 +1449,13 @@
 
     p2 = p_data->remote_bda;
 
-    APPL_TRACE_DEBUG3("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d",
+    APPL_TRACE_DEBUG("bta_hh_gatt_open BTA_GATTC_OPEN_EVT bda= [%08x%04x] status =%d",
                       ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
                       ((p2[4])<<8)+ p2[5],p_data->status);
 
     if (p_data->status == BTA_GATT_OK)
     {
-
+        p_cb->is_le_device  = TRUE;
         p_cb->in_use    = TRUE;
         p_cb->conn_id   = p_data->conn_id;
         p_cb->hid_handle = BTA_HH_GET_LE_DEV_HDL(p_cb->index);
@@ -1379,7 +1463,7 @@
         bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(p_cb->hid_handle)] = p_cb->index;
 
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_DEBUG3("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index);
+        APPL_TRACE_DEBUG("hid_handle = %2x conn_id = %04x cb_index = %d", p_cb->hid_handle, p_cb->conn_id, p_cb->index);
 #endif
 
         bta_hh_sm_execute(p_cb, BTA_HH_START_ENC_EVT, NULL);
@@ -1391,6 +1475,7 @@
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_close
@@ -1445,7 +1530,7 @@
                 /* TODO: proceed to find battery and device info */
                 if (bta_hh_le_add_hid_srvc_entry(p_dev_cb, p_dev_cb->total_srvc))
                     p_dev_cb->total_srvc ++;
-                APPL_TRACE_DEBUG1("num of hid service: %d", p_dev_cb->total_srvc);
+                APPL_TRACE_DEBUG("num of hid service: %d", p_dev_cb->total_srvc);
             }
             break;
 
@@ -1470,7 +1555,7 @@
 *******************************************************************************/
 void bta_hh_le_gatt_disc_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_STATUS status)
 {
-    APPL_TRACE_DEBUG0("bta_hh_le_gatt_disc_cmpl ");
+    APPL_TRACE_DEBUG("bta_hh_le_gatt_disc_cmpl ");
 
     /* if open sucessful or protocol mode not desired, keep the connection open but inform app */
     if (status == BTA_HH_OK || status == BTA_HH_ERR_PROTO)
@@ -1501,7 +1586,7 @@
 void bta_hh_le_srvc_expl_srvc(tBTA_HH_DEV_CB *p_dev_cb)
 {
 #if BTA_HH_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
+    APPL_TRACE_DEBUG("bta_hh_le_srvc_expl_srvc cur_srvc_index = %d in_use = %d",
                     p_dev_cb->cur_srvc_index,
                     p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].in_use);
 #endif
@@ -1511,9 +1596,7 @@
     {
         if (!p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].expl_incl_srvc)
             /* explore included service first */
-            {
-                bta_hh_le_search_hid_included(p_dev_cb);
-            }
+            bta_hh_le_search_hid_included(p_dev_cb);
         else
         {
             /* explore characterisc */
@@ -1526,6 +1609,7 @@
         bta_hh_le_gatt_disc_cmpl(p_dev_cb, p_dev_cb->status);
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_srvc_search_cmpl
@@ -1593,7 +1677,6 @@
                             &inc_srvc_result) == BTA_GATT_OK)
     {
         /* read include service UUID */
-
         p_dev_cb->hid_srvc[p_dev_cb->cur_srvc_index].incl_srvc_inst = inc_srvc_result.incl_svc_id.id.inst_id;
 
         char_cond.len = LEN_UUID_16;
@@ -1606,13 +1689,14 @@
                                     &char_result,
                                     &prop) == BTA_GATT_OK)
         {
+
             if (bta_hh_le_find_alloc_report_entry(p_dev_cb,
                                                   char_result.srvc_id.id.inst_id,
                                                   GATT_UUID_BATTERY_LEVEL,
                                                   char_result.char_id.inst_id,
                                                   prop) == NULL)
             {
-                APPL_TRACE_ERROR0("Add battery report entry failed !!!")
+                APPL_TRACE_ERROR("Add battery report entry failed !!!")
             }
 
             /* read the battery characteristic */
@@ -1625,7 +1709,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("Remote device does not have battery level");
+            APPL_TRACE_ERROR("Remote device does not have battery level");
         }
     }
 
@@ -1634,6 +1718,7 @@
     bta_hh_le_srvc_expl_srvc(p_dev_cb);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_read_battery_level_cmpl
@@ -1689,7 +1774,7 @@
     bta_hh_le_fill_16bits_srvc_id(TRUE, p_dev_cb->cur_srvc_index, UUID_SERVCLASS_LE_HID, &srvc_id);
 
 #if BTA_HH_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
+    APPL_TRACE_DEBUG("bta_hh_le_search_hid_chars: looking for %s(0x%04x)",
                        bta_hh_uuid_to_str(char_uuid), char_uuid);
 #endif
 
@@ -1744,6 +1829,7 @@
         bta_hh_le_search_hid_chars(p_dev_cb);
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_save_rpt_map
@@ -1783,9 +1869,8 @@
     {
         bta_hh_le_search_hid_chars(p_dev_cb);
     }
-
-
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_proc_get_rpt_cmpl
@@ -1805,7 +1890,7 @@
 
     if (p_dev_cb->w4_evt != BTA_HH_GET_RPT_EVT)
     {
-        APPL_TRACE_ERROR1("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt);
+        APPL_TRACE_ERROR("Unexpected READ cmpl, w4_evt = %d", p_dev_cb->w4_evt);
         return;
     }
 
@@ -1827,6 +1912,7 @@
             hs_data.status  = BTA_HH_OK;
             p_buf->len = p_data->p_value->unformat.len + 1;
             p_buf->layer_specific = 0;
+            p_buf->offset = 0;
 
             /* attach report ID as the first byte of the report before sending it to USB HID driver */
             pp = (UINT8*)(p_buf + 1);
@@ -1841,8 +1927,8 @@
     (* bta_hh_cb.p_cback)(BTA_HH_GET_RPT_EVT, (tBTA_HH *)&hs_data);
 
     utl_freebuf((void **)&p_buf);
-
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_proc_read_proto_mode
@@ -1873,7 +1959,7 @@
         p_dev_cb->mode = hs_data.rsp_data.proto_mode;
     }
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("LE GET_PROTOCOL Mode = [%s]",
+    APPL_TRACE_DEBUG("LE GET_PROTOCOL Mode = [%s]",
                         (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
 #endif
 
@@ -1881,6 +1967,7 @@
     (* bta_hh_cb.p_cback)(BTA_HH_GET_PROTO_EVT, (tBTA_HH *)&hs_data);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_w4_le_read_char_cmpl
@@ -1920,7 +2007,7 @@
 
             default:
 #if BTA_HH_DEBUG == TRUE
-                APPL_TRACE_ERROR2("Unexpected read %s(0x%04x)",
+                APPL_TRACE_ERROR("Unexpected read %s(0x%04x)",
                                 bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
                                 p_data->char_id.uuid.uu.uuid16);
 #endif
@@ -1930,18 +2017,19 @@
         else
         {
 #if BTA_HH_DEBUG == TRUE
-            APPL_TRACE_ERROR3("read uuid %s[0x%04x] error: %d",
+            APPL_TRACE_ERROR("read uuid %s[0x%04x] error: %d",
                                 bta_hh_uuid_to_str(p_data->char_id.uuid.uu.uuid16),
                                 p_data->char_id.uuid.uu.uuid16,
                                 p_data->status);
 #else
-            APPL_TRACE_ERROR2("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status);
+            APPL_TRACE_ERROR("read uuid [0x%04x] error: %d", p_data->char_id.uuid.uu.uuid16, p_data->status);
 #endif
         }
         bta_hh_le_search_hid_chars(p_dev_cb);
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_read_char_cmpl
@@ -1971,11 +2059,12 @@
         break;
 
     default:
-        APPL_TRACE_ERROR1("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16);
+        APPL_TRACE_ERROR("Unexpected Read UUID: 0x%04x", p_data->char_id.uuid.uu.uuid16);
         break;
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_read_descr_cmpl
@@ -2002,11 +2091,20 @@
             pp = p_data->p_value->unformat.p_value;
             STREAM_TO_UINT16(p_rpt->client_cfg_value, pp);
 
-            APPL_TRACE_DEBUG1("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value);
+            APPL_TRACE_DEBUG("Read Client Configuration: 0x%04x", p_rpt->client_cfg_value);
         }
     }
 }
 
+/*******************************************************************************
+**
+** Function         bta_hh_le_read_battery_level_descr_cmpl
+**
+** Description      Process report reference descriptor for battery level is completed
+**
+** Parameters:
+**
+*******************************************************************************/
 void bta_hh_le_read_battery_level_descr_cmpl(tBTA_HH_DEV_CB *p_dev_cb, tBTA_GATTC_READ * p_data)
 {
     tBTA_HH_LE_RPT  *p_rpt;
@@ -2024,9 +2122,9 @@
         }
         else
             bta_hh_le_save_rpt_ref(p_dev_cb, p_rpt, p_data);
-
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_w4_le_read_descr_cmpl
@@ -2048,7 +2146,7 @@
     char_uuid16 = p_data->char_id.uuid.uu.uuid16;
 
 #if BTA_HH_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)",
+    APPL_TRACE_DEBUG("bta_hh_w4_le_read_descr_cmpl uuid: %s(0x%04x)",
                         bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
                         p_data->descr_type.uuid.uu.uuid16);
 #endif
@@ -2075,7 +2173,7 @@
         break;
 
     default:
-        APPL_TRACE_ERROR1("unknown descriptor read complete for uuid: 0x%04x", char_uuid16);
+        APPL_TRACE_ERROR("unknown descriptor read complete for uuid: 0x%04x", char_uuid16);
         break;
     }
 }
@@ -2110,6 +2208,7 @@
         }
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_write_cmpl
@@ -2129,7 +2228,7 @@
         return;
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt);
+    APPL_TRACE_DEBUG("bta_hh_le_write_cmpl w4_evt: %d", p_dev_cb->w4_evt);
 #endif
     switch (p_data->char_id.uuid.uu.uuid16)
     {
@@ -2168,6 +2267,7 @@
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_write_char_descr_cmpl
@@ -2183,7 +2283,7 @@
     UINT8   srvc_inst_id, hid_inst_id;
 
     /* only write client configuration possible */
-    if (p_data && p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
+    if (p_data->descr_type.uuid.uu.uuid16 == GATT_UUID_CHAR_CLIENT_CONFIG)
     {
         srvc_inst_id = p_data->srvc_id.id.inst_id;
         hid_inst_id = srvc_inst_id;
@@ -2196,9 +2296,9 @@
         case GATT_UUID_HID_BT_MOUSE_INPUT:
         case GATT_UUID_HID_REPORT:
             if (p_data->status == BTA_GATT_OK)
-                p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx ++].client_cfg_value =
+                p_dev_cb->hid_srvc[hid_inst_id].report[p_dev_cb->clt_cfg_idx].client_cfg_value =
                         BTA_GATT_CLT_CONFIG_NOTIFICATION;
-
+            p_dev_cb->clt_cfg_idx ++;
             bta_hh_le_write_rpt_clt_cfg(p_dev_cb, hid_inst_id);
 
             break;
@@ -2206,22 +2306,24 @@
         case GATT_UUID_SCAN_REFRESH:
             bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, p_data->status);
             break;
+
         default:
-            APPL_TRACE_ERROR1("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16);
+            APPL_TRACE_ERROR("Unknown char ID clt cfg: 0x%04x", p_data->char_id.uuid.uu.uuid16);
         }
     }
     else
     {
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_ERROR2("Unexpected write to %s(0x%04x)",
+        APPL_TRACE_ERROR("Unexpected write to %s(0x%04x)",
                         bta_hh_uuid_to_str(p_data->descr_type.uuid.uu.uuid16),
                         p_data->descr_type.uuid.uu.uuid16);
 #else
-        APPL_TRACE_ERROR1("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16);
+        APPL_TRACE_ERROR("Unexpected write to (0x%04x)", p_data->descr_type.uuid.uu.uuid16);
 #endif
     }
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_input_rpt_notify
@@ -2240,10 +2342,9 @@
 
     if (p_dev_cb == NULL)
     {
-        APPL_TRACE_ERROR0("notification received from Unknown device");
+        APPL_TRACE_ERROR("notification received from Unknown device");
         return;
     }
-
     app_id= p_dev_cb->app_id;
 
     p_rpt = bta_hh_le_find_report_entry(p_dev_cb,
@@ -2252,7 +2353,7 @@
                                         p_data->char_id.char_id.inst_id);
     if (p_rpt == NULL)
     {
-        APPL_TRACE_ERROR0("notification received for Unknown Report");
+        APPL_TRACE_ERROR("notification received for Unknown Report");
         return;
     }
 
@@ -2261,14 +2362,14 @@
     else if (p_data->char_id.char_id.uuid.uu.uuid16 == GATT_UUID_HID_BT_KB_INPUT)
         app_id = BTA_HH_APP_ID_KB;
 
-    APPL_TRACE_ERROR1("Notification received on report ID: %d", p_rpt->rpt_id);
+    APPL_TRACE_DEBUG("Notification received on report ID: %d", p_rpt->rpt_id);
 
     /* need to append report ID to the head of data */
     if (p_rpt->rpt_id != 0)
     {
         if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(p_data->len + 1))) == NULL)
         {
-            APPL_TRACE_ERROR0("No resources to send report data");
+            APPL_TRACE_ERROR("No resources to send report data");
             return;
         }
 
@@ -2292,7 +2393,6 @@
         GKI_freebuf(p_buf);
 }
 
-
 /*******************************************************************************
 **
 ** Function         bta_hh_gatt_open_fail
@@ -2306,7 +2406,12 @@
 {
     tBTA_HH_CONN            conn_dat ;
     tBTA_HH_LE_HID_SRVC     *p_hid_srvc = &p_cb->hid_srvc[0];
-    UINT8   i;
+
+    /* open failure in the middle of service discovery, clear all services */
+    if (p_cb->disc_active & BTA_HH_LE_DISC_HIDS)
+    {
+        bta_hh_clear_service_cache(p_cb);
+    }
 
     p_cb->disc_active = BTA_HH_LE_DISC_NONE;
     /* Failure in opening connection or GATT discovery failure */
@@ -2320,16 +2425,11 @@
     else
         conn_dat.status = p_cb->status;
 
-    for (i = 0; i < BTA_HH_LE_HID_SRVC_MAX; i ++, p_hid_srvc ++)
-    {
-        utl_freebuf((void **)&p_hid_srvc->rpt_map);
-        memset(p_hid_srvc, 0, sizeof(tBTA_HH_LE_HID_SRVC));
-    }
-
     /* Report OPEN fail event */
     (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_gatt_close
@@ -2371,6 +2471,7 @@
     return;
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_api_disc_act
@@ -2383,7 +2484,12 @@
 void bta_hh_le_api_disc_act(tBTA_HH_DEV_CB *p_cb)
 {
     if (p_cb->conn_id != BTA_GATT_INVALID_CONN_ID)
+    {
         BTA_GATTC_Close(p_cb->conn_id);
+        /* remove device from background connection if intended to disconnect,
+           do not allow reconnection */
+        bta_hh_le_remove_dev_bg_conn(p_cb);
+    }
 }
 
 /*******************************************************************************
@@ -2403,7 +2509,7 @@
 
     if (p_rpt == NULL)
     {
-        APPL_TRACE_ERROR0("bta_hh_le_get_rpt: no matching report");
+        APPL_TRACE_ERROR("bta_hh_le_get_rpt: no matching report");
         return;
     }
     if (p_rpt->uuid == GATT_UUID_BATTERY_LEVEL)
@@ -2439,7 +2545,7 @@
 
     if (p_buf == NULL || p_buf->len == 0)
     {
-        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: Illegal data");
+        APPL_TRACE_ERROR("bta_hh_le_write_rpt: Illegal data");
         return;
     }
 
@@ -2452,11 +2558,11 @@
 
     if (p_rpt == NULL)
     {
-        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
+        APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report");
         return;
     }
 
-    APPL_TRACE_ERROR2("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len);
+    APPL_TRACE_ERROR("bta_hh_le_write_rpt: ReportID: 0x%02x Data Len: %d", rpt_id, p_buf->len);
 
     p_cb->w4_evt = w4_evt;
 
@@ -2471,6 +2577,7 @@
                              BTA_GATT_AUTH_REQ_NONE);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_suspend
@@ -2560,11 +2667,11 @@
             break;
 
         default:
-            APPL_TRACE_ERROR1("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type);
+            APPL_TRACE_ERROR("unsupported trsanction for LE HID device: %d", p_data->api_sndcmd.t_type);
             break;
     }
-
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_get_dscp_act
@@ -2610,7 +2717,7 @@
     {
         /* start reconnection if remote is a bonded device */
         /* verify bond */
-        BTM_GetSecurityFlags(p_cb->addr, &sec_flag);
+        BTM_GetSecurityFlagsByTransport(p_cb->addr, &sec_flag, BT_TRANSPORT_LE);
 
         if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN) == 0)
             to_add = FALSE;
@@ -2620,7 +2727,7 @@
         !p_cb->in_bg_conn && to_add)
     {
         /* add device into BG connection to accept remote initiated connection */
-        BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE);
+        BTA_GATTC_Open(bta_hh_cb.gatt_if, p_cb->addr, FALSE, BTA_GATT_TRANSPORT_LE);
         p_cb->in_bg_conn = TRUE;
 
         BTA_DmBleSetBgConnType(BTA_DM_BLE_CONN_AUTO, NULL);
@@ -2682,6 +2789,7 @@
         BTA_GATTC_CancelOpen(bta_hh_cb.gatt_if, p_dev_cb->addr, FALSE);
     }
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_update_scpp
@@ -2702,7 +2810,7 @@
         p_dev_cb->mode != BTA_HH_PROTO_RPT_MODE ||
         p_dev_cb->scps_supported == FALSE)
     {
-        APPL_TRACE_ERROR0("Can not set ScPP scan paramter as boot host, or remote does not support ScPP ");
+        APPL_TRACE_ERROR("Can not set ScPP scan paramter as boot host, or remote does not support ScPP ");
 
         cback_data.handle = p_dev_cb->hid_handle;
         cback_data.status = BTA_HH_ERR;
@@ -2727,6 +2835,7 @@
                              BTA_GATT_AUTH_REQ_NONE);
 
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_gattc_callback
@@ -2741,7 +2850,7 @@
     tBTA_HH_DEV_CB *p_dev_cb;
     UINT16          evt;
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("bta_hh_gattc_callback event = %d", event);
+    APPL_TRACE_DEBUG("bta_hh_gattc_callback event = %d", event);
 #endif
     if (p_data == NULL)
         return;
@@ -2834,7 +2943,7 @@
     index = bta_hh_find_cb(bd_addr);
     if ((index = bta_hh_find_cb(bd_addr))== BTA_HH_IDX_INVALID)
     {
-        APPL_TRACE_ERROR0("unknown device");
+        APPL_TRACE_ERROR("unknown device");
         return;
     }
 
@@ -2844,7 +2953,7 @@
 
     if (p_rpt == NULL)
     {
-        APPL_TRACE_ERROR0("bta_hh_le_write_rpt: no matching report");
+        APPL_TRACE_ERROR("bta_hh_le_write_rpt: no matching report");
         return;
     }
 
@@ -2859,6 +2968,7 @@
 
     return;
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_search_scps
@@ -2885,6 +2995,7 @@
     else
         bta_hh_le_open_cmpl(p_cb);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_search_scps_chars
@@ -2943,7 +3054,7 @@
         (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_SPT) != 0 &&
         (p_dev_cb->scps_notify & BTA_HH_LE_SCPS_NOTIFY_ENB) == 0)
     {
-        BTM_GetSecurityFlags(p_dev_cb->addr, &sec_flag);
+        BTM_GetSecurityFlagsByTransport(p_dev_cb->addr, &sec_flag, BT_TRANSPORT_LE);
         if ((sec_flag & BTM_SEC_FLAG_LKEY_KNOWN))
         {
             if (bta_hh_le_write_char_clt_cfg (p_dev_cb,
@@ -2965,6 +3076,7 @@
     }
     bta_hh_le_register_scpp_notif_cmpl(p_dev_cb, status);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_hh_le_register_scpp_notif_cmpl
@@ -2989,6 +3101,60 @@
 
 
 }
+
+/*******************************************************************************
+**
+** Function         bta_hh_process_cache_rpt
+**
+** Description      Process the cached reports
+**
+** Parameters:
+**
+*******************************************************************************/
+static void bta_hh_process_cache_rpt (tBTA_HH_DEV_CB *p_cb,
+                                      tBTA_HH_RPT_CACHE_ENTRY *p_rpt_cache,
+                                      UINT8 num_rpt)
+{
+    UINT8                       i = 0;
+    tBTA_HH_LE_RPT              *p_rpt;
+
+    if (num_rpt != 0)  /* no cache is found */
+    {
+        p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].in_use = TRUE;
+
+        /* set the descriptor info */
+        p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dl_len =
+                p_cb->dscp_info.descriptor.dl_len;
+        p_cb->hid_srvc[BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id)].descriptor.dsc_list =
+                    p_cb->dscp_info.descriptor.dsc_list;
+
+        for (; i <num_rpt; i ++, p_rpt_cache ++)
+        {
+            if ((p_rpt = bta_hh_le_find_alloc_report_entry (p_cb,
+                                               BTA_HH_LE_RPT_GET_SRVC_INST_ID(p_rpt_cache->inst_id),
+                                               p_rpt_cache->rpt_uuid,
+                                               BTA_HH_LE_RPT_GET_RPT_INST_ID(p_rpt_cache->inst_id),
+                                               p_rpt_cache->prop))  == NULL)
+            {
+                APPL_TRACE_ERROR("bta_hh_process_cache_rpt: allocation report entry failure");
+                break;
+            }
+            else
+            {
+                p_rpt->rpt_type =  p_rpt_cache->rpt_type;
+                p_rpt->rpt_id   =  p_rpt_cache->rpt_id;
+
+                if(p_rpt->uuid == GATT_UUID_HID_BT_KB_INPUT ||
+                    p_rpt->uuid == GATT_UUID_HID_BT_MOUSE_INPUT ||
+                    (p_rpt->uuid == GATT_UUID_HID_REPORT && p_rpt->rpt_type == BTA_HH_RPTT_INPUT))
+                {
+                    p_rpt->client_cfg_value = BTA_GATT_CLT_CONFIG_NOTIFICATION;
+                }
+            }
+        }
+    }
+}
+
 #endif
 
 
diff --git a/bta/hh/bta_hh_main.c b/bta/hh/bta_hh_main.c
index c2554c1..e5c353d 100644
--- a/bta/hh/bta_hh_main.c
+++ b/bta/hh/bta_hh_main.c
@@ -357,7 +357,13 @@
 
             default:
                 /* invalid handle, call bad API event */
-                APPL_TRACE_ERROR1("wrong device handle: [%d]", p_data->hdr.layer_specific);
+                APPL_TRACE_ERROR("wrong device handle: [%d]", p_data->hdr.layer_specific);
+                /* Free the callback buffer now */
+                if (p_data != NULL && p_data->hid_cback.p_data != NULL)
+                {
+                    GKI_freebuf(p_data->hid_cback.p_data);
+                    p_data->hid_cback.p_data = NULL;
+                }
                 break;
             }
            if (cback_event)
@@ -369,14 +375,14 @@
     {
 #if BTA_HH_DEBUG == TRUE
         in_state = p_cb->state;
-        APPL_TRACE_EVENT3("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]",
+        APPL_TRACE_EVENT("bta_hh_sm_execute: State 0x%02x [%s], Event [%s]",
                           in_state, bta_hh_state_code(in_state),
                           bta_hh_evt_code(debug_event));
 #endif
 
         if ((p_cb->state == BTA_HH_NULL_ST) || (p_cb->state >= BTA_HH_INVALID_ST))
         {
-            APPL_TRACE_ERROR2("bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d",
+            APPL_TRACE_ERROR("bta_hh_sm_execute: Invalid state State = 0x%x, Event = %d",
                               p_cb->state,event);
             return;
         }
@@ -394,7 +400,7 @@
 #if BTA_HH_DEBUG == TRUE
         if (in_state != p_cb->state)
         {
-            APPL_TRACE_DEBUG3("HH State Change: [%s] -> [%s] after Event [%s]",
+            APPL_TRACE_DEBUG("HH State Change: [%s] -> [%s] after Event [%s]",
                           bta_hh_state_code(in_state),
                           bta_hh_state_code(p_cb->state),
                           bta_hh_evt_code(debug_event));
@@ -475,7 +481,7 @@
                 p_cb = &bta_hh_cb.kdev[index];
 
 #if BTA_HH_DEBUG
-            APPL_TRACE_DEBUG2("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index);
+            APPL_TRACE_DEBUG("bta_hh_hdl_event:: handle = %d dev_cb[%d] ", p_msg->layer_specific, index);
 #endif
             bta_hh_sm_execute(p_cb, p_msg->event, (tBTA_HH_DATA *) p_msg);
     }
diff --git a/bta/hh/bta_hh_utils.c b/bta/hh/bta_hh_utils.c
index 6130a88..dc20a0d 100644
--- a/bta/hh/bta_hh_utils.c
+++ b/bta/hh/bta_hh_utils.c
@@ -72,14 +72,14 @@
               bdcmp(bda, bd_addr_null) != 0) )
         {
 #if BTA_HH_DEBUG
-            APPL_TRACE_DEBUG2("found kdev_cb[%d] hid_handle = %d ", xx,
+            APPL_TRACE_DEBUG("found kdev_cb[%d] hid_handle = %d ", xx,
                                 bta_hh_cb.kdev[xx].hid_handle)
 #endif
             return xx;
         }
 #if BTA_HH_DEBUG
         else
-            APPL_TRACE_DEBUG4("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]",
+            APPL_TRACE_DEBUG("in_use ? [%d] kdev[%d].hid_handle = %d state = [%d]",
                             bta_hh_cb.kdev[xx].in_use, xx,
                             bta_hh_cb.kdev[xx].hid_handle,
                             bta_hh_cb.kdev[xx].state);
@@ -97,7 +97,7 @@
     }
     /* If device list full, report BTA_HH_IDX_INVALID */
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG2("bta_hh_find_cb:: index = %d while max = %d",
+    APPL_TRACE_DEBUG("bta_hh_find_cb:: index = %d while max = %d",
                         xx, BTA_HH_MAX_DEVICE);
 #endif
 
@@ -157,7 +157,7 @@
                            UINT16 version, UINT8 flag)
 {
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG3("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x",
+    APPL_TRACE_DEBUG("vendor_id = 0x%2x product_id = 0x%2x version = 0x%2x",
                         vendor_id, product_id, version);
 #endif
     p_cb->dscp_info.vendor_id     =   vendor_id;
@@ -187,7 +187,7 @@
                                UINT8 app_id)
 {
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("subclass = 0x%2x", sub_class);
+    APPL_TRACE_DEBUG("subclass = 0x%2x", sub_class);
 #endif
 
     p_cb->hid_handle = handle;
@@ -237,13 +237,13 @@
         {
             p_cb->app_id = p_bta_hh_cfg->p_devt_list[xx].app_id;
 #if BTA_HH_DEBUG
-            APPL_TRACE_EVENT1("bta_hh_tod_spt sub_class:0x%x supported", sub_class);
+            APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x supported", sub_class);
 #endif
             return TRUE;
         }
     }
 #if BTA_HH_DEBUG
-            APPL_TRACE_EVENT1("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class);
+            APPL_TRACE_EVENT("bta_hh_tod_spt sub_class:0x%x NOT supported", sub_class);
 #endif
     return FALSE;
 }
@@ -269,7 +269,7 @@
     UINT8        this_report[BTA_HH_MAX_RPT_CHARS];
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG2("bta_hh_parse_keybd_rpt:  (report=%p, report_len=%d) called",
+    APPL_TRACE_DEBUG("bta_hh_parse_keybd_rpt:  (report=%p, report_len=%d) called",
             p_report, report_len);
 #endif
 
@@ -291,7 +291,7 @@
     {
         if (ctl_shift & bta_hh_mod_key_mask[xx])
         {
-            APPL_TRACE_DEBUG1("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] );
+            APPL_TRACE_DEBUG("Mod Key[%02x] pressed", bta_hh_mod_key_mask[xx] );
             p_kb->mod_key[xx] = TRUE;
         }
         else if (p_kb->mod_key[xx])
@@ -321,7 +321,7 @@
     for (xx = 0; xx < report_len; xx++)
     {
 #if BTA_HH_DEBUG
-        APPL_TRACE_DEBUG1("this_char = %02x", this_report[xx]);
+        APPL_TRACE_DEBUG("this_char = %02x", this_report[xx]);
 #endif
         if ((this_char = this_report[xx]) == 0)
             continue;
@@ -334,7 +334,7 @@
             p_data->this_char[key_idx ++] = this_char;
 
 #if BTA_HH_DEBUG
-        APPL_TRACE_DEBUG1("found keycode %02x ",  this_report[xx]);
+        APPL_TRACE_DEBUG("found keycode %02x ",  this_report[xx]);
 #endif
         p_data->caps_lock   = p_kb->caps_lock;
         p_data->num_lock      = p_kb->num_lock;
@@ -362,7 +362,7 @@
 #if BTA_HH_DEBUG
     UINT8       xx;
 
-    APPL_TRACE_DEBUG2("bta_hh_parse_mice_rpt:  bta_keybd_rpt_rcvd(report=%p, \
+    APPL_TRACE_DEBUG("bta_hh_parse_mice_rpt:  bta_keybd_rpt_rcvd(report=%p, \
                 report_len=%d) called", p_report, report_len);
 #endif
 
@@ -375,7 +375,7 @@
 #if BTA_HH_DEBUG
     for (xx = 0; xx < report_len; xx++)
     {
-        APPL_TRACE_DEBUG1("this_char = %02x", p_report[xx]);
+        APPL_TRACE_DEBUG("this_char = %02x", p_report[xx]);
     }
 #endif
 
@@ -389,8 +389,8 @@
     p_data->delta_y     = p_report[2];
 
 #if BTA_HH_DEBUG
-    APPL_TRACE_DEBUG1("mice button: 0x%2x", p_data->mouse_button);
-    APPL_TRACE_DEBUG2("mice move: x = %d y = %d", p_data->delta_x,
+    APPL_TRACE_DEBUG("mice button: 0x%2x", p_data->mouse_button);
+    APPL_TRACE_DEBUG("mice move: x = %d y = %d", p_data->delta_x,
                         p_data->delta_y );
 #endif
 
@@ -413,8 +413,6 @@
     tBTA_HH_CB  *p_cb = &bta_hh_cb;
     UINT8       i;
     UINT16      ssr_max_latency;
-    /* lock other GKI task */
-    GKI_sched_lock();
     for (i = 0; i < BTA_HH_MAX_KNOWN; i ++)
     {
         if (memcmp(p_cb->kdev[i].addr, bd_addr, BD_ADDR_LEN) == 0)
@@ -449,7 +447,6 @@
             break;
         }
     }
-    GKI_sched_unlock();
 
     return status;
 }
@@ -499,7 +496,7 @@
         if (BTA_HH_IS_LE_DEV_HDL_VALID(dev_handle))
             index = bta_hh_cb.le_cb_index[BTA_HH_GET_LE_CB_IDX(dev_handle)];
 #if BTA_HH_DEBUG == TRUE
-        APPL_TRACE_DEBUG2("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index);
+        APPL_TRACE_DEBUG("bta_hh_dev_handle_to_cb_idx dev_handle = %d index = %d", dev_handle, index);
 #endif
     }
     else
@@ -525,18 +522,18 @@
 {
     UINT8    xx;
 
-    APPL_TRACE_DEBUG0("bta_hh_trace_dev_db:: Device DB list********************");
+    APPL_TRACE_DEBUG("bta_hh_trace_dev_db:: Device DB list********************");
 
     for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
     {
-        APPL_TRACE_DEBUG3("kdev[%d] in_use[%d]  handle[%d] ",xx,
+        APPL_TRACE_DEBUG("kdev[%d] in_use[%d]  handle[%d] ",xx,
             bta_hh_cb.kdev[xx].in_use, bta_hh_cb.kdev[xx].hid_handle);
 
-        APPL_TRACE_DEBUG4("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d",
+        APPL_TRACE_DEBUG("\t\t\t attr_mask[%04x] state [%d] sub_class[%02x] index = %d",
             bta_hh_cb.kdev[xx].attr_mask, bta_hh_cb.kdev[xx].state,
             bta_hh_cb.kdev[xx].sub_class, bta_hh_cb.kdev[xx].index);
     }
-    APPL_TRACE_DEBUG0("*********************************************************");
+    APPL_TRACE_DEBUG("*********************************************************");
 }
 #endif
 #endif /* HL_INCLUDED */
diff --git a/bta/hl/bta_hl_act.c b/bta/hl/bta_hl_act.c
index 01528aa..b4c65c3 100644
--- a/bta/hl/bta_hl_act.c
+++ b/bta/hl/bta_hl_act.c
@@ -91,7 +91,7 @@
     tBTA_HL             evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG2("bta_hl_dch_mca_cong_change mdl_id=%d cong=%d",
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_cong_change mdl_id=%d cong=%d",
                       p_cong_chg->mdl_id,
                       p_cong_chg->cong);
 #endif
@@ -124,7 +124,7 @@
     UNUSED(p_data);
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_echo_test");
+    APPL_TRACE_DEBUG("bta_hl_dch_echo_test");
 #endif
 
     p_dcb->echo_oper = BTA_HL_ECHO_OP_CI_GET_ECHO_DATA;
@@ -152,7 +152,7 @@
     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_sdp_init");
+    APPL_TRACE_DEBUG("bta_hl_dch_sdp_init");
 #endif
     if ( p_mcb->sdp_oper == BTA_HL_SDP_OP_NONE)
     {
@@ -169,14 +169,14 @@
 
         if (bta_hl_init_sdp(p_mcb->sdp_oper, app_idx, mcl_idx, mdl_idx) != BTA_HL_STATUS_OK)
         {
-            APPL_TRACE_ERROR0("SDP INIT failed");
+            APPL_TRACE_ERROR("SDP INIT failed");
             p_mcb->sdp_oper = BTA_HL_SDP_OP_NONE;
             bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
         }
     }
     else
     {
-        APPL_TRACE_ERROR0("SDP in use");
+        APPL_TRACE_ERROR("SDP in use");
         bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
     }
 }
@@ -197,7 +197,7 @@
     tBTA_HL_MDL_CB          *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_close_echo_test");
+    APPL_TRACE_DEBUG("bta_hl_dch_close_echo_test");
 #endif
 
     switch (p_dcb->echo_oper)
@@ -238,7 +238,7 @@
     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_rcv_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_rcv_data");
 #endif
 
     if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
@@ -266,7 +266,7 @@
                                         BTA_HL_CI_PUT_ECHO_DATA_EVT);
                 break;
             default:
-                APPL_TRACE_ERROR1("Unknonw echo_oper=%d",p_dcb->echo_oper);
+                APPL_TRACE_ERROR("Unknonw echo_oper=%d",p_dcb->echo_oper);
                 break;
         }
 
@@ -302,7 +302,7 @@
     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_ci_put_echo_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_ci_put_echo_data");
 #endif
 
     p_dcb->cout_oper &= ~BTA_HL_CO_PUT_ECHO_DATA_MASK;
@@ -332,7 +332,7 @@
     tBTA_HL_STATUS      status;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_ci_get_echo_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_ci_get_echo_data");
 #endif
 
     p_dcb->cout_oper &= ~BTA_HL_CO_GET_ECHO_DATA_MASK;
@@ -376,7 +376,7 @@
     tBTA_HL             evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_ci_put_rx_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_ci_put_rx_data");
 #endif
 
     p_dcb->cout_oper &= ~BTA_HL_CO_PUT_RX_DATA_MASK;
@@ -422,7 +422,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_ci_get_tx_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_ci_get_tx_data");
 #endif
 
     p_dcb->cout_oper &= ~BTA_HL_CO_GET_TX_DATA_MASK;
@@ -495,7 +495,7 @@
     BOOLEAN             success = TRUE;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_send_data");
+    APPL_TRACE_DEBUG("bta_hl_dch_send_data");
 #endif
 
     if (!(p_dcb->cout_oper & BTA_HL_CO_GET_TX_DATA_MASK))
@@ -552,9 +552,9 @@
 
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_dch_close_cmpl dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+    APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
 #else
-    APPL_TRACE_DEBUG1("bta_hl_dch_close_cmpl dch oper=%d", p_dcb->dch_oper);
+    APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%d", p_dcb->dch_oper);
 #endif
 #endif
 
@@ -653,9 +653,9 @@
         default:
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-            APPL_TRACE_ERROR1("DCH operation not found oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+            APPL_TRACE_ERROR("DCH operation not found oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
 #else
-            APPL_TRACE_ERROR1("DCH operation not found oper=%d", p_dcb->dch_oper);
+            APPL_TRACE_ERROR("DCH operation not found oper=%d", p_dcb->dch_oper);
 #endif
 #endif
             send_evt=FALSE;
@@ -684,7 +684,7 @@
                 case BTA_HL_ECHO_OP_ECHO_PKT:
                     break;
                 default:
-                    APPL_TRACE_ERROR1("Invalid echo_oper=%d", p_dcb->echo_oper);
+                    APPL_TRACE_ERROR("Invalid echo_oper=%d", p_dcb->echo_oper);
                     break;
             }
         }
@@ -712,9 +712,9 @@
         {
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-            APPL_TRACE_DEBUG1("Send Event: %s",  bta_hl_cback_evt_code(event));
+            APPL_TRACE_DEBUG("Send Event: %s",  bta_hl_cback_evt_code(event));
 #else
-            APPL_TRACE_DEBUG1("Send Event: 0x%02x", event);
+            APPL_TRACE_DEBUG("Send Event: 0x%02x", event);
 #endif
 #endif
             p_acb->p_cback(event,(tBTA_HL *) &evt_data );
@@ -739,9 +739,9 @@
 
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_ind dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
 #else
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_ind dch oper=%d", p_dcb->dch_oper);
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%d", p_dcb->dch_oper);
 #endif
 #endif
 
@@ -783,9 +783,9 @@
 
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_cfm dch_oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper) );
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper) );
 #else
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_close_cfm dch_oper=%d", p_dcb->dch_oper);
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%d", p_dcb->dch_oper);
 #endif
 #endif
 
@@ -803,9 +803,9 @@
         default:
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-            APPL_TRACE_ERROR1("Invalid dch_oper=%s for close cfm", bta_hl_dch_oper_code(p_dcb->dch_oper) );
+            APPL_TRACE_ERROR("Invalid dch_oper=%s for close cfm", bta_hl_dch_oper_code(p_dcb->dch_oper) );
 #else
-            APPL_TRACE_ERROR1("Invalid dch_oper=%d for close cfm", p_dcb->dch_oper);
+            APPL_TRACE_ERROR("Invalid dch_oper=%d for close cfm", p_dcb->dch_oper);
 #endif
 #endif
             break;
@@ -832,7 +832,7 @@
     tBTA_HL                 evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_close");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_close");
 #endif
     if (!p_dcb->cout_oper)
     {
@@ -887,7 +887,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_open_ind");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_open_ind");
 #endif
     if ((p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_OPEN) ||
         (p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_RECONNECT)    )
@@ -957,7 +957,7 @@
                 }
                 else
                 {
-                    APPL_TRACE_ERROR0("Unabel to close DCH for reconnect cfg mismatch");
+                    APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
                 }
             }
             break;
@@ -995,7 +995,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_open_cfm");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_open_cfm");
 #endif
     if ((p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_OPEN) ||
         (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_RECONNECT))
@@ -1034,7 +1034,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Error dch oper =%d",  p_dcb->dch_oper);
+        APPL_TRACE_ERROR("Error dch oper =%d",  p_dcb->dch_oper);
         return;
     }
 
@@ -1079,7 +1079,7 @@
                 }
                 else
                 {
-                    APPL_TRACE_ERROR0("Unabel to close DCH for reconnect cfg mismatch");
+                    APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
                 }
             }
             break;
@@ -1108,7 +1108,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_abort_ind");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_ind");
 #endif
 
     p_dcb->abort_oper |= BTA_HL_ABORT_REMOTE_MASK;
@@ -1133,7 +1133,7 @@
     tBTA_HL             evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_abort_cfm");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_cfm");
 #endif
 
     if (p_dcb->abort_oper)
@@ -1156,7 +1156,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("Not expecting Abort CFM ");
+        APPL_TRACE_ERROR("Not expecting Abort CFM ");
     }
 }
 
@@ -1216,7 +1216,7 @@
     }
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_abort abort_oper=0x%x", p_dcb->abort_oper);
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort abort_oper=0x%x", p_dcb->abort_oper);
 #endif
 
 }
@@ -1242,7 +1242,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_dch_mca_reconnect_ind mdl_id=%d", p_reconnect_ind->mdl_id);
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_ind mdl_id=%d", p_reconnect_ind->mdl_id);
 #endif
 
     if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect_ind->mdl_id, &mdl_cfg_idx))
@@ -1313,7 +1313,7 @@
 
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_reconnect_cfm");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_cfm");
 #endif
     if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
     {
@@ -1362,7 +1362,7 @@
     UINT8               sdp_idx;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_reconnect");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect");
 #endif
     if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx))
     {
@@ -1401,7 +1401,7 @@
     UINT8                       mca_rsp_code = MCA_RSP_SUCCESS;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_create_rsp");
+    APPL_TRACE_DEBUG("bta_hl_dch_create_rsp");
 #endif
     if (p_create_rsp->rsp_code == BTA_HL_DCH_CREATE_RSP_SUCCESS)
     {
@@ -1452,7 +1452,7 @@
     tBTA_HL_ECHO_CFG    *p_echo_cfg;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_create_ind");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_create_ind");
 #endif
 
     if (bta_hl_find_mdep_cfg_idx(app_idx, p_create_ind->dep_id, &mdep_cfg_idx))
@@ -1551,7 +1551,7 @@
     tMCA_CREATE_CFM     *p_create_cfm = &p_data->mca_evt.mca_data.create_cfm;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_create_cfm");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_create_cfm");
 #endif
 
     if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
@@ -1572,7 +1572,7 @@
                 if (MCA_DataChnlCfg((tMCA_CL) p_mcb->mcl_handle, &p_dcb->chnl_cfg)!= MCA_SUCCESS)
                 {
                     /* this should not happen */
-                    APPL_TRACE_ERROR0("Unable to create data channel");
+                    APPL_TRACE_ERROR("Unable to create data channel");
                     MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
                     bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
                 }
@@ -1592,7 +1592,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("MCA Create- failed");
+            APPL_TRACE_ERROR("MCA Create- failed");
             bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
         }
     }
@@ -1616,7 +1616,7 @@
     UINT8               sdp_idx;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_dch_mca_create");
+    APPL_TRACE_DEBUG("bta_hl_dch_mca_create");
 #endif
 
     if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx) &&
@@ -1635,13 +1635,13 @@
                                      p_dcb->local_cfg,
                                      NULL )) != MCA_SUCCESS)
         {
-            APPL_TRACE_ERROR1("MCA_CreateMdl FAIL mca_result=%d", result);
+            APPL_TRACE_ERROR("MCA_CreateMdl FAIL mca_result=%d", result);
             bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
         }
     }
     else
     {
-        APPL_TRACE_ERROR0("MCA Create- SDP idx or peer MDEP cfg not found");
+        APPL_TRACE_ERROR("MCA Create- SDP idx or peer MDEP cfg not found");
         bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
     }
 }
@@ -1660,7 +1660,7 @@
 {
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_dch_sdp_fail");
+    APPL_TRACE_DEBUG("bta_hl_dch_sdp_fail");
 #endif
     bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
 }
@@ -1698,7 +1698,7 @@
     UINT16                          name_len;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG5("bta_hl_sdp_cback status:%d sdp_oper=%d app_idx=%d, mcl_idx=%d,   mdl_idx=%d",
+    APPL_TRACE_DEBUG("bta_hl_sdp_cback status:%d sdp_oper=%d app_idx=%d, mcl_idx=%d,   mdl_idx=%d",
                       status, sdp_oper, app_idx, mcl_idx, mdl_idx);
 #endif
 
@@ -1726,7 +1726,7 @@
             }
             else
             {
-                APPL_TRACE_WARNING0("Control PSM not found");
+                APPL_TRACE_WARNING("Control PSM not found");
                 break;
             }
             if (SDP_FindAddProtoListsElemInRec(p_rec, UUID_PROTOCOL_L2CAP, &pe))
@@ -1735,7 +1735,7 @@
             }
             else
             {
-                APPL_TRACE_WARNING0("Data PSM not found");
+                APPL_TRACE_WARNING("Data PSM not found");
                 break;
             }
 
@@ -1776,7 +1776,7 @@
             }
             else
             {
-                APPL_TRACE_WARNING0("MCAP SUP PROC not found");
+                APPL_TRACE_WARNING("MCAP SUP PROC not found");
                 break;
             }
 
@@ -1785,7 +1785,7 @@
                 if (bta_hl_fill_sup_feature_list (p_attr, &sup_feature))
                 {
                     p_hdp_rec->num_mdeps = (UINT8) sup_feature.num_elems;
-                    APPL_TRACE_WARNING1("bta_hl_sdp_cback num_mdeps %d",sup_feature.num_elems);
+                    APPL_TRACE_WARNING("bta_hl_sdp_cback num_mdeps %d",sup_feature.num_elems);
                     for (i=0; i<sup_feature.num_elems; i++)
                     {
                         p_hdp_rec->mdep_cfg[i].data_type = sup_feature.list_elem[i].data_type;
@@ -1801,7 +1801,7 @@
                         }
                         else
                         {
-                            APPL_TRACE_ERROR1("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
+                            APPL_TRACE_ERROR("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
                         }
                     }
 
@@ -1809,39 +1809,39 @@
                 }
                 else
                 {
-                    APPL_TRACE_WARNING0("HDP supported feature list fill failed");
+                    APPL_TRACE_WARNING("HDP supported feature list fill failed");
                     break;
                 }
             }
             else
             {
-                APPL_TRACE_WARNING0("HDP supported feature list not found");
+                APPL_TRACE_WARNING("HDP supported feature list not found");
                 break;
             }
 #if BTA_HL_DEBUG == TRUE
-            APPL_TRACE_DEBUG3("record=%d ctrl_psm=%0x data_psm=%x",
+            APPL_TRACE_DEBUG("record=%d ctrl_psm=%0x data_psm=%x",
                               rec_cnt+1,
                               p_hdp_rec->ctrl_psm,
                               p_hdp_rec->data_psm );
-            APPL_TRACE_DEBUG1("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
-            APPL_TRACE_DEBUG1("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
+            APPL_TRACE_DEBUG("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
+            APPL_TRACE_DEBUG("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
             for (i=0; i<sup_feature.num_elems; i++)
             {
-                APPL_TRACE_DEBUG5("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
+                APPL_TRACE_DEBUG("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
                                   (i+1),
                                   p_hdp_rec->mdep_cfg[i].mdep_id,
                                   p_hdp_rec->mdep_cfg[i].data_type,
                                   (p_hdp_rec->mdep_cfg[i].mdep_role == BTA_HL_MDEP_ROLE_SOURCE)?"Src":"Snk",
                                   p_hdp_rec->mdep_cfg[i].mdep_role);
             }
-            APPL_TRACE_DEBUG1("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
-            APPL_TRACE_DEBUG1("found MCAP sup procedure=%d",
+            APPL_TRACE_DEBUG("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
+            APPL_TRACE_DEBUG("found MCAP sup procedure=%d",
                               p_cb->sdp.sdp_rec[rec_cnt].mcap_sup_proc );
 #endif
             rec_cnt++;
             if (rec_cnt >= BTA_HL_NUM_SDP_RECS)
             {
-                APPL_TRACE_WARNING1("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
+                APPL_TRACE_WARNING("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
                 break;
             }
 
@@ -1860,7 +1860,7 @@
     }
     else
     {
-        APPL_TRACE_WARNING3("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
+        APPL_TRACE_WARNING("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
                             status, p_cb->sdp.num_recs,sdp_parsing_ok );
     }
 
@@ -2113,7 +2113,7 @@
     memset(p_spd_cb, 0, sizeof(tBTA_HL_SDP_CB));
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
+    APPL_TRACE_DEBUG("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
 #endif
 
 
@@ -2155,13 +2155,13 @@
 
     if (i == BTA_HL_NUM_SDP_CBACKS)
     {
-        APPL_TRACE_WARNING0("No scb is available to allocate")
+        APPL_TRACE_WARNING("No scb is available to allocate")
     }
     else
     {
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_allocate_spd_cback cback_idx=%d ",i );
-    APPL_TRACE_DEBUG4("sdp_oper=%d, app_idx=%d, mcl_idx=%d,  mdl_idx=%d",
+    APPL_TRACE_DEBUG("bta_hl_allocate_spd_cback cback_idx=%d ",i );
+    APPL_TRACE_DEBUG("sdp_oper=%d, app_idx=%d, mcl_idx=%d,  mdl_idx=%d",
                       bta_hl_cb.scb[i].sdp_oper,
                       bta_hl_cb.scb[i].app_idx,
                       bta_hl_cb.scb[i].mcl_idx,
@@ -2191,7 +2191,7 @@
     tBTA_HL_STATUS      status;
     UINT8               sdp_cback_idx;
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG4("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
+    APPL_TRACE_DEBUG("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
                       sdp_oper, app_idx, mcl_idx, mdl_idx);
 #endif
     if ((p_cb->sdp_cback = bta_hl_allocate_spd_cback(sdp_oper, app_idx, mcl_idx, mdl_idx, &sdp_cback_idx)) != NULL)
@@ -2260,7 +2260,7 @@
 {
     tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_cch_init_sdp");
+    APPL_TRACE_DEBUG("bta_hl_cch_init_sdp");
 #endif
     if ( p_cb->sdp_oper == BTA_HL_SDP_OP_NONE)
     {
@@ -2275,7 +2275,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("SDP in use");
+        APPL_TRACE_ERROR("SDP in use");
         bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
     }
 }
@@ -2296,7 +2296,7 @@
     UINT8               sdp_idx;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_cch_mca_open");
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_open");
 #endif
 
     if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->req_ctrl_psm, &sdp_idx))
@@ -2332,7 +2332,7 @@
     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
 #endif
     if (p_mcb->sdp_oper != BTA_HL_SDP_OP_CCH_INIT)
     {
@@ -2346,13 +2346,13 @@
         else
         {
             p_mcb->close_pending = TRUE;
-            APPL_TRACE_DEBUG0("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
+            APPL_TRACE_DEBUG("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
         }
     }
     else
     {
         p_mcb->close_pending = TRUE;
-        APPL_TRACE_DEBUG0("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
+        APPL_TRACE_DEBUG("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
     }
 }
 
@@ -2374,14 +2374,14 @@
     tBTA_HL_EVT         event;
     BOOLEAN             send_evt=TRUE;
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_cch_close_cmpl");
+    APPL_TRACE_DEBUG("bta_hl_cch_close_cmpl");
 #endif
     bta_sys_conn_close(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
 
     if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE && p_mcb->force_close_local_cch_opening)
     {
        p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
-       APPL_TRACE_DEBUG0("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
+       APPL_TRACE_DEBUG("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
     }
 
     switch (p_mcb->cch_oper)
@@ -2435,7 +2435,7 @@
     tBTA_HL_MDL_CB      *p_dcb;
     UINT8              i;
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_cch_mca_disconnect");
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_disconnect");
 #endif
 
     p_mcb->intentional_close = FALSE;
@@ -2476,7 +2476,7 @@
     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hl_cch_mca_disc_open mcl_handle=0x%x close_pending=%d", p_data->mca_evt.mcl_handle, p_mcb->close_pending );
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_disc_open mcl_handle=0x%x close_pending=%d", p_data->mca_evt.mcl_handle, p_mcb->close_pending );
 #endif
 
     p_mcb->close_pending = FALSE;
@@ -2498,7 +2498,7 @@
 
     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_cch_mca_rsp_tout");
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_rsp_tout");
 #endif
 
     p_mcb->rsp_tout = TRUE;
@@ -2524,7 +2524,7 @@
     BOOLEAN             send_event=TRUE;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
+    APPL_TRACE_DEBUG("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
 #endif
 
     p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
@@ -2574,9 +2574,9 @@
 
 #if (BTA_HL_DEBUG == TRUE)
 #if (BT_TRACE_VERBOSE == TRUE)
-    APPL_TRACE_EVENT1("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
+    APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
 #else
-    APPL_TRACE_EVENT1("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
+    APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
 #endif
 #endif
 
diff --git a/bta/hl/bta_hl_api.c b/bta/hl/bta_hl_api.c
index 6f5572b..86cb17f 100644
--- a/bta/hl/bta_hl_api.c
+++ b/bta/hl/bta_hl_api.c
@@ -63,9 +63,7 @@
     tBTA_HL_API_ENABLE *p_buf;
 
     /* register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_register(BTA_ID_HL, &bta_hl_reg);
-    GKI_sched_unlock();
 
     if ((p_buf = (tBTA_HL_API_ENABLE *)GKI_getbuf(sizeof(tBTA_HL_API_ENABLE))) != NULL)
     {
@@ -116,7 +114,7 @@
 {
     tBTA_HL_API_UPDATE *p_buf;
 
-    APPL_TRACE_DEBUG0("BTA_HlUpdate");
+    APPL_TRACE_DEBUG("BTA_HlUpdate");
     if (is_register)
     {
 
diff --git a/bta/hl/bta_hl_ci.c b/bta/hl/bta_hl_ci.c
index bd04b44..e4749d7 100644
--- a/bta/hl/bta_hl_ci.c
+++ b/bta/hl/bta_hl_ci.c
@@ -51,7 +51,7 @@
     tBTA_HL_CI_GET_PUT_DATA  *p_evt;
 
 #if  (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG3("bta_hl_ci_get_tx_data mdl_handle=%d status=%d evt=%d\n",
+    APPL_TRACE_DEBUG("bta_hl_ci_get_tx_data mdl_handle=%d status=%d evt=%d\n",
                       mdl_handle, status, evt);
 #endif
 
@@ -85,7 +85,7 @@
 {
     tBTA_HL_CI_GET_PUT_DATA  *p_evt;
 #if  (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG3("bta_hl_ci_put_rx_data mdl_handle=%d status=%d evt=%d\n",
+    APPL_TRACE_DEBUG("bta_hl_ci_put_rx_data mdl_handle=%d status=%d evt=%d\n",
                       mdl_handle, status, evt);
 #endif
 
@@ -121,7 +121,7 @@
     tBTA_HL_CI_ECHO_DATA  *p_evt;
 
 #if  (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG3("bta_hl_ci_get_echo_data mcl_handle=%d status=%d evt=%d\n",
+    APPL_TRACE_DEBUG("bta_hl_ci_get_echo_data mcl_handle=%d status=%d evt=%d\n",
                       mcl_handle, status, evt);
 #endif
 
@@ -156,7 +156,7 @@
     tBTA_HL_CI_ECHO_DATA  *p_evt;
 
 #if  (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG3("bta_hl_ci_put_echo_data mcl_handle=%d status=%d evt=%d\n",
+    APPL_TRACE_DEBUG("bta_hl_ci_put_echo_data mcl_handle=%d status=%d evt=%d\n",
                       mcl_handle, status, evt);
 #endif
 
diff --git a/bta/hl/bta_hl_main.c b/bta/hl/bta_hl_main.c
index 7b15585..7f08752 100644
--- a/bta/hl/bta_hl_main.c
+++ b/bta/hl/bta_hl_main.c
@@ -426,7 +426,7 @@
 #if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
     tBTA_HL_CCH_STATE in_state = p_cb->cch_state;
     UINT16             cur_evt = event;
-    APPL_TRACE_DEBUG3("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
+    APPL_TRACE_DEBUG("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
                       bta_hl_cch_state_code(in_state),
                       bta_hl_evt_code(cur_evt));
 #endif
@@ -455,7 +455,7 @@
 #if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
     if (in_state != p_cb->cch_state)
     {
-        APPL_TRACE_DEBUG3("HL CCH State Change: [%s] -> [%s] after [%s]",
+        APPL_TRACE_DEBUG("HL CCH State Change: [%s] -> [%s] after [%s]",
                           bta_hl_cch_state_code(in_state),
                           bta_hl_cch_state_code(p_cb->cch_state),
                           bta_hl_evt_code(cur_evt));
@@ -484,7 +484,7 @@
 #if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
     tBTA_HL_DCH_STATE in_state = p_cb->dch_state;
     UINT16             cur_evt = event;
-    APPL_TRACE_DEBUG3("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
+    APPL_TRACE_DEBUG("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
                       bta_hl_dch_state_code(in_state),
                       bta_hl_evt_code(cur_evt));
 #endif
@@ -514,7 +514,7 @@
 #if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
     if (in_state != p_cb->dch_state)
     {
-        APPL_TRACE_DEBUG3("HL DCH State Change: [%s] -> [%s] after [%s]",
+        APPL_TRACE_DEBUG("HL DCH State Change: [%s] -> [%s] after [%s]",
                           bta_hl_dch_state_code(in_state),
                           bta_hl_dch_state_code(p_cb->dch_state),
                           bta_hl_evt_code(cur_evt));
@@ -537,7 +537,7 @@
     /* If already enabled then reject this request */
     if (p_cb->enable)
     {
-        APPL_TRACE_ERROR0("HL is already enabled");
+        APPL_TRACE_ERROR("HL is already enabled");
         evt_data.enable_cfm.status = BTA_HL_STATUS_FAIL;
         if (p_data->api_enable.p_cback)
             p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
@@ -584,7 +584,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_disable status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_disable status =%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -606,14 +606,14 @@
     tBTA_HL_STATUS  status = BTA_HL_STATUS_FAIL;
 
 
-    APPL_TRACE_DEBUG0("bta_hl_api_update");
+    APPL_TRACE_DEBUG("bta_hl_api_update");
     if (p_cb->enable)
     {
 
         status = bta_hl_app_update(p_data->api_update.app_id, p_data->api_update.is_register);
         if (!p_data->api_update.is_register)
         {
-            APPL_TRACE_DEBUG0("Deregister");
+            APPL_TRACE_DEBUG("Deregister");
             memset(&evt_data, 0, sizeof(tBTA_HL));
             evt_data.dereg_cfm.status = status;
             evt_data.dereg_cfm.app_id = p_data->api_update.app_id;
@@ -640,7 +640,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_register status =%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -730,7 +730,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_register status =%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -782,7 +782,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR1("Invalid app_handle=%d", p_data->api_dereg.app_handle);
+        APPL_TRACE_ERROR("Invalid app_handle=%d", p_data->api_dereg.app_handle);
     }
 }
 
@@ -827,7 +827,7 @@
         {
             /* Only one MCL per BD_ADDR */
             status = BTA_HL_STATUS_DUPLICATE_CCH_OPEN;
-            APPL_TRACE_DEBUG1("bta_hl_api_cch_open: CCH already open: status =%d",status)
+            APPL_TRACE_DEBUG("bta_hl_api_cch_open: CCH already open: status =%d",status)
             p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
             p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
             if (p_acb->p_cback)
@@ -841,7 +841,7 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
             }
             return;
         }
@@ -853,7 +853,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_cch_open status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_cch_open status =%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -876,11 +876,11 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
             }
             break;
         default:
-            APPL_TRACE_ERROR1("status code=%d", status);
+            APPL_TRACE_ERROR("status code=%d", status);
             break;
     }
 }
@@ -915,7 +915,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_cch_close status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_cch_close status =%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -936,12 +936,12 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_cch_close Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_cch_close Null Callback");
             }
             break;
 
         default:
-            APPL_TRACE_ERROR1("status code=%d", status);
+            APPL_TRACE_ERROR("status code=%d", status);
             break;
 
     }
@@ -974,7 +974,7 @@
         p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
         p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 
-        APPL_TRACE_DEBUG4("bta_hl_api_dch_open: app_ix=%d, mcl_idx=%d, cch_state=%d, mcl_handle=%d",app_idx,mcl_idx,p_mcb->cch_state,p_data->api_dch_open.mcl_handle);
+        APPL_TRACE_DEBUG("bta_hl_api_dch_open: app_ix=%d, mcl_idx=%d, cch_state=%d, mcl_handle=%d",app_idx,mcl_idx,p_mcb->cch_state,p_data->api_dch_open.mcl_handle);
         if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST)
         {
             if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
@@ -1057,7 +1057,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_dch_open status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_dch_open status =%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -1091,12 +1091,12 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_dch_open Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_dch_open Null Callback");
             }
 
             break;
         default:
-            APPL_TRACE_ERROR1("Status code=%d", status);
+            APPL_TRACE_ERROR("Status code=%d", status);
             break;
 
     }
@@ -1137,7 +1137,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_dch_close status =%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_dch_close status =%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -1161,11 +1161,11 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_dch_close Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_dch_close Null Callback");
             }
             break;
         default:
-            APPL_TRACE_ERROR1("Status code=%d", status);
+            APPL_TRACE_ERROR("Status code=%d", status);
             break;
     }
 }
@@ -1230,12 +1230,12 @@
                             if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK)
                             {
                                 p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
-                                  APPL_TRACE_DEBUG0("peer mdep role = SOURCE ");
+                                  APPL_TRACE_DEBUG("peer mdep role = SOURCE ");
 							}
                             else
                             {
                                 p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
-                                APPL_TRACE_DEBUG0("peer mdep role = SINK ");
+                                APPL_TRACE_DEBUG("peer mdep role = SINK ");
                             }
 
                             bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
@@ -1271,7 +1271,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_dch_reconnect status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_dch_reconnect status=%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -1303,11 +1303,11 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_dch_reconnect Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_dch_reconnect Null Callback");
             }
             break;
         default:
-            APPL_TRACE_ERROR1("Status code=%d", status);
+            APPL_TRACE_ERROR("Status code=%d", status);
             break;
     }
 }
@@ -1404,7 +1404,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_dch_echo_test status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_dch_echo_test status=%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -1434,12 +1434,12 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_dch_echo_test Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_dch_echo_test Null Callback");
             }
             break;
 
         default:
-            APPL_TRACE_ERROR1("Status code=%s", status);
+            APPL_TRACE_ERROR("Status code=%s", status);
             break;
     }
 }
@@ -1472,7 +1472,7 @@
                 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                 p_mcb->in_use = TRUE;
                 bdcpy(p_mcb->bd_addr, p_data->api_sdp_query.bd_addr);
-                APPL_TRACE_DEBUG3("bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
+                APPL_TRACE_DEBUG("bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
                 p_mcb->app_id = p_data->api_sdp_query.app_id;
                 p_mcb->sdp_oper  = BTA_HL_SDP_OP_SDP_QUERY_NEW ;
             }
@@ -1512,7 +1512,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_sdp_query status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_sdp_query status=%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -1533,13 +1533,13 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_sdp_query Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_sdp_query Null Callback");
             }
             break;
         case BTA_HL_STATUS_OK:
             break;
         default:
-            APPL_TRACE_ERROR1("Status code=%d", status);
+            APPL_TRACE_ERROR("Status code=%d", status);
             break;
     }
 }
@@ -1593,11 +1593,11 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_sdp_query_results status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_sdp_query_results status=%s", bta_hl_status_code(status));
     }
 #endif
 
-    APPL_TRACE_DEBUG3("bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
+    APPL_TRACE_DEBUG("bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
     bta_hl_build_sdp_query_cfm(&evt_data,p_mcb->app_id, p_acb->app_handle,
                                p_mcb->bd_addr,p_sdp,status);
     p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT,(tBTA_HL *) &evt_data );
@@ -1685,7 +1685,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -1707,11 +1707,11 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_delete_mdl Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_delete_mdl Null Callback");
             }
             break;
         default:
-            APPL_TRACE_ERROR1("status code =%d", status);
+            APPL_TRACE_ERROR("status code =%d", status);
             break;
     }
 }
@@ -1771,7 +1771,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
     }
 #endif
 
@@ -1790,7 +1790,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_cfm Null Callback");
+            APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_cfm Null Callback");
 
         }
     }
@@ -1836,7 +1836,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!send_ind_evt)
     {
-        APPL_TRACE_DEBUG1("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d", send_ind_evt);
+        APPL_TRACE_DEBUG("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d", send_ind_evt);
     }
 #endif
 
@@ -1852,7 +1852,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_ind Null Callback");
+            APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_ind Null Callback");
         }
     }
 }
@@ -1908,7 +1908,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (status != BTA_HL_STATUS_OK)
     {
-        APPL_TRACE_DEBUG1("bta_hl_api_dch_abort status=%s", bta_hl_status_code(status));
+        APPL_TRACE_DEBUG("bta_hl_api_dch_abort status=%s", bta_hl_status_code(status));
     }
 #endif
     switch (status)
@@ -1935,11 +1935,11 @@
             }
             else
             {
-                APPL_TRACE_ERROR0("bta_hl_api_dch_abort Null Callback");
+                APPL_TRACE_ERROR("bta_hl_api_dch_abort Null Callback");
             }
             break;
         default:
-            APPL_TRACE_ERROR1("Status code=%d", status);
+            APPL_TRACE_ERROR("Status code=%d", status);
             break;
     }
 }
@@ -1959,7 +1959,7 @@
     BOOLEAN success = TRUE;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("BTA HL Event Handler: Event [%s]",
+    APPL_TRACE_DEBUG("BTA HL Event Handler: Event [%s]",
                       bta_hl_evt_code(p_msg->event));
 #endif
 
@@ -2036,10 +2036,10 @@
                 else
                 {
 #if BTA_HL_DEBUG == TRUE
-                    APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%s]",
+                    APPL_TRACE_ERROR("unable to find control block indexes for CCH: [event=%s]",
                                       bta_hl_evt_code(p_msg->event));
 #else
-                    APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%d]", p_msg->event);
+                    APPL_TRACE_ERROR("unable to find control block indexes for CCH: [event=%d]", p_msg->event);
 #endif
                     success = FALSE;
                 }
@@ -2057,10 +2057,10 @@
                 {
 
 #if BTA_HL_DEBUG == TRUE
-                    APPL_TRACE_ERROR1("unable to find control block indexes for DCH : [event=%s]",
+                    APPL_TRACE_ERROR("unable to find control block indexes for DCH : [event=%s]",
                                       bta_hl_evt_code(p_msg->event));
 #else
-                    APPL_TRACE_ERROR1("unable to find control block indexes for DCH: [event=%d]", p_msg->event);
+                    APPL_TRACE_ERROR("unable to find control block indexes for DCH: [event=%d]", p_msg->event);
 #endif
                     success = FALSE;
                 }
diff --git a/bta/hl/bta_hl_sdp.c b/bta/hl/bta_hl_sdp.c
index 43d22d2..14171fa 100644
--- a/bta/hl/bta_hl_sdp.c
+++ b/bta/hl/bta_hl_sdp.c
@@ -286,7 +286,7 @@
                 mdep_id = (UINT8)p_cb->sup_feature.mdep[i].mdep_id;
                 mdep_role = (UINT8)p_cb->sup_feature.mdep[i].mdep_cfg.mdep_role;
 
-                APPL_TRACE_DEBUG1("num_of_mdep_data_types %d ", p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types);
+                APPL_TRACE_DEBUG("num_of_mdep_data_types %d ", p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types);
                 for (j=0; j<p_cb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types; j++)
                 {
                     sup_feature_list.list_elem[cnt].mdep_id = mdep_id;
@@ -338,7 +338,7 @@
         for(i=0; i < num_services; i++)
         {
             bta_sys_add_uuid(svc_class_id_list[i]);
-            APPL_TRACE_DEBUG2("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
+            APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
         }
     }
     else
@@ -351,7 +351,7 @@
         status = BTA_HL_STATUS_SDP_FAIL;
     }
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_sdp_update status=%s", bta_hl_status_code(status));
+    APPL_TRACE_DEBUG("bta_hl_sdp_update status=%s", bta_hl_status_code(status));
 #endif
     return status;
 }
@@ -390,7 +390,7 @@
     tBTA_HL_STATUS                  status = BTA_HL_STATUS_OK;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_sdp_register app_idx=%d",app_idx);
+    APPL_TRACE_DEBUG("bta_hl_sdp_register app_idx=%d",app_idx);
 #endif
 
     if ((p_cb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE) &&
@@ -545,7 +545,7 @@
         for(i=0; i < num_services; i++)
         {
             bta_sys_add_uuid(svc_class_id_list[i]);
-            APPL_TRACE_DEBUG2("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
+            APPL_TRACE_DEBUG("dbg bta_sys_add_uuid i=%d uuid=0x%x", i, svc_class_id_list[i]); //todo
         }
     }
     else
@@ -558,7 +558,7 @@
         status = BTA_HL_STATUS_SDP_FAIL;
     }
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_sdp_register status=%s", bta_hl_status_code(status));
+    APPL_TRACE_DEBUG("bta_hl_sdp_register status=%s", bta_hl_status_code(status));
 #endif
     return status;
 }
@@ -628,7 +628,7 @@
     /* If here, no matching UUID found */
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_find_sink_or_src_srv_class_in_db failed");
+    APPL_TRACE_DEBUG("bta_hl_find_sink_or_src_srv_class_in_db failed");
 #endif
 
     return(NULL);
diff --git a/bta/hl/bta_hl_utils.c b/bta/hl/bta_hl_utils.c
index 6a08b74..3a5df45 100644
--- a/bta/hl/bta_hl_utils.c
+++ b/bta/hl/bta_hl_utils.c
@@ -78,7 +78,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!success)
     {
-        APPL_TRACE_DEBUG4("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
+        APPL_TRACE_DEBUG("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
                           p_mcb->sdp.num_recs, success, update_ctrl_psm, ctrl_psm );
     }
 #endif
@@ -126,7 +126,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
+        APPL_TRACE_DEBUG("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
                           found, *p_sdp_idx, ctrl_psm );
     }
 #endif
@@ -157,7 +157,7 @@
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG3("bta_hl_set_user_rx_pool_id pool_id=%d max_tx_size=%d default_ertm_pool_size=%d",
+    APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d max_tx_size=%d default_ertm_pool_size=%d",
                       pool_id, max_tx_size, GKI_get_pool_bufsize (OBX_FCR_TX_POOL_ID));
 #endif
 
@@ -188,7 +188,7 @@
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG3("bta_hl_set_user_rx_pool_id pool_id=%d mtu=%d default_ertm_pool_size=%d",
+    APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d mtu=%d default_ertm_pool_size=%d",
                       pool_id, mtu, GKI_get_pool_bufsize (OBX_FCR_RX_POOL_ID));
 #endif
 
@@ -222,13 +222,13 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("The MPS is zero");
+            APPL_TRACE_ERROR("The MPS is zero");
             tx_win_size = 10;
         }
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG3("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
+    APPL_TRACE_DEBUG("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
                       tx_win_size, mtu, mps);
 #endif
     return tx_win_size;
@@ -255,7 +255,7 @@
         mps = mtu;
     }
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hl_set_mps mps=%d mtu=%d",
+    APPL_TRACE_DEBUG("bta_hl_set_mps mps=%d mtu=%d",
                       mps, mtu);
 #endif
     return mps;
@@ -275,7 +275,7 @@
 {
     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG3("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
+    APPL_TRACE_DEBUG("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
                       app_idx, mcl_idx, mdl_idx);
 #endif
     utl_freebuf((void **) &p_dcb->p_tx_pkt);
@@ -400,7 +400,7 @@
             break;
     }
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
+    APPL_TRACE_DEBUG("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
 #endif
     return service_uuid;
 }
@@ -436,7 +436,7 @@
         else
         {
             status = FALSE;
-            APPL_TRACE_ERROR0("Inavlid echo cfg value");
+            APPL_TRACE_ERROR("Inavlid echo cfg value");
         }
         return status;
     }
@@ -444,7 +444,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!status)
     {
-        APPL_TRACE_DEBUG4("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
                           app_idx, mcl_idx, mdep_idx, cfg);
     }
 #endif
@@ -472,7 +472,7 @@
     if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
         (cfg != BTA_HL_DCH_CFG_RELIABLE))
     {
-        APPL_TRACE_ERROR0("the first DCH should be a reliable channel");
+        APPL_TRACE_ERROR("the first DCH should be a reliable channel");
         return is_valid;
     }
 
@@ -499,7 +499,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!is_valid)
     {
-        APPL_TRACE_DEBUG2("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
+        APPL_TRACE_DEBUG("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
     }
 #endif
     return is_valid;
@@ -605,7 +605,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG4("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
                           bta_hl_evt_code(p_msg->hdr.event), found, app_idx, mcl_idx);
     }
 #endif
@@ -779,7 +779,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG5("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
                           bta_hl_evt_code(p_msg->hdr.event), found, *p_app_idx, *p_mcl_idx, *p_mdl_idx  );
     }
 #endif
@@ -841,7 +841,7 @@
     }while (TRUE);
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_allocate_mdl OK mdl_id=%d",  mdl_id);
+    APPL_TRACE_DEBUG("bta_hl_allocate_mdl OK mdl_id=%d",  mdl_id);
 #endif
     return mdl_id;
 }
@@ -876,7 +876,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
+        APPL_TRACE_DEBUG("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
                           found, mdl_id, i);
     }
 #endif
@@ -914,7 +914,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (found)
     {
-        APPL_TRACE_DEBUG4("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
                           found, app_idx, mcl_idx, i);
     }
 #endif
@@ -952,7 +952,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (found)
     {
-        APPL_TRACE_DEBUG4("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
                           found, app_idx, mcl_idx, i);
     }
 #endif
@@ -991,7 +991,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
+        APPL_TRACE_DEBUG("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
                           found, app_idx, i);
     }
 #endif
@@ -1029,7 +1029,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
+        APPL_TRACE_DEBUG("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
                           found, i);
     }
 #endif
@@ -1063,7 +1063,7 @@
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG3("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
+    APPL_TRACE_DEBUG("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
                       found, app_id, i);
 #endif
 
@@ -1101,7 +1101,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
+        APPL_TRACE_DEBUG("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
                           found, app_handle , i);
     }
 #endif
@@ -1148,7 +1148,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
                           found, i, j);
     }
 #endif
@@ -1187,7 +1187,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_mcl_idx found=%d idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_mcl_idx found=%d idx=%d",
                           found, i);
     }
 #endif
@@ -1250,7 +1250,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d  ",
+        APPL_TRACE_DEBUG("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d  ",
                           found, mdl_handle);
     }
 #endif
@@ -1283,7 +1283,7 @@
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
+    APPL_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
 #endif
     return is_existed;
 }
@@ -1435,7 +1435,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx  );
+        APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx  );
     }
 #endif
 
@@ -1462,11 +1462,13 @@
     tBTA_HL_MDL_CFG     *p_mdl;
     UINT8 i ;
     BOOLEAN found=FALSE;
+
+    *p_mdl_cfg_idx = 0;
     for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
     {
         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
         if(p_mdl->active)
-            APPL_TRACE_DEBUG2("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
+            APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
                               p_mdl->mdl_id);
         if (p_mdl->active &&
             (!memcmp (p_mcb->bd_addr, p_mdl->peer_bd_addr, BD_ADDR_LEN))&&
@@ -1481,7 +1483,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
+        APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
     }
 #endif
 
@@ -1551,7 +1553,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!result)
     {
-        APPL_TRACE_DEBUG2("bta_hl_get_cur_time result=%s cur_time=%d",
+        APPL_TRACE_DEBUG("bta_hl_get_cur_time result=%s cur_time=%d",
                           (result?"OK":"FAIL"), *p_cur_time);
     }
 #endif
@@ -1621,7 +1623,7 @@
 
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
+    APPL_TRACE_DEBUG("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
 #endif
 
 
@@ -1803,7 +1805,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG3("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
+        APPL_TRACE_DEBUG("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
                           found,i, local_mdep_id );
     }
 #endif
@@ -1852,7 +1854,7 @@
     *p_tx_apu_size = max_tx_apdu_size;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
+    APPL_TRACE_DEBUG("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
                       max_rx_apdu_size, max_tx_apdu_size );
 #endif
 
@@ -1880,7 +1882,7 @@
     BOOLEAN peer_found =FALSE;
     UINT8 i;
 
-    APPL_TRACE_DEBUG2("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
+    APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
 
 
     if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
@@ -1891,8 +1893,8 @@
     p_rec = &p_mcb->sdp.sdp_rec[sdp_idx];
     for (i=0; i< p_rec->num_mdeps; i++)
     {
-        APPL_TRACE_DEBUG2("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
-        APPL_TRACE_DEBUG2("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
+        APPL_TRACE_DEBUG("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
+        APPL_TRACE_DEBUG("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
                           peer_mdep_role)
         if ( (p_rec->mdep_cfg[i].mdep_id == peer_mdep_id) &&
              (p_rec->mdep_cfg[i].mdep_role == peer_mdep_role))
@@ -1906,7 +1908,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!peer_found)
     {
-        APPL_TRACE_DEBUG1("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
+        APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
     }
 #endif
     return peer_found;
@@ -1937,7 +1939,7 @@
          (local_cfg != BTA_HL_DCH_CFG_RELIABLE))
     {
         status =  BTA_HL_STATUS_NO_FIRST_RELIABLE;
-        APPL_TRACE_ERROR0("BTA_HL_STATUS_INVALID_DCH_CFG");
+        APPL_TRACE_ERROR("BTA_HL_STATUS_INVALID_DCH_CFG");
     }
 
     return status;
@@ -1967,7 +1969,7 @@
     UINT8 i, in_use_mdl_idx = 0;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG2("bta_hl_validate_reconnect_params  mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
+    APPL_TRACE_DEBUG("bta_hl_validate_reconnect_params  mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
 #endif
     if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect->mdl_id, &mdl_cfg_idx))
     {
@@ -1977,7 +1979,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!mdl_cfg_found)
     {
-        APPL_TRACE_DEBUG0("mdl_cfg_found not found");
+        APPL_TRACE_DEBUG("mdl_cfg_found not found");
     }
 #endif
 
@@ -2000,7 +2002,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!local_mdep_id_found)
     {
-        APPL_TRACE_DEBUG0("local_mdep_id not found");
+        APPL_TRACE_DEBUG("local_mdep_id not found");
     }
 #endif
 
@@ -2013,14 +2015,14 @@
         }
         else
         {
-            APPL_TRACE_ERROR1("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
+            APPL_TRACE_ERROR("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
         }
     }
 
 #if BTA_HL_DEBUG == TRUE
     if (!status)
     {
-        APPL_TRACE_DEBUG3("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
+        APPL_TRACE_DEBUG("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
                           local_mdep_id_found,  mdl_cfg_found, in_use_mdl_idx);
     }
 #endif
@@ -2053,7 +2055,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_avail_mcl_idx found=%d idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_avail_mcl_idx found=%d idx=%d",
                           found, i);
     }
 #endif
@@ -2093,7 +2095,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_avail_mdl_idx found=%d idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_idx found=%d idx=%d",
                           found, i);
     }
 #endif
@@ -2129,7 +2131,7 @@
     if (is_duplicate)
     {
 
-        APPL_TRACE_DEBUG2("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
+        APPL_TRACE_DEBUG("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
                           app_id, is_duplicate);
     }
 #endif
@@ -2166,7 +2168,7 @@
 #if BTA_HL_DEBUG == TRUE
     if (!found)
     {
-        APPL_TRACE_DEBUG2("bta_hl_find_avail_app_idx found=%d app_idx=%d",
+        APPL_TRACE_DEBUG("bta_hl_find_avail_app_idx found=%d app_idx=%d",
                           found, i);
     }
 #endif
@@ -2192,7 +2194,7 @@
 
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_app_update app_id=%d", app_id);
+    APPL_TRACE_DEBUG("bta_hl_app_update app_id=%d", app_id);
 #endif
 
     if (is_register)
@@ -2221,7 +2223,7 @@
                 /* If no available MDEPs, return error */
                 if (mdep_idx == BTA_HL_NUM_MDEPS)
                 {
-                    APPL_TRACE_ERROR0("bta_hl_app_update: Out of MDEP IDs");
+                    APPL_TRACE_ERROR("bta_hl_app_update: Out of MDEP IDs");
                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
                     break;
                 }
@@ -2235,7 +2237,7 @@
                                                   &p_acb->sup_feature.mdep[mdep_idx].mdep_cfg))
                     {
                         p_acb->sup_feature.mdep[mdep_idx].ori_app_id = app_id;
-                        APPL_TRACE_DEBUG4("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
+                        APPL_TRACE_DEBUG("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
                                p_acb->sup_feature.mdep[mdep_idx].mdep_id,
                                p_acb->sup_feature.mdep[mdep_idx].ori_app_id,
                                p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.num_of_mdep_data_types);
@@ -2251,7 +2253,7 @@
                         }
                         else
                         {
-                            APPL_TRACE_ERROR1("bta_hl_app_registration: Invalid Role %d",
+                            APPL_TRACE_ERROR("bta_hl_app_registration: Invalid Role %d",
                                             p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role);
                             status = BTA_HL_STATUS_MDEP_CO_FAIL;
                             break;
@@ -2259,21 +2261,21 @@
                     }
                     else
                     {
-                        APPL_TRACE_ERROR0("bta_hl_app_registration: Cfg callout failed");
+                        APPL_TRACE_ERROR("bta_hl_app_registration: Cfg callout failed");
                         status = BTA_HL_STATUS_MDEP_CO_FAIL;
                         break;
                     }
                 }
                 else
                 {
-                    APPL_TRACE_ERROR0("bta_hl_app_registration: MCA_CreateDep failed");
+                    APPL_TRACE_ERROR("bta_hl_app_registration: MCA_CreateDep failed");
                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
                     break;
                 }
 
             }
             p_acb->sup_feature.num_of_mdeps += num_of_mdeps;
-            APPL_TRACE_DEBUG1("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
+            APPL_TRACE_DEBUG("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
 
             if ((status == BTA_HL_STATUS_OK) &&
                 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
@@ -2305,13 +2307,13 @@
         {
             if (p_acb->sup_feature.mdep[i].ori_app_id == app_id)
             {
-                APPL_TRACE_DEBUG1("Found index %", i);
+                APPL_TRACE_DEBUG("Found index %", i);
 
 
                 if (MCA_DeleteDep((tMCA_HANDLE)p_acb->app_handle,
                                   (p_acb->sup_feature.mdep[i].mdep_id)) != MCA_SUCCESS)
                 {
-                    APPL_TRACE_ERROR0("Error deregistering");
+                    APPL_TRACE_ERROR("Error deregistering");
                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
                     return status;
                 }
@@ -2353,7 +2355,7 @@
     UINT8           mdep_counter = 0;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("bta_hl_app_registration app_idx=%d", app_idx);
+    APPL_TRACE_DEBUG("bta_hl_app_registration app_idx=%d", app_idx);
 #endif
 
     reg.ctrl_psm = p_acb->ctrl_psm;
@@ -2374,14 +2376,14 @@
             if (p_acb->sup_feature.mdep[0].mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
             {
                 status = BTA_HL_STATUS_MCAP_REG_FAIL;
-                APPL_TRACE_ERROR1("BAD MDEP ID for echo test mdep_id=%d",
+                APPL_TRACE_ERROR("BAD MDEP ID for echo test mdep_id=%d",
                                   p_acb->sup_feature.mdep[0].mdep_id );
             }
         }
         else
         {
             status = BTA_HL_STATUS_MCAP_REG_FAIL;
-            APPL_TRACE_ERROR0("MCA_CreateDep for echo test(mdep_id=0) failed");
+            APPL_TRACE_ERROR("MCA_CreateDep for echo test(mdep_id=0) failed");
         }
 
 
@@ -2418,7 +2420,7 @@
                             break;
                         }
                         p_acb->sup_feature.mdep[i].ori_app_id = p_acb->app_id;
-                        APPL_TRACE_DEBUG2("index %d ori_app_id %d", i,
+                        APPL_TRACE_DEBUG("index %d ori_app_id %d", i,
                                           p_acb->sup_feature.mdep[i].ori_app_id);
                     }
                     else
@@ -2488,7 +2490,7 @@
 {
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_ERROR1("BTA HL Discard event=%s",bta_hl_evt_code(event));
+    APPL_TRACE_ERROR("BTA HL Discard event=%s",bta_hl_evt_code(event));
 
 #endif
 
@@ -2533,7 +2535,7 @@
     {
         if (!bta_hl_find_avail_mdl_cfg_idx(app_idx, mcl_idx, &mdl_cfg_idx))
         {
-            APPL_TRACE_ERROR0("No space to save the MDL config");
+            APPL_TRACE_ERROR("No space to save the MDL config");
             found= FALSE; /*no space available*/
         }
     }
@@ -2566,11 +2568,11 @@
     {
         if (p_dcb->mtu != l2cap_cfg.mtu)
         {
-            APPL_TRACE_WARNING2("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
+            APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
                                 p_dcb->mtu, l2cap_cfg.mtu);
         }
-        APPL_TRACE_DEBUG1("bta_hl_save_mdl_cfg saved=%d", found);
-        APPL_TRACE_DEBUG4("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
+        APPL_TRACE_DEBUG("bta_hl_save_mdl_cfg saved=%d", found);
+        APPL_TRACE_DEBUG("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
                           mdl_cfg.mdl_id, mdl_cfg.mtu, mdl_cfg.fcs,  mdl_cfg.dch_mode);
     }
 #endif
@@ -2611,7 +2613,7 @@
                 l2cap_mode = L2CAP_FCR_STREAM_MODE;
             break;
         default:
-            APPL_TRACE_ERROR1("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
+            APPL_TRACE_ERROR("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
             break;
     }
     p_dcb->chnl_cfg.fcr_opt.mode        = l2cap_mode;
@@ -2643,17 +2645,17 @@
     }
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG1("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
-    APPL_TRACE_DEBUG2("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
+    APPL_TRACE_DEBUG("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
+    APPL_TRACE_DEBUG("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
                       p_dcb->chnl_cfg.data_mtu);
-    APPL_TRACE_DEBUG5("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
+    APPL_TRACE_DEBUG("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
                       p_dcb->chnl_cfg.fcr_opt.tx_win_sz,
                       p_dcb->chnl_cfg.fcr_opt.max_transmit,
                       p_dcb->chnl_cfg.fcr_opt.rtrans_tout,
                       p_dcb->chnl_cfg.fcr_opt.mon_tout,
                       p_dcb->chnl_cfg.fcr_opt.mps);
 
-    APPL_TRACE_DEBUG4("USER rx_pool_id=%d, tx_pool_id=%d, FCR rx_pool_id=%d, tx_pool_id=%d",
+    APPL_TRACE_DEBUG("USER rx_pool_id=%d, tx_pool_id=%d, FCR rx_pool_id=%d, tx_pool_id=%d",
                       p_dcb->chnl_cfg.user_rx_pool_id,
                       p_dcb->chnl_cfg.user_tx_pool_id,
                       p_dcb->chnl_cfg.fcr_rx_pool_id,
@@ -2725,12 +2727,17 @@
         }
         success = TRUE;
     }
+    else
+    {
+      p_cfg->mtu = L2CAP_DEFAULT_MTU;
+      p_cfg->fcs = BTA_HL_L2C_NO_FCS;
+    }
 
 #if BTA_HL_DEBUG == TRUE
     if (!success)
     {
-        APPL_TRACE_DEBUG3("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
-        APPL_TRACE_DEBUG2("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
+        APPL_TRACE_DEBUG("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
+        APPL_TRACE_DEBUG("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
     }
 #endif
 
@@ -2772,15 +2779,15 @@
 
     if (p_dcb->mtu != l2cap_cfg.mtu)
     {
-        APPL_TRACE_WARNING2("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
+        APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
                             p_dcb->mtu, l2cap_cfg.mtu);
     }
 
     if (!success)
     {
-        APPL_TRACE_DEBUG4("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
-        APPL_TRACE_DEBUG3("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
-        APPL_TRACE_DEBUG3("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
+        APPL_TRACE_DEBUG("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
+        APPL_TRACE_DEBUG("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
+        APPL_TRACE_DEBUG("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
                           p_acb->mdl_cfg[mdl_cfg_idx].fcs , p_acb->mdl_cfg[mdl_cfg_idx].dch_mode);
     }
 #endif
@@ -2837,7 +2844,7 @@
     UINT8               mdl_idx;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG1("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
+    APPL_TRACE_DEBUG("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
 #endif
 
     if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE)
@@ -2889,7 +2896,7 @@
     int i, num_act_apps=0;
 
 #if BTA_HL_DEBUG == TRUE
-    APPL_TRACE_DEBUG0("bta_hl_clean_app");
+    APPL_TRACE_DEBUG("bta_hl_clean_app");
 #endif
     MCA_Deregister((tMCA_HANDLE)p_acb->app_handle);
 
@@ -2927,7 +2934,7 @@
     tBTA_HL             evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_check_deregistration");
+    APPL_TRACE_DEBUG("bta_hl_check_deregistration");
 #endif
 
     if (p_acb->deregistering)
@@ -2940,7 +2947,7 @@
                 if (p_mcb->cch_state == BTA_HL_CCH_OPENING_ST)
                     p_mcb->force_close_local_cch_opening = TRUE;
                 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
-                APPL_TRACE_DEBUG1("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening  );
+                APPL_TRACE_DEBUG("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening  );
                 bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
             }
         }
@@ -2976,7 +2983,7 @@
     tBTA_HL_CTRL        evt_data;
 
 #if (BTA_HL_DEBUG == TRUE)
-    APPL_TRACE_DEBUG0("bta_hl_check_disable");
+    APPL_TRACE_DEBUG("bta_hl_check_disable");
 #endif
 
     if (bta_hl_cb.disabling)
@@ -3141,7 +3148,7 @@
     p_evt_data->cch_open_cfm.mcl_handle = mcl_handle;
     bdcpy(p_evt_data->cch_open_cfm.bd_addr, bd_addr);
     p_evt_data->cch_open_cfm.status = status;
-    APPL_TRACE_DEBUG1("bta_hl_build_cch_open_cfm: status=%d",status);
+    APPL_TRACE_DEBUG("bta_hl_build_cch_open_cfm: status=%d",status);
 }
 
 /*******************************************************************************
@@ -3252,7 +3259,7 @@
                                  tBTA_HL_STATUS status)
 
 {
-    APPL_TRACE_DEBUG2("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
+    APPL_TRACE_DEBUG("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
                         app_id,app_handle);
     p_evt_data->sdp_query_cfm.app_id = app_id;
     p_evt_data->sdp_query_cfm.app_handle = app_handle;
diff --git a/bta/include/bta_ag_api.h b/bta/include/bta_ag_api.h
index f16687c..62342cb 100644
--- a/bta/include/bta_ag_api.h
+++ b/bta/include/bta_ag_api.h
@@ -229,7 +229,9 @@
 #define BTA_AG_MIC_EVT          8  /* Microphone volume changed */
 #define BTA_AG_AT_CKPD_EVT      9  /* CKPD from the HS */
 #define BTA_AG_DISABLE_EVT      30 /* AG disabled       */
-
+#if (BTM_WBS_INCLUDED == TRUE )
+#define BTA_AG_WBS_EVT          31 /* SCO codec info */
+#endif
 /* Values below are for HFP only */
 #define BTA_AG_AT_A_EVT         10 /* Answer a call */
 #define BTA_AG_AT_D_EVT         11 /* Place a call using number or memory dial */
@@ -247,7 +249,7 @@
 #define BTA_AG_AT_COPS_EVT      23 /* Query list of current calls */
 #define BTA_AG_AT_UNAT_EVT      24 /* Unknown AT command */
 #define BTA_AG_AT_CBC_EVT       25 /* Battery Level report from HF */
-#define BTA_AG_AT_BAC_EVT       26 /* Codec select */
+#define BTA_AG_AT_BAC_EVT       26 /* avablable codec */
 #define BTA_AG_AT_BCS_EVT       27 /* Codec select */
 
 typedef UINT8 tBTA_AG_EVT;
@@ -257,6 +259,7 @@
 {
     UINT16              handle;
     UINT8               app_id;
+    tBTA_AG_STATUS      status;
 } tBTA_AG_HDR;
 
 /* data associated with BTA_AG_REGISTER_EVT */
@@ -275,11 +278,19 @@
     tBTA_AG_STATUS      status;
 } tBTA_AG_OPEN;
 
+/* data associated with BTA_AG_CLOSE_EVT */
+typedef struct
+{
+    tBTA_AG_HDR         hdr;
+    BD_ADDR             bd_addr;
+} tBTA_AG_CLOSE;
+
 /* data associated with BTA_AG_CONN_EVT */
 typedef struct
 {
     tBTA_AG_HDR         hdr;
     tBTA_AG_PEER_FEAT   peer_feat;
+    BD_ADDR             bd_addr;
     tBTA_AG_PEER_CODEC  peer_codec;
 } tBTA_AG_CONN;
 
@@ -287,6 +298,7 @@
 typedef struct
 {
     tBTA_AG_HDR         hdr;
+    BD_ADDR             bd_addr;
     char                str[BTA_AG_AT_MAX_LEN+1];
     UINT16              num;
     UINT8               idx;    /* call number used by CLCC and CHLD */
@@ -298,6 +310,7 @@
     tBTA_AG_HDR         hdr;
     tBTA_AG_REGISTER    reg;
     tBTA_AG_OPEN        open;
+    tBTA_AG_CLOSE       close;
     tBTA_AG_CONN        conn;
     tBTA_AG_VAL         val;
 } tBTA_AG;
diff --git a/bta/include/bta_ag_co.h b/bta/include/bta_ag_co.h
index c6a3392..4ef3ce7 100644
--- a/bta/include/bta_ag_co.h
+++ b/bta/include/bta_ag_co.h
@@ -60,11 +60,21 @@
 **                      BTA_AG_CO_AUD_STATE_OFF_XFER - Audio is closed pending transfer
 **                      BTA_AG_CO_AUD_STATE_ON       - Audio has been turned on
 **                      BTA_AG_CO_AUD_STATE_SETUP    - Audio is about to be turned on
+**                  codec - if WBS support is compiled in, codec to going to be used is provided
+**                      and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
+**                      the correct platform parameters.
+**                      in the other states codec type should not be ignored
 **
 ** Returns          void
 **
 *******************************************************************************/
+#if (BTM_WBS_INCLUDED == TRUE )
+BTA_API extern void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state,
+                                          tBTA_AG_PEER_CODEC codec);
+
+#else
 BTA_API extern void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state);
+#endif
 
 /*******************************************************************************
 **
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index 4345fbf..b9403e9 100644
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2003-2012 Broadcom Corporation
+ *  Copyright (C) 2003-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -200,7 +200,11 @@
 
 // btla-specific ++
 typedef UINT16 tBTA_DM_CONN;
-// btla-specific --
+
+#define BTA_TRANSPORT_UNKNOWN   0
+#define BTA_TRANSPORT_BR_EDR    BT_TRANSPORT_BR_EDR
+#define BTA_TRANSPORT_LE        BT_TRANSPORT_LE
+typedef tBT_TRANSPORT tBTA_TRANSPORT;
 
 /* Pairable Modes */
 #define BTA_DM_PAIRABLE         1
@@ -311,6 +315,8 @@
 #define BTA_BLE_LIMIT_DISC_FLAG     BTM_BLE_LIMIT_DISC_FLAG
 #define BTA_BLE_GEN_DISC_FLAG       BTM_BLE_GEN_DISC_FLAG
 #define BTA_BLE_BREDR_NOT_SPT       BTM_BLE_BREDR_NOT_SPT
+#define BTA_BLE_DMT_CONTROLLER_SPT  BTM_BLE_DMT_CONTROLLER_SPT
+#define BTA_BLE_DMT_HOST_SPT        BTM_BLE_DMT_HOST_SPT
 #define BTA_BLE_NON_LIMIT_DISC_FLAG BTM_BLE_NON_LIMIT_DISC_FLAG
 #define BTA_BLE_ADV_FLAG_MASK       BTM_BLE_ADV_FLAG_MASK
 #define BTA_BLE_LIMIT_DISC_MASK     BTM_BLE_LIMIT_DISC_MASK
@@ -330,8 +336,9 @@
 #define BTA_DM_BLE_AD_BIT_SERVICE_128SOL  BTM_BLE_AD_BIT_SERVICE_128SOL
 #define BTA_DM_BLE_AD_BIT_PUBLIC_ADDR     BTM_BLE_AD_BIT_PUBLIC_ADDR
 #define BTA_DM_BLE_AD_BIT_RANDOM_ADDR     BTM_BLE_AD_BIT_RANDOM_ADDR
+#define BTA_DM_BLE_AD_BIT_SERVICE_128     BTM_BLE_AD_BIT_SERVICE_128      /*128-bit Service UUIDs*/
 
-typedef  UINT16  tBTA_BLE_AD_MASK;
+typedef  tBTM_BLE_AD_MASK  tBTA_BLE_AD_MASK;
 
 /* slave preferred connection interval range */
 typedef struct
@@ -372,15 +379,68 @@
 
 typedef struct
 {
-    tBTA_BLE_MANU			manu;			/* manufactuer data */
-    tBTA_BLE_INT_RANGE		int_range;      /* slave prefered conn interval range */
-    tBTA_BLE_SERVICE		services;       /* services */
-	UINT16					appearance;		/* appearance data */
-    UINT8					flag;
-    tBTA_BLE_PROPRIETARY    *p_proprietary;
+    tBT_UUID    service_uuid;
+    UINT8       len;
+    UINT8      *p_val;
+}tBTA_BLE_SERVICE_DATA;
 
+typedef tBTM_BLE_128SERVICE tBTA_BLE_128SERVICE;
+typedef tBTM_BLE_32SERVICE  tBTA_BLE_32SERVICE;
+
+typedef struct
+{
+    tBTA_BLE_INT_RANGE      int_range;          /* slave prefered conn interval range */
+    tBTA_BLE_MANU           *p_manu;            /* manufacturer data */
+    tBTA_BLE_SERVICE        *p_services;        /* 16 bits services */
+    tBTA_BLE_128SERVICE     *p_services_128b;   /* 128 bits service */
+    tBTA_BLE_32SERVICE      *p_service_32b;     /* 32 bits Service UUID */
+    tBTA_BLE_SERVICE        *p_sol_services;    /* 16 bits services Solicitation UUIDs */
+    tBTA_BLE_32SERVICE      *p_sol_service_32b; /* List of 32 bit Service Solicitation UUIDs */
+    tBTA_BLE_128SERVICE     *p_sol_service_128b;/* List of 128 bit Service Solicitation UUIDs */
+    tBTA_BLE_PROPRIETARY    *p_proprietary;     /* proprietary data */
+    tBTA_BLE_SERVICE_DATA   *p_service_data;    /* service data */
+    UINT16                  appearance;         /* appearance data */
+    UINT8                   flag;
+    UINT8                   tx_power;
 }tBTA_BLE_ADV_DATA;
 
+typedef void (tBTA_SET_ADV_DATA_CMPL_CBACK) (tBTA_STATUS status);
+
+/* advertising channel map */
+#define BTA_BLE_ADV_CHNL_37 BTM_BLE_ADV_CHNL_37
+#define BTA_BLE_ADV_CHNL_38 BTM_BLE_ADV_CHNL_38
+#define BTA_BLE_ADV_CHNL_39 BTM_BLE_ADV_CHNL_39
+typedef tBTM_BLE_ADV_CHNL_MAP tBTA_BLE_ADV_CHNL_MAP; /* use as a bit mask */
+
+/* advertising filter policy */
+typedef tBTM_BLE_AFP   tBTA_BLE_AFP;
+
+/* adv event type */
+#define BTA_BLE_CONNECT_EVT         BTM_BLE_CONNECT_EVT     /* Connectable undirected advertising */
+#define BTA_BLE_CONNECT_DIR_EVT     BTM_BLE_CONNECT_DIR_EVT /* Connectable directed advertising */
+#define BTA_BLE_DISCOVER_EVT        BTM_BLE_DISCOVER_EVT    /* Scannable undirected advertising */
+#define BTA_BLE_NON_CONNECT_EVT     BTM_BLE_NON_CONNECT_EVT /* Non connectable undirected advertising */
+typedef UINT8 tBTA_BLE_ADV_EVT;
+
+/* adv tx power level */
+#define BTA_BLE_ADV_TX_POWER_MIN        0           /* minimum tx power */
+#define BTA_BLE_ADV_TX_POWER_LOW        1           /* low tx power     */
+#define BTA_BLE_ADV_TX_POWER_MID        2           /* middle tx power  */
+#define BTA_BLE_ADV_TX_POWER_UPPER      3           /* upper tx power   */
+#define BTA_BLE_ADV_TX_POWER_MAX        4           /* maximum tx power */
+typedef UINT8 tBTA_BLE_ADV_TX_POWER;
+
+/* advertising instance parameters */
+typedef struct
+{
+    UINT16                  adv_int_min;            /* minimum adv interval */
+    UINT16                  adv_int_max;            /* maximum adv interval */
+    tBTA_BLE_ADV_EVT        adv_type;               /* adv event type */
+    tBTA_BLE_ADV_CHNL_MAP   channel_map;            /* adv channel map */
+    tBTA_BLE_AFP            adv_filter_policy;      /* advertising filter policy */
+    tBTA_BLE_ADV_TX_POWER   tx_power;               /* adv tx power */
+}tBTA_BLE_ADV_PARAMS;
+
 /* These are the fields returned in each device adv packet.  It
 ** is returned in the results callback if registered.
 */
@@ -394,6 +454,41 @@
     UINT8               *p_remote_name;
     tBTA_BLE_SERVICE    service;
 } tBTA_BLE_INQ_DATA;
+
+enum
+{
+    BTA_BLE_SCAN_MODE_PASS=1,
+    BTA_BLE_SCAN_MODE_ACTI=2,
+    BTA_BLE_SCAN_MODE_PASS_ACTI=3
+};
+typedef UINT8 tBTA_BLE_SCAN_MODE;
+
+enum
+{
+    BTA_BLE_DISCARD_OLD_ITEMS=0,
+    BTA_BLE_DISCARD_LOWER_RSSI_ITEMS=1
+};
+typedef UINT8 tBTA_BLE_DISCARD_RULE;
+
+enum
+{
+    BTA_BLE_ADV_SEEN_FIRST_TIME=0,
+    BTA_BLE_ADV_TRACKING_TIMEOUT=1
+};
+typedef UINT8 tBTA_BLE_ADV_CHANGE_REASON;
+
+enum
+{
+    BTA_BLE_BATCH_SCAN_ENB_EVT      = 1,
+    BTA_BLE_BATCH_SCAN_CFG_STRG_EVT = 2,
+    BTA_BLE_BATCH_SCAN_DATA_EVT     = 3,
+    BTA_BLE_BATCH_SCAN_THRES_EVT    = 4,
+    BTA_BLE_BATCH_SCAN_PARAM_EVT    = 5,
+    BTA_BLE_BATCH_SCAN_DIS_EVT      = 6
+};
+typedef tBTM_BLE_BATCH_SCAN_EVT tBTA_BLE_BATCH_SCAN_EVT;
+
+typedef tBTM_BLE_TRACK_ADV_ACTION tBTA_BLE_TRACK_ADV_ACTION;
 #endif
 
 /* BLE customer specific feature function type definitions */
@@ -430,22 +525,38 @@
 };
 typedef UINT8 tBTA_DM_BLE_SCAN_COND_OP;
 
+/* ADV payload filtering vendor specific call event */
+enum
+{
+    BTA_BLE_SCAN_PF_ENABLE_EVT = 7,
+    BTA_BLE_SCAN_PF_COND_EVT
+};
+
 /* filter selection bit index  */
 #define BTA_DM_BLE_PF_ADDR_FILTER          BTM_BLE_PF_ADDR_FILTER
+#define BTA_DM_BLE_PF_SRVC_DATA            BTM_BLE_PF_SRVC_DATA
 #define BTA_DM_BLE_PF_SRVC_UUID            BTM_BLE_PF_SRVC_UUID
 #define BTA_DM_BLE_PF_SRVC_SOL_UUID        BTM_BLE_PF_SRVC_SOL_UUID
 #define BTA_DM_BLE_PF_LOCAL_NAME           BTM_BLE_PF_LOCAL_NAME
 #define BTA_DM_BLE_PF_MANU_DATA            BTM_BLE_PF_MANU_DATA
-#define BTA_DM_BLE_PF_SRVC_DATA            BTM_BLE_PF_SRVC_DATA
-#define BTA_DM_BLE_PF_TYPE_MAX             BTM_BLE_PF_TYPE_MAX
+#define BTA_DM_BLE_PF_SRVC_DATA_PATTERN    BTM_BLE_PF_SRVC_DATA_PATTERN
 #define BTA_DM_BLE_PF_TYPE_ALL             BTM_BLE_PF_TYPE_ALL
+#define BTA_DM_BLE_PF_TYPE_MAX             BTM_BLE_PF_TYPE_MAX
 typedef UINT8   tBTA_DM_BLE_PF_COND_TYPE;
 
+typedef union
+{
+      UINT16              uuid16_mask;
+      UINT32              uuid32_mask;
+      UINT8               uuid128_mask[LEN_UUID_128];
+}tBTA_DM_BLE_PF_COND_MASK;
+
 typedef struct
 {
     tBLE_BD_ADDR                *p_target_addr;     /* target address, if NULL, generic UUID filter */
     tBT_UUID                    uuid;           /* UUID condition */
     tBTA_DM_BLE_PF_LOGIC_TYPE   cond_logic;    /* AND/OR */
+    tBTA_DM_BLE_PF_COND_MASK    *p_uuid_mask;           /* UUID condition mask, if NULL, match exact as UUID condition */
 }tBTA_DM_BLE_PF_UUID_COND;
 
 typedef struct
@@ -459,8 +570,20 @@
     UINT16                  company_id;     /* company ID */
     UINT8                   data_len;       /* <= 20 bytes */
     UINT8                   *p_pattern;
+    UINT16                  company_id_mask; /* UUID value mask */
+    UINT8                   *p_pattern_mask; /* Manufacturer data matching mask, same length
+                                                as data pattern, set to all 0xff, match exact data */
 }tBTA_DM_BLE_PF_MANU_COND;
 
+typedef struct
+{
+    UINT16                  uuid;     /* service ID */
+    UINT8                   data_len;       /* <= 20 bytes */
+    UINT8                   *p_pattern;
+    UINT8                   *p_pattern_mask; /* Service data matching mask, same length
+                                                as data pattern, set to all 0xff, match exact data */
+}tBTA_DM_BLE_PF_SRVC_PATTERN_COND;
+
 typedef union
 {
     tBLE_BD_ADDR                            target_addr;
@@ -468,8 +591,11 @@
     tBTA_DM_BLE_PF_MANU_COND                   manu_data;  /* manufactuer data filtering */
     tBTA_DM_BLE_PF_UUID_COND                   srvc_uuid;  /* service UUID filtering */
     tBTA_DM_BLE_PF_UUID_COND                   solicitate_uuid;   /* solicitated service UUID filtering */
+    tBTA_DM_BLE_PF_SRVC_PATTERN_COND           srvc_data;      /* service data pattern */
 }tBTA_DM_BLE_PF_COND_PARAM;
 
+typedef UINT8 tBTA_DM_BLE_PF_FILT_INDEX;
+typedef UINT8 tBTA_DM_BLE_PF_AVBL_SPACE;
 
 typedef INT8 tBTA_DM_RSSI_VALUE;
 typedef UINT8 tBTA_DM_LINK_QUALITY_VALUE;
@@ -510,6 +636,8 @@
 // btla-specific --
 #define BTA_DM_DEV_UNPAIRED_EVT         23
 #define BTA_DM_HW_ERROR_EVT             24      /* BT Chip H/W error */
+#define BTA_DM_LE_FEATURES_READ         25      /* Cotroller specific LE features are read */
+#define BTA_DM_ENER_INFO_READ           26      /* Energy info read */
 typedef UINT8 tBTA_DM_SEC_EVT;
 
 /* Structure associated with BTA_DM_ENABLE_EVT */
@@ -522,6 +650,7 @@
 /* Structure associated with BTA_DM_PIN_REQ_EVT */
 typedef struct
 {
+    /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in order */
     BD_ADDR         bd_addr;            /* BD address peer device. */
     DEV_CLASS       dev_class;          /* Class of Device */
     BD_NAME         bd_name;            /* Name of peer device. */
@@ -655,6 +784,9 @@
 typedef struct
 {
     BD_ADDR         bd_addr;            /* BD address peer device. */
+#if BLE_INCLUDED == TRUE
+    tBTA_TRANSPORT  link_type;
+#endif
 } tBTA_DM_LINK_UP;
 
 /* Structure associated with BTA_DM_LINK_DOWN_EVT */
@@ -663,6 +795,9 @@
     BD_ADDR         bd_addr;            /* BD address peer device. */
     UINT8           status;             /* connection open/closed */
     BOOLEAN         is_removed;         /* TRUE if device is removed when link is down */
+#if BLE_INCLUDED == TRUE
+    tBTA_TRANSPORT  link_type;
+#endif
 } tBTA_DM_LINK_DOWN;
 
 /* Structure associated with BTA_DM_ROLE_CHG_EVT */
@@ -809,6 +944,88 @@
 /* Security callback */
 typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
 
+#define BTA_BLE_MULTI_ADV_ILLEGAL 0
+
+/* multi adv callback event */
+#define BTA_BLE_MULTI_ADV_ENB_EVT           1
+#define BTA_BLE_MULTI_ADV_DISABLE_EVT       2
+#define BTA_BLE_MULTI_ADV_PARAM_EVT         3
+#define BTA_BLE_MULTI_ADV_DATA_EVT          4
+
+typedef UINT8 tBTA_BLE_MULTI_ADV_EVT;
+
+/* multi adv callback */
+typedef void (tBTA_BLE_MULTI_ADV_CBACK)(tBTA_BLE_MULTI_ADV_EVT event,
+                                        UINT8 inst_id, void *p_ref, tBTA_STATUS status);
+typedef UINT32 tBTA_DM_BLE_REF_VALUE;
+
+#define BTA_DM_BLE_PF_ENABLE_EVT       BTM_BLE_PF_ENABLE
+#define BTA_DM_BLE_PF_CONFIG_EVT       BTM_BLE_PF_CONFIG
+typedef UINT8 tBTA_DM_BLE_PF_EVT;
+
+typedef UINT8   tBTA_DM_BLE_PF_COND_TYPE;
+
+#define BTA_DM_BLE_PF_LOGIC_OR              0
+#define BTA_DM_BLE_PF_LOGIC_AND             1
+typedef UINT8 tBTA_DM_BLE_PF_LOGIC_TYPE;
+
+#define BTA_DM_BLE_PF_ENABLE       1
+#define BTA_DM_BLE_PF_CONFIG       2
+typedef UINT8 tBTA_DM_BLE_PF_ACTION;
+
+typedef UINT8 tBTA_DM_BLE_PF_FILT_INDEX;
+
+typedef UINT8 tBTA_DM_BLE_PF_AVBL_SPACE;
+
+/* Config callback */
+typedef void (tBTA_DM_BLE_PF_CFG_CBACK) (tBTA_DM_BLE_PF_ACTION action,
+                                         tBTA_DM_BLE_PF_COND_TYPE cfg_cond,
+                                         tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
+                                         tBTA_DM_BLE_REF_VALUE ref_value);
+/* Param callback */
+typedef void (tBTA_DM_BLE_PF_PARAM_CBACK) (UINT8 action_type, tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+                                           tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status);
+
+/* Status callback */
+typedef void (tBTA_DM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTA_STATUS status,
+                                            tBTA_DM_BLE_REF_VALUE ref_value);
+
+
+#define BTA_DM_BLE_PF_BRDCAST_ADDR_FILT  1
+#define BTA_DM_BLE_PF_SERV_DATA_CHG_FILT 2
+#define BTA_DM_BLE_PF_SERV_UUID          4
+#define BTA_DM_BLE_PF_SERV_SOLC_UUID     8
+#define BTA_DM_BLE_PF_LOC_NAME_CHECK    16
+#define BTA_DM_BLE_PF_MANUF_NAME_CHECK  32
+#define BTA_DM_BLE_PF_SERV_DATA_CHECK   64
+typedef UINT16 tBTA_DM_BLE_PF_FEAT_SEL;
+
+#define BTA_DM_BLE_PF_LIST_LOGIC_OR   1
+#define BTA_DM_BLE_PF_LIST_LOGIC_AND  2
+typedef UINT16 tBTA_DM_BLE_PF_LIST_LOGIC_TYPE;
+
+#define BTA_DM_BLE_PF_FILT_LOGIC_OR   0
+#define BTA_DM_BLE_PF_FILT_LOGIC_AND  1
+typedef UINT16 tBTA_DM_BLE_PF_FILT_LOGIC_TYPE;
+
+typedef UINT8  tBTA_DM_BLE_PF_RSSI_THRESHOLD;
+typedef UINT8  tBTA_DM_BLE_PF_DELIVERY_MODE;
+typedef UINT16 tBTA_DM_BLE_PF_TIMEOUT;
+typedef UINT8  tBTA_DM_BLE_PF_TIMEOUT_CNT;
+
+typedef struct
+{
+    tBTA_DM_BLE_PF_FEAT_SEL feat_seln;
+    tBTA_DM_BLE_PF_LIST_LOGIC_TYPE list_logic_type;
+    tBTA_DM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type;
+    tBTA_DM_BLE_PF_RSSI_THRESHOLD  rssi_high_thres;
+    tBTA_DM_BLE_PF_RSSI_THRESHOLD  rssi_low_thres;
+    tBTA_DM_BLE_PF_DELIVERY_MODE dely_mode;
+    tBTA_DM_BLE_PF_TIMEOUT found_timeout;
+    tBTA_DM_BLE_PF_TIMEOUT lost_timeout;
+    tBTA_DM_BLE_PF_TIMEOUT_CNT found_timeout_cnt;
+} tBTA_DM_BLE_PF_FILT_PARAMS;
+
 /* Vendor Specific Command Callback */
 typedef tBTM_VSC_CMPL_CB        tBTA_VENDOR_CMPL_CBACK;
 
@@ -840,6 +1057,7 @@
     UINT8               ble_addr_type;
     tBTM_BLE_EVT_TYPE   ble_evt_type;
     tBT_DEVICE_TYPE     device_type;
+    UINT8               flag;
 #endif
 
 } tBTA_DM_INQ_RES;
@@ -901,7 +1119,7 @@
 typedef void (tBTA_DM_EXEC_CBACK) (void * p_param);
 
 /* Encryption callback*/
-typedef void (tBTA_DM_ENCRYPT_CBACK) (BD_ADDR bd_addr, tBTA_STATUS result);
+typedef void (tBTA_DM_ENCRYPT_CBACK) (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result);
 
 #if BLE_INCLUDED == TRUE
 #define BTA_DM_BLE_SEC_NONE         BTM_BLE_SEC_NONE
@@ -909,6 +1127,44 @@
 #define BTA_DM_BLE_SEC_NO_MITM      BTM_BLE_SEC_ENCRYPT_NO_MITM
 #define BTA_DM_BLE_SEC_MITM         BTM_BLE_SEC_ENCRYPT_MITM
 typedef tBTM_BLE_SEC_ACT            tBTA_DM_BLE_SEC_ACT;
+
+typedef tBTM_BLE_TX_TIME_MS         tBTA_DM_BLE_TX_TIME_MS;
+typedef tBTM_BLE_RX_TIME_MS         tBTA_DM_BLE_RX_TIME_MS;
+typedef tBTM_BLE_IDLE_TIME_MS       tBTA_DM_BLE_IDLE_TIME_MS;
+typedef tBTM_BLE_ENERGY_USED        tBTA_DM_BLE_ENERGY_USED;
+
+#define BTA_DM_CONTRL_UNKNOWN 0       /* Unknown state */
+#define BTA_DM_CONTRL_ACTIVE  1       /* ACL link on, SCO link ongoing, sniff mode */
+#define BTA_DM_CONTRL_SCAN    2       /* Scan state - paging/inquiry/trying to connect*/
+#define BTA_DM_CONTRL_IDLE    3       /* Idle state - page scan, LE advt, inquiry scan */
+
+typedef UINT8 tBTA_DM_CONTRL_STATE;
+
+
+typedef void (tBTA_BLE_SCAN_THRESHOLD_CBACK)(tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_SCAN_REP_CBACK) (tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
+                                        UINT8 num_records, UINT16 data_len,
+                                        UINT8* p_rep_data, tBTA_STATUS status);
+
+typedef void (tBTA_BLE_SCAN_SETUP_CBACK) (tBTA_BLE_BATCH_SCAN_EVT evt,
+                                          tBTA_DM_BLE_REF_VALUE ref_value,
+                                          tBTA_STATUS status);
+
+typedef void (tBTA_BLE_TRACK_ADV_CMPL_CBACK)(int action, tBTA_STATUS status,
+                                             tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+                                             tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+                                        int adv_state, tBTA_DM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTA_BLE_ENERGY_INFO_CBACK)(tBTA_DM_BLE_TX_TIME_MS tx_time,
+                                          tBTA_DM_BLE_RX_TIME_MS rx_time,
+                                          tBTA_DM_BLE_IDLE_TIME_MS idle_time,
+                                          tBTA_DM_BLE_ENERGY_USED  energy_used,
+                                          tBTA_DM_CONTRL_STATE ctrl_state,
+                                          tBTA_STATUS status);
+
 #else
 typedef UINT8                       tBTA_DM_BLE_SEC_ACT;
 #endif
@@ -961,12 +1217,95 @@
 #define BTA_DM_PM_PARK_IDX      5 /* the actual index to bta_dm_pm_md[] for PARK mode */
 #endif
 
-#define BTA_DM_SW_BB_TO_MM      BTM_SW_BB_TO_MM
-#define BTA_DM_SW_MM_TO_BB      BTM_SW_MM_TO_BB
-#define BTA_DM_SW_BB_TO_BTC     BTM_SW_BB_TO_BTC
-#define BTA_DM_SW_BTC_TO_BB     BTM_SW_BTC_TO_BB
+#ifndef BTA_DM_PM_SNIFF_A2DP_IDX
+#define BTA_DM_PM_SNIFF_A2DP_IDX      BTA_DM_PM_SNIFF
+#endif
 
-typedef tBTM_SW_DIR tBTA_DM_SW_DIR;
+#ifndef BTA_DM_PM_SNIFF_HD_IDLE_IDX
+#define BTA_DM_PM_SNIFF_HD_IDLE_IDX   BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_SCO_OPEN_IDX
+#define BTA_DM_PM_SNIFF_SCO_OPEN_IDX  BTA_DM_PM_SNIFF3
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HD_ACTIVE_IDX
+#define BTA_DM_PM_SNIFF_HD_ACTIVE_IDX BTA_DM_PM_SNIFF4
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_OPEN_IDX
+#define BTA_DM_PM_SNIFF_HH_OPEN_IDX BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_ACTIVE_IDX
+#define BTA_DM_PM_SNIFF_HH_ACTIVE_IDX BTA_DM_PM_SNIFF2
+#endif
+
+#ifndef BTA_DM_PM_SNIFF_HH_IDLE_IDX
+#define BTA_DM_PM_SNIFF_HH_IDLE_IDX BTA_DM_PM_SNIFF2
+#endif
+
+
+#ifndef BTA_DM_PM_HH_OPEN_DELAY
+#define BTA_DM_PM_HH_OPEN_DELAY 30000
+#endif
+
+#ifndef BTA_DM_PM_HH_ACTIVE_DELAY
+#define BTA_DM_PM_HH_ACTIVE_DELAY 30000
+#endif
+
+#ifndef BTA_DM_PM_HH_IDLE_DELAY
+#define BTA_DM_PM_HH_IDLE_DELAY 30000
+#endif
+
+/* The Sniff Parameters defined below must be ordered from highest
+ * latency (biggest interval) to lowest latency.  If there is a conflict
+ * among the connected services the setting with the lowest latency will
+ * be selected.  If a device should override a sniff parameter then it
+ * must insure that order is maintained.
+ */
+#ifndef BTA_DM_PM_SNIFF_MAX
+#define BTA_DM_PM_SNIFF_MAX      800
+#define BTA_DM_PM_SNIFF_MIN      400
+#define BTA_DM_PM_SNIFF_ATTEMPT  4
+#define BTA_DM_PM_SNIFF_TIMEOUT  1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF1_MAX
+#define BTA_DM_PM_SNIFF1_MAX     400
+#define BTA_DM_PM_SNIFF1_MIN     200
+#define BTA_DM_PM_SNIFF1_ATTEMPT 4
+#define BTA_DM_PM_SNIFF1_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF2_MAX
+#define BTA_DM_PM_SNIFF2_MAX     180
+#define BTA_DM_PM_SNIFF2_MIN     150
+#define BTA_DM_PM_SNIFF2_ATTEMPT 4
+#define BTA_DM_PM_SNIFF2_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF3_MAX
+#define BTA_DM_PM_SNIFF3_MAX     150
+#define BTA_DM_PM_SNIFF3_MIN     50
+#define BTA_DM_PM_SNIFF3_ATTEMPT 4
+#define BTA_DM_PM_SNIFF3_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_SNIFF4_MAX
+#define BTA_DM_PM_SNIFF4_MAX     54
+#define BTA_DM_PM_SNIFF4_MIN     30
+#define BTA_DM_PM_SNIFF4_ATTEMPT 4
+#define BTA_DM_PM_SNIFF4_TIMEOUT 1
+#endif
+
+#ifndef BTA_DM_PM_PARK_MAX
+#define BTA_DM_PM_PARK_MAX       800
+#define BTA_DM_PM_PARK_MIN       400
+#define BTA_DM_PM_PARK_ATTEMPT   0
+#define BTA_DM_PM_PARK_TIMEOUT   0
+#endif
+
 
 /* Switch callback events */
 #define BTA_DM_SWITCH_CMPL_EVT      0       /* Completion of the Switch API */
@@ -1004,6 +1343,18 @@
 /* Device features mask definitions */
 #define BTA_FEATURE_BYTES_PER_PAGE  BTM_FEATURE_BYTES_PER_PAGE
 #define BTA_EXT_FEATURES_PAGE_MAX   BTM_EXT_FEATURES_PAGE_MAX
+/* ACL type
+*/
+#define BTA_DM_LINK_TYPE_BR_EDR    0x01
+#define BTA_DM_LINK_TYPE_LE        0x02
+#define BTA_DM_LINK_TYPE_ALL       0xFF
+typedef UINT8 tBTA_DM_LINK_TYPE;
+
+#define IMMEDIATE_DELY_MODE  0x00
+#define ONFOUND_DELY_MODE    0x01
+#define BATCH_DELY_MODE      0x02
+#define ALLOW_ALL_FILTER     0x00
+#define LOWEST_RSSI_VALUE     129
 
 /*****************************************************************************
 **  External Function Declarations
@@ -1255,6 +1606,21 @@
 
 /*******************************************************************************
 **
+** Function         BTA_DmBondByTransport
+**
+** Description      This function initiates a bonding procedure with a peer
+**                  device by designated transport.  The bonding procedure enables
+**                  authentication and optionally encryption on the Bluetooth link.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport);
+
+
+/*******************************************************************************
+**
 ** Function         BTA_DmBondCancel
 **
 ** Description      This function cancels a bonding procedure with a peer
@@ -1515,6 +1881,17 @@
 *******************************************************************************/
 BTA_API extern BOOLEAN BTA_DmUseSsr( BD_ADDR bd_addr );
 
+/*******************************************************************************
+**
+** Function         BTA_DmGetConnectionState
+**
+** Description      Returns whether the remote device is currently connected.
+**
+** Returns          0 if the device is NOT connected.
+**
+*******************************************************************************/
+BTA_API extern UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr );
+
 
 /*******************************************************************************
 **
@@ -1577,11 +1954,13 @@
 **
 ** Parameters:      bd_addr       - Address of the peer device
 **                  remove_dev    - remove device or not after link down
+**                  transport     - which transport to close
+
 **
 ** Returns          void.
 **
 *******************************************************************************/
-BTA_API extern void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev);
+BTA_API extern void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport);
 
 /*******************************************************************************
 **
@@ -1727,7 +2106,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-BTA_API extern void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key,
+BTA_API extern void BTA_DmAddBleKey (BD_ADDR bd_addr,
+                                     tBTA_LE_KEY_VALUE *p_le_key,
                                      tBTA_LE_KEY_TYPE key_type);
 
 /*******************************************************************************
@@ -1825,6 +2205,25 @@
 BTA_API extern void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
                                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search);
 
+/*******************************************************************************
+**
+** Function         BTA_DmDiscoverByTransport
+**
+** Description      This function does service discovery on particular transport
+**                  for services of a
+**                  peer device. When services.num_uuid is 0, it indicates all
+**                  GATT based services are to be searched; other wise a list of
+**                  UUID of interested services should be provided through
+**                  p_services->p_uuid.
+**
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
+                                              tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
+                                              tBTA_TRANSPORT transport);
 
 /*******************************************************************************
 **
@@ -1836,6 +2235,7 @@
 **                  bring up unencrypted links, then later encrypt them.
 **
 ** Parameters:      bd_addr       - Address of the peer device
+**                  transport     - transport of the link to be encruypted
 **                  p_callback    - Pointer to callback function to indicat the
 **                                  link encryption status
 **                  sec_act       - This is the security action to indicate
@@ -1848,8 +2248,9 @@
 **
 **
 *******************************************************************************/
-BTA_API extern void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_DM_ENCRYPT_CBACK *p_callback,
-                            tBTA_DM_BLE_SEC_ACT sec_act);
+BTA_API extern void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport,
+                                        tBTA_DM_ENCRYPT_CBACK *p_callback,
+                                         tBTA_DM_BLE_SEC_ACT sec_act);
 
 
 /*******************************************************************************
@@ -1926,7 +2327,8 @@
 **
 *******************************************************************************/
 BTA_API extern void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask,
-                                           tBTA_BLE_ADV_DATA *p_adv_cfg);
+                                           tBTA_BLE_ADV_DATA *p_adv_cfg,
+                                           tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback);
 
 /*******************************************************************************
 **
@@ -1940,7 +2342,8 @@
 **
 *******************************************************************************/
 BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask,
-                                         tBTA_BLE_ADV_DATA *p_adv_cfg);
+                                         tBTA_BLE_ADV_DATA *p_adv_cfg,
+                                         tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback);
 
 /*******************************************************************************
 **
@@ -1955,6 +2358,275 @@
 *******************************************************************************/
 BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start);
 
+
+/*******************************************************************************
+**
+** Function         BTA_BleEnableAdvInstance
+**
+** Description      This function enables the Multi ADV instance feature
+**
+** Parameters       p_params Pointer to ADV param user defined structure
+**                  p_cback  Pointer to Multi ADV callback structure
+**                  p_ref - Reference pointer
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+                                tBTA_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref);
+
+/*******************************************************************************
+**
+** Function         BTA_BleUpdateAdvInstParam
+**
+** Description      This function updates the Multi ADV instance params
+**
+** Parameters       inst_id Instance ID
+**                  p_params Pointer to ADV param user defined structure
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id,
+                                tBTA_BLE_ADV_PARAMS *p_params);
+
+/*******************************************************************************
+**
+** Function         BTA_BleCfgAdvInstData
+**
+** Description      This function is called to configure the ADV instance data
+**
+** Parameters       inst_id - Instance ID
+**                  is_scan_rsp - Boolean value Scan response
+**                  Pointer to User defined ADV data structure
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+                                tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data);
+
+/*******************************************************************************
+**
+** Function         BTA_BleDisableAdvInstance
+**
+** Description      This function is called to disable the ADV instance
+**
+** Parameters       inst_id - Instance ID to be disabled
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_BleDisableAdvInstance(UINT8 inst_id);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleUpdateConnectionParams
+**
+** Description      Update connection parameters, can only be used when connection is up.
+**
+** Parameters:      bd_addr   - BD address of the peer
+**                  min_int   -     minimum connection interval, [0x0004~ 0x4000]
+**                  max_int   -     maximum connection interval, [0x0004~ 0x4000]
+**                  latency   -     slave latency [0 ~ 500]
+**                  timeout   -     supervision timeout [0x000a ~ 0xc80]
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int,
+                                   UINT16 max_int, UINT16 latency, UINT16 timeout);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleSetStorageParams
+**
+** Description      This function is called to set the storage parameters
+**
+** Parameters       batch_scan_full_max -Max storage space (in %) allocated to full scanning
+**                  batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+**                  batch_scan_notify_threshold - Setup notification level based on total space
+**                  consumed by both pools. Setting it to 0 will disable threshold notification
+**                  p_setup_cback - Setup callback
+**                  p_thres_cback - Threshold callback
+**                  p_rep_cback - Reports callback
+**                  ref_value - Reference value
+**
+** Returns           None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max,
+                                         UINT8 batch_scan_trunc_max,
+                                         UINT8 batch_scan_notify_threshold,
+                                         tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+                                         tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+                                         tBTA_BLE_SCAN_REP_CBACK* p_rep_cback,
+                                         tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleEnableBatchScan
+**
+** Description      This function is called to enable the batch scan
+**
+** Parameters       scan_mode -Batch scan mode
+**                  scan_interval - Scan interval
+**                  scan_window - Scan window
+**                  discard_rule -Discard rules
+**                  addr_type - Address type
+**                  ref_value - Reference value
+**
+** Returns           None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+                                         UINT32 scan_interval, UINT32 scan_window,
+                                         tBTA_BLE_DISCARD_RULE discard_rule,
+                                         tBLE_ADDR_TYPE        addr_type,
+                                         tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleReadScanReports
+**
+** Description      This function is called to read the batch scan reports
+**
+** Parameters       scan_mode -Batch scan mode
+**                  ref_value - Reference value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+                                             tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleDisableBatchScan
+**
+** Description      This function is called to disable the batch scanning
+**
+** Parameters       ref_value - Reference value
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmEnableScanFilter
+**
+** Description      This function is called to enable the adv data payload filter
+**
+** Parameters       action - enable or disable the APCF feature
+**                  p_cmpl_cback - Command completed callback
+**                  ref_value - Reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmEnableScanFilter(UINT8 action,
+                                        tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback,
+                                        tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleScanFilterSetup
+**
+** Description      This function is called to setup the filter params
+**
+** Parameters       p_target: enable the filter condition on a target device; if NULL
+**                  filt_index - Filter index
+**                  p_filt_params -Filter parameters
+**                  ref_value - Reference value
+**                  action - Add, delete or clear
+**                  p_cmpl_back - Command completed callback
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleScanFilterSetup(UINT8 action,
+                                                   tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+                                                   tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params,
+                                                   tBLE_BD_ADDR *p_target,
+                                                   tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+                                                   tBTA_DM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleCfgFilterCondition
+**
+** Description      This function is called to configure the adv data payload filter
+**                  condition.
+**
+** Parameters       action: to read/write/clear
+**                  cond_type: filter condition type
+**                  filt_index - Filter index
+**                  p_cond: filter condition parameter
+**                  p_cmpl_back - Command completed callback
+**                  ref_value - Reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
+                                                 tBTA_DM_BLE_PF_COND_TYPE cond_type,
+                                                 tBTA_DM_BLE_PF_FILT_INDEX filt_index,
+                                                 tBTA_DM_BLE_PF_COND_PARAM *p_cond,
+                                                 tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                                                 tBTA_DM_BLE_REF_VALUE ref_value);
+
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleTrackAdvertiser
+**
+** Description      This function is called to track the advertiser
+**
+** Parameters    ref_value - Reference value
+**               p_track_adv_cback - ADV callback
+**
+** Returns          None
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
+                            tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback);
+
+/*******************************************************************************
+**
+** Function         BTA_DmBleGetEnergyInfo
+**
+** Description      This function is called to obtain the energy info
+**
+** Parameters       p_cmpl_cback - Command complete callback
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback);
+
+/*******************************************************************************
+**
+** Function         BTA_BrcmInit
+**
+** Description      This function initializes Broadcom specific VS handler in BTA
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorInit  (void);
+
+/*******************************************************************************
+**
+** Function         BTA_BrcmCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorCleanup (void);
+
 #endif
 
 #ifdef __cplusplus
diff --git a/bta/include/bta_av_api.h b/bta/include/bta_av_api.h
index 1ea570c..22ee91c 100644
--- a/bta/include/bta_av_api.h
+++ b/bta/include/bta_av_api.h
@@ -249,8 +249,11 @@
 #define BTA_AV_META_MSG_EVT     17      /* metadata messages */
 #define BTA_AV_REJECT_EVT       18      /* incoming connection rejected */
 #define BTA_AV_RC_FEAT_EVT      19      /* remote control channel peer supported features update */
+#define BTA_AV_MEDIA_SINK_CFG_EVT    20      /* command to configure codec */
+#define BTA_AV_MEDIA_DATA_EVT   21      /* sending data to Media Task */
 /* Max BTA event */
-#define BTA_AV_MAX_EVT          20
+#define BTA_AV_MAX_EVT          22
+
 
 typedef UINT8 tBTA_AV_EVT;
 
@@ -282,6 +285,7 @@
     tBTA_AV_STATUS  status;
     BOOLEAN         starting;
     tBTA_AV_EDR     edr;        /* 0, if peer device does not support EDR */
+    UINT8           sep;        /*  sep type of peer device */
 } tBTA_AV_OPEN;
 
 /* data associated with BTA_AV_CLOSE_EVT */
@@ -446,6 +450,13 @@
     tBTA_AV_RC_FEAT     rc_feat;
 } tBTA_AV;
 
+/* union of data associated with AV Media callback */
+typedef union
+{
+    BT_HDR     *p_data;
+    UINT8      *codec_info;
+} tBTA_AV_MEDIA;
+
 
 #define BTA_AVC_PACKET_LEN                  AVRC_PACKET_LEN
 #define BTA_VENDOR_DATA_OFFSET              6
@@ -464,6 +475,7 @@
 
 /* AV callback */
 typedef void (tBTA_AV_CBACK)(tBTA_AV_EVT event, tBTA_AV *p_data);
+typedef void (tBTA_AV_DATA_CBACK)(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data);
 
 /* type for stream state machine action functions */
 typedef void (*tBTA_AV_ACT)(void *p_cb, void *p_data);
@@ -548,7 +560,7 @@
 **
 *******************************************************************************/
 BTA_API void BTA_AvRegister(tBTA_AV_CHNL chnl, const char *p_service_name,
-                            UINT8 app_id);
+                            UINT8 app_id, tBTA_AV_DATA_CBACK  *p_data_cback);
 
 /*******************************************************************************
 **
@@ -573,7 +585,7 @@
 **
 *******************************************************************************/
 BTA_API void BTA_AvOpen(BD_ADDR bd_addr, tBTA_AV_HNDL handle,
-                        BOOLEAN use_rc, tBTA_SEC sec_mask);
+                        BOOLEAN use_rc, tBTA_SEC sec_mask, UINT16 uuid);
 
 /*******************************************************************************
 **
@@ -599,6 +611,17 @@
 
 /*******************************************************************************
 **
+** Function         BTA_AvEnable_Sink
+**
+** Description      Enable/Disable A2DP Sink.
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_AvEnable_Sink(int enable);
+
+/*******************************************************************************
+**
 ** Function         BTA_AvStart
 **
 ** Description      Start audio/video stream data transfer.
diff --git a/bta/include/bta_av_ci.h b/bta/include/bta_av_ci.h
index 63668a9..faad260 100644
--- a/bta/include/bta_av_ci.h
+++ b/bta/include/bta_av_ci.h
@@ -63,7 +63,7 @@
 *******************************************************************************/
 BTA_API extern void bta_av_ci_setconfig(tBTA_AV_HNDL hndl, UINT8 err_code,
                                         UINT8 category, UINT8 num_seid, UINT8 *p_seid,
-                                        BOOLEAN recfg_needed);
+                                        BOOLEAN recfg_needed, UINT8 avdt_handle);
 
 
 #ifdef __cplusplus
diff --git a/bta/include/bta_av_co.h b/bta/include/bta_av_co.h
index 862ac5e..ed11c50 100644
--- a/bta/include/bta_av_co.h
+++ b/bta/include/bta_av_co.h
@@ -100,7 +100,7 @@
 **
 *******************************************************************************/
 BTA_API extern void bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps,
-                                             UINT8 num_snk, BD_ADDR addr);
+                    UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
 
 /*******************************************************************************
 **
@@ -162,7 +162,7 @@
 *******************************************************************************/
 BTA_API extern void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
                                         UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr,
-                                        UINT8 num_protect, UINT8 *p_protect_info);
+                                        UINT8 num_protect, UINT8 *p_protect_info,UINT8 t_local_sep, UINT8 avdt_handle);
 
 /*******************************************************************************
 **
diff --git a/bta/include/bta_av_sbc.h b/bta/include/bta_av_sbc.h
index 98eb6ae..d7cfa89 100644
--- a/bta/include/bta_av_sbc.h
+++ b/bta/include/bta_av_sbc.h
@@ -194,6 +194,18 @@
 
 /*******************************************************************************
 **
+** Function         bta_av_sbc_cfg_matches_cap
+**
+** Description      This function checks whether an SBC codec configuration
+**                  matched with capabilities. Here we check subset.
+**
+** Returns          0 if ok, nonzero if error.
+**
+*******************************************************************************/
+extern UINT8 bta_av_sbc_cfg_matches_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap);
+
+/*******************************************************************************
+**
 ** Function         bta_av_sbc_bld_hdr
 **
 ** Description      This function builds the packet header for MPF1.
diff --git a/bta/include/bta_gatt_api.h b/bta/include/bta_gatt_api.h
index b53b180..9e75eef 100644
--- a/bta/include/bta_gatt_api.h
+++ b/bta/include/bta_gatt_api.h
@@ -77,21 +77,33 @@
 #define  BTA_GATT_INSUF_RESOURCE            GATT_INSUF_RESOURCE                /* 0x0011 */
 
 
-#define  BTA_GATT_ILLEGAL_PARAMETER         GATT_ILLEGAL_PARAMETER             /* 0x0087 */
-#define  BTA_GATT_NO_RESOURCES              GATT_NO_RESOURCES                  /* 0x0080 */
-#define  BTA_GATT_INTERNAL_ERROR            GATT_INTERNAL_ERROR                /* 0x0081 */
-#define  BTA_GATT_WRONG_STATE               GATT_WRONG_STATE                   /* 0x0082 */
-#define  BTA_GATT_DB_FULL                   GATT_DB_FULL                       /* 0x0083 */
-#define  BTA_GATT_BUSY                      GATT_BUSY                          /* 0x0084 */
-#define  BTA_GATT_ERROR                     GATT_ERROR                         /* 0x0085 */
-#define  BTA_GATT_CMD_STARTED               GATT_CMD_STARTED                   /* 0x0086 */
-#define  BTA_GATT_PENDING                   GATT_PENDING                       /* 0x0088 */
-#define  BTA_GATT_AUTH_FAIL                 GATT_AUTH_FAIL                     /* 0x0089 */
-#define  BTA_GATT_MORE                      GATT_MORE                          /* 0x008a */
-#define  BTA_GATT_INVALID_CFG               GATT_INVALID_CFG                   /* 0x008b */
-#define  BTA_GATT_DUP_REG                   0x008c
-#define  BTA_GATT_ALREADY_OPEN              0x008d                              /* 0x008d */
-#define  BTA_GATT_CANCEL                    0x008e                              /* 0x008e */
+#define  BTA_GATT_NO_RESOURCES              GATT_NO_RESOURCES                  /* 0x80 */
+#define  BTA_GATT_INTERNAL_ERROR            GATT_INTERNAL_ERROR                /* 0x81 */
+#define  BTA_GATT_WRONG_STATE               GATT_WRONG_STATE                   /* 0x82 */
+#define  BTA_GATT_DB_FULL                   GATT_DB_FULL                       /* 0x83 */
+#define  BTA_GATT_BUSY                      GATT_BUSY                          /* 0x84 */
+#define  BTA_GATT_ERROR                     GATT_ERROR                         /* 0x85 */
+#define  BTA_GATT_CMD_STARTED               GATT_CMD_STARTED                   /* 0x86 */
+#define  BTA_GATT_ILLEGAL_PARAMETER         GATT_ILLEGAL_PARAMETER             /* 0x87 */
+#define  BTA_GATT_PENDING                   GATT_PENDING                       /* 0x88 */
+#define  BTA_GATT_AUTH_FAIL                 GATT_AUTH_FAIL                     /* 0x89 */
+#define  BTA_GATT_MORE                      GATT_MORE                          /* 0x8a */
+#define  BTA_GATT_INVALID_CFG               GATT_INVALID_CFG                   /* 0x8b */
+#define  BTA_GATT_SERVICE_STARTED           GATT_SERVICE_STARTED               /* 0x8c */
+#define  BTA_GATT_ENCRYPED_MITM             GATT_ENCRYPED_MITM                 /* GATT_SUCCESS */
+#define  BTA_GATT_ENCRYPED_NO_MITM          GATT_ENCRYPED_NO_MITM              /* 0x8d */
+#define  BTA_GATT_NOT_ENCRYPTED             GATT_NOT_ENCRYPTED                 /* 0x8e */
+#define  BTA_GATT_CONGESTED                 GATT_CONGESTED                     /* 0x8f */
+
+#define  BTA_GATT_DUP_REG                   0x90                               /* 0x90 */
+#define  BTA_GATT_ALREADY_OPEN              0x91                               /* 0x91 */
+#define  BTA_GATT_CANCEL                    0x92                               /* 0x92 */
+
+                                             /* 0xE0 ~ 0xFC reserved for future use */
+#define  BTA_GATT_CCC_CFG_ERR                GATT_CCC_CFG_ERR     /* 0xFD Client Characteristic Configuration Descriptor Improperly Configured */
+#define  BTA_GATT_PRC_IN_PROGRESS            GATT_PRC_IN_PROGRESS /* 0xFE Procedure Already in progress */
+#define  BTA_GATT_OUT_OF_RANGE               GATT_OUT_OF_RANGE    /* 0xFFAttribute value out of range */
+
 typedef UINT8 tBTA_GATT_STATUS;
 
 #define BTA_GATT_INVALID_CONN_ID   GATT_INVALID_CONN_ID
@@ -117,6 +129,22 @@
 #define BTA_GATTC_LISTEN_EVT        16  /* listen event */
 #define BTA_GATTC_ENC_CMPL_CB_EVT   17  /* encryption complete callback event */
 #define BTA_GATTC_CFG_MTU_EVT       18  /* configure MTU complete event */
+#define BTA_GATTC_ADV_DATA_EVT      19  /* ADV data event */
+#define BTA_GATTC_MULT_ADV_ENB_EVT  20  /* Enable Multi ADV event */
+#define BTA_GATTC_MULT_ADV_UPD_EVT  21  /* Update parameter event */
+#define BTA_GATTC_MULT_ADV_DATA_EVT 22  /* Multi ADV data event */
+#define BTA_GATTC_MULT_ADV_DIS_EVT  23  /* Disable Multi ADV event */
+#define BTA_GATTC_CONGEST_EVT       24  /* Congestion event */
+#define BTA_GATTC_BTH_SCAN_ENB_EVT  25 /* Enable batch scan event */
+#define BTA_GATTC_BTH_SCAN_CFG_EVT  26 /* Config storage event */
+#define BTA_GATTC_BTH_SCAN_RD_EVT   27 /* Batch scan reports read event */
+#define BTA_GATTC_BTH_SCAN_THR_EVT  28 /* Batch scan threshold event */
+#define BTA_GATTC_BTH_SCAN_PARAM_EVT 29 /* Batch scan param event */
+#define BTA_GATTC_BTH_SCAN_DIS_EVT  30 /* Disable batch scan event */
+#define BTA_GATTC_SCAN_FLT_CFG_EVT  31 /* Scan filter config event */
+#define BTA_GATTC_SCAN_FLT_PARAM_EVT 32 /* Param filter event */
+#define BTA_GATTC_SCAN_FLT_STATUS_EVT 33 /* Filter status event */
+#define BTA_GATTC_ADV_VSC_EVT         34 /* ADV VSC event */
 
 typedef UINT8 tBTA_GATTC_EVT;
 
@@ -325,6 +353,7 @@
     UINT16              conn_id;
     tBTA_GATTC_IF       client_if;
     BD_ADDR             remote_bda;
+    tBTA_TRANSPORT      transport;
     UINT16              mtu;
 }tBTA_GATTC_OPEN;
 
@@ -348,6 +377,12 @@
     BOOLEAN             is_notify;
 }tBTA_GATTC_NOTIFY;
 
+typedef struct
+{
+    UINT16 conn_id;
+    BOOLEAN congested; /* congestion indicator */
+}tBTA_GATTC_CONGEST;
+
 // btla-specific ++
 typedef struct
 {
@@ -380,6 +415,7 @@
     tBTA_GATTC_ENC_CMPL_CB  enc_cmpl;
     BD_ADDR                 remote_bda;     /* service change event */
     tBTA_GATTC_CFG_MTU      cfg_mtu;        /* configure MTU operation */
+    tBTA_GATTC_CONGEST      congest;
 } tBTA_GATTC;
 
 /* GATTC enable callback function */
@@ -411,6 +447,7 @@
 #define BTA_GATTS_CANCEL_OPEN_EVT                       17
 #define BTA_GATTS_CLOSE_EVT                             18
 #define BTA_GATTS_LISTEN_EVT                            19
+#define BTA_GATTS_CONGEST_EVT                           20
 
 typedef UINT8  tBTA_GATTS_EVT;
 typedef tGATT_IF tBTA_GATTS_IF;
@@ -469,12 +506,9 @@
 typedef tGATTS_SRV_CHG_REQ tBTA_GATTS_SRV_CHG_REQ;
 typedef tGATTS_SRV_CHG_RSP tBTA_GATTS_SRV_CHG_RSP;
 
-enum
-{
-    BTA_GATT_TRANSPORT_LE,
-    BTA_GATT_TRANSPORT_BR_EDR,
-    BTA_GATT_TRANSPORT_LE_BR_EDR
-};
+#define BTA_GATT_TRANSPORT_LE       GATT_TRANSPORT_LE
+#define BTA_GATT_TRANSPORT_BR_EDR   GATT_TRANSPORT_BR_EDR
+#define BTA_GATT_TRANSPORT_LE_BR_EDR    GATT_TRANSPORT_LE_BR_EDR
 typedef UINT8 tBTA_GATT_TRANSPORT;
 
 /* attribute value */
@@ -499,6 +533,7 @@
 
 typedef struct
 {
+    tBTA_GATT_STATUS    status;
     BD_ADDR             remote_bda;
     UINT32              trans_id;
     UINT16              conn_id;
@@ -552,21 +587,35 @@
     BD_ADDR             remote_bda;
     UINT16              conn_id;
     tBTA_GATT_REASON    reason; /* report disconnect reason */
+    tBTA_GATT_TRANSPORT transport;
 }tBTA_GATTS_CONN;
 
+typedef struct
+{
+    UINT16 conn_id;
+    BOOLEAN congested; /* report channel congestion indicator */
+}tBTA_GATTS_CONGEST;
+
+typedef struct
+{
+    UINT16 conn_id; /* connection ID */
+    tBTA_GATT_STATUS status; /* notification/indication status */
+}tBTA_GATTS_CONF;
+
 /* GATTS callback data */
 typedef union
 {
     tBTA_GATTS_REG_OPER     reg_oper;
     tBTA_GATTS_CREATE       create;
     tBTA_GATTS_SRVC_OPER    srvc_oper;
-    tBTA_GATT_STATUS        status; /*  BTA_GATTS_CONF_EVT */
+    tBTA_GATT_STATUS        status;      /* BTA_GATTS_LISTEN_EVT */
     tBTA_GATTS_ADD_RESULT   add_result;  /* add included service: BTA_GATTS_ADD_INCL_SRVC_EVT
                                            add char : BTA_GATTS_ADD_CHAR_EVT
                                            add char descriptor: BTA_GATTS_ADD_CHAR_DESCR_EVT */
     tBTA_GATTS_REQ          req_data;
     tBTA_GATTS_CONN         conn;       /* BTA_GATTS_CONN_EVT */
-
+    tBTA_GATTS_CONGEST      congest;    /* BTA_GATTS_CONGEST_EVT callback data */
+    tBTA_GATTS_CONF         confirm;    /* BTA_GATTS_CONF_EVT callback data */
 }tBTA_GATTS;
 
 /* GATTS enable callback function */
@@ -644,7 +693,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-BTA_API extern void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda, BOOLEAN is_direct);
+BTA_API extern void BTA_GATTC_Open(tBTA_GATTC_IF client_if, BD_ADDR remote_bda,
+                                   BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport);
 
 /*******************************************************************************
 **
@@ -1301,7 +1351,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-    BTA_API extern void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct);
+    BTA_API extern void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda,
+                                        BOOLEAN is_direct, tBTA_GATT_TRANSPORT transport);
 
 
 /*******************************************************************************
diff --git a/bta/include/bta_hf_client_api.h b/bta/include/bta_hf_client_api.h
new file mode 100644
index 0000000..8ef42f4
--- /dev/null
+++ b/bta/include/bta_hf_client_api.h
@@ -0,0 +1,382 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 is the public interface file for the handsfree (HF role) subsystem
+ *
+ ******************************************************************************/
+#ifndef BTA_HF_CLIENT_API_H
+#define BTA_HF_CLIENT_API_H
+
+#include "bta_api.h"
+
+/*****************************************************************************
+**  Constants and data types
+*****************************************************************************/
+
+/* HFP peer (AG) features*/
+#define BTA_HF_CLIENT_PEER_FEAT_3WAY   0x00000001  /* Three-way calling */
+#define BTA_HF_CLIENT_PEER_FEAT_ECNR   0x00000002  /* Echo cancellation and/or noise reduction */
+#define BTA_HF_CLIENT_PEER_FEAT_VREC   0x00000004  /* Voice recognition */
+#define BTA_HF_CLIENT_PEER_INBAND      0x00000008  /* In-band ring tone */
+#define BTA_HF_CLIENT_PEER_VTAG        0x00000010  /* Attach a phone number to a voice tag */
+#define BTA_HF_CLIENT_PEER_REJECT      0x00000020  /* Ability to reject incoming call */
+#define BTA_HF_CLIENT_PEER_ECS         0x00000040  /* Enhanced Call Status */
+#define BTA_HF_CLIENT_PEER_ECC         0x00000080  /* Enhanced Call Control */
+#define BTA_HF_CLIENT_PEER_EXTERR      0x00000100  /* Extended error codes */
+#define BTA_HF_CLIENT_PEER_CODEC       0x00000200  /* Codec Negotiation */
+
+typedef UINT16 tBTA_HF_CLIENT_PEER_FEAT;
+
+/* HFP HF features */
+#define BTA_HF_CLIENT_FEAT_ECNR        0x00000001  /* Echo cancellation and/or noise reduction */
+#define BTA_HF_CLIENT_FEAT_3WAY        0x00000002  /* Call waiting and three-way calling */
+#define BTA_HF_CLIENT_FEAT_CLI         0x00000004  /* Caller ID presentation capability */
+#define BTA_HF_CLIENT_FEAT_VREC        0x00000008  /* Voice recognition activation */
+#define BTA_HF_CLIENT_FEAT_VOL         0x00000010  /* Remote volume control */
+#define BTA_HF_CLIENT_FEAT_ECS         0x00000020  /* Enhanced Call Status */
+#define BTA_HF_CLIENT_FEAT_ECC         0x00000040  /* Enhanced Call Control */
+#define BTA_HF_CLIENT_FEAT_CODEC       0x00000080  /* Codec Negotiation */
+
+/* HFP HF extended call handling - masks not related to any spec */
+#define BTA_HF_CLIENT_CHLD_REL          0x00000001  /* 0  Release waiting call or held calls */
+#define BTA_HF_CLIENT_CHLD_REL_ACC      0x00000002  /* 1  Release active calls and accept other (waiting or held) cal */
+#define BTA_HF_CLIENT_CHLD_REL_X        0x00000004  /* 1x Release x call*/
+#define BTA_HF_CLIENT_CHLD_HOLD_ACC     0x00000008  /* 2  Active calls on hold and accept other call */
+#define BTA_HF_CLIENT_CHLD_PRIV_X       0x00000010  /* 2x Active multiparty call on hold except call x */
+#define BTA_HF_CLIENT_CHLD_MERGE        0x00000020  /* 3  Add held call to multiparty */
+#define BTA_HF_CLIENT_CHLD_MERGE_DETACH 0x00000040  /* 4  Add held call to multiparty */
+
+typedef UINT16 tBTA_HF_CLIENT_CHLD_FEAT;
+
+/* HFP AG errors ot OK sent to HF Unit */
+#define BTA_HF_CLIENT_AT_RESULT_OK            0
+#define BTA_HF_CLIENT_AT_RESULT_ERROR         1
+#define BTA_HF_CLIENT_AT_RESULT_NO_CARRIER    2
+#define BTA_HF_CLIENT_AT_RESULT_BUSY          3
+#define BTA_HF_CLIENT_AT_RESULT_NO_ANSWER     4
+#define BTA_HF_CLIENT_AT_RESULT_DELAY         5
+#define BTA_HF_CLIENT_AT_RESULT_BLACKLISTED   6
+#define BTA_HF_CLIENT_AT_RESULT_CME           7
+
+typedef UINT8 tBTA_HF_CLIENT_AT_RESULT_TYPE;
+
+/* HF Client callback events */
+#define BTA_HF_CLIENT_ENABLE_EVT            0  /* HF Client enabled */
+#define BTA_HF_CLIENT_REGISTER_EVT          1  /* HF Client registered */
+#define BTA_HF_CLIENT_OPEN_EVT              2  /* HF Client connection open */
+#define BTA_HF_CLIENT_CLOSE_EVT             3  /* HF Client connection closed */
+#define BTA_HF_CLIENT_CONN_EVT              4  /* Service level connection opened */
+#define BTA_HF_CLIENT_AUDIO_OPEN_EVT        5  /* Audio connection open */
+#define BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT   6  /* Audio connection with mSBC codec open */
+#define BTA_HF_CLIENT_AUDIO_CLOSE_EVT       7  /* Audio connection closed */
+#define BTA_HF_CLIENT_SPK_EVT               8  /* Speaker volume changed */
+#define BTA_HF_CLIENT_MIC_EVT               9  /* Microphone volume changed */
+#define BTA_HF_CLIENT_IND_EVT               10 /* Indicator */
+#define BTA_HF_CLIENT_VOICE_REC_EVT         11 /* AG changed voice recognition setting */
+#define BTA_HF_CLIENT_OPERATOR_NAME_EVT     12 /* Operator name acquired */
+#define BTA_HF_CLIENT_CLIP_EVT              13 /* Calling line identification event */
+#define BTA_HF_CLIENT_CCWA_EVT              14 /* Call waiting notification */
+#define BTA_HF_CLIENT_AT_RESULT_EVT         15 /* Call waiting notification */
+#define BTA_HF_CLIENT_CLCC_EVT              16 /* current call event */
+#define BTA_HF_CLIENT_CNUM_EVT              17 /* subscriber information event */
+#define BTA_HF_CLIENT_BTRH_EVT              18 /* bluetooth response and hold event */
+#define BTA_HF_CLIENT_BSIR_EVT              19 /* in-band ring tone setting changed event */
+#define BTA_HF_CLIENT_BINP_EVT              20 /* binp number event */
+#define BTA_HF_CLIENT_RING_INDICATION       21 /* HF Client ring indication */
+#define BTA_HF_CLIENT_DISABLE_EVT           30 /* HF Client disabled */
+
+typedef UINT8 tBTA_HF_CLIENT_EVT;
+
+/* HF Client open status */
+#define BTA_HF_CLIENT_SUCCESS          0 /* Connection successfully opened */
+#define BTA_HF_CLIENT_FAIL_SDP         1 /* Open failed due to SDP */
+#define BTA_HF_CLIENT_FAIL_RFCOMM      2 /* Open failed due to RFCOMM */
+#define BTA_HF_CLIENT_FAIL_RESOURCES   3 /* out of resources failure  */
+
+typedef UINT8 tBTA_HF_CLIENT_STATUS;
+
+/* indicator type */
+#define BTA_HF_CLIENT_IND_BATTCH    0  /* Battery charge indicator */
+#define BTA_HF_CLIENT_IND_SIGNAL    1  /* Signal Strength indicator */
+#define BTA_HF_CLIENT_IND_SERVICE   2  /* Service availability indicator */
+#define BTA_HF_CLIENT_IND_CALL      3  /* Standard call status indicator*/
+#define BTA_HF_CLIENT_IND_ROAM      4  /* Roaming status indicator */
+#define BTA_HF_CLIENT_IND_CALLSETUP 5  /* Call setup status indicator */
+#define BTA_HF_CLIENT_IND_CALLHELD  6  /* Call hold status indicator */
+
+typedef UINT8 tBTA_HF_CLIENT_IND_TYPE;
+
+/* AT commands */
+#define BTA_HF_CLIENT_AT_CMD_VTS    0
+#define BTA_HF_CLIENT_AT_CMD_BTRH   1
+#define BTA_HF_CLIENT_AT_CMD_CHUP   2
+#define BTA_HF_CLIENT_AT_CMD_CHLD   3
+#define BTA_HF_CLIENT_AT_CMD_BCC    4
+#define BTA_HF_CLIENT_AT_CMD_CNUM   5
+#define BTA_HF_CLIENT_AT_CMD_ATA    6
+#define BTA_HF_CLIENT_AT_CMD_COPS   7
+#define BTA_HF_CLIENT_AT_CMD_ATD    8
+#define BTA_HF_CLIENT_AT_CMD_VGM    9
+#define BTA_HF_CLIENT_AT_CMD_VGS    10
+#define BTA_HF_CLIENT_AT_CMD_BVRA   11
+#define BTA_HF_CLIENT_AT_CMD_CLCC   12
+#define BTA_HF_CLIENT_AT_CMD_BINP   13
+#define BTA_HF_CLIENT_AT_CMD_BLDN   14
+#define BTA_HF_CLIENT_AT_CMD_NREC   15
+
+typedef UINT8 tBTA_HF_CLIENT_AT_CMD_TYPE;
+
+/* data associated with most non-AT events */
+/* placeholder, if not needed should be removed*/
+typedef struct
+{
+} tBTA_HF_CLIENT_HDR;
+
+/* data associated with BTA_HF_CLIENT_REGISTER_EVT */
+typedef struct
+{
+    tBTA_HF_CLIENT_HDR      hdr;
+    UINT16                  handle;
+    tBTA_HF_CLIENT_STATUS   status;
+} tBTA_HF_CLIENT_REGISTER;
+
+/* data associated with BTA_HF_CLIENT_OPEN_EVT */
+typedef struct
+{
+    tBTA_HF_CLIENT_HDR      hdr;
+    BD_ADDR                 bd_addr;
+    tBTA_HF_CLIENT_STATUS   status;
+} tBTA_HF_CLIENT_OPEN;
+
+/* data associated with BTA_HF_CLIENT_CONN_EVT */
+typedef struct
+{
+    tBTA_HF_CLIENT_HDR         hdr;
+    tBTA_HF_CLIENT_PEER_FEAT   peer_feat;
+    tBTA_HF_CLIENT_CHLD_FEAT   chld_feat;
+} tBTA_HF_CLIENT_CONN;
+
+/* data associated with BTA_HF_CLIENT_IND_EVT event */
+typedef struct
+{
+    tBTA_HF_CLIENT_HDR         hdr;
+    tBTA_HF_CLIENT_IND_TYPE    type;
+    UINT16                     value;
+} tBTA_HF_CLIENT_IND;
+
+/* data associated with BTA_HF_CLIENT_OPERATOR_NAME_EVT */
+#define BTA_HF_CLIENT_OPERATOR_NAME_LEN 16
+typedef struct
+{
+    char                       name[BTA_HF_CLIENT_OPERATOR_NAME_LEN + 1];
+} tBTA_HF_CLIENT_OPERATOR_NAME;
+
+/* data associated with BTA_HF_CLIENT_CLIP_EVT  and BTA_HF_CLIENT_CCWA_EVT*/
+#define BTA_HF_CLIENT_NUMBER_LEN 32
+typedef struct
+{
+    char                       number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_NUMBER;
+
+/* data associated with BTA_HF_CLIENT_AT_RESULT_EVT event */
+typedef struct
+{
+    tBTA_HF_CLIENT_AT_RESULT_TYPE    type;
+    UINT16                           cme;
+} tBTA_HF_CLIENT_AT_RESULT;
+
+/* data associated with BTA_HF_CLIENT_CLCC_EVT event */
+typedef struct
+{
+    UINT32                     idx;
+    BOOLEAN                    inc;
+    UINT8                      status;
+    BOOLEAN                    mpty;
+    BOOLEAN                    number_present;
+    char                       number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_CLCC;
+
+/* data associated with BTA_HF_CLIENT_CNUM_EVT event */
+typedef struct
+{
+    UINT16                     service;
+    char                       number[BTA_HF_CLIENT_NUMBER_LEN + 1];
+} tBTA_HF_CLIENT_CNUM;
+
+/* data associated with other events */
+typedef struct
+{
+    UINT16                     value;
+} tBTA_HF_CLIENT_VAL;
+
+/* union of data associated with AG callback */
+typedef union
+{
+    tBTA_HF_CLIENT_HDR              hdr;
+    tBTA_HF_CLIENT_REGISTER         reg;
+    tBTA_HF_CLIENT_OPEN             open;
+    tBTA_HF_CLIENT_CONN             conn;
+    tBTA_HF_CLIENT_IND              ind;
+    tBTA_HF_CLIENT_VAL              val;
+    tBTA_HF_CLIENT_OPERATOR_NAME    operator;
+    tBTA_HF_CLIENT_NUMBER           number;
+    tBTA_HF_CLIENT_AT_RESULT        result;
+    tBTA_HF_CLIENT_CLCC             clcc;
+    tBTA_HF_CLIENT_CNUM             cnum;
+} tBTA_HF_CLIENT;
+
+typedef UINT32 tBTA_HF_CLIENT_FEAT;
+
+/* HF Client callback */
+typedef void (tBTA_HF_CLIENT_CBACK)(tBTA_HF_CLIENT_EVT event, tBTA_HF_CLIENT *p_data);
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*****************************************************************************
+**  External Function Declarations
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientEnable
+**
+** Description      Enable the HF CLient service. When the enable
+**                  operation is complete the callback function will be
+**                  called with a BTA_HF_CLIENT_ENABLE_EVT. This function must
+**                  be called before other function in the HF CLient API are
+**                  called.
+**
+** Returns          BTA_SUCCESS if OK, BTA_FAILURE otherwise.
+**
+*******************************************************************************/
+BTA_API tBTA_STATUS BTA_HfClientEnable(tBTA_HF_CLIENT_CBACK *p_cback);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientDisable
+**
+** Description      Disable the HF Client service
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDisable(void);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientRegister
+**
+** Description      Register an HF Client service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientRegister(tBTA_SEC sec_mask, tBTA_HF_CLIENT_FEAT features,
+                                                        char *p_service_name);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientDeregister
+**
+** Description      Deregister an HF Client service.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientDeregister(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientOpen
+**
+** Description      Opens a connection to an audio gateway.
+**                  When connection is open callback function is called
+**                  with a BTA_HF_CLIENT_OPEN_EVT. Only the data connection is
+**                  opened. The audio connection is not opened.
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientOpen(UINT16 handle, BD_ADDR bd_addr, tBTA_SEC sec_mask);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientClose
+**
+** Description      Close the current connection to an audio gateway.
+**                  Any current audio connection will also be closed
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientClose(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function         BTA_HfCllientAudioOpen
+**
+** Description      Opens an audio connection to the currently connected
+**                 audio gateway
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioOpen(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientAudioClose
+**
+** Description      Close the currently active audio connection to an audio
+**                  gateway. The data connection remains open
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientAudioClose(UINT16 handle);
+
+/*******************************************************************************
+**
+** Function         BTA_HfClientSendAT
+**
+** Description      send AT command
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API void BTA_HfClientSendAT(UINT16 handle, tBTA_HF_CLIENT_AT_CMD_TYPE at, UINT32 val1, UINT32 val2, const char *str);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BTA_HF_CLIENT_API_H */
diff --git a/bta/include/bta_hh_co.h b/bta/include/bta_hh_co.h
old mode 100644
new mode 100755
index 8f648df..bf73b46
--- a/bta/include/bta_hh_co.h
+++ b/bta/include/bta_hh_co.h
@@ -26,6 +26,14 @@
 
 #include "bta_hh_api.h"
 
+typedef struct
+{
+    UINT16              rpt_uuid;
+    UINT8               rpt_id;
+    tBTA_HH_RPT_TYPE    rpt_type;
+    UINT8               inst_id;
+    UINT8               prop;
+}tBTA_HH_RPT_CACHE_ENTRY;
 
 /*******************************************************************************
 **
@@ -68,5 +76,59 @@
 *******************************************************************************/
 BTA_API extern void bta_hh_co_close(UINT8 dev_handle, UINT8 app_id);
 
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_rpt_info
+**
+** Description      This callout function is to convey the report information on
+**                  a HOGP device to the application. Application can save this
+**                  information in NV if device is bonded and load it back when
+**                  stack reboot.
+**
+** Parameters       remote_bda  - remote device address
+**                  p_entry     - report entry pointer
+**                  app_id      - application id
+**
+** Returns          void.
+**
+*******************************************************************************/
+BTA_API extern void bta_hh_le_co_rpt_info(BD_ADDR remote_bda,
+                                          tBTA_HH_RPT_CACHE_ENTRY *p_entry,
+                                          UINT8 app_id);
+
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_cache_load
+**
+** Description      This callout function is to request the application to load the
+**                  cached HOGP report if there is any. When cache reading is completed,
+**                  bta_hh_le_ci_cache_load() is called by the application.
+**
+** Parameters       remote_bda  - remote device address
+**                  p_num_rpt: number of cached report
+**                  app_id      - application id
+**
+** Returns          the acched report array
+**
+*******************************************************************************/
+BTA_API extern tBTA_HH_RPT_CACHE_ENTRY *bta_hh_le_co_cache_load (BD_ADDR remote_bda,
+                                                                 UINT8 *p_num_rpt,
+                                                                 UINT8 app_id);
+
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_reset_rpt_cache
+**
+** Description      This callout function is to reset the HOGP device cache.
+**
+** Parameters       remote_bda  - remote device address
+**
+** Returns          none
+**
+*******************************************************************************/
+BTA_API extern void bta_hh_le_co_reset_rpt_cache (BD_ADDR remote_bda, UINT8 app_id);
+
+#endif /* #if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE) */
 #endif /* BTA_HH_CO_H */
 
diff --git a/bta/include/bta_mce_api.h b/bta/include/bta_mce_api.h
new file mode 100644
index 0000000..b9fbf6a
--- /dev/null
+++ b/bta/include/bta_mce_api.h
@@ -0,0 +1,132 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2006-2012 Broadcom Corporation
+ *
+ *  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 is the public interface file the BTA MCE I/F
+ *
+ ******************************************************************************/
+#ifndef BTA_MCE_API_H
+#define BTA_MCE_API_H
+
+#include "data_types.h"
+#include "bt_target.h"
+#include "bt_types.h"
+#include "bta_api.h"
+#include "btm_api.h"
+
+/*****************************************************************************
+**  Constants and data types
+*****************************************************************************/
+/* status values */
+#define BTA_MCE_SUCCESS             0            /* Successful operation. */
+#define BTA_MCE_FAILURE             1            /* Generic failure. */
+#define BTA_MCE_BUSY                2            /* Temporarily can not handle this request. */
+
+typedef UINT8 tBTA_MCE_STATUS;
+
+/* MCE I/F callback events */
+/* events received by tBTA_MCE_DM_CBACK */
+#define BTA_MCE_ENABLE_EVT               0  /* MCE enabled */
+#define BTA_MCE_MAS_DISCOVERY_COMP_EVT   1  /* SDP MAS discovery complete */
+#define BTA_MCE_MAX_EVT                  2  /* max number of MCE events */
+
+#define BTA_MCE_MAX_MAS_INSTANCES 12
+
+typedef UINT16 tBTA_MCE_EVT;
+
+typedef struct
+{
+    UINT8   scn;
+    char    *p_srv_name;
+    UINT16  srv_name_len;
+    UINT8   instance_id;
+    UINT8   msg_type;
+} tBTA_MCE_MAS_INFO;
+
+/* data associated with BTA_MCE_MAS_DISCOVERY_COMP_EVT */
+typedef struct
+{
+    tBTA_MCE_STATUS    status;
+    BD_ADDR            remote_addr;
+    int                num_mas;
+    tBTA_MCE_MAS_INFO  mas[BTA_MCE_MAX_MAS_INSTANCES];
+} tBTA_MCE_MAS_DISCOVERY_COMP;
+
+/* union of data associated with MCE callback */
+typedef union
+{
+    tBTA_MCE_STATUS              status;         /* BTA_MCE_ENABLE_EVT */
+    tBTA_MCE_MAS_DISCOVERY_COMP  mas_disc_comp;  /* BTA_MCE_MAS_DISCOVERY_COMP_EVT */
+} tBTA_MCE;
+
+/* MCE DM Interface callback */
+typedef void (tBTA_MCE_DM_CBACK)(tBTA_MCE_EVT event, tBTA_MCE *p_data, void * user_data);
+
+/* MCE configuration structure */
+typedef struct
+{
+    UINT16  sdp_db_size;            /* The size of p_sdp_db */
+    tSDP_DISCOVERY_DB   *p_sdp_db;  /* The data buffer to keep SDP database */
+} tBTA_MCE_CFG;
+
+/*****************************************************************************
+**  External Function Declarations
+*****************************************************************************/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************************
+**
+** Function         BTA_MceEnable
+**
+** Description      Enable the MCE I/F service. When the enable
+**                  operation is complete the callback function will be
+**                  called with a BTA_MCE_ENABLE_EVT. This function must
+**                  be called before other functions in the MCE API are
+**                  called.
+**
+** Returns          BTA_MCE_SUCCESS if successful.
+**                  BTA_MCE_FAIL if internal failure.
+**
+*******************************************************************************/
+BTA_API extern tBTA_MCE_STATUS BTA_MceEnable(tBTA_MCE_DM_CBACK *p_cback);
+
+/*******************************************************************************
+**
+** Function         BTA_MceGetRemoteMasInstances
+**
+** Description      This function performs service discovery for the MAS service
+**                  by the given peer device. When the operation is completed
+**                  the tBTA_MCE_DM_CBACK callback function will be  called with
+**                  a BTA_MCE_MAS_DISCOVERY_COMP_EVT.
+**
+** Returns          BTA_MCE_SUCCESS, if the request is being processed.
+**                  BTA_MCE_FAILURE, otherwise.
+**
+*******************************************************************************/
+BTA_API extern tBTA_MCE_STATUS BTA_MceGetRemoteMasInstances(BD_ADDR bd_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BTA_MCE_API_H */
diff --git a/bta/jv/bta_jv_act.c b/bta/jv/bta_jv_act.c
index dd09ca7..3419089 100644
--- a/bta/jv/bta_jv_act.c
+++ b/bta/jv/bta_jv_act.c
@@ -56,7 +56,7 @@
 {
     char uuids[128];
     uuid_to_string((bt_uuid_t*)p_uuid, uuids);
-    APPL_TRACE_DEBUG2("%s: %s", title, uuids);
+    APPL_TRACE_DEBUG("%s: %s", title, uuids);
 }
 
 
@@ -135,7 +135,7 @@
             used++;
     }
     if (used == BTA_JV_NUM_SERVICE_ID)
-        APPL_TRACE_ERROR1("get_sec_id_used, sec id exceeds the limit:%d",
+        APPL_TRACE_ERROR("get_sec_id_used, sec id exceeds the limit:%d",
                 BTA_JV_NUM_SERVICE_ID);
     return used;
 }
@@ -149,7 +149,7 @@
             used++;
     }
     if (used == BTA_JV_MAX_RFC_CONN)
-        APPL_TRACE_ERROR1("get_sec_id_used, rfc ctrl block exceeds the limit:%d",
+        APPL_TRACE_ERROR("get_sec_id_used, rfc ctrl block exceeds the limit:%d",
                 BTA_JV_MAX_RFC_CONN);
     return used;
 }
@@ -201,7 +201,7 @@
             for (j = 0; j < BTA_JV_MAX_RFC_SR_SESSION; j++)
                 p_cb->rfc_hdl[j] = 0;
             p_cb->rfc_hdl[0]        = port_handle;
-            APPL_TRACE_DEBUG2( "bta_jv_alloc_rfc_cb port_handle:%d handle:0x%2x",
+            APPL_TRACE_DEBUG( "bta_jv_alloc_rfc_cb port_handle:%d handle:0x%2x",
                     port_handle, p_cb->handle);
 
             p_pcb = &bta_jv_cb.port_cb[port_handle - 1];
@@ -214,7 +214,7 @@
     }
     if(p_cb == NULL)
     {
-        APPL_TRACE_ERROR2( "bta_jv_alloc_rfc_cb: port_handle:%d, ctrl block exceeds "
+        APPL_TRACE_ERROR( "bta_jv_alloc_rfc_cb: port_handle:%d, ctrl block exceeds "
                 "limit:%d", port_handle, BTA_JV_MAX_RFC_CONN);
     }
     return p_cb;
@@ -267,7 +267,7 @@
     }
     else
     {
-        APPL_TRACE_WARNING2("bta_jv_rfc_port_to_cb(port_handle:0x%x):jv handle:0x%x not"
+        APPL_TRACE_WARNING("bta_jv_rfc_port_to_cb(port_handle:0x%x):jv handle:0x%x not"
                 " FOUND", port_handle, bta_jv_cb.port_cb[port_handle - 1].handle);
     }
     return p_cb;
@@ -281,12 +281,12 @@
 
     if (!p_cb || !p_pcb)
     {
-        APPL_TRACE_ERROR0("bta_jv_free_sr_rfc_cb, p_cb or p_pcb cannot be null");
+        APPL_TRACE_ERROR("bta_jv_free_sr_rfc_cb, p_cb or p_pcb cannot be null");
         return BTA_JV_FAILURE;
     }
-    APPL_TRACE_DEBUG6("bta_jv_free_sr_rfc_cb: max_sess:%d, curr_sess:%d, p_pcb:%p, user:"
-            "%d, state:%d, jv handle: 0x%x" ,p_cb->max_sess, p_cb->curr_sess, p_pcb,
-            (int)p_pcb->user_data, p_pcb->state, p_pcb->handle);
+    APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: max_sess:%d, curr_sess:%d, p_pcb:%p, user:"
+            "%p, state:%d, jv handle: 0x%x" ,p_cb->max_sess, p_cb->curr_sess, p_pcb,
+            p_pcb->user_data, p_pcb->state, p_pcb->handle);
 
     if (p_cb->curr_sess <= 0)
         return BTA_JV_SUCCESS;
@@ -295,33 +295,33 @@
     {
     case BTA_JV_ST_CL_CLOSING:
     case BTA_JV_ST_SR_CLOSING:
-        APPL_TRACE_WARNING4("bta_jv_free_sr_rfc_cb: return on closing, port state:%d, "
-                "scn:%d, p_pcb:%p, user_data:%d", p_pcb->state, p_cb->scn, p_pcb,
-                (int)p_pcb->user_data);
+        APPL_TRACE_WARNING("bta_jv_free_sr_rfc_cb: return on closing, port state:%d, "
+                "scn:%d, p_pcb:%p, user_data:%p", p_pcb->state, p_cb->scn, p_pcb,
+                p_pcb->user_data);
         status = BTA_JV_FAILURE;
         return status;
     case BTA_JV_ST_CL_OPEN:
     case BTA_JV_ST_CL_OPENING:
-        APPL_TRACE_DEBUG3("bta_jv_free_sr_rfc_cb: state: %d, scn:%d,"
-                          " user_data:%d", p_pcb->state, p_cb->scn, (int)p_pcb->user_data);
+        APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: %d, scn:%d,"
+                          " user_data:%p", p_pcb->state, p_cb->scn, p_pcb->user_data);
         p_pcb->state = BTA_JV_ST_CL_CLOSING;
         break;
     case BTA_JV_ST_SR_LISTEN:
         p_pcb->state = BTA_JV_ST_SR_CLOSING;
         remove_server = TRUE;
-        APPL_TRACE_DEBUG2("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_LISTEN, scn:%d,"
-                " user_data:%d", p_cb->scn, (int)p_pcb->user_data);
+        APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_LISTEN, scn:%d,"
+                " user_data:%p", p_cb->scn, p_pcb->user_data);
         break;
     case BTA_JV_ST_SR_OPEN:
         p_pcb->state = BTA_JV_ST_SR_CLOSING;
-        APPL_TRACE_DEBUG2("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_OPEN, scn:%d,"
-                " user_data:%d", p_cb->scn, (int)p_pcb->user_data);
+        APPL_TRACE_DEBUG("bta_jv_free_sr_rfc_cb: state: BTA_JV_ST_SR_OPEN, scn:%d,"
+                " user_data:%p", p_cb->scn, p_pcb->user_data);
         break;
     default:
-        APPL_TRACE_WARNING6("bta_jv_free_sr_rfc_cb():failed, ignore port state:%d, scn:"
-                "%d, p_pcb:%p, jv handle: 0x%x, port_handle: %d, user_data:%d",
+        APPL_TRACE_WARNING("bta_jv_free_sr_rfc_cb():failed, ignore port state:%d, scn:"
+                "%d, p_pcb:%p, jv handle: 0x%x, port_handle: %d, user_data:%p",
                 p_pcb->state, p_cb->scn, p_pcb, p_pcb->handle, p_pcb->port_handle,
-                (int)p_pcb->user_data);
+                p_pcb->user_data);
         status = BTA_JV_FAILURE;
         break;
     }
@@ -336,7 +336,7 @@
         if (port_status != PORT_SUCCESS)
         {
             status = BTA_JV_FAILURE;
-            APPL_TRACE_WARNING5("bta_jv_free_rfc_cb(jv handle: 0x%x, state %d)::"
+            APPL_TRACE_WARNING("bta_jv_free_rfc_cb(jv handle: 0x%x, state %d)::"
                     "port_status: %d, port_handle: %d, close_pending: %d:Remove",
                     p_pcb->handle, p_pcb->state, port_status, p_pcb->port_handle,
                     close_pending);
@@ -449,7 +449,7 @@
 {
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_PM_CB  **p_cb;
-    int i;
+    int i, j, bd_counter = 0, appid_counter = 0;
 
     for (i = 0; i < BTA_JV_PM_MAX_NUM; i++)
     {
@@ -457,10 +457,31 @@
         if ((bta_jv_cb.pm_cb[i].state != BTA_JV_PM_FREE_ST) &&
                 (jv_handle == bta_jv_cb.pm_cb[i].handle))
         {
-            APPL_TRACE_API3("bta_jv_free_set_pm_profile_cb(jv_handle: 0x%2x), idx: %d, "
-                    "app_id: 0x%x", jv_handle, i, bta_jv_cb.pm_cb[i].app_id);
+            for (j = 0; j < BTA_JV_PM_MAX_NUM; j++)
+            {
+                if (bdcmp(bta_jv_cb.pm_cb[j].peer_bd_addr, bta_jv_cb.pm_cb[i].peer_bd_addr) == 0)
+                    bd_counter++;
+                if (bta_jv_cb.pm_cb[j].app_id == bta_jv_cb.pm_cb[i].app_id)
+                    appid_counter++;
+            }
 
-            bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], TRUE);
+            APPL_TRACE_API("bta_jv_free_set_pm_profile_cb(jv_handle: 0x%2x), idx: %d, "
+                    "app_id: 0x%x", jv_handle, i, bta_jv_cb.pm_cb[i].app_id);
+            APPL_TRACE_API("bta_jv_free_set_pm_profile_cb, bd_counter = %d, "
+                    "appid_counter = %d", bd_counter, appid_counter);
+            if (bd_counter > 1)
+            {
+                bta_jv_pm_conn_idle(&bta_jv_cb.pm_cb[i]);
+            }
+
+            if (bd_counter <= 1 || (appid_counter <= 1))
+            {
+                bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], TRUE);
+            }
+            else
+            {
+                bta_jv_clear_pm_cb(&bta_jv_cb.pm_cb[i], FALSE);
+            }
 
             if (BTA_JV_RFCOMM_MASK & jv_handle)
             {
@@ -473,7 +494,7 @@
                     if (p_pcb)
                     {
                         if (NULL == p_pcb->p_pm_cb)
-                            APPL_TRACE_WARNING3("bta_jv_free_set_pm_profile_cb(jv_handle:"
+                            APPL_TRACE_WARNING("bta_jv_free_set_pm_profile_cb(jv_handle:"
                                     " 0x%x):port_handle: 0x%x, p_pm_cb: %d: no link to "
                                     "pm_cb?", jv_handle, p_pcb->port_handle, i);
                         p_cb = &p_pcb->p_pm_cb;
@@ -486,7 +507,7 @@
                 {
                     tBTA_JV_L2C_CB *p_l2c_cb = &bta_jv_cb.l2c_cb[jv_handle];
                     if (NULL == p_l2c_cb->p_pm_cb)
-                        APPL_TRACE_WARNING2("bta_jv_free_set_pm_profile_cb(jv_handle: "
+                        APPL_TRACE_WARNING("bta_jv_free_set_pm_profile_cb(jv_handle: "
                                 "0x%x): p_pm_cb: %d: no link to pm_cb?", jv_handle, i);
                     p_cb = &p_l2c_cb->p_pm_cb;
                 }
@@ -556,7 +577,7 @@
                     }
                 }
             }
-            APPL_TRACE_API5("bta_jv_alloc_set_pm_profile_cb(handle 0x%2x, app_id %d): "
+            APPL_TRACE_API("bta_jv_alloc_set_pm_profile_cb(handle 0x%2x, app_id %d): "
                     "idx: %d, (BTA_JV_PM_MAX_NUM: %d), pp_cb: 0x%x", jv_handle, app_id,
                     i, BTA_JV_PM_MAX_NUM, pp_cb);
             break;
@@ -572,7 +593,7 @@
         bta_jv_cb.pm_cb[i].state = BTA_JV_PM_IDLE_ST;
         return &bta_jv_cb.pm_cb[i];
     }
-    APPL_TRACE_WARNING2("bta_jv_alloc_set_pm_profile_cb(jv_handle: 0x%x, app_id: %d) "
+    APPL_TRACE_WARNING("bta_jv_alloc_set_pm_profile_cb(jv_handle: 0x%x, app_id: %d) "
             "return NULL", jv_handle, app_id);
     return (tBTA_JV_PM_CB *)NULL;
 }
@@ -736,7 +757,7 @@
 {
     UNUSED(p_data);
 
-    APPL_TRACE_ERROR0("bta_jv_disable not used");
+    APPL_TRACE_ERROR("bta_jv_disable not used");
 #if 0
     int i;
 
@@ -746,7 +767,7 @@
     {
         if(bta_jv_cb.sdp_handle[i])
         {
-            APPL_TRACE_DEBUG1( "delete SDP record: %d", bta_jv_cb.sdp_handle[i]);
+            APPL_TRACE_DEBUG( "delete SDP record: %d", bta_jv_cb.sdp_handle[i]);
             SDP_DeleteRecord(bta_jv_cb.sdp_handle[i]);
             bta_jv_cb.sdp_handle[i] = 0;
         }
@@ -757,7 +778,7 @@
     {
         if(bta_jv_cb.scn[i])
         {
-            APPL_TRACE_DEBUG1( "free scn: %d", (i+1));
+            APPL_TRACE_DEBUG( "free scn: %d", (i+1));
             BTM_FreeSCN((UINT8)(i+1));
             bta_jv_cb.scn[i] = FALSE;
         }
@@ -865,7 +886,7 @@
 {
 
     BTM_ReadRemoteDeviceName(p_data->get_rmt_name.bd_addr,
-        (tBTM_CMPL_CB *)bta_jv_get_remote_device_name_cback);
+        (tBTM_CMPL_CB *)bta_jv_get_remote_device_name_cback, BT_TRANSPORT_BR_EDR);
 }
 
 /*******************************************************************************
@@ -882,11 +903,16 @@
     tBTA_UTL_COD cod;
 
     /* set class of device */
-    /* BTA_JvSetServiceClass(UINT32 service) assumes that the service class passed to the API function as defined in the assigned number page.
-    For example: the object transfer bit is bit 20 of the 24-bit Class of device; the value of this bit is 0x00100000 (value 1)
-    Our btm_api.h defines this bit as #define BTM_COD_SERVICE_OBJ_TRANSFER        0x1000 // (value 2)
-    This reflects that the service class defined at btm is UINT16, which starts at bit 8 of the 24 bit Class of Device
-    The following statement converts from (value 1) into (value 2) */
+    /* 
+    BTA_JvSetServiceClass(UINT32 service) assumes that the service class passed to the
+    API function as defined in the assigned number page.
+    For example: the object transfer bit is bit 20 of the 24-bit Class of device;
+    the value of this bit is 0x00100000 (value 1)
+    Our btm_api.h defines this bit as #define BTM_COD_SERVICE_OBJ_TRANSFER        0x1000  (value 2)
+    This reflects that the service class defined at btm is UINT16,
+    which starts at bit 8 of the 24 bit Class of Device
+    The following statement converts from (value 1) into (value 2)
+    */
     cod.service = (p_data->set_service.service >> 8);
     utl_set_device_class(&cod, BTA_UTL_SET_COD_SERVICE_CLASS);
 }
@@ -900,9 +926,11 @@
 ** Returns      void
 **
 *******************************************************************************/
-static void bta_jv_sec_cback (BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+static void bta_jv_sec_cback (BD_ADDR bd_addr, tBTA_TRANSPORT transport,
+                                    void *p_ref_data, tBTM_STATUS result)
 {
     UNUSED(p_ref_data);
+    UNUSED(transport);
 
     tBTA_JV_SET_ENCRYPTION  set_enc;
     if(bta_jv_cb.p_dm_cback)
@@ -926,7 +954,7 @@
 *******************************************************************************/
 void bta_jv_set_encryption(tBTA_JV_MSG *p_data)
 {
-    BTM_SetEncryption(p_data->set_encrypt.bd_addr, bta_jv_sec_cback, NULL);
+    BTM_SetEncryption(p_data->set_encrypt.bd_addr, BTA_TRANSPORT_BR_EDR, bta_jv_sec_cback, NULL);
 }
 
 /*******************************************************************************
@@ -977,7 +1005,7 @@
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
 
     logu("in, uuid:", u->uu.uuid128);
-    APPL_TRACE_DEBUG1("uuid len:%d", u->len);
+    APPL_TRACE_DEBUG("uuid len:%d", u->len);
     if(u->len == 16)
     {
         if(memcmp(&u->uu.uuid128[4], &bt_base_uuid[4], 12) == 0)
@@ -990,7 +1018,7 @@
                 uint16_t u16;
                 memcpy(&u16, &u->uu.uuid128[2], sizeof(u16));
                 su.uu.uuid16 = ntohs(u16);
-                APPL_TRACE_DEBUG1("shorten to 16 bits uuid: %x", su.uu.uuid16);
+                APPL_TRACE_DEBUG("shorten to 16 bits uuid: %x", su.uu.uuid16);
             }
             else
             {
@@ -998,12 +1026,12 @@
                 uint32_t u32;
                 memcpy(&u32, &u->uu.uuid128[0], sizeof(u32));
                 su.uu.uuid32 = ntohl(u32);
-                APPL_TRACE_DEBUG1("shorten to 32 bits uuid: %x", su.uu.uuid32);
+                APPL_TRACE_DEBUG("shorten to 32 bits uuid: %x", su.uu.uuid32);
             }
             return su;
         }
     }
-    APPL_TRACE_DEBUG0("cannot shorten none-reserved 128 bits uuid");
+    APPL_TRACE_DEBUG("cannot shorten none-reserved 128 bits uuid");
     return *u;
 }
 
@@ -1021,14 +1049,14 @@
     tBTA_JV_STATUS status;
     UINT8          old_sdp_act = bta_jv_cb.sdp_active;
 
-    APPL_TRACE_DEBUG1("bta_jv_start_discovery_cback res: 0x%x", result);
+    APPL_TRACE_DEBUG("bta_jv_start_discovery_cback res: 0x%x", result);
 
     bta_jv_cb.sdp_active = BTA_JV_SDP_ACT_NONE;
     if(bta_jv_cb.p_dm_cback)
     {
         if (old_sdp_act == BTA_JV_SDP_ACT_CANCEL)
         {
-            APPL_TRACE_DEBUG0("BTA_JV_SDP_ACT_CANCEL");
+            APPL_TRACE_DEBUG("BTA_JV_SDP_ACT_CANCEL");
             status = BTA_JV_SUCCESS;
             bta_jv_cb.p_dm_cback(BTA_JV_CANCEL_DISCVRY_EVT, (tBTA_JV *)&status, user_data);
         }
@@ -1045,7 +1073,7 @@
                 tBT_UUID su = shorten_sdp_uuid(&bta_jv_cb.uuid);
                 logu("shorten uuid:", su.uu.uuid128);
                 p_sdp_rec = SDP_FindServiceUUIDInDb(p_bta_jv_cfg->p_sdp_db, &su, p_sdp_rec);
-                APPL_TRACE_DEBUG1("p_sdp_rec:%p", p_sdp_rec);
+                APPL_TRACE_DEBUG("p_sdp_rec:%p", p_sdp_rec);
                 if(p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
                 {
                     dcomp.scn = (UINT8) pe.params[0];
@@ -1073,7 +1101,7 @@
 void bta_jv_start_discovery(tBTA_JV_MSG *p_data)
 {
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
-    APPL_TRACE_DEBUG1("bta_jv_start_discovery in, sdp_active:%d", bta_jv_cb.sdp_active);
+    APPL_TRACE_DEBUG("bta_jv_start_discovery in, sdp_active:%d", bta_jv_cb.sdp_active);
     if (bta_jv_cb.sdp_active != BTA_JV_SDP_ACT_NONE)
     {
         /* SDP is still in progress */
@@ -1091,7 +1119,7 @@
     }
 */
     /* init the database/set up the filter */
-    APPL_TRACE_DEBUG1("call SDP_InitDiscoveryDb, p_data->start_discovery.num_uuid:%d",
+    APPL_TRACE_DEBUG("call SDP_InitDiscoveryDb, p_data->start_discovery.num_uuid:%d",
         p_data->start_discovery.num_uuid);
     SDP_InitDiscoveryDb (p_bta_jv_cfg->p_sdp_db, p_bta_jv_cfg->sdp_db_size,
                     p_data->start_discovery.num_uuid, p_data->start_discovery.uuid_list, 0, NULL);
@@ -1240,7 +1268,7 @@
                 bta_jv_cb.sel_len = len;
                 serv_sel.service_len = len;
                 bdcpy(serv_sel.bd_addr, p_rec->remote_bd_addr);
-                APPL_TRACE_DEBUG1( "bta_jv_service_select found uuid: 0x%x",
+                APPL_TRACE_DEBUG( "bta_jv_service_select found uuid: 0x%x",
                     p_data->service_select.uuid);
                 break;
             }
@@ -1258,7 +1286,7 @@
             p_tmp = p_tmp->p_next_rec;
         } /* end of while */
     }
-    APPL_TRACE_DEBUG1( "service_len: %d", serv_sel.service_len);
+    APPL_TRACE_DEBUG( "service_len: %d", serv_sel.service_len);
     if(bta_jv_cb.p_dm_cback)
         bta_jv_cb.p_dm_cback(BTA_JV_SERVICE_SEL_EVT, (tBTA_JV *)&serv_sel);
 #endif
@@ -1378,7 +1406,7 @@
         ptr = aa->p_value;
         type = *ptr;
         next_ptr = sdpu_get_len_from_type(ptr + 1, *ptr, &len);
-        APPL_TRACE_DEBUG3( "bta_jv_add_attribute: ptr chg:%d len:%d, size:%d",
+        APPL_TRACE_DEBUG( "bta_jv_add_attribute: ptr chg:%d len:%d, size:%d",
             (next_ptr - ptr), len, aa->value_size);
         if(ATTR_ID_SERVICE_RECORD_HDL != aa->attr_id && /* do not allow the SDP record handle to be updated */
             ((INT32)(next_ptr - ptr + len) == aa->value_size) && /* double check data size */
@@ -1447,65 +1475,6 @@
     }
 }
 
-/*******************************************************************************
-**
-** Function     bta_jv_l2cap_client_cback
-**
-** Description  handles the l2cap client events
-**
-** Returns      void
-**
-*******************************************************************************/
-static void bta_jv_l2cap_client_cback(UINT16 gap_handle, UINT16 event)
-{
-    UNUSED(gap_handle);
-    UNUSED(event);
-#if 0
-    tBTA_JV_L2C_CB  *p_cb = &bta_jv_cb.l2c_cb[gap_handle];
-    tBTA_JV     evt_data;
-
-    if(gap_handle >= BTA_JV_MAX_L2C_CONN && !p_cb->p_cback)
-        return;
-
-    APPL_TRACE_DEBUG2( "bta_jv_l2cap_client_cback: %d evt:x%x",
-        gap_handle, event);
-    evt_data.l2c_open.status = BTA_JV_SUCCESS;
-    evt_data.l2c_open.handle = gap_handle;
-    switch (event)
-    {
-    case GAP_EVT_CONN_OPENED:
-        bdcpy(evt_data.l2c_open.rem_bda, GAP_ConnGetRemoteAddr(gap_handle));
-        evt_data.l2c_open.tx_mtu = GAP_ConnGetRemMtuSize(gap_handle);
-        p_cb->state = BTA_JV_ST_CL_OPEN;
-        p_cb->p_cback(BTA_JV_L2CAP_OPEN_EVT, &evt_data);
-        break;
-
-    case GAP_EVT_CONN_CLOSED:
-        p_cb->state = BTA_JV_ST_NONE;
-        bta_jv_free_sec_id(&p_cb->sec_id);
-        evt_data.l2c_close.async = TRUE;
-        p_cb->p_cback(BTA_JV_L2CAP_CLOSE_EVT, &evt_data);
-        p_cb->p_cback = NULL;
-        break;
-
-    case GAP_EVT_CONN_DATA_AVAIL:
-        evt_data.handle = gap_handle;
-        p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
-        break;
-
-    case GAP_EVT_CONN_CONGESTED:
-    case GAP_EVT_CONN_UNCONGESTED:
-        p_cb->cong = (event == GAP_EVT_CONN_CONGESTED) ? TRUE : FALSE;
-        evt_data.l2c_cong.cong = p_cb->cong;
-        p_cb->p_cback(BTA_JV_L2CAP_CONG_EVT, &evt_data);
-        break;
-
-    default:
-        break;
-    }
-#endif
-}
-
 #if SDP_FOR_JV_INCLUDED == TRUE
 /*******************************************************************************
 **
@@ -1521,7 +1490,7 @@
     tBTA_JV evt_data;
     tBTA_JV_L2C_CB  *p_cb = &bta_jv_cb.l2c_cb[BTA_JV_L2C_FOR_SDP_HDL];
 
-    APPL_TRACE_DEBUG2( "bta_jv_sdp_res_cback: %d evt:x%x",
+    APPL_TRACE_DEBUG( "bta_jv_sdp_res_cback: %d evt:x%x",
         bta_jv_cb.sdp_for_jv, event);
 
     if(!bta_jv_cb.sdp_for_jv)
@@ -1541,7 +1510,7 @@
     case SDP_EVT_DATA_IND:
         evt_data.handle = BTA_JV_L2C_FOR_SDP_HDL;
         memcpy(p_bta_jv_cfg->p_sdp_raw_data, p_data->data.p_data, p_data->data.data_len);
-        APPL_TRACE_DEBUG2( "data size: %d/%d ", bta_jv_cb.sdp_data_size, p_data->data.data_len);
+        APPL_TRACE_DEBUG( "data size: %d/%d ", bta_jv_cb.sdp_data_size, p_data->data.data_len);
         bta_jv_cb.sdp_data_size = p_data->data.data_len;
         p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
         break;
@@ -1561,7 +1530,7 @@
 {
     tBTA_JV_L2CAP_CLOSE close;
     tBTA_JV_L2C_CB  *p_cb = &bta_jv_cb.l2c_cb[BTA_JV_L2C_FOR_SDP_HDL];
-    APPL_TRACE_DEBUG1( "bta_jv_sdp_cback: result:x%x", result);
+    APPL_TRACE_DEBUG( "bta_jv_sdp_cback: result:x%x", result);
 
     if(p_cb->p_cback)
     {
@@ -1678,68 +1647,7 @@
     if (p_cback)
         p_cback(BTA_JV_L2CAP_CLOSE_EVT, (tBTA_JV *)&evt_data);
     else
-        APPL_TRACE_ERROR0("### NO CALLBACK SET !!! ###");
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         bta_jv_l2cap_server_cback
-**
-** Description      handles the l2cap server callback
-**
-** Returns          void
-**
-*******************************************************************************/
-static void bta_jv_l2cap_server_cback(UINT16 gap_handle, UINT16 event)
-{
-    UNUSED(gap_handle);
-    UNUSED(event);
-#if 0
-    tBTA_JV_L2C_CB  *p_cb = &bta_jv_cb.l2c_cb[gap_handle];
-    tBTA_JV evt_data;
-    tBTA_JV_L2CAP_CBACK *p_cback;
-
-    if(gap_handle >= BTA_JV_MAX_L2C_CONN && !p_cb->p_cback)
-        return;
-
-    APPL_TRACE_DEBUG2( "bta_jv_l2cap_server_cback: %d evt:x%x",
-        gap_handle, event);
-    evt_data.l2c_open.status = BTA_JV_SUCCESS;
-    evt_data.l2c_open.handle = gap_handle;
-
-    switch (event)
-    {
-    case GAP_EVT_CONN_OPENED:
-        bdcpy(evt_data.l2c_open.rem_bda, GAP_ConnGetRemoteAddr(gap_handle));
-        evt_data.l2c_open.tx_mtu = GAP_ConnGetRemMtuSize(gap_handle);
-        p_cb->state = BTA_JV_ST_SR_OPEN;
-        p_cb->p_cback(BTA_JV_L2CAP_OPEN_EVT, &evt_data);
-        break;
-
-    case GAP_EVT_CONN_CLOSED:
-        evt_data.l2c_close.async = TRUE;
-        evt_data.l2c_close.handle = p_cb->handle;
-        p_cback = p_cb->p_cback;
-        evt_data.l2c_close.status = bta_jv_free_l2c_cb(p_cb);
-        p_cback(BTA_JV_L2CAP_CLOSE_EVT, &evt_data);
-        break;
-
-    case GAP_EVT_CONN_DATA_AVAIL:
-        evt_data.handle = gap_handle;
-        p_cb->p_cback(BTA_JV_L2CAP_DATA_IND_EVT, &evt_data);
-        break;
-
-    case GAP_EVT_CONN_CONGESTED:
-    case GAP_EVT_CONN_UNCONGESTED:
-        p_cb->cong = (event == GAP_EVT_CONN_CONGESTED) ? TRUE : FALSE;
-        evt_data.l2c_cong.cong = p_cb->cong;
-        p_cb->p_cback(BTA_JV_L2CAP_CONG_EVT, &evt_data);
-        break;
-
-    default:
-        break;
-    }
+        APPL_TRACE_ERROR("### NO CALLBACK SET !!! ###");
 #endif
 }
 
@@ -1964,7 +1872,7 @@
     tBTA_JV_RFC_CB  *p_cb = bta_jv_rfc_port_to_cb(port_handle);
     tBTA_JV_PCB     *p_pcb = bta_jv_rfc_port_to_pcb(port_handle);
     int ret = 0;
-    APPL_TRACE_DEBUG4("bta_jv_port_data_co_cback, p_cb:%p, p_pcb:%p, len:%d, type:%d",
+    APPL_TRACE_DEBUG("bta_jv_port_data_co_cback, p_cb:%p, p_pcb:%p, len:%d, type:%d",
                         p_cb, p_pcb, len, type);
     if (p_pcb != NULL)
     {
@@ -1980,7 +1888,7 @@
             case DATA_CO_CALLBACK_TYPE_OUTGOING:
                 return bta_co_rfc_data_outgoing(p_pcb->user_data, buf, len);
             default:
-                APPL_TRACE_ERROR1("unknown callout type:%d", type);
+                APPL_TRACE_ERROR("unknown callout type:%d", type);
                 break;
         }
     }
@@ -2006,11 +1914,11 @@
     UINT16 lcid;
     tBTA_JV_RFCOMM_CBACK *p_cback;  /* the callback function */
 
-    APPL_TRACE_DEBUG2( "bta_jv_port_mgmt_cl_cback:code:%d, port_handle%d", code, port_handle);
+    APPL_TRACE_DEBUG( "bta_jv_port_mgmt_cl_cback:code:%d, port_handle%d", code, port_handle);
     if(NULL == p_cb || NULL == p_cb->p_cback)
         return;
 
-    APPL_TRACE_DEBUG3( "bta_jv_port_mgmt_cl_cback code=%d port_handle:%d handle:%d",
+    APPL_TRACE_DEBUG( "bta_jv_port_mgmt_cl_cback code=%d port_handle:%d handle:%d",
         code, port_handle, p_cb->handle);
 
     PORT_CheckConnection(port_handle, rem_bda, &lcid);
@@ -2057,11 +1965,11 @@
     tBTA_JV_PCB     *p_pcb = bta_jv_rfc_port_to_pcb(port_handle);
     tBTA_JV evt_data;
 
-    APPL_TRACE_DEBUG1( "bta_jv_port_event_cl_cback:%d", port_handle);
+    APPL_TRACE_DEBUG( "bta_jv_port_event_cl_cback:%d", port_handle);
     if(NULL == p_cb || NULL == p_cb->p_cback)
         return;
 
-    APPL_TRACE_DEBUG3( "bta_jv_port_event_cl_cback code=x%x port_handle:%d handle:%d",
+    APPL_TRACE_DEBUG( "bta_jv_port_event_cl_cback code=x%x port_handle:%d handle:%d",
         code, port_handle, p_cb->handle);
     if (code & PORT_EV_RXCHAR)
     {
@@ -2116,14 +2024,14 @@
                 BTM_SEC_PROTO_RFCOMM, cc->remote_scn) == FALSE)
     {
         evt_data.status = BTA_JV_FAILURE;
-        APPL_TRACE_ERROR2("sec_id:%d is zero or BTM_SetSecurityLevel failed, remote_scn:%d", sec_id, cc->remote_scn);
+        APPL_TRACE_ERROR("sec_id:%d is zero or BTM_SetSecurityLevel failed, remote_scn:%d", sec_id, cc->remote_scn);
     }
 
     if (evt_data.status == BTA_JV_SUCCESS &&
         RFCOMM_CreateConnection(UUID_SERVCLASS_SERIAL_PORT, cc->remote_scn, FALSE,
         BTA_JV_DEF_RFC_MTU, cc->peer_bd_addr, &handle, bta_jv_port_mgmt_cl_cback) != PORT_SUCCESS)
     {
-        APPL_TRACE_ERROR0("bta_jv_rfcomm_connect, RFCOMM_CreateConnection failed");
+        APPL_TRACE_ERROR("bta_jv_rfcomm_connect, RFCOMM_CreateConnection failed");
         evt_data.status = BTA_JV_FAILURE;
     }
     if (evt_data.status == BTA_JV_SUCCESS)
@@ -2155,7 +2063,7 @@
         else
         {
             evt_data.status = BTA_JV_FAILURE;
-            APPL_TRACE_ERROR0("run out of rfc control block");
+            APPL_TRACE_ERROR("run out of rfc control block");
         }
     }
     cc->p_cback(BTA_JV_RFCOMM_CL_INIT_EVT, (tBTA_JV *)&evt_data, cc->user_data);
@@ -2181,13 +2089,13 @@
         {
             *pcb = &bta_jv_cb.port_cb[i];
             *cb = &bta_jv_cb.rfc_cb[rfc_handle - 1];
-            APPL_TRACE_DEBUG4("find_rfc_pcb(): FOUND rfc_cb_handle 0x%x, port.jv_handle:"
+            APPL_TRACE_DEBUG("find_rfc_pcb(): FOUND rfc_cb_handle 0x%x, port.jv_handle:"
                     " 0x%x, state: %d, rfc_cb->handle: 0x%x", rfc_handle, (*pcb)->handle,
                     (*pcb)->state, (*cb)->handle);
             return 1;
         }
     }
-    APPL_TRACE_DEBUG1("find_rfc_pcb: cannot find rfc_cb from user data:%d", (UINT32)user_data);
+    APPL_TRACE_DEBUG("find_rfc_pcb: cannot find rfc_cb from user data:%d", (UINT32)user_data);
     return 0;
 }
 
@@ -2205,10 +2113,10 @@
     tBTA_JV_API_RFCOMM_CLOSE *cc = &(p_data->rfcomm_close);
     tBTA_JV_RFC_CB           *p_cb = NULL;
     tBTA_JV_PCB              *p_pcb = NULL;
-    APPL_TRACE_DEBUG1("bta_jv_rfcomm_close, rfc handle:%d", cc->handle);
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_close, rfc handle:%d", cc->handle);
     if (!cc->handle)
     {
-        APPL_TRACE_ERROR0("bta_jv_rfcomm_close, rfc handle is null");
+        APPL_TRACE_ERROR("bta_jv_rfcomm_close, rfc handle is null");
         return;
     }
 
@@ -2216,45 +2124,12 @@
     if (!find_rfc_pcb(user_data, &p_cb, &p_pcb))
         return;
     bta_jv_free_rfc_cb(p_cb, p_pcb);
-    APPL_TRACE_DEBUG2("bta_jv_rfcomm_close: sec id in use:%d, rfc_cb in use:%d",
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_close: sec id in use:%d, rfc_cb in use:%d",
                 get_sec_id_used(), get_rfc_cb_used());
 }
 
 /*******************************************************************************
 **
-** Function     bta_jv_get_num_rfc_listen
-**
-** Description  when a RFCOMM connection goes down, make sure that there's only
-**              one port stays listening on this scn.
-**
-** Returns
-**
-*******************************************************************************/
-static UINT8 bta_jv_get_num_rfc_listen(tBTA_JV_RFC_CB *p_cb)
-{
-    UINT8   i, listen=1;
-    tBTA_JV_PCB *p_pcb;
-
-    if (p_cb->max_sess > 1)
-    {
-        listen = 0;
-        for (i=0; i<p_cb->max_sess; i++)
-        {
-            if (p_cb->rfc_hdl[i] != 0)
-            {
-                p_pcb = &bta_jv_cb.port_cb[p_cb->rfc_hdl[i] - 1];
-                if (BTA_JV_ST_SR_LISTEN == p_pcb->state)
-                {
-                    listen++;
-                }
-            }
-        }
-    }
-    return listen;
-}
-
-/*******************************************************************************
-**
 ** Function     bta_jv_port_mgmt_sr_cback
 **
 ** Description  callback for port mamangement function of rfcomm
@@ -2272,15 +2147,15 @@
     UINT16 lcid;
     UINT8  num;
     UINT32  si;
-    APPL_TRACE_DEBUG2("bta_jv_port_mgmt_sr_cback, code:%d, port_handle:%d", code, port_handle);
+    APPL_TRACE_DEBUG("bta_jv_port_mgmt_sr_cback, code:%d, port_handle:%d", code, port_handle);
     if(NULL == p_cb || NULL == p_cb->p_cback)
     {
-        APPL_TRACE_ERROR2("bta_jv_port_mgmt_sr_cback, p_cb:%p, p_cb->p_cback%p",
+        APPL_TRACE_ERROR("bta_jv_port_mgmt_sr_cback, p_cb:%p, p_cb->p_cback%p",
                 p_cb, p_cb ? p_cb->p_cback : NULL);
         return;
     }
     void *user_data = p_pcb->user_data;
-    APPL_TRACE_DEBUG5( "bta_jv_port_mgmt_sr_cback code=%d port_handle:0x%x handle:0x%x, p_pcb:%p, user:%d",
+    APPL_TRACE_DEBUG( "bta_jv_port_mgmt_sr_cback code=%d port_handle:0x%x handle:0x%x, p_pcb:%p, user:%d",
         code, port_handle, p_cb->handle, p_pcb, p_pcb->user_data);
 
     PORT_CheckConnection(port_handle, rem_bda, &lcid);
@@ -2295,11 +2170,11 @@
         {
             evt_data.rfc_srv_open.new_listen_handle = p_pcb_new_listen->handle;
             p_pcb_new_listen->user_data = p_cb->p_cback(BTA_JV_RFCOMM_SRV_OPEN_EVT, &evt_data, user_data);
-            APPL_TRACE_DEBUG2("PORT_SUCCESS: curr_sess:%d, max_sess:%d", p_cb->curr_sess, p_cb->max_sess);
+            APPL_TRACE_DEBUG("PORT_SUCCESS: curr_sess:%d, max_sess:%d", p_cb->curr_sess, p_cb->max_sess);
             failed = FALSE;
         }
         else
-            APPL_TRACE_ERROR0("bta_jv_add_rfc_port failed to create new listen port");
+            APPL_TRACE_ERROR("bta_jv_add_rfc_port failed to create new listen port");
     }
     if (failed)
     {
@@ -2310,7 +2185,7 @@
         p_pcb->cong = FALSE;
 
         tBTA_JV_RFCOMM_CBACK    *p_cback = p_cb->p_cback;
-        APPL_TRACE_DEBUG2("PORT_CLOSED before BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
+        APPL_TRACE_DEBUG("PORT_CLOSED before BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
                             p_cb->curr_sess, p_cb->max_sess);
         if(BTA_JV_ST_SR_CLOSING == p_pcb->state)
         {
@@ -2321,7 +2196,7 @@
         p_cback(BTA_JV_RFCOMM_CLOSE_EVT, &evt_data, user_data);
         //bta_jv_free_rfc_cb(p_cb, p_pcb);
 
-        APPL_TRACE_DEBUG2("PORT_CLOSED after BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
+        APPL_TRACE_DEBUG("PORT_CLOSED after BTA_JV_RFCOMM_CLOSE_EVT: curr_sess:%d, max_sess:%d",
                 p_cb->curr_sess, p_cb->max_sess);
      }
 }
@@ -2344,7 +2219,7 @@
     if(NULL == p_cb || NULL == p_cb->p_cback)
         return;
 
-    APPL_TRACE_DEBUG3( "bta_jv_port_event_sr_cback code=x%x port_handle:%d handle:%d",
+    APPL_TRACE_DEBUG( "bta_jv_port_event_sr_cback code=x%x port_handle:%d handle:%d",
         code, port_handle, p_cb->handle);
 
     void *user_data = p_pcb->user_data;
@@ -2397,14 +2272,14 @@
                     listen++;
                     if(p_pcb_open == p_pcb)
                     {
-                        APPL_TRACE_DEBUG1("bta_jv_add_rfc_port, port_handle:%d, change the listen port to open state",
+                        APPL_TRACE_DEBUG("bta_jv_add_rfc_port, port_handle:%d, change the listen port to open state",
                                               p_pcb->port_handle);
                         p_pcb->state = BTA_JV_ST_SR_OPEN;
 
                     }
                     else
                     {
-                        APPL_TRACE_ERROR3("bta_jv_add_rfc_port, open pcb not matching listen one,"
+                        APPL_TRACE_ERROR("bta_jv_add_rfc_port, open pcb not matching listen one,"
                             "listen count:%d, listen pcb handle:%d, open pcb:%d",
                                listen, p_pcb->port_handle, p_pcb_open->handle);
                         return NULL;
@@ -2418,7 +2293,7 @@
             }
         }
 
-        APPL_TRACE_DEBUG5("bta_jv_add_rfc_port max_sess=%d used:%d curr_sess:%d, listen:%d si:%d",
+        APPL_TRACE_DEBUG("bta_jv_add_rfc_port max_sess=%d used:%d curr_sess:%d, listen:%d si:%d",
                     p_cb->max_sess, used, p_cb->curr_sess, listen, si);
         if (used < p_cb->max_sess && listen == 1 && si)
         {
@@ -2444,14 +2319,14 @@
 FALSE-POSITIVE: port_state is initialized at PORT_GetState() */
                 PORT_SetState(p_pcb->port_handle, &port_state);
                 p_pcb->handle = BTA_JV_RFC_H_S_TO_HDL(p_cb->handle, si);
-                APPL_TRACE_DEBUG2("bta_jv_add_rfc_port: p_pcb->handle:0x%x, curr_sess:%d",
+                APPL_TRACE_DEBUG("bta_jv_add_rfc_port: p_pcb->handle:0x%x, curr_sess:%d",
                                     p_pcb->handle, p_cb->curr_sess);
             }
         }
         else
-            APPL_TRACE_ERROR0("bta_jv_add_rfc_port, cannot create new rfc listen port");
+            APPL_TRACE_ERROR("bta_jv_add_rfc_port, cannot create new rfc listen port");
     }
-    APPL_TRACE_DEBUG2("bta_jv_add_rfc_port: sec id in use:%d, rfc_cb in use:%d",
+    APPL_TRACE_DEBUG("bta_jv_add_rfc_port: sec id in use:%d, rfc_cb in use:%d",
                 get_sec_id_used(), get_rfc_cb_used());
     return p_pcb;
 }
@@ -2480,7 +2355,7 @@
     L2CA_SetDesireRole(rs->role);
     */
     evt_data.status = BTA_JV_FAILURE;
-    APPL_TRACE_DEBUG2("bta_jv_rfcomm_start_server: sec id in use:%d, rfc_cb in use:%d",
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_start_server: sec id in use:%d, rfc_cb in use:%d",
                 get_sec_id_used(), get_rfc_cb_used());
 
     do
@@ -2491,14 +2366,14 @@
             BTM_SetSecurityLevel(FALSE, "JV PORT", sec_id,  rs->sec_mask,
                 BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, rs->local_scn) == FALSE)
         {
-            APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, run out of sec_id");
+            APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, run out of sec_id");
             break;
         }
 
         if (RFCOMM_CreateConnection(sec_id, rs->local_scn, TRUE,
             BTA_JV_DEF_RFC_MTU, (UINT8 *) bd_addr_any, &handle, bta_jv_port_mgmt_sr_cback) != PORT_SUCCESS)
         {
-            APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, RFCOMM_CreateConnection failed");
+            APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, RFCOMM_CreateConnection failed");
             break;
         }
 
@@ -2506,7 +2381,7 @@
         p_cb = bta_jv_alloc_rfc_cb(handle, &p_pcb);
         if(!p_cb)
         {
-            APPL_TRACE_ERROR0("bta_jv_rfcomm_start_server, run out of rfc control block");
+            APPL_TRACE_ERROR("bta_jv_rfcomm_start_server, run out of rfc control block");
             break;
         }
 
@@ -2561,19 +2436,19 @@
     tBTA_JV_API_RFCOMM_SERVER *ls = &(p_data->rfcomm_server);
     tBTA_JV_RFC_CB           *p_cb = NULL;
     tBTA_JV_PCB              *p_pcb = NULL;
-    APPL_TRACE_ERROR0("bta_jv_rfcomm_stop_server");
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server");
     if(!ls->handle)
     {
-        APPL_TRACE_ERROR0("bta_jv_rfcomm_stop_server, jv handle is null");
+        APPL_TRACE_ERROR("bta_jv_rfcomm_stop_server, jv handle is null");
         return;
     }
     void* user_data = ls->user_data;
     if(!find_rfc_pcb(user_data, &p_cb, &p_pcb))
         return;
-    APPL_TRACE_DEBUG2("bta_jv_rfcomm_stop_server: p_pcb:%p, p_pcb->port_handle:%d",
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server: p_pcb:%p, p_pcb->port_handle:%d",
                         p_pcb, p_pcb->port_handle);
     bta_jv_free_rfc_cb(p_cb, p_pcb);
-    APPL_TRACE_DEBUG2("bta_jv_rfcomm_stop_server: sec id in use:%d, rfc_cb in use:%d",
+    APPL_TRACE_DEBUG("bta_jv_rfcomm_stop_server: sec id in use:%d, rfc_cb in use:%d",
                 get_sec_id_used(), get_rfc_cb_used());
 }
 
@@ -2642,7 +2517,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("bta_jv_rfcomm_write :: WARNING ! No JV callback set");
+        APPL_TRACE_ERROR("bta_jv_rfcomm_write :: WARNING ! No JV callback set");
     }
 }
 
@@ -2660,7 +2535,7 @@
     tBTA_JV_STATUS status;
     tBTA_JV_PM_CB *p_cb;
 
-    APPL_TRACE_API3("bta_jv_set_pm_profile(handle: 0x%x, app_id: %d, init_st: %d)",
+    APPL_TRACE_API("bta_jv_set_pm_profile(handle: 0x%x, app_id: %d, init_st: %d)",
             p_data->set_pm.handle, p_data->set_pm.app_id, p_data->set_pm.init_st);
 
     /* clear PM control block */
@@ -2670,7 +2545,7 @@
 
         if (status != BTA_JV_SUCCESS)
         {
-            APPL_TRACE_WARNING1("bta_jv_set_pm_profile() free pm cb failed: reason %d",
+            APPL_TRACE_WARNING("bta_jv_set_pm_profile() free pm cb failed: reason %d",
                     status);
         }
     }
@@ -2682,7 +2557,7 @@
         if (NULL != p_cb)
             bta_jv_pm_state_change(p_cb, p_data->set_pm.init_st);
         else
-            APPL_TRACE_WARNING0("bta_jv_alloc_set_pm_profile_cb() failed");
+            APPL_TRACE_WARNING("bta_jv_alloc_set_pm_profile_cb() failed");
     }
 }
 
@@ -2726,7 +2601,7 @@
     if (NULL == p_cb)
         return status;
 
-    APPL_TRACE_API2("bta_jv_set_pm_conn_state(handle:0x%x, state: %d)", p_cb->handle,
+    APPL_TRACE_API("bta_jv_set_pm_conn_state(handle:0x%x, state: %d)", p_cb->handle,
             new_st);
     if ((p_msg = (tBTA_JV_API_PM_STATE_CHANGE *)GKI_getbuf(
             sizeof(tBTA_JV_API_PM_STATE_CHANGE))) != NULL)
@@ -2787,7 +2662,7 @@
  *******************************************************************************/
 static void bta_jv_pm_state_change(tBTA_JV_PM_CB *p_cb, const tBTA_JV_CONN_STATE state)
 {
-    APPL_TRACE_API5("bta_jv_pm_state_change(p_cb: 0x%x, handle: 0x%x, busy/idle_state: %d"
+    APPL_TRACE_API("bta_jv_pm_state_change(p_cb: 0x%x, handle: 0x%x, busy/idle_state: %d"
             ", app_id: %d, conn_state: %d)", p_cb, p_cb->handle, p_cb->state,
             p_cb->app_id, state);
 
@@ -2828,7 +2703,7 @@
         break;
 
     default:
-        APPL_TRACE_WARNING1("bta_jv_pm_state_change(state: %d): Invalid state", state);
+        APPL_TRACE_WARNING("bta_jv_pm_state_change(state: %d): Invalid state", state);
         break;
     }
 }
diff --git a/bta/jv/bta_jv_api.c b/bta/jv/bta_jv_api.c
index 16ab2d5..e0d100d 100644
--- a/bta/jv/bta_jv_api.c
+++ b/bta/jv/bta_jv_api.c
@@ -63,7 +63,7 @@
     tBTA_JV_API_ENABLE  *p_buf;
     int i;
 
-    APPL_TRACE_API0( "BTA_JvEnable");
+    APPL_TRACE_API( "BTA_JvEnable");
     if(p_cback && FALSE == bta_sys_is_register(BTA_ID_JV))
     {
         memset(&bta_jv_cb, 0, sizeof(tBTA_JV_CB));
@@ -74,9 +74,7 @@
         }
 
         /* register with BTA system manager */
-        GKI_sched_lock();
         bta_sys_register(BTA_ID_JV, &bta_jv_reg);
-        GKI_sched_unlock();
 
         if (p_cback && (p_buf = (tBTA_JV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_JV_API_ENABLE))) != NULL)
         {
@@ -88,7 +86,7 @@
     }
     else
       {
-         APPL_TRACE_ERROR0("JVenable fails");
+         APPL_TRACE_ERROR("JVenable fails");
       }
     return(status);
 }
@@ -106,7 +104,7 @@
 {
     BT_HDR  *p_buf;
 
-    APPL_TRACE_API0( "BTA_JvDisable");
+    APPL_TRACE_API( "BTA_JvDisable");
     bta_sys_deregister(BTA_ID_JV);
     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
@@ -149,7 +147,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_SET_DISCOVERABILITY *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvSetDiscoverability");
+    APPL_TRACE_API( "BTA_JvSetDiscoverability");
     if ((p_msg = (tBTA_JV_API_SET_DISCOVERABILITY *)GKI_getbuf(sizeof(tBTA_JV_MSG))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_SET_DISCOVERABILITY_EVT;
@@ -173,7 +171,7 @@
 *******************************************************************************/
 tBTA_JV_DISC BTA_JvGetDiscoverability(void)
 {
-    APPL_TRACE_API0( "BTA_JvGetDiscoverability");
+    APPL_TRACE_API( "BTA_JvGetDiscoverability");
     return BTM_ReadDiscoverability(0, 0);
 }
 
@@ -194,7 +192,7 @@
     tBTA_JV_STATUS ret = BTA_JV_FAILURE;
     BT_HDR *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvGetLocalDeviceAddr");
+    APPL_TRACE_API( "BTA_JvGetLocalDeviceAddr");
     if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
         p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_ADDR_EVT;
@@ -222,7 +220,7 @@
     tBTA_JV_STATUS ret = BTA_JV_FAILURE;
     BT_HDR *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvGetLocalDeviceName");
+    APPL_TRACE_API( "BTA_JvGetLocalDeviceName");
     if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
         p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_NAME_EVT;
@@ -250,7 +248,7 @@
     tBTA_JV_STATUS ret = BTA_JV_FAILURE;
     tBTA_JV_API_GET_REMOTE_NAME *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvGetRemoteDeviceName");
+    APPL_TRACE_API( "BTA_JvGetRemoteDeviceName");
     if ((p_msg = (tBTA_JV_API_GET_REMOTE_NAME *)GKI_getbuf(sizeof(tBTA_JV_API_GET_REMOTE_NAME))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_GET_REMOTE_DEVICE_NAME_EVT;
@@ -281,7 +279,7 @@
     UINT32  count = 0;
     INT32   ret = BTA_JV_INTERNAL_ERR;
 
-    APPL_TRACE_API0( "BTA_JvGetPreknownDevice");
+    APPL_TRACE_API( "BTA_JvGetPreknownDevice");
     p_info = BTM_InqFirstResult();
     if(p_info)
     {
@@ -348,7 +346,7 @@
 *******************************************************************************/
 UINT8 * BTA_JvGetDeviceClass(void)
 {
-    APPL_TRACE_API0( "BTA_JvGetDeviceClass");
+    APPL_TRACE_API( "BTA_JvGetDeviceClass");
     return BTM_ReadDeviceClass();
 }
 
@@ -367,7 +365,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_SET_SERVICE_CLASS *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvSetServiceClass");
+    APPL_TRACE_API( "BTA_JvSetServiceClass");
     if ((p_msg = (tBTA_JV_API_SET_SERVICE_CLASS *)GKI_getbuf(sizeof(tBTA_JV_API_SET_SERVICE_CLASS))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_SET_SERVICE_CLASS_EVT;
@@ -397,7 +395,7 @@
     tBTA_JV_STATUS ret = BTA_JV_FAILURE;
     tBTA_JV_API_SET_ENCRYPTION *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvSetEncryption");
+    APPL_TRACE_API( "BTA_JvSetEncryption");
     if ((p_msg = (tBTA_JV_API_SET_ENCRYPTION *)GKI_getbuf(sizeof(tBTA_JV_API_SET_ENCRYPTION))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_SET_ENCRYPTION_EVT;
@@ -495,11 +493,13 @@
 BOOLEAN BTA_JvIsEncrypted(BD_ADDR bd_addr)
 {
     BOOLEAN is_encrypted = FALSE;
-    UINT8 sec_flags;
+    UINT8 sec_flags, le_flags;
 
-    if(BTM_GetSecurityFlags(bd_addr, &sec_flags))
+    if (BTM_GetSecurityFlags(bd_addr, &sec_flags) &&
+        BTM_GetSecurityFlagsByTransport(bd_addr, &le_flags, BT_TRANSPORT_LE))
     {
-        if(sec_flags&BTM_SEC_FLAG_ENCRYPTED)
+        if(sec_flags & BTM_SEC_FLAG_ENCRYPTED ||
+           le_flags & BTM_SEC_FLAG_ENCRYPTED)
             is_encrypted = TRUE;
     }
     return is_encrypted;
@@ -541,7 +541,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     BT_HDR *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvGetSCN");
+    APPL_TRACE_API( "BTA_JvGetSCN");
     if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
     {
         p_msg->event = BTA_JV_API_GET_SCN_EVT;
@@ -568,7 +568,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_FREE_SCN *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvFreeSCN");
+    APPL_TRACE_API( "BTA_JvFreeSCN");
     if ((p_msg = (tBTA_JV_API_FREE_SCN *)GKI_getbuf(sizeof(tBTA_JV_API_FREE_SCN))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT;
@@ -595,7 +595,7 @@
 UINT16 BTA_JvGetPSM(void)
 {
 #if 0
-    APPL_TRACE_API0( "BTA_JvGetPSM");
+    APPL_TRACE_API( "BTA_JvGetPSM");
 
     return (L2CA_AllocatePSM());
 #endif
@@ -622,7 +622,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_START_DISCOVERY *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvStartDiscovery");
+    APPL_TRACE_API( "BTA_JvStartDiscovery");
     if ((p_msg = (tBTA_JV_API_START_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_START_DISCOVERY))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT;
@@ -656,7 +656,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_CANCEL_DISCOVERY *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvCancelDiscovery");
+    APPL_TRACE_API( "BTA_JvCancelDiscovery");
     if ((p_msg = (tBTA_JV_API_CANCEL_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_CANCEL_DISCOVERY))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_CANCEL_DISCOVERY_EVT;
@@ -687,7 +687,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_GET_SERVICES_LENGTH *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvGetServicesLength");
+    APPL_TRACE_API( "BTA_JvGetServicesLength");
     if ((p_msg = (tBTA_JV_API_GET_SERVICES_LENGTH *)GKI_getbuf(sizeof(tBTA_JV_API_GET_SERVICES_LENGTH))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_GET_SERVICES_LENGTH_EVT;
@@ -724,7 +724,7 @@
     UINT32  len;
     UINT32  hdr_len;
 
-    APPL_TRACE_API0( "BTA_JvGetServicesResult");
+    APPL_TRACE_API( "BTA_JvGetServicesResult");
     if(p_bta_jv_cfg->p_sdp_db->p_first_rec)
     {
         /* the database is valid */
@@ -781,7 +781,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_SERVICE_SELECT *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvServiceSelect");
+    APPL_TRACE_API( "BTA_JvServiceSelect");
     if ((p_msg = (tBTA_JV_API_SERVICE_SELECT *)GKI_getbuf(sizeof(tBTA_JV_API_SERVICE_SELECT))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_SERVICE_SELECT_EVT;
@@ -808,7 +808,7 @@
 {
     INT32   serv_sel = -1;
 
-    APPL_TRACE_API0( "BTA_JvServiceResult");
+    APPL_TRACE_API( "BTA_JvServiceResult");
     if(bta_jv_cb.p_sel_raw_data)
     {
         serv_sel = bta_jv_cb.sel_len;
@@ -836,7 +836,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_CREATE_RECORD *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvCreateRecordByUser");
+    APPL_TRACE_API( "BTA_JvCreateRecordByUser");
     if ((p_msg = (tBTA_JV_API_CREATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_CREATE_RECORD))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT;
@@ -872,7 +872,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_UPDATE_RECORD *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvUpdateRecord");
+    APPL_TRACE_API( "BTA_JvUpdateRecord");
     if ((p_msg = (tBTA_JV_API_UPDATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_UPDATE_RECORD))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_UPDATE_RECORD_EVT;
@@ -907,7 +907,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvAddAttribute");
+    APPL_TRACE_API( "BTA_JvAddAttribute");
     if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_ADD_ATTRIBUTE_EVT;
@@ -938,7 +938,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvDeleteAttribute");
+    APPL_TRACE_API( "BTA_JvDeleteAttribute");
     if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_DELETE_ATTRIBUTE_EVT;
@@ -965,7 +965,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvDeleteRecord");
+    APPL_TRACE_API( "BTA_JvDeleteRecord");
     if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT;
@@ -1024,7 +1024,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_L2CAP_CONNECT *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvL2capConnect");
+    APPL_TRACE_API( "BTA_JvL2capConnect");
     if (p_cback &&
         (p_msg = (tBTA_JV_API_L2CAP_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CONNECT))) != NULL)
     {
@@ -1057,7 +1057,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_L2CAP_CLOSE *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvL2capClose");
+    APPL_TRACE_API( "BTA_JvL2capClose");
     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
         (p_msg = (tBTA_JV_API_L2CAP_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CLOSE))) != NULL)
     {
@@ -1092,7 +1092,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_L2CAP_SERVER *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvL2capStartServer");
+    APPL_TRACE_API( "BTA_JvL2capStartServer");
     if (p_cback &&
         (p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
     {
@@ -1125,7 +1125,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_L2CAP_SERVER *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvL2capStopServer");
+    APPL_TRACE_API( "BTA_JvL2capStopServer");
     if ((p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT;
@@ -1165,7 +1165,7 @@
 #endif
     tBTA_JV_L2CAP_READ evt_data;
 
-    APPL_TRACE_API0( "BTA_JvL2capRead");
+    APPL_TRACE_API( "BTA_JvL2capRead");
 
 #if SDP_FOR_JV_INCLUDED == TRUE
     if(BTA_JV_L2C_FOR_SDP_HDL == handle)
@@ -1231,7 +1231,7 @@
     UINT32  left_over = 0;
     UINT16  max_len, read_len;
 
-    APPL_TRACE_API0( "BTA_JvL2capReceive");
+    APPL_TRACE_API( "BTA_JvL2capReceive");
 
     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
     {
@@ -1278,7 +1278,7 @@
 #if 0
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
 
-    APPL_TRACE_API1( "BTA_JvL2capReady: %d", handle);
+    APPL_TRACE_API( "BTA_JvL2capReady: %d", handle);
     if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
     {
         *p_data_size = 0;
@@ -1319,7 +1319,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_L2CAP_WRITE *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvL2capWrite");
+    APPL_TRACE_API( "BTA_JvL2capWrite");
     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
         (p_msg = (tBTA_JV_API_L2CAP_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_WRITE))) != NULL)
     {
@@ -1358,7 +1358,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_RFCOMM_CONNECT *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvRfcommConnect");
+    APPL_TRACE_API( "BTA_JvRfcommConnect");
     if (p_cback &&
         (p_msg = (tBTA_JV_API_RFCOMM_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CONNECT))) != NULL)
     {
@@ -1393,7 +1393,7 @@
     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
 
-    APPL_TRACE_API0( "BTA_JvRfcommClose");
+    APPL_TRACE_API( "BTA_JvRfcommClose");
     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
         (p_msg = (tBTA_JV_API_RFCOMM_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CLOSE))) != NULL)
@@ -1432,7 +1432,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_RFCOMM_SERVER *p_msg;
 
-    APPL_TRACE_API0( "BTA_JvRfcommStartServer");
+    APPL_TRACE_API( "BTA_JvRfcommStartServer");
     if (p_cback &&
         (p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
     {
@@ -1440,7 +1440,7 @@
             max_session = 1;
         if (max_session > BTA_JV_MAX_RFC_SR_SESSION)
         {
-            APPL_TRACE_DEBUG2( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION);
+            APPL_TRACE_DEBUG( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION);
             max_session = BTA_JV_MAX_RFC_SR_SESSION;
         }
         p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT;
@@ -1472,7 +1472,7 @@
 {
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_RFCOMM_SERVER *p_msg;
-    APPL_TRACE_API0( "BTA_JvRfcommStopServer");
+    APPL_TRACE_API( "BTA_JvRfcommStopServer");
     if ((p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
     {
         p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT;
@@ -1503,7 +1503,7 @@
     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
 
-    APPL_TRACE_API0( "BTA_JvRfcommRead");
+    APPL_TRACE_API( "BTA_JvRfcommRead");
     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
         (p_msg = (tBTA_JV_API_RFCOMM_READ *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_READ))) != NULL)
@@ -1563,7 +1563,7 @@
     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
 
-    APPL_TRACE_API0( "BTA_JvRfcommReady");
+    APPL_TRACE_API( "BTA_JvRfcommReady");
     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si])
     {
@@ -1593,8 +1593,8 @@
     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
 
-    APPL_TRACE_API0( "BTA_JvRfcommWrite");
-    APPL_TRACE_DEBUG3( "handle:0x%x, hi:%d, si:%d", handle, hi, si);
+    APPL_TRACE_API( "BTA_JvRfcommWrite");
+    APPL_TRACE_DEBUG( "handle:0x%x, hi:%d, si:%d", handle, hi, si);
     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
         (p_msg = (tBTA_JV_API_RFCOMM_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_WRITE))) != NULL)
@@ -1604,7 +1604,7 @@
         p_msg->req_id = req_id;
         p_msg->p_cb = &bta_jv_cb.rfc_cb[hi];
         p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1];
-        APPL_TRACE_API0( "write ok");
+        APPL_TRACE_API( "write ok");
         bta_sys_sendmsg(p_msg);
         status = BTA_JV_SUCCESS;
     }
@@ -1637,7 +1637,7 @@
     tBTA_JV_STATUS status = BTA_JV_FAILURE;
     tBTA_JV_API_SET_PM_PROFILE *p_msg;
 
-    APPL_TRACE_API2("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id);
+    APPL_TRACE_API("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id);
     if ((p_msg = (tBTA_JV_API_SET_PM_PROFILE *)GKI_getbuf(sizeof(tBTA_JV_API_SET_PM_PROFILE)))
         != NULL)
     {
diff --git a/bta/jv/bta_jv_cfg.c b/bta/jv/bta_jv_cfg.c
index 675801f..21bd2a8 100644
--- a/bta/jv/bta_jv_cfg.c
+++ b/bta/jv/bta_jv_cfg.c
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (C) 2014 The Android Open Source Project
  *  Copyright (C) 2004-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -42,7 +43,7 @@
  * p_bta_jv_cfg->p_sdp_raw_data can be allocated before calling BTA_JvStartDiscovery
  * it can be de-allocated after the last call to access the database */
 static UINT8 bta_jv_sdp_raw_data[BTA_JV_SDP_RAW_DATA_SIZE];
-static UINT8 bta_jv_sdp_db_data[BTA_JV_SDP_DB_SIZE];
+static UINT8 __attribute__ ((aligned(4))) bta_jv_sdp_db_data[BTA_JV_SDP_DB_SIZE];
 
 /* JV configuration structure */
 const tBTA_JV_CFG bta_jv_cfg =
diff --git a/bta/mce/bta_mce_act.c b/bta/mce/bta_mce_act.c
new file mode 100644
index 0000000..652254f
--- /dev/null
+++ b/bta/mce/bta_mce_act.c
@@ -0,0 +1,186 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 action functions for MCE.
+ *
+ ******************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <arpa/inet.h>
+
+#include "bt_types.h"
+#include "gki.h"
+#include "bd.h"
+#include "utl.h"
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+#include "btm_api.h"
+#include "btm_int.h"
+#include "sdp_api.h"
+#include <string.h>
+
+/*****************************************************************************
+**  Constants
+*****************************************************************************/
+
+static const tBT_UUID bta_mce_mas_uuid = {
+    .len = 2,
+    .uu.uuid16 = UUID_SERVCLASS_MESSAGE_ACCESS
+};
+
+/*******************************************************************************
+**
+** Function     bta_mce_search_cback
+**
+** Description  Callback from btm after search is completed
+**
+** Returns      void
+**
+*******************************************************************************/
+
+static void bta_mce_search_cback(UINT16 result, void * user_data)
+{
+    tSDP_DISC_REC *p_rec = NULL;
+    tBTA_MCE_MAS_DISCOVERY_COMP evt_data;
+    int found = 0;
+
+    APPL_TRACE_DEBUG("bta_mce_start_discovery_cback res: 0x%x", result);
+
+    bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE;
+
+    if (bta_mce_cb.p_dm_cback == NULL) return;
+
+    evt_data.status = BTA_MCE_FAILURE;
+    bdcpy(evt_data.remote_addr, bta_mce_cb.remote_addr);
+    evt_data.num_mas = 0;
+
+    if (result == SDP_SUCCESS || result == SDP_DB_FULL)
+    {
+        do
+        {
+            tSDP_DISC_ATTR *p_attr;
+            tSDP_PROTOCOL_ELEM pe;
+
+            p_rec = SDP_FindServiceUUIDInDb(p_bta_mce_cfg->p_sdp_db, (tBT_UUID*) &bta_mce_mas_uuid, p_rec);
+
+            APPL_TRACE_DEBUG("p_rec:%p", p_rec);
+
+            if (p_rec == NULL)
+                break;
+
+            if (!SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe))
+                continue;
+
+            evt_data.mas[found].scn = pe.params[0];
+
+            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) == NULL)
+                continue;
+
+            evt_data.mas[found].p_srv_name = (char *) p_attr->attr_value.v.array;
+            evt_data.mas[found].srv_name_len= SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
+
+            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID)) == NULL)
+                break;
+
+                 evt_data.mas[found].instance_id = p_attr->attr_value.v.u8;
+
+            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE)) == NULL)
+                break;
+
+            evt_data.mas[found].msg_type = p_attr->attr_value.v.u8;
+
+            found++;
+        } while (p_rec != NULL && found < BTA_MCE_MAX_MAS_INSTANCES);
+
+        evt_data.num_mas = found;
+        evt_data.status = BTA_MCE_SUCCESS;
+    }
+
+    bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE*) &evt_data, user_data);
+}
+
+/*******************************************************************************
+**
+** Function     bta_mce_enable
+**
+** Description  Initializes the MCE I/F
+**
+** Returns      void
+**
+*******************************************************************************/
+void bta_mce_enable(tBTA_MCE_MSG *p_data)
+{
+    tBTA_MCE_STATUS status = BTA_MCE_SUCCESS;
+    bta_mce_cb.p_dm_cback = p_data->enable.p_cback;
+    bta_mce_cb.p_dm_cback(BTA_MCE_ENABLE_EVT, (tBTA_MCE *)&status, NULL);
+}
+
+/*******************************************************************************
+**
+** Function     bta_mce_get_remote_mas_instances
+**
+** Description  Discovers MAS instances on remote device
+**
+** Returns      void
+**
+*******************************************************************************/
+void bta_mce_get_remote_mas_instances(tBTA_MCE_MSG *p_data)
+{
+    if(p_data == NULL)
+    {
+    APPL_TRACE_DEBUG("MCE control block handle is null");
+    return;
+    }
+    tBTA_MCE_STATUS status = BTA_MCE_FAILURE;
+
+    APPL_TRACE_DEBUG("%s in, sdp_active:%d", __FUNCTION__, bta_mce_cb.sdp_active);
+
+    if (bta_mce_cb.sdp_active != BTA_MCE_SDP_ACT_NONE)
+    {
+        /* SDP is still in progress */
+        status = BTA_MCE_BUSY;
+        if(bta_mce_cb.p_dm_cback)
+            bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL);
+
+        return;
+    }
+
+    bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_YES;
+    bdcpy(bta_mce_cb.remote_addr, p_data->get_rmt_mas.bd_addr);
+
+    SDP_InitDiscoveryDb (p_bta_mce_cfg->p_sdp_db, p_bta_mce_cfg->sdp_db_size, 1,
+                                (tBT_UUID*) &bta_mce_mas_uuid, 0, NULL);
+
+    if (!SDP_ServiceSearchAttributeRequest2(p_data->get_rmt_mas.bd_addr, p_bta_mce_cfg->p_sdp_db,
+                                                bta_mce_search_cback, NULL))
+    {
+        bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE;
+
+        /* failed to start SDP. report the failure right away */
+        if (bta_mce_cb.p_dm_cback)
+            bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL);
+    }
+    /*
+    else report the result when the cback is called
+    */
+}
diff --git a/bta/mce/bta_mce_api.c b/bta/mce/bta_mce_api.c
new file mode 100644
index 0000000..ff2713c
--- /dev/null
+++ b/bta/mce/bta_mce_api.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 is the implementation of the API for MCE subsystem
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_sys.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+#include "gki.h"
+#include <string.h>
+#include "port_api.h"
+#include "sdp_api.h"
+
+/*****************************************************************************
+**  Constants
+*****************************************************************************/
+
+static const tBTA_SYS_REG bta_mce_reg =
+{
+    bta_mce_sm_execute,
+    NULL
+};
+
+/*******************************************************************************
+**
+** Function         BTA_MceEnable
+**
+** Description      Enable the MCE I/F service. When the enable
+**                  operation is complete the callback function will be
+**                  called with a BTA_MCE_ENABLE_EVT. This function must
+**                  be called before other functions in the MCE API are
+**                  called.
+**
+** Returns          BTA_MCE_SUCCESS if successful.
+**                  BTA_MCE_FAIL if internal failure.
+**
+*******************************************************************************/
+tBTA_MCE_STATUS BTA_MceEnable(tBTA_MCE_DM_CBACK *p_cback)
+{
+    tBTA_MCE_STATUS status = BTA_MCE_FAILURE;
+    tBTA_MCE_API_ENABLE  *p_buf;
+
+    APPL_TRACE_API(__FUNCTION__);
+    if(p_cback && FALSE == bta_sys_is_register(BTA_ID_MCE))
+    {
+        memset(&bta_mce_cb, 0, sizeof(tBTA_MCE_CB));
+
+        /* register with BTA system manager */
+        bta_sys_register(BTA_ID_MCE, &bta_mce_reg);
+
+        if (p_cback && (p_buf = (tBTA_MCE_API_ENABLE *) GKI_getbuf(sizeof(tBTA_MCE_API_ENABLE))) != NULL)
+        {
+            p_buf->hdr.event = BTA_MCE_API_ENABLE_EVT;
+            p_buf->p_cback = p_cback;
+            bta_sys_sendmsg(p_buf);
+            status = BTA_MCE_SUCCESS;
+        }
+    }
+    return(status);
+}
+
+/*******************************************************************************
+**
+** Function         BTA_MceGetRemoteMasInstances
+**
+** Description      This function performs service discovery for the MAS service
+**                  by the given peer device. When the operation is completed
+**                  the tBTA_MCE_DM_CBACK callback function will be  called with
+**                  a BTA_MCE_MAS_DISCOVERY_COMP_EVT.
+**
+** Returns          BTA_MCE_SUCCESS, if the request is being processed.
+**                  BTA_MCE_FAILURE, otherwise.
+**
+*******************************************************************************/
+tBTA_MCE_STATUS BTA_MceGetRemoteMasInstances(BD_ADDR bd_addr)
+{
+    tBTA_MCE_STATUS ret = BTA_MCE_FAILURE;
+    tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES *p_msg;
+
+    APPL_TRACE_API(__FUNCTION__);
+    if ((p_msg = (tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES *)GKI_getbuf(sizeof(tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES))) != NULL)
+    {
+        p_msg->hdr.event = BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT;
+        bdcpy(p_msg->bd_addr, bd_addr);
+        bta_sys_sendmsg(p_msg);
+        ret = BTA_MCE_SUCCESS;
+    }
+
+    return(ret);
+}
diff --git a/bta/mce/bta_mce_cfg.c b/bta/mce/bta_mce_cfg.c
new file mode 100644
index 0000000..db9fe66
--- /dev/null
+++ b/bta/mce/bta_mce_cfg.c
@@ -0,0 +1,44 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 compile-time configurable constants for MCE
+ *
+ ******************************************************************************/
+
+#include "gki.h"
+#include "bta_api.h"
+#include "bd.h"
+#include "bta_mce_api.h"
+
+#ifndef BTA_MCE_SDP_DB_SIZE
+#define BTA_MCE_SDP_DB_SIZE  4500
+#endif
+
+static UINT8 __attribute__ ((aligned(4))) bta_mce_sdp_db_data[BTA_MCE_SDP_DB_SIZE];
+
+/* MCE configuration structure */
+const tBTA_MCE_CFG bta_mce_cfg =
+{
+    BTA_MCE_SDP_DB_SIZE,
+    (tSDP_DISCOVERY_DB *)bta_mce_sdp_db_data /* The data buffer to keep SDP database */
+};
+
+tBTA_MCE_CFG *p_bta_mce_cfg = (tBTA_MCE_CFG *) &bta_mce_cfg;
diff --git a/bta/mce/bta_mce_int.h b/bta/mce/bta_mce_int.h
new file mode 100644
index 0000000..9032f6a
--- /dev/null
+++ b/bta/mce/bta_mce_int.h
@@ -0,0 +1,97 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 is the private interface file for the BTA MCE I/F
+ *
+ ******************************************************************************/
+#ifndef BTA_MCE_INT_H
+#define BTA_MCE_INT_H
+
+#include "bta_sys.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+
+/*****************************************************************************
+**  Constants
+*****************************************************************************/
+
+enum
+{
+    /* these events are handled by the state machine */
+    BTA_MCE_API_ENABLE_EVT = BTA_SYS_EVT_START(BTA_ID_MCE),
+    BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT,
+    BTA_MCE_MAX_INT_EVT
+};
+
+/* data type for BTA_MCE_API_ENABLE_EVT */
+typedef struct
+{
+    BT_HDR             hdr;
+    tBTA_MCE_DM_CBACK  *p_cback;
+} tBTA_MCE_API_ENABLE;
+
+/* data type for BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT */
+typedef struct
+{
+    BT_HDR   hdr;
+    BD_ADDR  bd_addr;
+} tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES;
+
+/* union of all data types */
+typedef union
+{
+    /* GKI event buffer header */
+    BT_HDR                                 hdr;
+    tBTA_MCE_API_ENABLE                    enable;
+    tBTA_MCE_API_GET_REMOTE_MAS_INSTANCES  get_rmt_mas;
+} tBTA_MCE_MSG;
+
+/* MCE control block */
+typedef struct
+{
+    UINT8              sdp_active;  /* see BTA_MCE_SDP_ACT_* */
+    BD_ADDR            remote_addr;
+    tBTA_MCE_DM_CBACK  *p_dm_cback;
+} tBTA_MCE_CB;
+
+enum
+{
+    BTA_MCE_SDP_ACT_NONE = 0,
+    BTA_MCE_SDP_ACT_YES       /* waiting for SDP result */
+};
+
+/* MCE control block */
+#if BTA_DYNAMIC_MEMORY == FALSE
+extern tBTA_MCE_CB bta_mce_cb;
+#else
+extern tBTA_MCE_CB *bta_mce_cb_ptr;
+#define bta_mce_cb (*bta_mce_cb_ptr)
+#endif
+
+/* config struct */
+extern tBTA_MCE_CFG *p_bta_mce_cfg;
+
+extern BOOLEAN bta_mce_sm_execute(BT_HDR *p_msg);
+
+extern void bta_mce_enable (tBTA_MCE_MSG *p_data);
+extern void bta_mce_get_remote_mas_instances (tBTA_MCE_MSG *p_data);
+
+#endif /* BTA_MCE_INT_H */
diff --git a/bta/mce/bta_mce_main.c b/bta/mce/bta_mce_main.c
new file mode 100644
index 0000000..f313eb0
--- /dev/null
+++ b/bta/mce/bta_mce_main.c
@@ -0,0 +1,77 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2003-2012 Broadcom Corporation
+ *
+ *  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 is the main implementation file for the BTA MCE I/F
+ *
+ ******************************************************************************/
+
+#include "bta_api.h"
+#include "bta_sys.h"
+#include "bta_mce_api.h"
+#include "bta_mce_int.h"
+
+/*****************************************************************************
+** Constants and types
+*****************************************************************************/
+
+#if BTA_DYNAMIC_MEMORY == FALSE
+tBTA_MCE_CB bta_mce_cb;
+#endif
+
+/* state machine action enumeration list */
+#define BTA_MCE_NUM_ACTIONS  (BTA_MCE_MAX_INT_EVT & 0x00ff)
+
+/* type for action functions */
+typedef void (*tBTA_MCE_ACTION)(tBTA_MCE_MSG *p_data);
+
+/* action function list */
+const tBTA_MCE_ACTION bta_mce_action[] =
+{
+    bta_mce_enable,                    /* BTA_MCE_API_ENABLE_EVT */
+    bta_mce_get_remote_mas_instances,  /* BTA_MCE_API_GET_REMOTE_MAS_INSTANCES_EVT */
+};
+
+/*******************************************************************************
+**
+** Function         bta_mce_sm_execute
+**
+** Description      State machine event handling function for MCE
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+BOOLEAN bta_mce_sm_execute(BT_HDR *p_msg)
+{
+    if(p_msg == NULL) return FALSE;
+
+    BOOLEAN ret = FALSE;
+    UINT16 action = (p_msg->event & 0x00ff);
+
+    /* execute action functions */
+    if(action < BTA_MCE_NUM_ACTIONS)
+    {
+        (*bta_mce_action[action])((tBTA_MCE_MSG*)p_msg);
+        ret = TRUE;
+    }
+
+    return(ret);
+}
diff --git a/bta/pan/bta_pan_act.c b/bta/pan/bta_pan_act.c
index d0939d6..ca3567c 100644
--- a/bta/pan/bta_pan_act.c
+++ b/bta/pan/bta_pan_act.c
@@ -43,6 +43,40 @@
 #define BTA_PAN_TX_MASK              0xF0
 
 /*******************************************************************************
+ **
+ ** Function    bta_pan_pm_conn_busy
+ **
+ ** Description set pan pm connection busy state
+ **
+ ** Params      p_scb: state machine control block of pan connection
+ **
+ ** Returns     void
+ **
+ *******************************************************************************/
+static void bta_pan_pm_conn_busy(tBTA_PAN_SCB *p_scb)
+{
+    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
+        bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
+}
+
+/*******************************************************************************
+ **
+ ** Function    bta_pan_pm_conn_idle
+ **
+ ** Description set pan pm connection idle state
+ **
+ ** Params      p_scb: state machine control block of pan connection
+ **
+ ** Returns     void
+ **
+ *******************************************************************************/
+static void bta_pan_pm_conn_idle(tBTA_PAN_SCB *p_scb)
+{
+    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
+        bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
+}
+
+/*******************************************************************************
 **
 ** Function         bta_pan_conn_state_cback
 **
@@ -177,7 +211,7 @@
         p_new_buf = (BT_HDR *)GKI_getpoolbuf( PAN_POOL_ID );
         if(!p_new_buf)
         {
-            APPL_TRACE_WARNING0("Cannot get a PAN GKI buffer");
+            APPL_TRACE_WARNING("Cannot get a PAN GKI buffer");
             GKI_freebuf( p_buf );
             return;
         }
@@ -438,7 +472,7 @@
 
     status = PAN_Connect (p_data->api_open.bd_addr, p_data->api_open.local_role, p_data->api_open.peer_role,
                         &p_scb->handle);
-
+    APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status);
 
     if(status == PAN_SUCCESS)
     {
@@ -511,6 +545,8 @@
 
     tBTA_PAN_OPEN data;
 
+    APPL_TRACE_DEBUG("%s pan connection result: %d", __func__, p_data->conn.result);
+
     bdcpy(data.bd_addr, p_scb->bd_addr);
     data.handle = p_scb->handle;
     data.local_role = p_scb->local_role;
@@ -520,7 +556,9 @@
     {
         data.status = BTA_PAN_SUCCESS;
         bta_pan_co_open(p_scb->handle, p_scb->app_id, p_scb->local_role, p_scb->peer_role, p_scb->bd_addr);
-
+        p_scb->pan_flow_enable = TRUE;
+        p_scb->app_flow_enable = TRUE;
+        bta_sys_conn_open(BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
     }
     else
     {
@@ -528,11 +566,6 @@
         data.status = BTA_PAN_FAIL;
     }
 
-    p_scb->pan_flow_enable = TRUE;
-    p_scb->app_flow_enable = TRUE;
-
-    bta_sys_conn_open( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
-
     bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
 
 
@@ -627,12 +660,14 @@
     /* if data path configured for tx pull */
     if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL)
     {
+        bta_pan_pm_conn_busy(p_scb);
         /* call application callout function for tx path */
         bta_pan_co_tx_path(p_scb->handle, p_scb->app_id);
 
         /* free data that exceeds queue level */
         while(p_scb->data_queue.count > bta_pan_cb.q_level)
             GKI_freebuf(GKI_dequeue(&p_scb->data_queue));
+        bta_pan_pm_conn_idle(p_scb);
     }
     /* if configured for zero copy push */
     else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF)
@@ -704,6 +739,7 @@
 {
     if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF)
     {
+        bta_pan_pm_conn_busy(p_scb);
 
         PAN_WriteBuf (p_scb->handle,
                       ((tBTA_PAN_DATA_PARAMS *)p_data)->dst,
@@ -711,6 +747,7 @@
                       ((tBTA_PAN_DATA_PARAMS *)p_data)->protocol,
                       (BT_HDR *)p_data,
                       ((tBTA_PAN_DATA_PARAMS *)p_data)->ext);
+        bta_pan_pm_conn_idle(p_scb);
 
     }
 }
diff --git a/bta/pan/bta_pan_api.c b/bta/pan/bta_pan_api.c
index 17ae6a7..0a69b0f 100644
--- a/bta/pan/bta_pan_api.c
+++ b/bta/pan/bta_pan_api.c
@@ -60,9 +60,7 @@
     tBTA_PAN_API_ENABLE  *p_buf;
 
     /* register with BTA system manager */
-    GKI_sched_lock();
     bta_sys_register(BTA_ID_PAN, &bta_pan_reg);
-    GKI_sched_unlock();
 
     if ((p_buf = (tBTA_PAN_API_ENABLE *) GKI_getbuf(sizeof(tBTA_PAN_API_ENABLE))) != NULL)
     {
diff --git a/bta/pan/bta_pan_int.h b/bta/pan/bta_pan_int.h
index 1667e57..bd75311 100644
--- a/bta/pan/bta_pan_int.h
+++ b/bta/pan/bta_pan_int.h
@@ -56,6 +56,14 @@
     BTA_PAN_API_OPEN_EVT
 };
 
+/* state machine states */
+enum
+{
+    BTA_PAN_IDLE_ST,
+    BTA_PAN_OPEN_ST,
+    BTA_PAN_CLOSING_ST
+};
+
 
 
 
diff --git a/bta/pan/bta_pan_main.c b/bta/pan/bta_pan_main.c
index 5ed545f..3a69994 100644
--- a/bta/pan/bta_pan_main.c
+++ b/bta/pan/bta_pan_main.c
@@ -84,14 +84,6 @@
 #define BTA_PAN_NUM_COLS             2       /* number of columns in state tables */
 
 
-/* state machine states */
-enum
-{
-    BTA_PAN_IDLE_ST,
-    BTA_PAN_OPEN_ST,
-    BTA_PAN_CLOSING_ST
-};
-
 
 /* state table for listen state */
 const UINT8 bta_pan_st_idle[][BTA_PAN_NUM_COLS] =
@@ -180,7 +172,7 @@
         if (!p_scb->in_use)
         {
             p_scb->in_use = TRUE;
-            APPL_TRACE_DEBUG1("bta_pan_scb_alloc %d", i);
+            APPL_TRACE_DEBUG("bta_pan_scb_alloc %d", i);
             break;
         }
     }
@@ -189,7 +181,7 @@
     {
         /* out of scbs */
         p_scb = NULL;
-        APPL_TRACE_WARNING0("Out of scbs");
+        APPL_TRACE_WARNING("Out of scbs");
     }
     return p_scb;
 }
@@ -210,7 +202,7 @@
     UINT8               action;
     int                 i;
 
-    APPL_TRACE_EVENT3("PAN scb=%d event=0x%x state=%d", bta_pan_scb_to_idx(p_scb), event, p_scb->state);
+    APPL_TRACE_EVENT("PAN scb=%d event=0x%x state=%d", bta_pan_scb_to_idx(p_scb), event, p_scb->state);
 
     /* look up the state table for the current state */
     state_table = bta_pan_st_tbl[p_scb->state];
@@ -312,7 +304,7 @@
 *******************************************************************************/
 void bta_pan_scb_dealloc(tBTA_PAN_SCB *p_scb)
 {
-    APPL_TRACE_DEBUG1("bta_pan_scb_dealloc %d", bta_pan_scb_to_idx(p_scb));
+    APPL_TRACE_DEBUG("bta_pan_scb_dealloc %d", bta_pan_scb_to_idx(p_scb));
     memset(p_scb, 0, sizeof(tBTA_PAN_SCB));
 }
 
@@ -358,7 +350,7 @@
     }
 
 
-    APPL_TRACE_WARNING1("No scb for handle %d", handle);
+    APPL_TRACE_WARNING("No scb for handle %d", handle);
 
     return NULL;
 }
diff --git a/bta/sys/bta_sys.h b/bta/sys/bta_sys.h
index 5d724e5..7b60b1f 100644
--- a/bta/sys/bta_sys.h
+++ b/bta/sys/bta_sys.h
@@ -31,6 +31,9 @@
 **  Constants and data types
 *****************************************************************************/
 
+/* vendor specific event handler function type */
+typedef BOOLEAN (tBTA_SYS_VS_EVT_HDLR)(UINT16 evt, void *p);
+
 /* event handler function type */
 typedef BOOLEAN (tBTA_SYS_EVT_HDLR)(BT_HDR *p_msg);
 
@@ -300,6 +303,7 @@
 extern void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr);
 extern void bta_sys_set_default_policy (UINT8 id, UINT8 policy);
 extern void bta_sys_clear_default_policy (UINT8 id, UINT8 policy);
+extern BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p);
 
 #ifdef __cplusplus
 }
diff --git a/bta/sys/bta_sys_conn.c b/bta/sys/bta_sys_conn.c
index a5d1017..aef155b 100644
--- a/bta/sys/bta_sys_conn.c
+++ b/bta/sys/bta_sys_conn.c
@@ -578,3 +578,20 @@
 }
 #endif
 
+/*******************************************************************************
+**
+** Function         bta_sys_vs_hdl
+**
+** Description      Called by BTA subsystems to execute a VS event handler function
+**
+** Returns          void
+**
+*******************************************************************************/
+BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p)
+{
+    if (bta_sys_cb.p_vs_evt_hdlr)
+        return (*bta_sys_cb.p_vs_evt_hdlr)(evt, p);
+
+    return FALSE;
+}
+
diff --git a/bta/sys/bta_sys_int.h b/bta/sys/bta_sys_int.h
index d187b29..32101a5 100644
--- a/bta/sys/bta_sys_int.h
+++ b/bta/sys/bta_sys_int.h
@@ -78,6 +78,9 @@
 #if (BTM_SSR_INCLUDED == TRUE)
     tBTA_SYS_SSR_CFG_CBACK      *p_ssr_cb;
 #endif
+    /* VS event handler */
+    tBTA_SYS_VS_EVT_HDLR   *p_vs_evt_hdlr;
+
 } tBTA_SYS_CB;
 
 
diff --git a/bta/sys/bta_sys_main.c b/bta/sys/bta_sys_main.c
index a440f52..0219290 100644
--- a/bta/sys/bta_sys_main.c
+++ b/bta/sys/bta_sys_main.c
@@ -205,7 +205,7 @@
     UINT8               action;
     int                 i;
 
-    APPL_TRACE_EVENT2("bta_sys_sm_execute state:%d, event:0x%x",  bta_sys_cb.state, p_msg->event);
+    APPL_TRACE_EVENT("bta_sys_sm_execute state:%d, event:0x%x",  bta_sys_cb.state, p_msg->event);
 
     /* look up the state table for the current state */
     state_table = bta_sys_st_tbl[bta_sys_cb.state];
@@ -255,7 +255,7 @@
 
     tBTA_SYS_HW_MSG *sys_event;
 
-    APPL_TRACE_DEBUG1(" bta_sys_hw_btm_cback was called with parameter: %i" , status );
+    APPL_TRACE_DEBUG(" bta_sys_hw_btm_cback was called with parameter: %i" , status );
 
     /* send a message to BTA SYS */
     if ((sys_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
@@ -278,7 +278,7 @@
     }
     else
     {
-        APPL_TRACE_DEBUG0("ERROR bta_sys_hw_btm_cback couldn't send msg" );
+        APPL_TRACE_DEBUG("ERROR bta_sys_hw_btm_cback couldn't send msg" );
     }
 }
 
@@ -299,7 +299,7 @@
     UINT8 module_index;
     UNUSED(p_sys_hw_msg);
 
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
     for (module_index = 0; module_index < BTA_SYS_MAX_HW_MODULES; module_index++)
     {
@@ -352,7 +352,7 @@
             bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ](  BTA_SYS_HW_ON_EVT   );
     }
 
-    APPL_TRACE_EVENT2 ("bta_sys_hw_api_enable for %d, active modules 0x%04X",
+    APPL_TRACE_EVENT ("bta_sys_hw_api_enable for %d, active modules 0x%04X",
                     p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active);
 
 }
@@ -369,7 +369,7 @@
 *******************************************************************************/
 void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg)
 {
-    APPL_TRACE_DEBUG2("bta_sys_hw_api_disable for %d, active modules: 0x%04X",
+    APPL_TRACE_DEBUG("bta_sys_hw_api_disable for %d, active modules: 0x%04X",
         p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active );
 
     /* make sure the related SW blocks were stopped */
@@ -410,7 +410,7 @@
 *******************************************************************************/
 void bta_sys_hw_evt_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg)
 {
-    APPL_TRACE_EVENT1("bta_sys_hw_evt_enabled for %i", p_sys_hw_msg->hw_module);
+    APPL_TRACE_EVENT("bta_sys_hw_evt_enabled for %i", p_sys_hw_msg->hw_module);
 
 #if ( defined BTM_AUTOMATIC_HCI_RESET && BTM_AUTOMATIC_HCI_RESET == TRUE )
     /* If device is already up, send a fake "BTM DEVICE UP" using BTA SYS state machine */
@@ -443,7 +443,7 @@
 {
     UINT8 hw_module_index;
 
-    APPL_TRACE_DEBUG1("bta_sys_hw_evt_disabled - module 0x%X", p_sys_hw_msg->hw_module);
+    APPL_TRACE_DEBUG("bta_sys_hw_evt_disabled - module 0x%X", p_sys_hw_msg->hw_module);
 
     for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++)
     {
@@ -467,7 +467,7 @@
     UINT8 hw_module_index;
     UNUSED(p_sys_hw_msg);
 
-    APPL_TRACE_DEBUG0(" bta_sys_hw_evt_stack_enabled!notify the callers");
+    APPL_TRACE_DEBUG(" bta_sys_hw_evt_stack_enabled!notify the callers");
 
     for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++ )
     {
@@ -494,7 +494,7 @@
     UINT8       id;
     BOOLEAN     freebuf = TRUE;
 
-    APPL_TRACE_EVENT1("BTA got event 0x%x", p_msg->event);
+    APPL_TRACE_EVENT("BTA got event 0x%x", p_msg->event);
 
     /* get subsystem id from event */
     id = (UINT8) (p_msg->event >> 8);
@@ -506,7 +506,7 @@
     }
     else
     {
-        APPL_TRACE_WARNING1("BTA got unregistered event id %d", id);
+        APPL_TRACE_WARNING("BTA got unregistered event id %d", id);
     }
 
     if (freebuf)
@@ -642,7 +642,7 @@
     int bta_id = 0;
     int bta_id_max = 0;
 
-    APPL_TRACE_DEBUG1("bta_sys_disable: module %i", module);
+    APPL_TRACE_DEBUG("bta_sys_disable: module %i", module);
 
     switch( module )
     {
@@ -663,7 +663,7 @@
             bta_id_max = BTA_ID_GPS;
             break;
         default:
-            APPL_TRACE_WARNING0("bta_sys_disable: unkown module");
+            APPL_TRACE_WARNING("bta_sys_disable: unkown module");
             return;
     }
 
diff --git a/bta/sys/ptim.c b/bta/sys/ptim.c
index 9dffc66..cc69349 100644
--- a/bta/sys/ptim.c
+++ b/bta/sys/ptim.c
@@ -137,6 +137,7 @@
 
     p_tle->event = type;
     p_tle->ticks = timeout;
+    p_tle->ticks_initial = timeout;
 
     GKI_add_to_timer_list(&p_cb->timer_queue, p_tle);
 }
diff --git a/btif/co/bta_ag_co.c b/btif/co/bta_ag_co.c
old mode 100644
new mode 100755
index 9c6de7d..13c1aff
--- a/btif/co/bta_ag_co.c
+++ b/btif/co/bta_ag_co.c
@@ -37,6 +37,11 @@
 #endif
 
 
+/************************************************************************************
+**  Externs
+************************************************************************************/
+extern int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param);
+
 /*******************************************************************************
 **
 ** Function         bta_ag_co_init
@@ -69,14 +74,53 @@
 **                      BTA_AG_CO_AUD_STATE_OFF_XFER - Audio has been turned off (xfer)
 **                      BTA_AG_CO_AUD_STATE_ON      - Audio has been turned on
 **                      BTA_AG_CO_AUD_STATE_SETUP   - Audio is about to be turned on
+**                  codec - if WBS support is compiled in, codec to going to be used is provided
+**                      and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
+**                      the correct platform parameters.
+**                      in the other states codec type should not be ignored
 **
 ** Returns          void
 **
 *******************************************************************************/
+#if (BTM_WBS_INCLUDED == TRUE )
+void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state, tBTA_AG_PEER_CODEC codec)
+#else
 void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state)
+#endif
 {
-    UNUSED(app_id);
-    BTIF_TRACE_DEBUG2("bta_ag_co_audio_state: handle %d, state %d", handle, state);
+    BTIF_TRACE_DEBUG("bta_ag_co_audio_state: handle %d, state %d", handle, state);
+    switch (state)
+    {
+    case BTA_AG_CO_AUD_STATE_OFF:
+#if (BTM_WBS_INCLUDED == TRUE )
+        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF), codec: 0x%x",
+                        handle, codec);
+        set_audio_state(handle, codec, state, NULL);
+#else
+        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF)",
+                        handle);
+#endif
+        break;
+    case BTA_AG_CO_AUD_STATE_OFF_XFER:
+        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (XFERRING)", handle);
+        break;
+    case BTA_AG_CO_AUD_STATE_SETUP:
+#if (BTM_WBS_INCLUDED == TRUE )
+        set_audio_state(handle, codec, state, NULL);
+#else
+        set_audio_state(handle, BTA_AG_CODEC_CVSD, state, NULL);
+#endif
+        break;
+    default:
+        break;
+    }
+#if (BTM_WBS_INCLUDED == TRUE )
+    APPL_TRACE_DEBUG("bta_ag_co_audio_state(handle %d, app_id: %d, state %d, codec: 0x%x)",
+                      handle, app_id, state, codec);
+#else
+    APPL_TRACE_DEBUG("bta_ag_co_audio_state(handle %d, app_id: %d, state %d)", \
+    handle, app_id, state);
+#endif
 }
 
 
@@ -95,7 +139,7 @@
 *******************************************************************************/
 void bta_ag_co_data_open(UINT16 handle, tBTA_SERVICE_ID service)
 {
-    BTIF_TRACE_DEBUG2("bta_ag_co_data_open handle:%d service:%d", handle, service);
+    BTIF_TRACE_DEBUG("bta_ag_co_data_open handle:%d service:%d", handle, service);
 }
 
 /*******************************************************************************
@@ -111,7 +155,7 @@
 *******************************************************************************/
 void bta_ag_co_data_close(UINT16 handle)
 {
-    BTIF_TRACE_DEBUG1("bta_ag_co_data_close handle:%d", handle);
+    BTIF_TRACE_DEBUG("bta_ag_co_data_close handle:%d", handle);
 }
 
 
@@ -130,6 +174,6 @@
 void bta_ag_co_tx_write(UINT16 handle, UINT8 * p_data, UINT16 len)
 {
     UNUSED(p_data);
-    BTIF_TRACE_DEBUG2( "bta_ag_co_tx_write: handle: %d, len: %d", handle, len );
+    BTIF_TRACE_DEBUG( "bta_ag_co_tx_write: handle: %d, len: %d", handle, len );
 }
 
diff --git a/btif/co/bta_av_co.c b/btif/co/bta_av_co.c
index fecf621..985d39f 100644
--- a/btif/co/bta_av_co.c
+++ b/btif/co/bta_av_co.c
@@ -42,7 +42,7 @@
  **  Constants
  *****************************************************************************/
 
-#define FUNC_TRACE()     APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+#define FUNC_TRACE()     APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
 /* Macro to retrieve the number of elements in a statically allocated array */
 #define BTA_AV_CO_NUM_ELEMENTS(__a) (sizeof(__a)/sizeof((__a)[0]))
@@ -67,7 +67,7 @@
 /* SCMS-T protect info */
 const UINT8 bta_av_co_cp_scmst[BTA_AV_CP_INFO_LEN] = "\x02\x02\x00";
 
-/* SBC codec capabilities */
+/* SBC SRC codec capabilities */
 const tA2D_SBC_CIE bta_av_co_sbc_caps =
 {
     (A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */
@@ -79,6 +79,18 @@
     A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */
 };
 
+/* SBC SINK codec capabilities */
+const tA2D_SBC_CIE bta_av_co_sbc_sink_caps =
+{
+    (A2D_SBC_IE_SAMP_FREQ_48 | A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */
+    (A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL), /* ch_mode */
+    (A2D_SBC_IE_BLOCKS_16 | A2D_SBC_IE_BLOCKS_12 | A2D_SBC_IE_BLOCKS_8 | A2D_SBC_IE_BLOCKS_4), /* block_len */
+    (A2D_SBC_IE_SUBBAND_4 | A2D_SBC_IE_SUBBAND_8), /* num_subbands */
+    (A2D_SBC_IE_ALLOC_MD_L | A2D_SBC_IE_ALLOC_MD_S), /* alloc_mthd */
+    A2D_SBC_IE_MAX_BITPOOL, /* max_bitpool */
+    A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */
+};
+
 #if !defined(BTIF_AV_SBC_DEFAULT_SAMP_FREQ)
 #define BTIF_AV_SBC_DEFAULT_SAMP_FREQ A2D_SBC_IE_SAMP_FREQ_44
 #endif
@@ -113,17 +125,23 @@
 {
     BD_ADDR         addr;               /* address of audio/video peer */
     tBTA_AV_CO_SINK snks[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported sinks */
+    tBTA_AV_CO_SINK srcs[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported srcs */
     UINT8           num_snks;           /* total number of sinks at peer */
+    UINT8           num_srcs;           /* total number of srcs at peer */
     UINT8           num_seps;           /* total number of seids at peer */
     UINT8           num_rx_snks;        /* number of received sinks */
+    UINT8           num_rx_srcs;        /* number of received srcs */
     UINT8           num_sup_snks;       /* number of supported sinks in the snks array */
+    UINT8           num_sup_srcs;       /* number of supported srcs in the srcs array */
     tBTA_AV_CO_SINK *p_snk;             /* currently selected sink */
+    tBTA_AV_CO_SINK *p_src;             /* currently selected src */
     UINT8           codec_cfg[AVDT_CODEC_SIZE]; /* current codec configuration */
     BOOLEAN         cp_active;          /* current CP configuration */
     BOOLEAN         acp;                /* acceptor */
     BOOLEAN         recfg_needed;       /* reconfiguration is needed */
     BOOLEAN         opened;             /* opened */
     UINT16          mtu;                /* maximum transmit unit size */
+    UINT16          uuid_to_connect;    /* uuid of peer device */
 } tBTA_AV_CO_PEER;
 
 typedef struct
@@ -152,7 +170,8 @@
 static BOOLEAN bta_av_co_audio_sink_has_scmst(const tBTA_AV_CO_SINK *p_sink);
 static BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_snk_index);
 static BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg);
-
+static BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg);
+static BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index);
 
 
 
@@ -235,7 +254,7 @@
     /* Sanity check */
     if (index >= BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers))
     {
-        APPL_TRACE_ERROR1("bta_av_co_get_peer peer index out of bounds:%d", index);
+        APPL_TRACE_ERROR("bta_av_co_get_peer peer index out of bounds:%d", index);
         return NULL;
     }
 
@@ -260,7 +279,7 @@
 {
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG1("bta_av_co_audio_init: %d", index);
+    APPL_TRACE_DEBUG("bta_av_co_audio_init: %d", index);
 
 #if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
     {
@@ -284,7 +303,7 @@
     switch (index)
     {
     case BTIF_SV_AV_AA_SBC_INDEX:
-        /* Set up for SBC codec */
+        /* Set up for SBC codec  for SRC*/
         *p_codec_type = BTA_AV_CODEC_SBC;
 
         /* This should not fail because we are using constants for parameters */
@@ -292,8 +311,16 @@
 
         /* Codec is valid */
         return TRUE;
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    case BTIF_SV_AV_AA_SBC_SINK_INDEX:
+        *p_codec_type = BTA_AV_CODEC_SBC;
 
+        /* This should not fail because we are using constants for parameters */
+        A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &bta_av_co_sbc_sink_caps, p_codec_info);
 
+        /* Codec is valid */
+        return TRUE;
+#endif
     default:
         /* Not valid */
         return FALSE;
@@ -313,39 +340,246 @@
  **
  *******************************************************************************/
 BTA_API void bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps, UINT8 num_snk,
-        BD_ADDR addr)
+        UINT8 num_src, BD_ADDR addr, UINT16 uuid_local)
 {
     tBTA_AV_CO_PEER *p_peer;
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG3("bta_av_co_audio_disc_res h:x%x num_seps:%d num_snk:%d",
-            hndl, num_seps, num_snk);
+    APPL_TRACE_DEBUG("bta_av_co_audio_disc_res h:x%x num_seps:%d num_snk:%d num_src:%d",
+            hndl, num_seps, num_snk, num_src);
 
     /* Find the peer info */
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_disc_res could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_disc_res could not find peer entry");
         return;
     }
 
     /* Sanity check : this should never happen */
     if (p_peer->opened)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_disc_res peer already opened");
+        APPL_TRACE_ERROR("bta_av_co_audio_disc_res peer already opened");
     }
 
     /* Copy the discovery results */
     bdcpy(p_peer->addr, addr);
     p_peer->num_snks = num_snk;
+    p_peer->num_srcs = num_src;
     p_peer->num_seps = num_seps;
     p_peer->num_rx_snks = 0;
+    p_peer->num_rx_srcs = 0;
     p_peer->num_sup_snks = 0;
+    if (uuid_local == UUID_SERVCLASS_AUDIO_SINK)
+        p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SOURCE;
+    else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE)
+        p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK;
 }
 
 /*******************************************************************************
  **
+ ** Function         bta_av_build_src_cfg
+ **
+ ** Description      This function will build preferred config from src capabilities
+ **
+ **
+ ** Returns          Pass or Fail for current getconfig.
+ **
+ *******************************************************************************/
+void bta_av_build_src_cfg (UINT8 *p_pref_cfg, UINT8 *p_src_cap)
+{
+    tA2D_SBC_CIE    src_cap;
+    tA2D_SBC_CIE    pref_cap;
+    UINT8           status = 0;
+
+    /* initialize it to default SBC configuration */
+    A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &btif_av_sbc_default_config, p_pref_cfg);
+    /* now try to build a preferred one */
+    /* parse configuration */
+    if ((status = A2D_ParsSbcInfo(&src_cap, p_src_cap, TRUE)) != 0)
+    {
+         APPL_TRACE_DEBUG(" Cant parse src cap ret = %d", status);
+         return ;
+    }
+
+    if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_48)
+        pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_48;
+    else if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_44)
+        pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_44;
+
+    if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT)
+        pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT;
+    else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO)
+        pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;
+    else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL)
+        pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
+    else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO)
+        pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO;
+
+    if (src_cap.block_len & A2D_SBC_IE_BLOCKS_16)
+        pref_cap.block_len = A2D_SBC_IE_BLOCKS_16;
+    else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_12)
+        pref_cap.block_len = A2D_SBC_IE_BLOCKS_12;
+    else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_8)
+        pref_cap.block_len = A2D_SBC_IE_BLOCKS_8;
+    else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_4)
+        pref_cap.block_len = A2D_SBC_IE_BLOCKS_4;
+
+    if (src_cap.num_subbands & A2D_SBC_IE_SUBBAND_8)
+        pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_8;
+    else if(src_cap.num_subbands & A2D_SBC_IE_SUBBAND_4)
+        pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_4;
+
+    if (src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_L)
+        pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_L;
+    else if(src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_S)
+        pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_S;
+
+    pref_cap.max_bitpool = src_cap.max_bitpool;
+    pref_cap.min_bitpool = src_cap.min_bitpool;
+
+    A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &pref_cap, p_pref_cfg);
+}
+
+/*******************************************************************************
+ **
+ ** Function         bta_av_audio_sink_getconfig
+ **
+ ** Description      This callout function is executed by AV to retrieve the
+ **                  desired codec and content protection configuration for the
+ **                  A2DP Sink audio stream in Initiator.
+ **
+ **
+ ** Returns          Pass or Fail for current getconfig.
+ **
+ *******************************************************************************/
+UINT8 bta_av_audio_sink_getconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
+        UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid, UINT8 *p_num_protect,
+        UINT8 *p_protect_info)
+{
+
+    UINT8 result = A2D_FAIL;
+    BOOLEAN supported;
+    tBTA_AV_CO_PEER *p_peer;
+    tBTA_AV_CO_SINK *p_src;
+    UINT8 codec_cfg[AVDT_CODEC_SIZE];
+    UINT8 pref_cfg[AVDT_CODEC_SIZE];
+    UINT8 index;
+
+    FUNC_TRACE();
+
+    APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig handle:0x%x codec_type:%d seid:%d",
+                                                               hndl, codec_type, seid);
+    APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+        *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
+
+    /* Retrieve the peer info */
+    p_peer = bta_av_co_get_peer(hndl);
+    if (p_peer == NULL)
+    {
+        APPL_TRACE_ERROR("bta_av_audio_sink_getconfig could not find peer entry");
+        return A2D_FAIL;
+    }
+
+    APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+            p_peer->opened, p_peer->num_srcs, p_peer->num_rx_srcs, p_peer->num_sup_srcs);
+
+    p_peer->num_rx_srcs++;
+
+    /* Check if this is a supported configuration */
+    supported = FALSE;
+    switch (codec_type)
+    {
+        case BTA_AV_CODEC_SBC:
+            supported = TRUE;
+            break;
+
+        default:
+            break;
+    }
+
+    if (supported)
+    {
+        /* If there is room for a new one */
+        if (p_peer->num_sup_srcs < BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs))
+        {
+            p_src = &p_peer->srcs[p_peer->num_sup_srcs++];
+
+            APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
+                    p_codec_info[1], p_codec_info[2], p_codec_info[3],
+                    p_codec_info[4], p_codec_info[5], p_codec_info[6]);
+
+            memcpy(p_src->codec_caps, p_codec_info, AVDT_CODEC_SIZE);
+            p_src->codec_type = codec_type;
+            p_src->sep_info_idx = *p_sep_info_idx;
+            p_src->seid = seid;
+            p_src->num_protect = *p_num_protect;
+            memcpy(p_src->protect_info, p_protect_info, BTA_AV_CP_INFO_LEN);
+        }
+        else
+        {
+            APPL_TRACE_ERROR("bta_av_audio_sink_getconfig no more room for SRC info");
+        }
+    }
+
+    /* If last SNK get capabilities or all supported codec caps retrieved */
+    if ((p_peer->num_rx_srcs == p_peer->num_srcs) ||
+        (p_peer->num_sup_srcs == BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs)))
+    {
+        APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig last SRC reached");
+
+        /* Protect access to bta_av_co_cb.codec_cfg */
+        GKI_disable();
+
+        /* Find a src that matches the codec config */
+        if (bta_av_co_audio_peer_src_supports_codec(p_peer, &index))
+        {
+            APPL_TRACE_DEBUG(" Codec Supported ");
+            p_src = &p_peer->srcs[index];
+
+            /* Build the codec configuration for this sink */
+            {
+                /* Save the new configuration */
+                p_peer->p_src = p_src;
+                /* get preferred config from src_caps */
+                bta_av_build_src_cfg(pref_cfg, p_src->codec_caps);
+                memcpy(p_peer->codec_cfg, pref_cfg, AVDT_CODEC_SIZE);
+
+                APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig  p_codec_info[%x:%x:%x:%x:%x:%x]",
+                        p_peer->codec_cfg[1], p_peer->codec_cfg[2], p_peer->codec_cfg[3],
+                        p_peer->codec_cfg[4], p_peer->codec_cfg[5], p_peer->codec_cfg[6]);
+                /* By default, no content protection */
+                *p_num_protect = 0;
+
+#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
+                /* Check if this sink supports SCMS */
+                if (bta_av_co_audio_sink_has_scmst(p_sink))
+                {
+                    p_peer->cp_active = TRUE;
+                    bta_av_co_cb.cp.active = TRUE;
+                    *p_num_protect = BTA_AV_CP_INFO_LEN;
+                    memcpy(p_protect_info, bta_av_co_cp_scmst, BTA_AV_CP_INFO_LEN);
+                }
+                else
+                {
+                    p_peer->cp_active = FALSE;
+                    bta_av_co_cb.cp.active = FALSE;
+                }
+#endif
+
+                    *p_sep_info_idx = p_src->sep_info_idx;
+                    memcpy(p_codec_info, p_peer->codec_cfg, AVDT_CODEC_SIZE);
+                result =  A2D_SUCCESS;
+            }
+        }
+        /* Protect access to bta_av_co_cb.codec_cfg */
+        GKI_enable();
+    }
+    return result;
+}
+/*******************************************************************************
+ **
  ** Function         bta_av_co_audio_getconfig
  **
  ** Description      This callout function is executed by AV to retrieve the
@@ -370,22 +604,28 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG3("bta_av_co_audio_getconfig handle:0x%x codec_type:%d seid:%d", hndl, codec_type, seid);
-    APPL_TRACE_DEBUG4("num_protect:0x%02x protect_info:0x%02x%02x%02x",
-        *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
-
     /* Retrieve the peer info */
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_getconfig could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_getconfig could not find peer entry");
         return A2D_FAIL;
     }
 
-    APPL_TRACE_DEBUG4("bta_av_co_audio_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+    if (p_peer->uuid_to_connect == UUID_SERVCLASS_AUDIO_SOURCE)
+    {
+        result = bta_av_audio_sink_getconfig(hndl, codec_type, p_codec_info, p_sep_info_idx,
+                                             seid, p_num_protect, p_protect_info);
+        return result;
+    }
+    APPL_TRACE_DEBUG("bta_av_co_audio_getconfig handle:0x%x codec_type:%d seid:%d",
+                                                              hndl, codec_type, seid);
+    APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+        *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
+
+    APPL_TRACE_DEBUG("bta_av_co_audio_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
             p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks);
 
-    /* Increment the number of received sinks capabilities */
     p_peer->num_rx_snks++;
 
     /* Check if this is a supported configuration */
@@ -407,7 +647,7 @@
         {
             p_sink = &p_peer->snks[p_peer->num_sup_snks++];
 
-            APPL_TRACE_DEBUG6("bta_av_co_audio_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
+            APPL_TRACE_DEBUG("bta_av_co_audio_getconfig saved caps[%x:%x:%x:%x:%x:%x]",
                     p_codec_info[1], p_codec_info[2], p_codec_info[3],
                     p_codec_info[4], p_codec_info[5], p_codec_info[6]);
 
@@ -420,7 +660,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR0("bta_av_co_audio_getconfig no more room for SNK info");
+            APPL_TRACE_ERROR("bta_av_co_audio_getconfig no more room for SNK info");
         }
     }
 
@@ -428,7 +668,7 @@
     if ((p_peer->num_rx_snks == p_peer->num_snks) ||
         (p_peer->num_sup_snks == BTA_AV_CO_NUM_ELEMENTS(p_peer->snks)))
     {
-        APPL_TRACE_DEBUG0("bta_av_co_audio_getconfig last sink reached");
+        APPL_TRACE_DEBUG("bta_av_co_audio_getconfig last sink reached");
 
         /* Protect access to bta_av_co_cb.codec_cfg */
         GKI_disable();
@@ -440,7 +680,7 @@
             if (p_peer->acp)
             {
                 *p_sep_info_idx = p_peer->num_seps;
-                APPL_TRACE_EVENT0("no need to fetch more SEPs");
+                APPL_TRACE_EVENT("no need to fetch more SEPs");
             }
 
             p_sink = &p_peer->snks[index];
@@ -448,7 +688,7 @@
             /* Build the codec configuration for this sink */
             if (bta_av_co_audio_codec_build_config(p_sink->codec_caps, codec_cfg))
             {
-                APPL_TRACE_DEBUG6("bta_av_co_audio_getconfig reconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
+                APPL_TRACE_DEBUG("bta_av_co_audio_getconfig reconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
                         codec_cfg[1], codec_cfg[2], codec_cfg[3],
                         codec_cfg[4], codec_cfg[5], codec_cfg[6]);
 
@@ -480,7 +720,7 @@
                 {
                     if (p_peer->recfg_needed)
                     {
-                        APPL_TRACE_DEBUG1("bta_av_co_audio_getconfig call BTA_AvReconfig(x%x)", hndl);
+                        APPL_TRACE_DEBUG("bta_av_co_audio_getconfig call BTA_AvReconfig(x%x)", hndl);
                         BTA_AvReconfig(hndl, TRUE, p_sink->sep_info_idx, p_peer->codec_cfg, *p_num_protect, (UINT8 *)bta_av_co_cp_scmst);
                     }
                 }
@@ -510,39 +750,43 @@
  **
  *******************************************************************************/
 BTA_API void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
-        UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr, UINT8 num_protect, UINT8 *p_protect_info)
+        UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr, UINT8 num_protect, UINT8 *p_protect_info,
+        UINT8 t_local_sep, UINT8 avdt_handle)
 
 {
     tBTA_AV_CO_PEER *p_peer;
     UINT8 status = A2D_SUCCESS;
     UINT8 category = A2D_SUCCESS;
     BOOLEAN recfg_needed = FALSE;
+    BOOLEAN codec_cfg_supported = FALSE;
     UNUSED(seid);
     UNUSED(addr);
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG6("bta_av_co_audio_setconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
+    APPL_TRACE_DEBUG("bta_av_co_audio_setconfig p_codec_info[%x:%x:%x:%x:%x:%x]",
             p_codec_info[1], p_codec_info[2], p_codec_info[3],
             p_codec_info[4], p_codec_info[5], p_codec_info[6]);
-    APPL_TRACE_DEBUG4("num_protect:0x%02x protect_info:0x%02x%02x%02x",
+    APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x",
         num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]);
 
     /* Retrieve the peer info */
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_setconfig could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry");
 
         /* Call call-in rejecting the configuration */
-        bta_av_ci_setconfig(hndl, A2D_BUSY, AVDT_ASC_CODEC, 0, NULL, FALSE);
+        bta_av_ci_setconfig(hndl, A2D_BUSY, AVDT_ASC_CODEC, 0, NULL, FALSE, avdt_handle);
         return;
     }
+    APPL_TRACE_DEBUG("bta_av_co_audio_setconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)",
+            p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks);
 
     /* Sanity check: should not be opened at this point */
     if (p_peer->opened)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_setconfig peer already in use");
+        APPL_TRACE_ERROR("bta_av_co_audio_setconfig peer already in use");
     }
 
 #if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
@@ -552,7 +796,7 @@
         if ((num_protect != 1) ||
             (bta_av_co_cp_is_scmst(p_protect_info) == FALSE))
         {
-            APPL_TRACE_ERROR0("bta_av_co_audio_setconfig wrong CP configuration");
+            APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration");
             status = A2D_BAD_CP_TYPE;
             category = AVDT_ASC_PROTECT;
         }
@@ -561,16 +805,27 @@
     /* Do not support content protection for the time being */
     if (num_protect != 0)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_setconfig wrong CP configuration");
+        APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration");
         status = A2D_BAD_CP_TYPE;
         category = AVDT_ASC_PROTECT;
     }
 #endif
     if (status == A2D_SUCCESS)
     {
-        /* Check if codec configuration is supported */
-        if (bta_av_co_audio_media_supports_config(codec_type, p_codec_info))
+        if(AVDT_TSEP_SNK == t_local_sep)
         {
+            codec_cfg_supported = bta_av_co_audio_sink_supports_config(codec_type, p_codec_info);
+            APPL_TRACE_DEBUG(" Peer is  A2DP SRC ");
+        }
+        if(AVDT_TSEP_SRC == t_local_sep)
+        {
+            codec_cfg_supported = bta_av_co_audio_media_supports_config(codec_type, p_codec_info);
+            APPL_TRACE_DEBUG(" Peer is A2DP SINK ");
+        }
+        /* Check if codec configuration is supported */
+        if (codec_cfg_supported)
+        {
+
             /* Protect access to bta_av_co_cb.codec_cfg */
             GKI_disable();
 
@@ -589,17 +844,24 @@
 
                 /* if remote side requests a restricted notify sinks preferred bitpool range as all other params are
                    already checked for validify */
-                APPL_TRACE_EVENT2("remote peer setconfig bitpool range [%d:%d]",
+                APPL_TRACE_EVENT("remote peer setconfig bitpool range [%d:%d]",
                    p_codec_info[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
                    p_codec_info[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] );
 
                 bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_SBC;
                 memcpy(bta_av_co_cb.codec_cfg_setconfig.info, p_codec_info, AVDT_CODEC_SIZE);
+                if(AVDT_TSEP_SNK == t_local_sep)
+                {
+                    /* If Peer is SRC, and our cfg subset matches with what is requested by peer, then
+                                         just accept what peer wants */
+                    memcpy(bta_av_co_cb.codec_cfg.info, p_codec_info, AVDT_CODEC_SIZE);
+                    recfg_needed = FALSE;
+                }
                 break;
 
 
             default:
-                APPL_TRACE_ERROR1("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg.id);
+                APPL_TRACE_ERROR("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg.id);
                 recfg_needed = TRUE;
                 break;
             }
@@ -615,10 +877,10 @@
 
     if (status != A2D_SUCCESS)
     {
-        APPL_TRACE_DEBUG2("bta_av_co_audio_setconfig reject s=%d c=%d", status, category);
+        APPL_TRACE_DEBUG("bta_av_co_audio_setconfig reject s=%d c=%d", status, category);
 
         /* Call call-in rejecting the configuration */
-        bta_av_ci_setconfig(hndl, status, category, 0, NULL, FALSE);
+        bta_av_ci_setconfig(hndl, status, category, 0, NULL, FALSE, avdt_handle);
     }
     else
     {
@@ -626,10 +888,10 @@
         p_peer->acp = TRUE;
         p_peer->recfg_needed = recfg_needed;
 
-        APPL_TRACE_DEBUG1("bta_av_co_audio_setconfig accept reconf=%d", recfg_needed);
+        APPL_TRACE_DEBUG("bta_av_co_audio_setconfig accept reconf=%d", recfg_needed);
 
         /* Call call-in accepting the configuration */
-        bta_av_ci_setconfig(hndl, A2D_SUCCESS, A2D_SUCCESS, 0, NULL, recfg_needed);
+        bta_av_ci_setconfig(hndl, A2D_SUCCESS, A2D_SUCCESS, 0, NULL, recfg_needed, avdt_handle);
     }
 }
 
@@ -652,13 +914,13 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG2("bta_av_co_audio_open mtu:%d codec_type:%d", mtu, codec_type);
+    APPL_TRACE_DEBUG("bta_av_co_audio_open mtu:%d codec_type:%d", mtu, codec_type);
 
     /* Retrieve the peer info */
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_setconfig could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry");
     }
     else
     {
@@ -687,7 +949,7 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG0("bta_av_co_audio_close");
+    APPL_TRACE_DEBUG("bta_av_co_audio_close");
 
     /* Retrieve the peer info */
     p_peer = bta_av_co_get_peer(hndl);
@@ -698,7 +960,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_close could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_close could not find peer entry");
     }
 
     /* reset remote preference through setconfig */
@@ -726,7 +988,7 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG0("bta_av_co_audio_start");
+    APPL_TRACE_DEBUG("bta_av_co_audio_start");
 
 }
 
@@ -748,7 +1010,7 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG0("bta_av_co_audio_stop");
+    APPL_TRACE_DEBUG("bta_av_co_audio_stop");
 }
 
 /*******************************************************************************
@@ -788,7 +1050,7 @@
 
 
         default:
-            APPL_TRACE_ERROR1("bta_av_co_audio_src_data_path Unsupported codec type (%d)", codec_type);
+            APPL_TRACE_ERROR("bta_av_co_audio_src_data_path Unsupported codec type (%d)", codec_type);
             break;
         }
 #if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
@@ -823,7 +1085,7 @@
 {
     FUNC_TRACE();
 
-    APPL_TRACE_ERROR1("bta_av_co_audio_drop dropped: x%x", hndl);
+    APPL_TRACE_ERROR("bta_av_co_audio_drop dropped: x%x", hndl);
 }
 
 /*******************************************************************************
@@ -841,7 +1103,7 @@
 {
     FUNC_TRACE();
 
-    APPL_TRACE_ERROR2("bta_av_co_audio_delay handle: x%x, delay:0x%x", hndl, delay);
+    APPL_TRACE_ERROR("bta_av_co_audio_delay handle: x%x, delay:0x%x", hndl, delay);
 }
 
 
@@ -872,12 +1134,12 @@
         p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF];
         p_codec_cfg[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF];
 
-        APPL_TRACE_EVENT2("bta_av_co_audio_codec_build_config : bitpool min %d, max %d",
+        APPL_TRACE_EVENT("bta_av_co_audio_codec_build_config : bitpool min %d, max %d",
                     p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
                     p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]);
         break;
     default:
-        APPL_TRACE_ERROR1("bta_av_co_audio_codec_build_config: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
+        APPL_TRACE_ERROR("bta_av_co_audio_codec_build_config: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
         return FALSE;
         break;
     }
@@ -901,7 +1163,7 @@
     {
     case BTIF_AV_CODEC_SBC:
 
-        APPL_TRACE_EVENT4("bta_av_co_audio_codec_cfg_matches_caps : min %d/%d max %d/%d",
+        APPL_TRACE_EVENT("bta_av_co_audio_codec_cfg_matches_caps : min %d/%d max %d/%d",
            p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
            p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
            p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF],
@@ -911,7 +1173,7 @@
         if (!((p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF] & p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF]) &&
               (p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF] & p_codec_cfg[BTA_AV_CO_SBC_BLOCK_BAND_OFF])))
         {
-            APPL_TRACE_EVENT4("FALSE %x %x %x %x",
+            APPL_TRACE_EVENT("FALSE %x %x %x %x",
                     p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF],
                     p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF],
                     p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF],
@@ -922,11 +1184,11 @@
 
 
     default:
-        APPL_TRACE_ERROR1("bta_av_co_audio_codec_cfg_matches_caps: unsupported codec id %d", codec_id);
+        APPL_TRACE_ERROR("bta_av_co_audio_codec_cfg_matches_caps: unsupported codec id %d", codec_id);
         return FALSE;
         break;
     }
-    APPL_TRACE_EVENT0("TRUE");
+    APPL_TRACE_EVENT("TRUE");
 
     return TRUE;
 }
@@ -984,7 +1246,7 @@
         STREAM_TO_UINT16(cp_id, p_protectinfo);
         if (cp_id == BTA_AV_CP_SCMS_T_ID)
         {
-            APPL_TRACE_DEBUG0("bta_av_co_cp_is_scmst: SCMS-T found");
+            APPL_TRACE_DEBUG("bta_av_co_cp_is_scmst: SCMS-T found");
             return TRUE;
         }
     }
@@ -1022,7 +1284,7 @@
         /* Decrement the SC counter */
         index--;
     }
-    APPL_TRACE_DEBUG0("bta_av_co_audio_sink_has_scmst: SCMS-T not found");
+    APPL_TRACE_DEBUG("bta_av_co_audio_sink_has_scmst: SCMS-T not found");
     return FALSE;
 }
 
@@ -1046,7 +1308,7 @@
     }
     else
     {
-        APPL_TRACE_DEBUG0("bta_av_co_audio_sink_supports_cp: not required");
+        APPL_TRACE_DEBUG("bta_av_co_audio_sink_supports_cp: not required");
         return TRUE;
     }
 }
@@ -1083,7 +1345,7 @@
 
 
             default:
-                APPL_TRACE_ERROR1("bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
+                APPL_TRACE_ERROR("bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg.id);
                 return FALSE;
                 break;
             }
@@ -1094,13 +1356,89 @@
 
 /*******************************************************************************
  **
- ** Function         bta_av_co_audio_media_supports_config
+ ** Function         bta_av_co_audio_peer_src_supports_codec
+ **
+ ** Description      Check if a peer acting as src supports codec config
+ **
+ ** Returns          TRUE if the connection supports this codec, FALSE otherwise
+ **
+ *******************************************************************************/
+static BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index)
+{
+    int index;
+    UINT8 codec_type;
+    FUNC_TRACE();
+
+    /* Configure the codec type to look for */
+    codec_type = bta_av_co_cb.codec_cfg.id;
+
+
+    for (index = 0; index < p_peer->num_sup_srcs; index++)
+    {
+        if (p_peer->srcs[index].codec_type == codec_type)
+        {
+            switch (bta_av_co_cb.codec_cfg.id)
+            {
+            case BTIF_AV_CODEC_SBC:
+                if (p_src_index) *p_src_index = index;
+                if (0 ==  bta_av_sbc_cfg_matches_cap((UINT8 *)p_peer->srcs[index].codec_caps,
+                                                     (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps))
+                {
+                    return TRUE;
+                }
+                break;
+
+            default:
+                APPL_TRACE_ERROR("peer_src_supports_codec: unsupported codec id %d",
+                                                            bta_av_co_cb.codec_cfg.id);
+                return FALSE;
+                break;
+            }
+        }
+    }
+    return FALSE;
+}
+
+/*******************************************************************************
+ **
+ ** Function         bta_av_co_audio_sink_supports_config
  **
  ** Description      Check if the media source supports a given configuration
  **
  ** Returns          TRUE if the media source supports this config, FALSE otherwise
  **
  *******************************************************************************/
+static BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg)
+{
+    FUNC_TRACE();
+
+    switch (codec_type)
+    {
+    case BTA_AV_CODEC_SBC:
+        if (bta_av_sbc_cfg_in_cap((UINT8 *)p_codec_cfg, (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps))
+        {
+            return FALSE;
+        }
+        break;
+
+
+    default:
+        APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
+        return FALSE;
+        break;
+    }
+    return TRUE;
+}
+
+/*******************************************************************************
+ **
+ ** Function         bta_av_co_audio_media_supports_config
+ **
+ ** Description      Check if the media sink supports a given configuration
+ **
+ ** Returns          TRUE if the media source supports this config, FALSE otherwise
+ **
+ *******************************************************************************/
 static BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg)
 {
     FUNC_TRACE();
@@ -1116,7 +1454,7 @@
 
 
     default:
-        APPL_TRACE_ERROR1("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
+        APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type);
         return FALSE;
         break;
     }
@@ -1147,7 +1485,7 @@
 
     FUNC_TRACE();
 
-    APPL_TRACE_DEBUG0("bta_av_co_audio_codec_supported");
+    APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported");
 
     /* Check AV feeding is supported */
     *p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED;
@@ -1164,7 +1502,7 @@
                 /* Check that this sink is compatible with the CP */
                 if (!bta_av_co_audio_sink_supports_cp(p_sink))
                 {
-                    APPL_TRACE_DEBUG2("bta_av_co_audio_codec_supported sink %d of peer %d doesn't support cp",
+                    APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported sink %d of peer %d doesn't support cp",
                             snk_index, index);
                     *p_status = BTIF_ERROR_SRV_AV_CP_NOT_SUPPORTED;
                     return FALSE;
@@ -1200,7 +1538,7 @@
                             bta_av_co_cb.cp.active = FALSE;
                         }
 #endif
-                        APPL_TRACE_DEBUG1("bta_av_co_audio_codec_supported call BTA_AvReconfig(x%x)", BTA_AV_CO_AUDIO_INDX_TO_HNDL(index));
+                        APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported call BTA_AvReconfig(x%x)", BTA_AV_CO_AUDIO_INDX_TO_HNDL(index));
                         BTA_AvReconfig(BTA_AV_CO_AUDIO_INDX_TO_HNDL(index), TRUE, p_sink->sep_info_idx,
                                 p_peer->codec_cfg, num_protect, (UINT8 *)bta_av_co_cp_scmst);
                     }
@@ -1208,7 +1546,7 @@
             }
             else
             {
-                APPL_TRACE_DEBUG1("bta_av_co_audio_codec_supported index %d doesn't support codec", index);
+                APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported index %d doesn't support codec", index);
                 return FALSE;
             }
         }
@@ -1237,7 +1575,7 @@
 
     if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, (tA2D_SBC_CIE *)&btif_av_sbc_default_config, bta_av_co_cb.codec_cfg.info) != A2D_SUCCESS)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed");
+        APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed");
     }
 
     GKI_enable();
@@ -1264,7 +1602,7 @@
     /* Check AV feeding is supported */
     *p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED;
 
-    APPL_TRACE_DEBUG1("bta_av_co_audio_set_codec cid=%d", p_feeding->format);
+    APPL_TRACE_DEBUG("bta_av_co_audio_set_codec cid=%d", p_feeding->format);
 
     /* Supported codecs */
     switch (p_feeding->format)
@@ -1276,13 +1614,13 @@
         if ((p_feeding->cfg.pcm.num_channel != 1) &&
             (p_feeding->cfg.pcm.num_channel != 2))
         {
-            APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM channel number unsupported");
+            APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM channel number unsupported");
             return FALSE;
         }
         if ((p_feeding->cfg.pcm.bit_per_sample != 8) &&
             (p_feeding->cfg.pcm.bit_per_sample != 16))
         {
-            APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM sample size unsupported");
+            APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sample size unsupported");
             return FALSE;
         }
         switch (p_feeding->cfg.pcm.sampling_freq)
@@ -1302,21 +1640,21 @@
             sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_44;
             break;
         default:
-            APPL_TRACE_ERROR0("bta_av_co_audio_set_codec PCM sampling frequency unsupported");
+            APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sampling frequency unsupported");
             return FALSE;
             break;
         }
         /* Build the codec config */
         if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, &sbc_config, new_cfg.info) != A2D_SUCCESS)
         {
-            APPL_TRACE_ERROR0("bta_av_co_audio_set_codec A2D_BldSbcInfo failed");
+            APPL_TRACE_ERROR("bta_av_co_audio_set_codec A2D_BldSbcInfo failed");
             return FALSE;
         }
         break;
 
 
     default:
-        APPL_TRACE_ERROR0("bta_av_co_audio_set_codec Feeding format unsupported");
+        APPL_TRACE_ERROR("bta_av_co_audio_set_codec Feeding format unsupported");
         return FALSE;
         break;
     }
@@ -1347,7 +1685,7 @@
     tBTA_AV_CO_PEER *p_peer;
     tBTA_AV_CO_SINK *p_sink;
 
-    APPL_TRACE_EVENT1("bta_av_co_cb.codec_cfg.id : codec 0x%x", bta_av_co_cb.codec_cfg.id);
+    APPL_TRACE_EVENT("bta_av_co_cb.codec_cfg.id : codec 0x%x", bta_av_co_cb.codec_cfg.id);
 
     /* Minimum MTU is by default very large */
     *p_minmtu = 0xFFFF;
@@ -1378,7 +1716,7 @@
                             p_sbc_config->max_bitpool =
                                BTA_AV_CO_MIN(p_sink->codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF],
                                              p_sbc_config->max_bitpool);
-                            APPL_TRACE_EVENT2("bta_av_co_audio_get_sbc_config : sink bitpool min %d, max %d",
+                            APPL_TRACE_EVENT("bta_av_co_audio_get_sbc_config : sink bitpool min %d, max %d",
                                  p_sbc_config->min_bitpool, p_sbc_config->max_bitpool);
                             break;
                         }
@@ -1418,7 +1756,7 @@
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_audio_discard_config could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_audio_discard_config could not find peer entry");
         return;
     }
 
@@ -1476,7 +1814,7 @@
     p_peer = bta_av_co_get_peer(hndl);
     if (p_peer == NULL)
     {
-        APPL_TRACE_ERROR0("bta_av_co_peer_cp_supported could not find peer entry");
+        APPL_TRACE_ERROR("bta_av_co_peer_cp_supported could not find peer entry");
         return FALSE;
     }
 
@@ -1488,7 +1826,7 @@
             return bta_av_co_audio_sink_has_scmst(p_sink);
         }
     }
-    APPL_TRACE_ERROR0("bta_av_co_peer_cp_supported did not find SBC sink");
+    APPL_TRACE_ERROR("bta_av_co_peer_cp_supported did not find SBC sink");
     return FALSE;
 }
 
diff --git a/btif/co/bta_dm_co.c b/btif/co/bta_dm_co.c
index 13a5c8f..d576049 100644
--- a/btif/co/bta_dm_co.c
+++ b/btif/co/bta_dm_co.c
@@ -29,7 +29,14 @@
 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
 #include "bte_appl.h"
 
-tBTE_APPL_CFG bte_appl_cfg = { 0x5, 0x4, 0x7, 0x7, 0x10 };
+tBTE_APPL_CFG bte_appl_cfg =
+{
+    BTM_AUTH_SPGB_YES,  // Authentication requirements
+    BTM_LOCAL_IO_CAPS,  // I/O capabilities
+    7,                  // Initiaor key size
+    7,                  // Responder key size
+    16                  // Maximum key size
+};
 #endif
 
 /*******************************************************************************
@@ -75,10 +82,11 @@
 #if (BTM_OOB_INCLUDED == TRUE)
     btif_dm_set_oob_for_io_req(p_oob_data);
 #endif
-    BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_oob_data = %d", *p_oob_data);
-    BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_io_cap = %d", *p_io_cap);
-    BTIF_TRACE_DEBUG1("bta_dm_co_io_req *p_auth_req = %d", *p_auth_req);
-    BTIF_TRACE_DEBUG1("bta_dm_co_io_req is_orig = %d", is_orig);
+    btif_dm_proc_io_req(bd_addr, p_io_cap, p_oob_data, p_auth_req, is_orig);
+    BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_oob_data = %d", *p_oob_data);
+    BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_io_cap = %d", *p_io_cap);
+    BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_auth_req = %d", *p_auth_req);
+    BTIF_TRACE_DEBUG("bta_dm_co_io_req is_orig = %d", is_orig);
 }
 
 /*******************************************************************************
@@ -99,10 +107,7 @@
 void bta_dm_co_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
                       tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req)
 {
-    UNUSED(bd_addr);
-    UNUSED(io_cap);
-    UNUSED(oob_data);
-    UNUSED(auth_req);
+    btif_dm_proc_io_rsp(bd_addr, io_cap, oob_data, auth_req);
 }
 
 /*******************************************************************************
@@ -141,7 +146,7 @@
 *******************************************************************************/
 void bta_dm_co_loc_oob(BOOLEAN valid, BT_OCTET16 c, BT_OCTET16 r)
 {
-    BTIF_TRACE_DEBUG1("bta_dm_co_loc_oob, valid = %d", valid);
+    BTIF_TRACE_DEBUG("bta_dm_co_loc_oob, valid = %d", valid);
 #ifdef BTIF_DM_OOB_TEST
     btif_dm_proc_loc_oob(valid, c, r);
 #endif
@@ -170,7 +175,7 @@
     result = btif_dm_proc_rmt_oob(bd_addr, p_c, p_r);
 #endif
 
-    BTIF_TRACE_DEBUG1("bta_dm_co_rmt_oob: result=%d",result);
+    BTIF_TRACE_DEBUG("bta_dm_co_rmt_oob: result=%d",result);
     bta_dm_ci_rmt_oob(result, bd_addr, p_c, p_r);
 }
 
@@ -212,7 +217,7 @@
 {
     tBTM_SCO_ROUTE_TYPE route = BTA_DM_SCO_ROUTE_PCM;
 
-    BTIF_TRACE_DEBUG0("bta_dm_sco_co_init");
+    BTIF_TRACE_DEBUG("bta_dm_sco_co_init");
 
     /* set up SCO routing configuration if SCO over HCI app ID is used and run time
         configuration is set to SCO over HCI */
@@ -232,7 +237,7 @@
         /* initialize SCO codec */
         if (!btui_sco_codec_init(rx_bw, tx_bw))
         {
-            BTIF_TRACE_ERROR0("codec initialization exception!");
+            BTIF_TRACE_ERROR("codec initialization exception!");
         }
     }
 
@@ -257,7 +262,7 @@
 
     if (btui_cb.sco_hci)
     {
-        BTIF_TRACE_DEBUG2("bta_dm_sco_co_open handle:%d pkt_size:%d", handle, pkt_size);
+        BTIF_TRACE_DEBUG("bta_dm_sco_co_open handle:%d pkt_size:%d", handle, pkt_size);
         /* use dedicated SCO buffer pool for SCO TX data */
         cfg.pool_id = HCI_SCO_POOL_ID;
         cfg.p_cback = btui_sco_codec_callback;
@@ -283,7 +288,7 @@
 {
     if (btui_cb.sco_hci)
     {
-        BTIF_TRACE_DEBUG0("bta_dm_sco_co_close close codec");
+        BTIF_TRACE_DEBUG("bta_dm_sco_co_close close codec");
         /* close sco codec */
         btui_sco_codec_close();
 
@@ -346,9 +351,9 @@
                              tBTA_LE_KEY_TYPE  *p_resp_key )
 {
     UNUSED(bd_addr);
-    BTIF_TRACE_ERROR0("##################################");
-    BTIF_TRACE_ERROR0("bta_dm_co_le_io_key_req: only setting max size to 16");
-    BTIF_TRACE_ERROR0("##################################");
+    BTIF_TRACE_ERROR("##################################");
+    BTIF_TRACE_ERROR("bta_dm_co_le_io_key_req: only setting max size to 16");
+    BTIF_TRACE_ERROR("##################################");
     *p_max_key_size = 16;
     *p_init_key = *p_resp_key =
                   (BTA_LE_KEY_PENC|BTA_LE_KEY_PID|BTA_LE_KEY_PCSRK|BTA_LE_KEY_LENC|BTA_LE_KEY_LID|BTA_LE_KEY_LCSRK);
@@ -370,9 +375,9 @@
 void bta_dm_co_ble_load_local_keys(tBTA_DM_BLE_LOCAL_KEY_MASK *p_key_mask, BT_OCTET16 er,
                                    tBTA_BLE_LOCAL_ID_KEYS *p_id_keys)
 {
-    BTIF_TRACE_DEBUG0("##################################");
-    BTIF_TRACE_DEBUG0("bta_dm_co_ble_load_local_keys:  Load local keys if any are persisted");
-    BTIF_TRACE_DEBUG0("##################################");
+    BTIF_TRACE_DEBUG("##################################");
+    BTIF_TRACE_DEBUG("bta_dm_co_ble_load_local_keys:  Load local keys if any are persisted");
+    BTIF_TRACE_DEBUG("##################################");
     btif_dm_get_ble_local_keys( p_key_mask, er, p_id_keys);
 }
 
diff --git a/btif/co/bta_fs_co.c b/btif/co/bta_fs_co.c
index 958fef5..54bb87e 100644
--- a/btif/co/bta_fs_co.c
+++ b/btif/co/bta_fs_co.c
@@ -63,11 +63,11 @@
     int ret = 0;
     char nameBuffer[PATH_MAX] = {0};
     struct stat statBuffer;
-    BTIF_TRACE_DEBUG1("in del_path for path:%s", path);
+    BTIF_TRACE_DEBUG("in del_path for path:%s", path);
     dir = opendir(path);
 
     if (dir == NULL) {
-        BTIF_TRACE_DEBUG1("opendir failed on path:%s", path);
+        BTIF_TRACE_DEBUG("opendir failed on path:%s", path);
         return -1;
     }
 
@@ -82,7 +82,7 @@
         de = readdir(dir);
 
         if (de == NULL) {
-            BTIF_TRACE_DEBUG1("readdir failed for path:%s", path);
+            BTIF_TRACE_DEBUG("readdir failed for path:%s", path);
             //ret = -1;
             break;
         }
@@ -91,7 +91,7 @@
            continue;
 
         if((int)strlen(de->d_name) > PATH_MAX - nameLen) {
-            BTIF_TRACE_DEBUG1("d_name len:%d is too big", strlen(de->d_name));
+            BTIF_TRACE_DEBUG("d_name len:%d is too big", strlen(de->d_name));
             ret = -1;
             break;
         }
@@ -101,7 +101,7 @@
         ret = lstat (nameBuffer, &statBuffer);
 
         if (ret != 0) {
-            BTIF_TRACE_DEBUG1("lstat failed for path:%s", nameBuffer);
+            BTIF_TRACE_DEBUG("lstat failed for path:%s", nameBuffer);
             break;
         }
 
@@ -113,7 +113,7 @@
         } else {
             ret = unlink(nameBuffer);
             if (ret != 0) {
-                BTIF_TRACE_DEBUG1("unlink failed for path:%s", nameBuffer);
+                BTIF_TRACE_DEBUG("unlink failed for path:%s", nameBuffer);
                 break;
             }
         }
@@ -122,7 +122,7 @@
     closedir(dir);
     if(ret == 0) {
         ret = rmdir(path);
-        BTIF_TRACE_DEBUG2("rmdir return:%d for path:%s", ret, path);
+        BTIF_TRACE_DEBUG("rmdir return:%d for path:%s", ret, path);
     }
 
     return ret;
@@ -191,7 +191,7 @@
 	default:
 	return BTA_FS_CO_OK;
     }
-    BTIF_TRACE_DEBUG0("*************FTP- Access Failed **********");
+    BTIF_TRACE_DEBUG("*************FTP- Access Failed **********");
     return BTA_FS_CO_EACCES;
 }
 
@@ -274,7 +274,7 @@
 
                 max_space = fs_buffer.f_bavail * fs_buffer.f_bsize;
 #if (BTA_FS_DEBUG==TRUE)
-                BTIF_TRACE_DEBUG2("btapp_fs_enough_space(file size: %d): (uint)max_size: %u", size, (UINT32)max_space);
+                BTIF_TRACE_DEBUG("btapp_fs_enough_space(file size: %d): (uint)max_size: %u", size, (UINT32)max_space);
 #endif
                 if (max_space < size)
                     err = EFBIG;
@@ -282,7 +282,7 @@
             else
             {
                 err = errno;
-                BTIF_TRACE_WARNING1("btapp_fs_enough_space(): statfs() failed with err: %d", err);
+                BTIF_TRACE_WARNING("btapp_fs_enough_space(): statfs() failed with err: %d", err);
             }
         }
         else
@@ -353,7 +353,7 @@
                 if (oflags & O_CREAT)
                 {
                     fchown(fd, BT_UID, BT_GID);
-                    BTIF_TRACE_DEBUG0("\n ******CHANGED OWNERSHIP SUCCESSFULLY**********");
+                    BTIF_TRACE_DEBUG("\n ******CHANGED OWNERSHIP SUCCESSFULLY**********");
                 }
             }
         }
@@ -364,9 +364,9 @@
         }
     }
 
-    BTIF_TRACE_DEBUG4("[CO] bta_fs_co_open: handle:%d err:%d, flags:%x, app id:%d",
+    BTIF_TRACE_DEBUG("[CO] bta_fs_co_open: handle:%d err:%d, flags:%x, app id:%d",
             fd, err, oflags, app_id);
-    BTIF_TRACE_DEBUG1("file=%s", p_path);
+    BTIF_TRACE_DEBUG("file=%s", p_path);
 
     /* convert fs error into bta_fs err. erro is set by first call to enough space to a valid value
      * and needs only updating in case of error. This reports correct failure to remote obex! */
@@ -412,13 +412,13 @@
     tBTA_FS_CO_STATUS status = BTA_FS_CO_OK;
     int err;
 
-    BTIF_TRACE_DEBUG2("[CO] bta_fs_co_close: handle:%d, app id:%d",
+    BTIF_TRACE_DEBUG("[CO] bta_fs_co_close: handle:%d, app id:%d",
         fd, app_id);
     if (close (fd) < 0)
     {
         err = errno;
         status = BTA_FS_CO_FAIL;
-        BTIF_TRACE_WARNING3("[CO] bta_fs_co_close: handle:%d error=%d app_id:%d", fd, err, app_id);
+        BTIF_TRACE_WARNING("[CO] bta_fs_co_close: handle:%d error=%d app_id:%d", fd, err, app_id);
     }
 
     return (status);
@@ -462,7 +462,7 @@
     {
         err = errno;
         status = BTA_FS_CO_FAIL;
-        BTIF_TRACE_WARNING3("[CO] bta_fs_co_read: handle:%d error=%d app_id:%d",
+        BTIF_TRACE_WARNING("[CO] bta_fs_co_read: handle:%d error=%d app_id:%d",
                             fd, err, app_id);
     }
     else if (num_read < nbytes)
@@ -510,7 +510,7 @@
         err = errno;
         status = BTA_FS_CO_FAIL;
     }
-/*    BTIF_TRACE_DEBUG3("[CO] bta_fs_co_write: handle:%d error=%d, num_written:%d", fd, err, num_written);*/
+/*    BTIF_TRACE_DEBUG("[CO] bta_fs_co_write: handle:%d error=%d, num_written:%d", fd, err, num_written);*/
 
     bta_fs_ci_write(fd, status, evt);
 }
@@ -610,7 +610,7 @@
     }
     else
     {
-	BTIF_TRACE_DEBUG0("stat() failed! ");
+	BTIF_TRACE_DEBUG("stat() failed! ");
         return BTA_FS_CO_FAIL;
     }
 
@@ -645,7 +645,7 @@
     {
         err = errno;
         status = BTA_FS_CO_FAIL;
-        BTIF_TRACE_WARNING3("[CO] bta_fs_co_mkdir: error=%d, path [%s] app_id:%d",
+        BTIF_TRACE_WARNING("[CO] bta_fs_co_mkdir: error=%d, path [%s] app_id:%d",
                             err, p_path, app_id);
     }
     return (status);
@@ -678,10 +678,10 @@
     char *dirName, *tmp = NULL;
 
     path_len = strlen( p_path )+1;
-    BTIF_TRACE_DEBUG2( "bta_fs_co_rmdir( app_id: %d ): path_len: %d", app_id, path_len );
+    BTIF_TRACE_DEBUG( "bta_fs_co_rmdir( app_id: %d ): path_len: %d", app_id, path_len );
 #if (TRUE==BTA_FS_DEBUG)
-    BTIF_TRACE_DEBUG1( "bta_fs_co_rmdir():path_len: %d, p_path", app_id );
-    BTIF_TRACE_DEBUG0( p_path );
+    BTIF_TRACE_DEBUG( "bta_fs_co_rmdir():path_len: %d, p_path", app_id );
+    BTIF_TRACE_DEBUG( p_path );
 #endif
 
     /* allocate a temp buffer for path with 0 char. make sure not to crash if path is too big! */
@@ -692,7 +692,7 @@
     }
     else
     {
-        BTIF_TRACE_WARNING2( "bta_fs_co_rmdir( app_id: %d ) for path_len: %d::out of memory",
+        BTIF_TRACE_WARNING( "bta_fs_co_rmdir( app_id: %d ) for path_len: %d::out of memory",
                              app_id, path_len );
         return BTA_FS_CO_FAIL;
     }
@@ -709,7 +709,7 @@
     {
         free(dirName);
 #if (TRUE==BTA_FS_DEBUG)
-        BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::stat(dirName) failed" );
+        BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::stat(dirName) failed" );
 #endif
         return BTA_FS_CO_FAIL;
     }
@@ -718,7 +718,7 @@
     if (status != BTA_FS_CO_OK)
     {
 #if (TRUE==BTA_FS_DEBUG)
-        BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::getAccess(dirName) FAILED");
+        BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::getAccess(dirName) FAILED");
 #endif
         return status;
     }
@@ -730,7 +730,7 @@
     else
     {
 #if (TRUE==BTA_FS_DEBUG)
-        BTIF_TRACE_WARNING0( "bta_fs_co_rmdir()::stat(p_path) FAILED");
+        BTIF_TRACE_WARNING( "bta_fs_co_rmdir()::stat(p_path) FAILED");
 #endif
         return BTA_FS_CO_FAIL;
     }
@@ -738,7 +738,7 @@
     if (status != BTA_FS_CO_OK)
     {
 #if (TRUE==BTA_FS_DEBUG)
-        BTIF_TRACE_DEBUG0( "bta_fs_co_rmdir()::getAccess(p_path) FAILED");
+        BTIF_TRACE_DEBUG( "bta_fs_co_rmdir()::getAccess(p_path) FAILED");
 #endif
         return status;
     }
@@ -746,7 +746,7 @@
     if (del_path(p_path) != 0)
     {
         err = errno;
-        BTIF_TRACE_WARNING1( "bta_fs_co_rmdir():rmdir/del_path FAILED with err: %d", err );
+        BTIF_TRACE_WARNING( "bta_fs_co_rmdir():rmdir/del_path FAILED with err: %d", err );
         if (err == EACCES)
             status = BTA_FS_CO_EACCES;
         else if (err == ENOTEMPTY)
@@ -777,7 +777,7 @@
 *******************************************************************************/
 tBTA_FS_CO_STATUS bta_fs_co_unlink(const char *p_path, UINT8 app_id)
 {
-    BTIF_TRACE_DEBUG0("bta_fs_co_unlink");
+    BTIF_TRACE_DEBUG("bta_fs_co_unlink");
     int err;
     tBTA_FS_CO_STATUS status = BTA_FS_CO_OK;
     char *dirName, *tmp=NULL;
@@ -806,7 +806,7 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("stat() failed! ");
+        BTIF_TRACE_DEBUG("stat() failed! ");
         free(dirName);
         return BTA_FS_CO_FAIL;
     }
@@ -865,32 +865,32 @@
     char fullname[500];
     UNUSED(app_id);
 
-    BTIF_TRACE_DEBUG0("Entered bta_fs_co_getdirentry");
+    BTIF_TRACE_DEBUG("Entered bta_fs_co_getdirentry");
 
     /* First item is to be retrieved */
     if (first_item)
     {
-        BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: path = %s", p_path);
+        BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: path = %s", p_path);
 
         dir = opendir(p_path);
         if(dir == NULL)
         {
-     	    BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dir is NULL so error out with errno=%d", errno);
+     	    BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dir is NULL so error out with errno=%d", errno);
             co_status = BTA_FS_CO_EODIR;
             bta_fs_ci_direntry(co_status, evt);
             return;
         }
 
-        BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dir = %p", dir);
+        BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dir = %p", dir);
         if((dirent = readdir(dir)) != NULL)
         {
             p_entry->refdata = (UINT32) dir;     /* Save this for future searches */
             status = 0;
-            BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+            BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
         }
         else
         {
-            BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+            BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
             /* Close the search if there are no more items */
             closedir( (DIR*) p_entry->refdata);
             co_status = BTA_FS_CO_EODIR;
@@ -903,18 +903,18 @@
             /* Close the search if there are no more items */
             closedir( (DIR*) p_entry->refdata);
             co_status = BTA_FS_CO_EODIR;
-            BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+            BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
         }
         else
         {
-            BTIF_TRACE_DEBUG1("bta_fs_co_getdirentry: dirent = %p", dirent);
+            BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: dirent = %p", dirent);
             status = 0;
         }
     }
 
     if (status == 0)
     {
-        BTIF_TRACE_DEBUG0("bta_fs_co_getdirentry: status = 0");
+        BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: status = 0");
 
         sprintf(fullname, "%s/%s", p_path,  dirent->d_name);
 
@@ -957,11 +957,11 @@
 #endif
             co_status = BTA_FS_CO_OK;
         } else {
-            BTIF_TRACE_WARNING0("stat() failed! ");
+            BTIF_TRACE_WARNING("stat() failed! ");
             co_status = BTA_FS_CO_EACCES;
         }
     }
-    BTIF_TRACE_DEBUG0("bta_fs_co_getdirentry: calling bta_fs_ci_getdirentry");
+    BTIF_TRACE_DEBUG("bta_fs_co_getdirentry: calling bta_fs_ci_getdirentry");
 
     bta_fs_ci_direntry(co_status, evt);
 }
@@ -989,7 +989,7 @@
     UNUSED(p_path);
     UNUSED(app_id);
 
-    BTIF_TRACE_DEBUG2("Entered %s. New path: %s", __FUNCTION__, p_path);
+    BTIF_TRACE_DEBUG("Entered %s. New path: %s", __FUNCTION__, p_path);
 }
 
 /*******************************************************************************
@@ -1020,7 +1020,7 @@
     UNUSED(evt);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_resume - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_resume - NOT implemented");
 }
 
 /*******************************************************************************
@@ -1050,7 +1050,7 @@
     UNUSED(evt);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_set_perms - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_set_perms - NOT implemented");
 }
 
 /*******************************************************************************
@@ -1082,7 +1082,7 @@
     UNUSED(evt);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_rename - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_rename - NOT implemented");
 }
 
 /*******************************************************************************
@@ -1116,7 +1116,7 @@
     UNUSED(evt);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_copy - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_copy - NOT implemented");
 }
 
 /*******************************************************************************
@@ -1141,7 +1141,7 @@
     UNUSED(evt);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_resume_op - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_resume_op - NOT implemented");
 }
 
 
@@ -1172,7 +1172,7 @@
     UNUSED(p_info);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_session_info - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_session_info - NOT implemented");
 }
 
 
@@ -1205,7 +1205,7 @@
     UNUSED(info);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_suspend - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_suspend - NOT implemented");
 }
 
 /*******************************************************************************
@@ -1231,6 +1231,6 @@
     UNUSED(ssn);
     UNUSED(app_id);
 
-    BTIF_TRACE_WARNING0("[CO] bta_fs_co_suspend - NOT implemented");
+    BTIF_TRACE_WARNING("[CO] bta_fs_co_suspend - NOT implemented");
 }
 
diff --git a/btif/co/bta_gattc_co.c b/btif/co/bta_gattc_co.c
index 29fbb09..8541aa3 100644
--- a/btif/co/bta_gattc_co.c
+++ b/btif/co/bta_gattc_co.c
@@ -25,6 +25,43 @@
 #if( defined BLE_INCLUDED ) && (BLE_INCLUDED == TRUE)
 #if( defined BTA_GATT_INCLUDED ) && (BTA_GATT_INCLUDED == TRUE)
 
+#define GATT_CACHE_PREFIX "/data/misc/bluedroid/gatt_cache_"
+
+static FILE* sCacheFD = 0;
+
+static void getFilename(char *buffer, BD_ADDR bda)
+{
+    sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX
+        , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
+}
+
+static void cacheClose()
+{
+    if (sCacheFD != 0)
+    {
+        fclose(sCacheFD);
+        sCacheFD = 0;
+    }
+}
+
+static bool cacheOpen(BD_ADDR bda, bool to_save)
+{
+    char fname[255] = {0};
+    getFilename(fname, bda);
+
+    cacheClose();
+    sCacheFD = fopen(fname, to_save ? "w" : "r");
+
+    return (sCacheFD != 0);
+}
+
+static void cacheReset(BD_ADDR bda)
+{
+    char fname[255] = {0};
+    getFilename(fname, bda);
+    unlink(fname);
+}
+
 
 /*****************************************************************************
 **  Function Declarations
@@ -47,10 +84,12 @@
 *******************************************************************************/
 void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, UINT16 conn_id, BOOLEAN to_save)
 {
-    tBTA_GATT_STATUS    status = BTA_GATT_OK;
-    UNUSED(to_save);
-
     /* open NV cache and send call in */
+    tBTA_GATT_STATUS    status = BTA_GATT_OK;
+    if (!cacheOpen(server_bda, to_save))
+        status = BTA_GATT_ERROR;
+
+    BTIF_TRACE_DEBUG("%s() - status=%d", __FUNCTION__, status);
     bta_gattc_ci_cache_open(server_bda, evt, status, conn_id);
 }
 
@@ -73,11 +112,19 @@
 {
     UINT16              num_attr = 0;
     tBTA_GATTC_NV_ATTR  attr[BTA_GATTC_NV_LOAD_MAX];
-    tBTA_GATT_STATUS    status = BTA_GATT_MORE;
-    UNUSED(start_index);
+    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
 
+    if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET)))
+    {
+        num_attr = fread(attr, sizeof(tBTA_GATTC_NV_ATTR), BTA_GATTC_NV_LOAD_MAX, sCacheFD);
+        status = (num_attr < BTA_GATTC_NV_LOAD_MAX ? BTA_GATT_OK : BTA_GATT_MORE);
+    }
+
+    BTIF_TRACE_DEBUG("%s() - sCacheFD=%p, start_index=%d, read=%d, status=%d",
+        __FUNCTION__, sCacheFD, start_index, num_attr, status);
     bta_gattc_ci_cache_load(server_bda, evt, num_attr, attr, status, conn_id);
 }
+
 /*******************************************************************************
 **
 ** Function         bta_gattc_co_cache_save
@@ -98,10 +145,14 @@
                               tBTA_GATTC_NV_ATTR *p_attr_list, UINT16 attr_index, UINT16 conn_id)
 {
     tBTA_GATT_STATUS    status = BTA_GATT_OK;
-    UNUSED(num_attr);
-    UNUSED(p_attr_list);
     UNUSED(attr_index);
 
+    if (sCacheFD != 0)
+    {
+        int num = fwrite(p_attr_list, sizeof(tBTA_GATTC_NV_ATTR), num_attr, sCacheFD);
+        BTIF_TRACE_DEBUG("%s() wrote %d", __FUNCTION__, num);
+    }
+
     bta_gattc_ci_cache_save(server_bda, evt, status, conn_id);
 }
 
@@ -122,8 +173,13 @@
 {
     UNUSED(server_bda);
     UNUSED(conn_id);
+
+    cacheClose();
+
     /* close NV when server cache is done saving or loading,
        does not need to do anything for now on Insight */
+
+    BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
 }
 
 /*******************************************************************************
@@ -140,7 +196,8 @@
 *******************************************************************************/
 void bta_gattc_co_cache_reset(BD_ADDR server_bda)
 {
-    UNUSED(server_bda);
+    BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
+    cacheReset(server_bda);
 }
 
 #endif
diff --git a/btif/co/bta_gatts_co.c b/btif/co/bta_gatts_co.c
index d030075..c061a28 100644
--- a/btif/co/bta_gatts_co.c
+++ b/btif/co/bta_gatts_co.c
@@ -61,97 +61,6 @@
     }
 }
 
-static BOOLEAN btif_gatts_srv_chg(tBTA_GATTS_SRV_CHG_CMD cmd,
-                                  tBTA_GATTS_SRV_CHG_REQ *p_req,
-                                  tBTA_GATTS_SRV_CHG_RSP *p_rsp)
-{
-    BOOLEAN status = TRUE;
-    BOOLEAN found = FALSE;
-    UINT8   i, j, idx, last_idx;
-    btif_gatts_srv_chg_cb_t *p_cb = &btif_gatts_srv_chg_cb;
-
-    btif_gatts_check_init();
-
-    switch (cmd)
-    {
-        case BTA_GATTS_SRV_CHG_CMD_ADD_CLIENT:
-
-            if (p_cb->num_clients < BTIF_GATTS_MAX_SRV_CHG_CLT_SIZE)
-            {
-                memcpy(&p_cb->srv_chg[p_cb->num_clients], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
-                p_cb->num_clients++;
-            } else {
-                status = FALSE;
-            }
-            break;
-
-        case BTA_GATTS_SRV_CHG_CMD_UPDATE_CLIENT:
-
-            for (i=0; i != p_cb->num_clients; ++i)
-            {
-                if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
-                {
-                    found = TRUE;
-                    memcpy(&p_cb->srv_chg[i], &p_req->srv_chg, sizeof(tBTA_GATTS_SRV_CHG));
-                    break;
-                }
-            }
-
-            if (!found)
-                status = FALSE;
-            break;
-
-        case BTA_GATTS_SRV_CHG_CMD_REMOVE_CLIENT:
-
-            for (i=0; i != p_cb->num_clients; ++i)
-            {
-                if (!memcmp(p_cb->srv_chg[i].bda, p_req->srv_chg.bda, sizeof(BD_ADDR)))
-                {
-                    found = TRUE;
-                    last_idx = p_cb->num_clients - 1;
-
-                    if (i != last_idx )
-                    {
-                        /* Update the array so there is no gap */
-                        for (j=i; j != last_idx; ++j )
-                        {
-                            memcpy(&p_cb->srv_chg[j], &p_cb->srv_chg[j+1], sizeof(tBTA_GATTS_SRV_CHG));
-                        }
-
-                    }
-
-                    /* Reset the last client and update num_clients */
-                    memset(&p_cb->srv_chg[last_idx], 0, sizeof(tBTA_GATTS_SRV_CHG));
-                    p_cb->num_clients--;
-                    break;
-                }
-            }
-
-            if (!found)
-                status = FALSE;
-            break;
-
-        case BTA_GATTS_SRV_CHG_CMD_READ_NUM_CLENTS:
-            p_rsp->num_clients = p_cb->num_clients;
-            break;
-
-        case BTA_GATTS_SRV_CHG_CMD_READ_CLENT:
-            idx = p_req->client_read_index - 1;
-
-            if (idx < p_cb->num_clients )
-                memcpy(&p_rsp->srv_chg, &p_cb->srv_chg[idx], sizeof(tBTA_GATTS_SRV_CHG));
-            else
-                status = FALSE;
-            break;
-
-        default:
-            status = FALSE;
-            break;
-    }
-
-    return status;
-}
-
 /*****************************************************************************
 **  Externally called functions
 *****************************************************************************/
diff --git a/btif/co/bta_hh_co.c b/btif/co/bta_hh_co.c
index b393099..d7458b1 100644
--- a/btif/co/bta_hh_co.c
+++ b/btif/co/bta_hh_co.c
@@ -31,10 +31,15 @@
 #include "bta_api.h"
 #include "bta_hh_api.h"
 #include "btif_util.h"
-
+#include "bta_hh_co.h"
 
 const char *dev_path = "/dev/uhid";
 
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+#include "btif_config.h"
+#define BTA_HH_NV_LOAD_MAX       16
+static tBTA_HH_RPT_CACHE_ENTRY sReportCache[BTA_HH_NV_LOAD_MAX];
+#endif
 
 /*Internal function to perform UHID write and error checking*/
 static int uhid_write(int fd, const struct uhid_event *ev)
@@ -43,10 +48,10 @@
     ret = write(fd, ev, sizeof(*ev));
     if (ret < 0){
         int rtn = -errno;
-        APPL_TRACE_ERROR2("%s: Cannot write to uhid:%s", __FUNCTION__, strerror(errno));
+        APPL_TRACE_ERROR("%s: Cannot write to uhid:%s", __FUNCTION__, strerror(errno));
         return rtn;
     } else if (ret != sizeof(*ev)) {
-        APPL_TRACE_ERROR3("%s: Wrong size written to uhid: %ld != %lu",
+        APPL_TRACE_ERROR("%s: Wrong size written to uhid: %ld != %lu",
                                                     __FUNCTION__, ret, sizeof(*ev));
         return -EFAULT;
     } else {
@@ -62,39 +67,39 @@
     memset(&ev, 0, sizeof(ev));
     if(!p_dev)
     {
-        APPL_TRACE_ERROR1("%s: Device not found",__FUNCTION__)
+        APPL_TRACE_ERROR("%s: Device not found",__FUNCTION__)
         return -1;
     }
     ret = read(p_dev->fd, &ev, sizeof(ev));
     if (ret == 0) {
-        APPL_TRACE_ERROR2("%s: Read HUP on uhid-cdev %s", __FUNCTION__,
+        APPL_TRACE_ERROR("%s: Read HUP on uhid-cdev %s", __FUNCTION__,
                                                  strerror(errno));
         return -EFAULT;
     } else if (ret < 0) {
-        APPL_TRACE_ERROR2("%s:Cannot read uhid-cdev: %s", __FUNCTION__,
+        APPL_TRACE_ERROR("%s:Cannot read uhid-cdev: %s", __FUNCTION__,
                                                 strerror(errno));
         return -errno;
     } else if (ret != sizeof(ev)) {
-        APPL_TRACE_ERROR3("%s:Invalid size read from uhid-dev: %ld != %lu",
+        APPL_TRACE_ERROR("%s:Invalid size read from uhid-dev: %ld != %lu",
                             __FUNCTION__, ret, sizeof(ev));
         return -EFAULT;
     }
 
     switch (ev.type) {
     case UHID_START:
-        APPL_TRACE_DEBUG0("UHID_START from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_START from uhid-dev\n");
         break;
     case UHID_STOP:
-        APPL_TRACE_DEBUG0("UHID_STOP from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_STOP from uhid-dev\n");
         break;
     case UHID_OPEN:
-        APPL_TRACE_DEBUG0("UHID_OPEN from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_OPEN from uhid-dev\n");
         break;
     case UHID_CLOSE:
-        APPL_TRACE_DEBUG0("UHID_CLOSE from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_CLOSE from uhid-dev\n");
         break;
     case UHID_OUTPUT:
-        APPL_TRACE_DEBUG2("UHID_OUTPUT: Report type = %d, report_size = %d"
+        APPL_TRACE_DEBUG("UHID_OUTPUT: Report type = %d, report_size = %d"
                             ,ev.u.output.rtype, ev.u.output.size);
         //Send SET_REPORT with feature report if the report type in output event is FEATURE
         if(ev.u.output.rtype == UHID_FEATURE_REPORT)
@@ -105,17 +110,17 @@
             btif_hh_setreport(p_dev,BTHH_INPUT_REPORT,ev.u.output.size,ev.u.output.data);
            break;
     case UHID_OUTPUT_EV:
-        APPL_TRACE_DEBUG0("UHID_OUTPUT_EV from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_OUTPUT_EV from uhid-dev\n");
         break;
     case UHID_FEATURE:
-        APPL_TRACE_DEBUG0("UHID_FEATURE from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_FEATURE from uhid-dev\n");
         break;
     case UHID_FEATURE_ANSWER:
-        APPL_TRACE_DEBUG0("UHID_FEATURE_ANSWER from uhid-dev\n");
+        APPL_TRACE_DEBUG("UHID_FEATURE_ANSWER from uhid-dev\n");
         break;
 
     default:
-        APPL_TRACE_DEBUG1("Invalid event from uhid-dev: %u\n", ev.type);
+        APPL_TRACE_DEBUG("Invalid event from uhid-dev: %u\n", ev.type);
     }
 
     return 0;
@@ -131,7 +136,7 @@
 **
 *******************************************************************************/
 static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
-    APPL_TRACE_DEBUG0("create_thread: entered");
+    APPL_TRACE_DEBUG("create_thread: entered");
     pthread_attr_t thread_attr;
 
     pthread_attr_init(&thread_attr);
@@ -139,10 +144,10 @@
     pthread_t thread_id = -1;
     if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
     {
-        APPL_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+        APPL_TRACE_ERROR("pthread_create : %s", strerror(errno));
         return -1;
     }
-    APPL_TRACE_DEBUG0("create_thread: thread created successfully");
+    APPL_TRACE_DEBUG("create_thread: thread created successfully");
     return thread_id;
 }
 
@@ -159,20 +164,20 @@
 {
 
     btif_hh_device_t *p_dev = arg;
-    APPL_TRACE_DEBUG2("%s: Thread created fd = %d", __FUNCTION__, p_dev->fd);
+    APPL_TRACE_DEBUG("%s: Thread created fd = %d", __FUNCTION__, p_dev->fd);
     struct pollfd pfds[1];
     int ret;
     pfds[0].fd = p_dev->fd;
     pfds[0].events = POLLIN;
 
     while(p_dev->hh_keep_polling){
-        ret = poll(pfds, 1, 500);
+        ret = poll(pfds, 1, 50);
         if (ret < 0) {
-            APPL_TRACE_ERROR2("%s: Cannot poll for fds: %s\n", __FUNCTION__, strerror(errno));
+            APPL_TRACE_ERROR("%s: Cannot poll for fds: %s\n", __FUNCTION__, strerror(errno));
             break;
         }
         if (pfds[0].revents & POLLIN) {
-            APPL_TRACE_DEBUG0("btif_hh_poll_event_thread: POLLIN");
+            APPL_TRACE_DEBUG("btif_hh_poll_event_thread: POLLIN");
             ret = uhid_event(p_dev);
             if (ret){
                 break;
@@ -186,7 +191,7 @@
 
 static inline void btif_hh_close_poll_thread(btif_hh_device_t *p_dev)
 {
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
     p_dev->hh_keep_polling = 0;
     if(p_dev->hh_poll_thread_id > 0)
         pthread_join(p_dev->hh_poll_thread_id,NULL);
@@ -205,13 +210,13 @@
 
 int bta_hh_co_write(int fd, UINT8* rpt, UINT16 len)
 {
-    APPL_TRACE_DEBUG0("bta_hh_co_data: UHID write");
+    APPL_TRACE_DEBUG("bta_hh_co_data: UHID write");
     struct uhid_event ev;
     memset(&ev, 0, sizeof(ev));
     ev.type = UHID_INPUT;
     ev.u.input.size = len;
     if(len > sizeof(ev.u.input.data)){
-        APPL_TRACE_WARNING1("%s:report size greater than allowed size",__FUNCTION__);
+        APPL_TRACE_WARNING("%s:report size greater than allowed size",__FUNCTION__);
         return -1;
     }
     memcpy(ev.u.input.data, rpt, len);
@@ -236,7 +241,7 @@
     btif_hh_device_t *p_dev = NULL;
 
     if (dev_handle == BTA_HH_INVALID_HANDLE) {
-        APPL_TRACE_WARNING2("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
+        APPL_TRACE_WARNING("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
         return;
     }
 
@@ -244,22 +249,22 @@
         p_dev = &btif_hh_cb.devices[i];
         if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->dev_handle == dev_handle) {
             // We found a device with the same handle. Must be a device reconnected.
-            APPL_TRACE_WARNING2("%s: Found an existing device with the same handle "
+            APPL_TRACE_WARNING("%s: Found an existing device with the same handle "
                                                                 "dev_status = %d",__FUNCTION__,
                                                                 p_dev->dev_status);
-            APPL_TRACE_WARNING6("%s:     bd_addr = [%02X:%02X:%02X:%02X:%02X:]", __FUNCTION__,
+            APPL_TRACE_WARNING("%s:     bd_addr = [%02X:%02X:%02X:%02X:%02X:]", __FUNCTION__,
                  p_dev->bd_addr.address[0], p_dev->bd_addr.address[1], p_dev->bd_addr.address[2],
                  p_dev->bd_addr.address[3], p_dev->bd_addr.address[4]);
-                 APPL_TRACE_WARNING4("%s:     attr_mask = 0x%04x, sub_class = 0x%02x, app_id = %d",
+                 APPL_TRACE_WARNING("%s:     attr_mask = 0x%04x, sub_class = 0x%02x, app_id = %d",
                                   __FUNCTION__, p_dev->attr_mask, p_dev->sub_class, p_dev->app_id);
 
             if(p_dev->fd<0) {
                 p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
                 if (p_dev->fd < 0){
-                    APPL_TRACE_ERROR2("%s: Error: failed to open uhid, err:%s",
+                    APPL_TRACE_ERROR("%s: Error: failed to open uhid, err:%s",
                                                                     __FUNCTION__,strerror(errno));
                 }else
-                    APPL_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+                    APPL_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
             }
             p_dev->hh_keep_polling = 1;
             p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
@@ -283,10 +288,10 @@
                 // This is a new device,open the uhid driver now.
                 p_dev->fd = open(dev_path, O_RDWR | O_CLOEXEC);
                 if (p_dev->fd < 0){
-                    APPL_TRACE_ERROR2("%s: Error: failed to open uhid, err:%s",
+                    APPL_TRACE_ERROR("%s: Error: failed to open uhid, err:%s",
                                                                     __FUNCTION__,strerror(errno));
                 }else{
-                    APPL_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+                    APPL_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
                     p_dev->hh_keep_polling = 1;
                     p_dev->hh_poll_thread_id = create_thread(btif_hh_poll_event_thread, p_dev);
                 }
@@ -298,12 +303,12 @@
     }
 
     if (p_dev == NULL) {
-        APPL_TRACE_ERROR1("%s: Error: too many HID devices are connected", __FUNCTION__);
+        APPL_TRACE_ERROR("%s: Error: too many HID devices are connected", __FUNCTION__);
         return;
     }
 
     p_dev->dev_status = BTHH_CONN_STATE_CONNECTED;
-    APPL_TRACE_DEBUG2("%s: Return device status %d", __FUNCTION__, p_dev->dev_status);
+    APPL_TRACE_DEBUG("%s: Return device status %d", __FUNCTION__, p_dev->dev_status);
 }
 
 
@@ -324,16 +329,16 @@
     UINT32 i;
     btif_hh_device_t *p_dev = NULL;
 
-    APPL_TRACE_WARNING3("%s: dev_handle = %d, app_id = %d", __FUNCTION__, dev_handle, app_id);
+    APPL_TRACE_WARNING("%s: dev_handle = %d, app_id = %d", __FUNCTION__, dev_handle, app_id);
     if (dev_handle == BTA_HH_INVALID_HANDLE) {
-        APPL_TRACE_WARNING2("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
+        APPL_TRACE_WARNING("%s: Oops, dev_handle (%d) is invalid...", __FUNCTION__, dev_handle);
         return;
     }
 
     for (i = 0; i < BTIF_HH_MAX_HID; i++) {
         p_dev = &btif_hh_cb.devices[i];
         if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->dev_handle == dev_handle) {
-            APPL_TRACE_WARNING3("%s: Found an existing device with the same handle "
+            APPL_TRACE_WARNING("%s: Found an existing device with the same handle "
                                                         "dev_status = %d, dev_handle =%d"
                                                         ,__FUNCTION__,p_dev->dev_status
                                                         ,p_dev->dev_handle);
@@ -341,7 +346,6 @@
             break;
         }
      }
-
 }
 
 
@@ -367,20 +371,20 @@
     btif_hh_device_t *p_dev;
     UNUSED(peer_addr);
 
-    APPL_TRACE_DEBUG6("%s: dev_handle = %d, subclass = 0x%02X, mode = %d, "
+    APPL_TRACE_DEBUG("%s: dev_handle = %d, subclass = 0x%02X, mode = %d, "
          "ctry_code = %d, app_id = %d",
          __FUNCTION__, dev_handle, sub_class, mode, ctry_code, app_id);
 
     p_dev = btif_hh_find_connected_dev_by_handle(dev_handle);
     if (p_dev == NULL) {
-        APPL_TRACE_WARNING2("%s: Error: unknown HID device handle %d", __FUNCTION__, dev_handle);
+        APPL_TRACE_WARNING("%s: Error: unknown HID device handle %d", __FUNCTION__, dev_handle);
         return;
     }
     // Send the HID report to the kernel.
     if (p_dev->fd >= 0) {
         bta_hh_co_write(p_dev->fd, p_rpt, len);
     }else {
-        APPL_TRACE_WARNING3("%s: Error: fd = %d, len = %d", __FUNCTION__, p_dev->fd, len);
+        APPL_TRACE_WARNING("%s: Error: fd = %d, len = %d", __FUNCTION__, p_dev->fd, len);
     }
 }
 
@@ -405,13 +409,13 @@
     struct uhid_event ev;
 
     if (p_dev->fd < 0) {
-        APPL_TRACE_WARNING3("%s: Error: fd = %d, dscp_len = %d", __FUNCTION__, p_dev->fd, dscp_len);
+        APPL_TRACE_WARNING("%s: Error: fd = %d, dscp_len = %d", __FUNCTION__, p_dev->fd, dscp_len);
         return;
     }
 
-    APPL_TRACE_WARNING4("%s: fd = %d, name = [%s], dscp_len = %d", __FUNCTION__,
+    APPL_TRACE_WARNING("%s: fd = %d, name = [%s], dscp_len = %d", __FUNCTION__,
                                                                     p_dev->fd, dev_name, dscp_len);
-    APPL_TRACE_WARNING5("%s: vendor_id = 0x%04x, product_id = 0x%04x, version= 0x%04x,"
+    APPL_TRACE_WARNING("%s: vendor_id = 0x%04x, product_id = 0x%04x, version= 0x%04x,"
                                                                     "ctry_code=0x%02x",__FUNCTION__,
                                                                     vendor_id, product_id,
                                                                     version, ctry_code);
@@ -434,11 +438,11 @@
     ev.u.create.country = ctry_code;
     result = uhid_write(p_dev->fd, &ev);
 
-    APPL_TRACE_WARNING4("%s: fd = %d, dscp_len = %d, result = %d", __FUNCTION__,
+    APPL_TRACE_WARNING("%s: fd = %d, dscp_len = %d, result = %d", __FUNCTION__,
                                                                     p_dev->fd, dscp_len, result);
 
     if (result) {
-        APPL_TRACE_WARNING2("%s: Error: failed to send DSCP, result = %d", __FUNCTION__, result);
+        APPL_TRACE_WARNING("%s: Error: failed to send DSCP, result = %d", __FUNCTION__, result);
 
         /* The HID report descriptor is corrupted. Close the driver. */
         close(p_dev->fd);
@@ -446,4 +450,118 @@
     }
 }
 
+#if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_rpt_info
+**
+** Description      This callout function is to convey the report information on
+**                  a HOGP device to the application. Application can save this
+**                  information in NV if device is bonded and load it back when
+**                  stack reboot.
+**
+** Parameters       remote_bda  - remote device address
+**                  p_entry     - report entry pointer
+**                  app_id      - application id
+**
+** Returns          void.
+**
+*******************************************************************************/
+void bta_hh_le_co_rpt_info(BD_ADDR remote_bda, tBTA_HH_RPT_CACHE_ENTRY *p_entry, UINT8 app_id)
+{
+    UNUSED(app_id);
+
+    unsigned len = 0;
+    unsigned type = 0;
+    unsigned idx = 0;
+
+    bdstr_t bdstr;
+    sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+        remote_bda[0], remote_bda[1], remote_bda[2],
+        remote_bda[3], remote_bda[4], remote_bda[5]);
+
+    btif_config_get("Remote", bdstr, "HidReport", NULL, (int*)&len, (int*)&type);
+    if (len >= sizeof(tBTA_HH_RPT_CACHE_ENTRY) && len <= sizeof(sReportCache))
+    {
+        btif_config_get("Remote", bdstr, "HidReport", (char*)sReportCache, (int*)&len, (int*)&type);
+        idx = len / sizeof(tBTA_HH_RPT_CACHE_ENTRY);
+    }
+
+    if (idx < BTA_HH_NV_LOAD_MAX)
+    {
+        memcpy(&sReportCache[idx++], p_entry, sizeof(tBTA_HH_RPT_CACHE_ENTRY));
+        btif_config_set("Remote", bdstr, "HidReport", (const char*)sReportCache,
+            idx * sizeof(tBTA_HH_RPT_CACHE_ENTRY), BTIF_CFG_TYPE_BIN);
+        BTIF_TRACE_DEBUG("%s() - Saving report; dev=%s, idx=%d", __FUNCTION__, bdstr, idx);
+    }
+}
+
+
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_cache_load
+**
+** Description      This callout function is to request the application to load the
+**                  cached HOGP report if there is any. When cache reading is completed,
+**                  bta_hh_le_ci_cache_load() is called by the application.
+**
+** Parameters       remote_bda  - remote device address
+**                  p_num_rpt: number of cached report
+**                  app_id      - application id
+**
+** Returns          the acched report array
+**
+*******************************************************************************/
+tBTA_HH_RPT_CACHE_ENTRY * bta_hh_le_co_cache_load (BD_ADDR remote_bda,
+                                                   UINT8 *p_num_rpt, UINT8 app_id)
+{
+    UNUSED(app_id);
+
+    unsigned len = 0;
+    unsigned type = 0;
+    unsigned idx = 0;
+
+    bdstr_t bdstr;
+    sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+        remote_bda[0], remote_bda[1], remote_bda[2],
+        remote_bda[3], remote_bda[4], remote_bda[5]);
+
+    btif_config_get("Remote", bdstr, "HidReport", NULL, (int*)&len, (int*)&type);
+    if (!p_num_rpt && len < sizeof(tBTA_HH_RPT_CACHE_ENTRY))
+        return NULL;
+
+    if (len > sizeof(sReportCache))
+        len = sizeof(sReportCache);
+    btif_config_get("Remote", bdstr, "HidReport", (char*)sReportCache, (int*)&len, (int*)&type);
+    *p_num_rpt = len / sizeof(tBTA_HH_RPT_CACHE_ENTRY);
+
+    BTIF_TRACE_DEBUG("%s() - Loaded %d reports; dev=%s", __FUNCTION__, *p_num_rpt, bdstr);
+
+    return sReportCache;
+}
+
+/*******************************************************************************
+**
+** Function         bta_hh_le_co_reset_rpt_cache
+**
+** Description      This callout function is to reset the HOGP device cache.
+**
+** Parameters       remote_bda  - remote device address
+**
+** Returns          none
+**
+*******************************************************************************/
+void bta_hh_le_co_reset_rpt_cache (BD_ADDR remote_bda, UINT8 app_id)
+{
+    UNUSED(app_id);
+
+    bdstr_t bdstr;
+    sprintf(bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+        remote_bda[0], remote_bda[1], remote_bda[2],
+        remote_bda[3], remote_bda[4], remote_bda[5]);
+    btif_config_remove("Remote", bdstr, "HidReport");
+
+    BTIF_TRACE_DEBUG("%s() - Reset cache for bda %s", __FUNCTION__, bdstr);
+}
+#endif /* #if (BLE_INCLUDED == TRUE && BTA_HH_LE_INCLUDED == TRUE) */
 
diff --git a/btif/co/bta_hl_co.c b/btif/co/bta_hl_co.c
index 1432974..22b7c89 100644
--- a/btif/co/bta_hl_co.c
+++ b/btif/co/bta_hl_co.c
@@ -81,7 +81,7 @@
     }
 
 
-    BTIF_TRACE_DEBUG3("%s success=%d num_mdeps=%d",
+    BTIF_TRACE_DEBUG("%s success=%d num_mdeps=%d",
                       __FUNCTION__, success, *p_num_of_mdep );
     return success;
 }
@@ -110,7 +110,7 @@
     }
 
 
-    BTIF_TRACE_DEBUG2("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp );
+    BTIF_TRACE_DEBUG("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp );
 
     return advertize_source_sdp;
 }
@@ -141,7 +141,7 @@
     UINT8       app_idx;
     BOOLEAN     success = FALSE;
 
-    BTIF_TRACE_DEBUG5("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d",
                       __FUNCTION__, app_id,mdep_idx,mdep_id,mdep_counter);
 
     if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -155,7 +155,7 @@
         success = TRUE;
     }
 
-    BTIF_TRACE_DEBUG4("%s success=%d mdep_idx=%d mdep_id=%d",
+    BTIF_TRACE_DEBUG("%s success=%d mdep_idx=%d mdep_id=%d",
                       __FUNCTION__, success, mdep_idx, mdep_id );
 
     return success;
@@ -183,7 +183,7 @@
     btif_hl_app_cb_t    *p_acb;
     tBTA_HL_SUP_FEATURE *p_sup;
 
-    BTIF_TRACE_DEBUG2("%s app_id=%d",__FUNCTION__, app_id );
+    BTIF_TRACE_DEBUG("%s app_id=%d",__FUNCTION__, app_id );
 
     if (btif_hl_find_app_idx(app_id, &app_idx))
     {
@@ -194,7 +194,7 @@
         success = TRUE;
     }
 
-    BTIF_TRACE_DEBUG4("%s success=%d max tx_size=%d rx_size=%d",
+    BTIF_TRACE_DEBUG("%s success=%d max tx_size=%d rx_size=%d",
                       __FUNCTION__, success, p_echo_cfg->max_tx_apdu_size,
                       p_echo_cfg->max_rx_apdu_size );
 
@@ -219,7 +219,7 @@
 void bta_hl_co_save_mdl(UINT8 mdep_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg )
 {
 
-    BTIF_TRACE_DEBUG6("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d",
+    BTIF_TRACE_DEBUG("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d",
                       __FUNCTION__, mdep_id, item_idx,
                       p_mdl_cfg->active,
                       p_mdl_cfg->mdl_id,
@@ -246,7 +246,7 @@
 {
 
 
-    BTIF_TRACE_DEBUG3("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx);
+    BTIF_TRACE_DEBUG("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx);
 
     btif_hl_delete_mdl_cfg(mdep_id, item_idx);
 
@@ -276,7 +276,7 @@
     UINT8 i;
     tBTA_HL_MDL_CFG *p;
 
-    BTIF_TRACE_DEBUG3("%s app_id=%d, num_items=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d, num_items=%d",
                       __FUNCTION__, app_id, buffer_size);
 
     if (buffer_size > BTA_HL_NUM_MDL_CFGS)
@@ -292,13 +292,13 @@
         {
             if (p->active)
             {
-                BTIF_TRACE_DEBUG6("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d",
+                BTIF_TRACE_DEBUG("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d",
                                   i, p->mdl_id, p->dch_mode, p->local_mdep_role, p->local_mdep_role, p->mtu);
             }
         }
     }
 
-    BTIF_TRACE_DEBUG3("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size);
+    BTIF_TRACE_DEBUG("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size);
 
     return result;
 }
@@ -326,7 +326,7 @@
     btif_hl_mdl_cb_t *p_dcb;
     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
 
-    BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x buf_size=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x buf_size=%d",
                       __FUNCTION__, app_id, mdl_handle, buf_size);
 
     if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -371,7 +371,7 @@
     btif_hl_mdl_cb_t *p_dcb;
     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
     int            r;
-    BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x data_size=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x data_size=%d",
                       __FUNCTION__,app_id, mdl_handle, data_size);
 
     if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -383,18 +383,18 @@
             memcpy(p_dcb->p_rx_pkt, p_data, data_size);
             if (p_dcb->p_scb)
             {
-                BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d",
+                BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d",
                                   app_idx, mcl_idx, mdl_idx, data_size);
                 r = send(p_dcb->p_scb->socket_id[1], p_dcb->p_rx_pkt, data_size, 0);
 
                 if (r == data_size)
                 {
-                    BTIF_TRACE_DEBUG1("socket send success data_size=%d",  data_size);
+                    BTIF_TRACE_DEBUG("socket send success data_size=%d",  data_size);
                     status = BTA_HL_STATUS_OK;
                 }
                 else
                 {
-                    BTIF_TRACE_ERROR2("socket send failed r=%d data_size=%d",r, data_size);
+                    BTIF_TRACE_ERROR("socket send failed r=%d data_size=%d",r, data_size);
                 }
 
 
@@ -431,7 +431,7 @@
     UNUSED(buf_size);
     UNUSED(p_buf);
 
-    BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__);
+    BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
     bta_hl_ci_get_echo_data(mcl_handle,  status, evt);
 }
 
@@ -460,7 +460,7 @@
     UNUSED(data_size);
     UNUSED(p_data);
 
-    BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__);
+    BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
     bta_hl_ci_put_echo_data(mcl_handle,  status, evt);
 }
 
diff --git a/btif/co/bta_pan_co.c b/btif/co/bta_pan_co.c
index 1dcce8e..ad0c796 100644
--- a/btif/co/bta_pan_co.c
+++ b/btif/co/bta_pan_co.c
@@ -33,6 +33,7 @@
 #include <hardware/bluetooth.h>
 #include <hardware/bt_pan.h>
 #include "btif_pan_internal.h"
+#include "btif_sock_thread.h"
 #include "bd.h"
 #include <string.h>
 #include "btif_util.h"
@@ -49,7 +50,7 @@
 *******************************************************************************/
 UINT8 bta_pan_co_init(UINT8 *q_level)
 {
-    BTIF_TRACE_API0("bta_pan_co_init");
+    BTIF_TRACE_API("bta_pan_co_init");
 
     /* set the q_level to 30 buffers */
     *q_level = 30;
@@ -74,14 +75,14 @@
 void bta_pan_co_open(UINT16 handle, UINT8 app_id, tBTA_PAN_ROLE local_role,
                             tBTA_PAN_ROLE peer_role, BD_ADDR peer_addr)
 {
-    BTIF_TRACE_API4("bta_pan_co_open:app_id:%d, local_role:%d, peer_role:%d, "
+    BTIF_TRACE_API("bta_pan_co_open:app_id:%d, local_role:%d, peer_role:%d, "
                     "handle:%d", app_id, local_role, peer_role, handle);
     btpan_conn_t* conn = btpan_find_conn_addr(peer_addr);
     if(conn == NULL)
         conn = btpan_new_conn(handle, peer_addr, local_role, peer_role);
     if(conn)
     {
-        BTIF_TRACE_DEBUG6("bta_pan_co_open:tap_fd:%d, open_count:%d, "
+        BTIF_TRACE_DEBUG("bta_pan_co_open:tap_fd:%d, open_count:%d, "
             "conn->handle:%d should = handle:%d, local_role:%d, remote_role:%d",
              btpan_cb.tap_fd, btpan_cb.open_count, conn->handle, handle,
              conn->local_role, conn->remote_role);
@@ -98,6 +99,7 @@
         }
         if(btpan_cb.tap_fd >= 0)
         {
+            btpan_cb.flow = 1;
             conn->state = PAN_STATE_OPEN;
             bta_pan_ci_rx_ready(handle);
         }
@@ -117,11 +119,11 @@
 *******************************************************************************/
 void bta_pan_co_close(UINT16 handle, UINT8 app_id)
 {
-    BTIF_TRACE_API2("bta_pan_co_close:app_id:%d, handle:%d", app_id, handle);
+    BTIF_TRACE_API("bta_pan_co_close:app_id:%d, handle:%d", app_id, handle);
     btpan_conn_t* conn = btpan_find_conn_handle(handle);
     if(conn && conn->state == PAN_STATE_OPEN)
     {
-        BTIF_TRACE_DEBUG0("bta_pan_co_close");
+        BTIF_TRACE_DEBUG("bta_pan_co_close");
 
         // let bta close event reset this handle as it needs
         // the handle to find the connection upon CLOSE
@@ -129,14 +131,10 @@
         conn->state = PAN_STATE_CLOSE;
         btpan_cb.open_count--;
 
-        if(btpan_cb.open_count == 0)
+        if(btpan_cb.open_count == 0 && btpan_cb.tap_fd != -1)
         {
-            destroy_tap_read_thread();
-            if(btpan_cb.tap_fd != -1)
-            {
-                btpan_tap_close(btpan_cb.tap_fd);
-                btpan_cb.tap_fd = -1;
-            }
+            btpan_tap_close(btpan_cb.tap_fd);
+            btpan_cb.tap_fd = -1;
         }
     }
 }
@@ -168,12 +166,12 @@
     BOOLEAN            ext;
     BOOLEAN         forward;
 
-    BTIF_TRACE_API2("bta_pan_co_tx_path, handle:%d, app_id:%d", handle, app_id);
+    BTIF_TRACE_API("bta_pan_co_tx_path, handle:%d, app_id:%d", handle, app_id);
 
     btpan_conn_t* conn = btpan_find_conn_handle(handle);
-    if(conn && conn->state != PAN_STATE_OPEN)
+    if(!conn || conn->state != PAN_STATE_OPEN)
     {
-        BTIF_TRACE_ERROR2("bta_pan_co_tx_path: cannot find pan connction or conn"
+        BTIF_TRACE_ERROR("bta_pan_co_tx_path: cannot find pan connction or conn"
             "is not opened, conn:%p, conn->state:%d", conn, conn->state);
         return;
     }
@@ -183,14 +181,14 @@
         if ((p_buf = bta_pan_ci_readbuf(handle, src, dst, &protocol,
                                  &ext, &forward)))
         {
-            BTIF_TRACE_DEBUG2("bta_pan_co_tx_path, calling btapp_tap_send, "
+            BTIF_TRACE_DEBUG("bta_pan_co_tx_path, calling btapp_tap_send, "
                 "p_buf->len:%d, offset:%d", p_buf->len, p_buf->offset);
             if(is_empty_eth_addr(conn->eth_addr) && is_valid_bt_eth_addr(src))
             {
-                BTIF_TRACE_DEBUG6("pan bt peer addr: %02x:%02x:%02x:%02x:%02x:%02x",
+                BTIF_TRACE_DEBUG("pan bt peer addr: %02x:%02x:%02x:%02x:%02x:%02x",
                     conn->peer[0], conn->peer[1], conn->peer[2],
                     conn->peer[3],conn->peer[4], conn->peer[5]);
-                BTIF_TRACE_DEBUG6("     update its ethernet addr: "
+                BTIF_TRACE_DEBUG("     update its ethernet addr: "
                     "%02x:%02x:%02x:%02x:%02x:%02x", src[0], src[1], src[2],
                     src[3],src[4], src[5]);
                 memcpy(conn->eth_addr, src, sizeof(conn->eth_addr));
@@ -221,7 +219,7 @@
     UNUSED(handle);
     UNUSED(app_id);
 
-    BTIF_TRACE_API0("bta_pan_co_rx_path not used");
+    BTIF_TRACE_API("bta_pan_co_rx_path not used");
 }
 
 /*******************************************************************************
@@ -251,7 +249,7 @@
     UNUSED(ext);
     UNUSED(forward);
 
-    BTIF_TRACE_API0("bta_pan_co_tx_write not used");
+    BTIF_TRACE_API("bta_pan_co_tx_write not used");
 }
 
 /*******************************************************************************
@@ -280,7 +278,7 @@
     UNUSED(ext);
     UNUSED(forward);
 
-    BTIF_TRACE_API0("bta_pan_co_tx_writebuf not used");
+    BTIF_TRACE_API("bta_pan_co_tx_writebuf not used");
 }
 
 /*******************************************************************************
@@ -303,7 +301,11 @@
     UNUSED(app_id);
     UNUSED(enable);
 
-    BTIF_TRACE_API1("bta_pan_co_rx_flow, enabled:%d, not used", enable);
+    BTIF_TRACE_API("bta_pan_co_rx_flow, enabled:%d, not used", enable);
+    btpan_conn_t* conn = btpan_find_conn_handle(handle);
+    if(!conn || conn->state != PAN_STATE_OPEN)
+        return;
+    btpan_set_flow_control(enable);
 }
 
 /*******************************************************************************
@@ -324,7 +326,7 @@
     UNUSED(len);
     UNUSED(p_filters);
 
-    BTIF_TRACE_API0("bta_pan_co_pfilt_ind");
+    BTIF_TRACE_API("bta_pan_co_pfilt_ind");
 }
 
 /*******************************************************************************
@@ -345,6 +347,6 @@
     UNUSED(len);
     UNUSED(p_filters);
 
-    BTIF_TRACE_API0("bta_pan_co_mfilt_ind");
+    BTIF_TRACE_API("bta_pan_co_mfilt_ind");
 }
 
diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h
index 3a5607f..2e41d22 100644
--- a/btif/include/btif_api.h
+++ b/btif/include/btif_api.h
@@ -206,7 +206,7 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr);
+bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr, int transport);
 
 /*******************************************************************************
 **
@@ -232,6 +232,17 @@
 
 /*******************************************************************************
 **
+** Function         btif_dm_get_connection_state
+**
+** Description      Returns whether the remote device is currently connected
+**
+** Returns          0 if not connected
+**
+*******************************************************************************/
+uint16_t btif_dm_get_connection_state(const bt_bdaddr_t *bd_addr);
+
+/*******************************************************************************
+**
 ** Function         btif_dm_pin_reply
 **
 ** Description      BT legacy pairing - PIN code reply
@@ -338,6 +349,17 @@
 
 /*******************************************************************************
 **
+** Function         btif_dm_read_energy_info
+**
+** Description     Reads the energy info from controller
+**
+** Returns          void
+**
+*******************************************************************************/
+void btif_dm_read_energy_info();
+
+/*******************************************************************************
+**
 ** Function         btif_config_hci_snoop_log
 **
 ** Description     enable or disable HCI snoop log
diff --git a/btif/include/btif_av.h b/btif/include/btif_av.h
index 9e537cd..12174c9 100644
--- a/btif/include/btif_av.h
+++ b/btif/include/btif_av.h
@@ -44,7 +44,7 @@
     BTIF_AV_START_STREAM_REQ_EVT,
     BTIF_AV_STOP_STREAM_REQ_EVT,
     BTIF_AV_SUSPEND_STREAM_REQ_EVT,
-    BTIF_AV_RECONFIGURE_REQ_EVT,
+    BTIF_AV_SINK_CONFIG_REQ_EVT,
 } btif_av_sm_event_t;
 
 
diff --git a/btif/include/btif_av_co.h b/btif/include/btif_av_co.h
index 20e9a1e..a6a5bfa 100644
--- a/btif/include/btif_av_co.h
+++ b/btif/include/btif_av_co.h
@@ -28,6 +28,7 @@
 enum
 {
     BTIF_SV_AV_AA_SBC_INDEX = 0,
+    BTIF_SV_AV_AA_SBC_SINK_INDEX,
     BTIF_SV_AV_AA_SEP_INDEX  /* Last index */
 };
 
diff --git a/btif/include/btif_common.h b/btif/include/btif_common.h
index f11b629..f6361e1 100644
--- a/btif/include/btif_common.h
+++ b/btif/include/btif_common.h
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (c) 2014 The Android Open Source Project
  *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,12 +50,13 @@
 #define BTIF_HFP            2
 #define BTIF_AV             3
 #define BTIF_PAN            4
+#define BTIF_HF_CLIENT      5
 
 extern bt_callbacks_t *bt_hal_cbacks;
 
 #define HAL_CBACK(P_CB, P_CBACK, ...)\
     if (P_CB && P_CB->P_CBACK) {            \
-        BTIF_TRACE_API2("HAL %s->%s", #P_CB, #P_CBACK); \
+        BTIF_TRACE_API("HAL %s->%s", #P_CB, #P_CBACK); \
         P_CB->P_CBACK(__VA_ARGS__);         \
     }                                       \
     else {                                  \
@@ -116,6 +118,9 @@
 
     BTIF_PAN_CB_START = BTIF_SIG_CB_START(BTIF_PAN),
     BTIF_PAN_CB_DISCONNECTING, /* PAN Disconnect has been sent to BTA successfully */
+
+    BTIF_HF_CLIENT_CLIENT_CB_START  = BTIF_SIG_CB_START(BTIF_HF_CLIENT),
+    BTIF_HF_CLIENT_CB_AUDIO_CONNECTING, /* AUDIO connect has been sent to BTA successfully */
 };
 
 /* Macro definitions for BD ADDR persistence */
diff --git a/btif/include/btif_config_util.h b/btif/include/btif_config_util.h
index 3a2f53e..6a8bb72 100644
--- a/btif/include/btif_config_util.h
+++ b/btif/include/btif_config_util.h
@@ -44,7 +44,7 @@
 #define BLUEZ_TYPES "types"
 #define BLUEZ_CONFIG "config"
 #define BLUEZ_ALIASES "aliases"
-
+#define BLUEZ_SDP "sdp"
 
 /*******************************************************************************
 **  Functions
diff --git a/btif/include/btif_dm.h b/btif/include/btif_dm.h
index ed03e34..297e2a9 100644
--- a/btif/include/btif_dm.h
+++ b/btif/include/btif_dm.h
@@ -36,6 +36,17 @@
 void btif_dm_on_disable(void);
 
 /**
+ * Callout for handling io_capabilities request
+ */
+void btif_dm_proc_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, tBTA_OOB_DATA *p_oob_data,
+                      tBTA_AUTH_REQ *p_auth_req, BOOLEAN is_orig);
+/**
+ * Callout for handling io_capabilities response
+ */
+void btif_dm_proc_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
+                      tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req);
+
+/**
  * Out-of-band functions
  */
 #if (BTM_OOB_INCLUDED == TRUE)
@@ -81,12 +92,19 @@
 
 typedef struct
 {
+    BT_OCTET16          irk;
+    tBLE_ADDR_TYPE      addr_type;
+    BD_ADDR             static_addr;
+}btif_dm_ble_pid_keys_t;
+
+typedef struct
+{
     BOOLEAN                   is_penc_key_rcvd;
     btif_dm_ble_penc_keys_t   penc_key;       /* received peer encryption key */
     BOOLEAN                   is_pcsrk_key_rcvd;
     btif_dm_ble_pcsrk_keys_t  pcsrk_key;       /* received peer device SRK */
     BOOLEAN                   is_pid_key_rcvd;
-    UINT8                     pid_key[BT_OCTET16_LEN];        /* peer device ID key */
+    btif_dm_ble_pid_keys_t    pid_key;        /* peer device ID key */
     BOOLEAN                   is_lenc_key_rcvd;
     btif_dm_ble_lenc_keys_t   lenc_key;       /* local encryption reproduction keys LTK = = d1(ER,DIV,0)*/
     BOOLEAN                   is_lcsrk_key_rcvd;
diff --git a/btif/include/btif_gatt_multi_adv_util.h b/btif/include/btif_gatt_multi_adv_util.h
new file mode 100644
index 0000000..e6c26a0
--- /dev/null
+++ b/btif/include/btif_gatt_multi_adv_util.h
@@ -0,0 +1,94 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014  Broadcom Corporation
+ *
+ *  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 BTIF_GATT_MULTI_ADV_UTIL_H
+#define BTIF_GATT_MULTI_ADV_UTIL_H
+
+#include <hardware/bluetooth.h>
+#include "bta_api.h"
+
+#define CLNT_IF_IDX 0
+#define INST_ID_IDX 1
+#define INST_ID_IDX_MAX INST_ID_IDX + 1
+#define INVALID_ADV_INST -1
+#define STD_ADV_INSTID 0
+
+/* Default ADV flags for general and limited discoverability */
+#define ADV_FLAGS_LIMITED BTA_DM_LIMITED_DISC
+#define ADV_FLAGS_GENERAL BTA_DM_GENERAL_DISC
+
+typedef struct
+{
+    int client_if;
+    BOOLEAN set_scan_rsp;
+    BOOLEAN include_name;
+    BOOLEAN include_txpower;
+    int min_interval;
+    int max_interval;
+    int appearance;
+    uint16_t manufacturer_len;
+    uint8_t* p_manufacturer_data;
+    uint16_t service_data_len;
+    uint8_t* p_service_data;
+    uint16_t service_uuid_len;
+    uint8_t* p_service_uuid;
+} btif_adv_data_t;
+
+typedef struct
+{
+    UINT8 inst_id;
+    BOOLEAN is_scan_rsp;
+    UINT8 client_if;
+    UINT16 service_uuid_len;
+    tBTA_BLE_AD_MASK mask;
+    tBTA_BLE_ADV_DATA data;
+    tBTA_BLE_ADV_PARAMS param;
+    TIMER_LIST_ENT tle_limited_timer;
+    int timeout_s;
+}btgatt_multi_adv_inst_cb;
+
+typedef struct
+{
+     INT8 *clntif_map;
+    // Includes the stored data for standard LE instance
+    btgatt_multi_adv_inst_cb *inst_cb;
+
+} btgatt_multi_adv_common_data;
+
+extern btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb();
+extern void btif_gattc_init_multi_adv_cb(void);
+extern void btif_gattc_destroy_multi_adv_cb();
+extern int btif_multi_adv_add_instid_map(int client_if, int inst_id,
+        BOOLEAN gen_temp_instid);
+extern int btif_multi_adv_instid_for_clientif(int client_if);
+extern int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index);
+extern void btif_gattc_clear_clientif(int client_if);
+extern void btif_gattc_cleanup_inst_cb(int inst_id);
+extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb);
+extern BOOLEAN btif_gattc_copy_datacb(int arrindex, btif_adv_data_t *p_adv_data,
+                                            BOOLEAN bInstData);
+extern void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
+                bool include_name, bool include_txpower, int min_interval, int max_interval,
+                int appearance, int manufacturer_len, char* manufacturer_data,
+                int service_data_len, char* service_data, int service_uuid_len,
+                char* service_uuid, btif_adv_data_t *p_multi_adv_inst);
+void btif_multi_adv_timer_ctrl(int client_if, TIMER_CBACK cb);
+#endif
+
+
diff --git a/btif/include/btif_gatt_util.h b/btif/include/btif_gatt_util.h
index 74ac6bc..87c263b 100644
--- a/btif/include/btif_gatt_util.h
+++ b/btif/include/btif_gatt_util.h
@@ -26,6 +26,7 @@
 void btif_to_bta_gatt_id(tBTA_GATT_ID *p_dest, btgatt_gatt_id_t *p_src);
 void btif_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, btgatt_srvc_id_t *p_src);
 void btif_to_bta_response(tBTA_GATTS_RSP *p_dest, btgatt_response_t* p_src);
+void btif_to_bta_uuid_mask(tBTA_DM_BLE_PF_COND_MASK *p_mask, bt_uuid_t *p_src);
 
 void bta_to_btif_uuid(bt_uuid_t *p_dest, tBT_UUID *p_src);
 void bta_to_btif_srvc_id(btgatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src);
diff --git a/main/bte_version.c b/btif/include/btif_mce.h
similarity index 60%
copy from main/bte_version.c
copy to btif/include/btif_mce.h
index 826f31b..aa61cfb 100644
--- a/main/bte_version.c
+++ b/btif/include/btif_mce.h
@@ -1,6 +1,7 @@
 /******************************************************************************
  *
- *  Copyright (C) 2001-2012 Broadcom Corporation
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -16,8 +17,19 @@
  *
  ******************************************************************************/
 
-#include "bt_types.h"
+/*******************************************************************************
+ *
+ *  Filename:      btif_mce.h
+ *
+ *  Description:   Bluetooth MCE Interface
+ *
+ *******************************************************************************/
 
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#ifndef BTIF_MCE_H
+#define BTIF_MCE_H
 
+#include <hardware/bt_mce.h>
+
+btmce_interface_t *btif_mce_get_interface();
+
+#endif
diff --git a/btif/include/btif_media.h b/btif/include/btif_media.h
old mode 100755
new mode 100644
index 4cdbb8c..f01286b
--- a/btif/include/btif_media.h
+++ b/btif/include/btif_media.h
@@ -90,8 +90,13 @@
         tBTIF_AV_FEEDING_MODE feeding_mode;
         tBTIF_AV_MEDIA_FEEDINGS feeding;
 } tBTIF_MEDIA_INIT_AUDIO_FEEDING;
-#endif
 
+typedef struct
+{
+        BT_HDR hdr;
+        UINT8 codec_info[AVDT_CODEC_SIZE];
+} tBTIF_MEDIA_SINK_CFG_UPDATE;
+#endif
 
 /*******************************************************************************
  **  Public functions
@@ -154,7 +159,16 @@
  *******************************************************************************/
 extern BOOLEAN btif_media_task_stop_aa_req(void);
 
-
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_aa_rx_flush_req
+ **
+ ** Description      Request to flush audio decoding pipe
+ **
+ ** Returns          TRUE is success
+ **
+ *******************************************************************************/
+extern BOOLEAN btif_media_task_aa_rx_flush_req(void);
 /*******************************************************************************
  **
  ** Function         btif_media_task_aa_tx_flush_req
@@ -179,6 +193,19 @@
 
 /*******************************************************************************
  **
+ ** Function         btif_media_sink_enque_buf
+ **
+ ** Description      This function is called by the av_co to fill A2DP Sink Queue
+ **
+ **
+ ** Returns          size of the queue
+ *******************************************************************************/
+ UINT8 btif_media_sink_enque_buf(BT_HDR *p_buf);
+
+
+
+/*******************************************************************************
+ **
  ** Function         btif_media_aa_writebuf
  **
  ** Description      Enqueue a Advance Audio media GKI buffer to be processed by btif media task.
@@ -243,5 +270,13 @@
 void btif_a2dp_on_suspend(void);
 void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av);
 void btif_a2dp_set_tx_flush(BOOLEAN enable);
+void btif_a2dp_set_rx_flush(BOOLEAN enable);
+void btif_media_check_iop_exceptions(UINT8 *peer_bda);
+void btif_reset_decoder(UINT8 *p_av);
+BOOLEAN btif_media_task_start_decoding_req(void);
+
+int btif_a2dp_get_track_frequency(UINT8 frequency);
+int btif_a2dp_get_track_channel_count(UINT8 channeltype);
+void btif_a2dp_set_peer_sep(UINT8 sep);
 
 #endif
diff --git a/btif/include/btif_pan_internal.h b/btif/include/btif_pan_internal.h
index d697ac8..64bab99 100644
--- a/btif/include/btif_pan_internal.h
+++ b/btif/include/btif_pan_internal.h
@@ -79,7 +79,10 @@
     int tap_fd;
     int enabled;
     int open_count;
+    int flow; // 1: outbound data flow on; 0: outbound data flow off
     btpan_conn_t conns[MAX_PAN_CONNS];
+    int congest_packet_size;
+    unsigned char congest_packet[1600]; //max ethernet packet size
 } btpan_cb_t;
 
 
@@ -91,6 +94,7 @@
 btpan_conn_t *btpan_new_conn(int handle, const BD_ADDR addr, int local_role, int peer_role);
 btpan_conn_t *btpan_find_conn_addr(const BD_ADDR addr);
 btpan_conn_t *btpan_find_conn_handle(UINT16 handle);
+void btpan_set_flow_control(BOOLEAN enable);
 int btpan_get_connected_count(void);
 int btpan_tap_open(void);
 void create_tap_read_thread(int tap_fd);
diff --git a/btif/include/btif_profile_queue.h b/btif/include/btif_profile_queue.h
index 931f457..b586575 100644
--- a/btif/include/btif_profile_queue.h
+++ b/btif/include/btif_profile_queue.h
@@ -27,10 +27,9 @@
 #ifndef BTIF_PROFILE_QUEUE_H
 #define BTIF_PROFILE_QUEUE_H
 
-typedef bt_status_t (btif_connect_cb_t) (bt_bdaddr_t *bda);
+typedef bt_status_t (*btif_connect_cb_t) (bt_bdaddr_t *bda, uint16_t uuid);
 
-bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda,
-                        btif_connect_cb_t *connect_cb);
+bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, btif_connect_cb_t connect_cb);
 void btif_queue_advance();
 void btif_queue_release();
 
diff --git a/btif/include/btif_storage.h b/btif/include/btif_storage.h
index 9a69b00..f64c695 100644
--- a/btif/include/btif_storage.h
+++ b/btif/include/btif_storage.h
@@ -353,4 +353,34 @@
 
 bt_status_t btif_storage_get_remote_version(const bt_bdaddr_t *remote_bd_addr,
                                   bt_remote_version_t *p_ver);
+
+/*******************************************************************************
+**
+** Function         btif_storage_set_dmt_support_type
+**
+** Description      Sets DMT support status for a remote device
+**
+** Returns          BT_STATUS_SUCCESS if config update is successful
+**                  BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+
+bt_status_t btif_storage_set_dmt_support_type(const bt_bdaddr_t *remote_bd_addr,
+                                                   BOOLEAN dmt_supported);
+
+
+
+/*******************************************************************************
+**
+** Function         btif_storage_is_dmt_supported_device
+**
+** Description      checks if a device supports Dual mode topology
+**
+** Returns         TRUE if remote supports DMT else FALSE
+**
+*******************************************************************************/
+
+BOOLEAN btif_storage_is_dmt_supported_device(const bt_bdaddr_t *remote_bd_addr);
+
+
 #endif /* BTIF_STORAGE_H */
diff --git a/btif/include/btif_util.h b/btif/include/btif_util.h
old mode 100755
new mode 100644
index 95969dd..4f1a9cc
--- a/btif/include/btif_util.h
+++ b/btif/include/btif_util.h
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (c) 2014 The Android Open Source Project
  *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,6 +51,7 @@
 const char* dump_dm_search_event(UINT16 event);
 const char* dump_dm_event(UINT16 event);
 const char* dump_hf_event(UINT16 event);
+const char* dump_hf_client_event(UINT16 event);
 const char* dump_hh_event(UINT16 event);
 const char* dump_hf_conn_state(UINT16 event);
 const char* dump_hf_call_state(bthf_call_state_t call_state);
diff --git a/btif/src/bluetooth.c b/btif/src/bluetooth.c
old mode 100755
new mode 100644
index f6c2f48..5c730f9
--- a/btif/src/bluetooth.c
+++ b/btif/src/bluetooth.c
@@ -30,11 +30,13 @@
 
 #include <hardware/bluetooth.h>
 #include <hardware/bt_hf.h>
+#include <hardware/bt_hf_client.h>
 #include <hardware/bt_av.h>
 #include <hardware/bt_sock.h>
 #include <hardware/bt_hh.h>
 #include <hardware/bt_hl.h>
 #include <hardware/bt_pan.h>
+#include <hardware/bt_mce.h>
 #include <hardware/bt_gatt.h>
 #include <hardware/bt_rc.h>
 
@@ -60,6 +62,9 @@
 
 bt_callbacks_t *bt_hal_cbacks = NULL;
 
+/** Operating System specific callouts for resource management */
+bt_os_callouts_t *bt_os_callouts = NULL;
+
 /************************************************************************************
 **  Static functions
 ************************************************************************************/
@@ -68,14 +73,15 @@
 **  Externs
 ************************************************************************************/
 
-extern bt_wakelock_callback config_wakelock_callback;
-
 /* list all extended interfaces here */
 
 /* handsfree profile */
 extern bthf_interface_t *btif_hf_get_interface();
+/* handsfree profile - client */
+extern bthf_client_interface_t *btif_hf_client_get_interface();
 /* advanced audio profile */
-extern btav_interface_t *btif_av_get_interface();
+extern btav_interface_t *btif_av_get_src_interface();
+extern btav_interface_t *btif_av_get_sink_interface();
 /*rfc l2cap*/
 extern btsock_interface_t *btif_sock_get_interface();
 /* hid host profile */
@@ -84,12 +90,16 @@
 extern bthl_interface_t *btif_hl_get_interface();
 /*pan*/
 extern btpan_interface_t *btif_pan_get_interface();
+/*map client*/
+extern btmce_interface_t *btif_mce_get_interface();
 #if BLE_INCLUDED == TRUE
 /* gatt */
 extern btgatt_interface_t *btif_gatt_get_interface();
 #endif
-/* avrc */
+/* avrc target */
 extern btrc_interface_t *btif_rc_get_interface();
+/* avrc controller */
+extern btrc_interface_t *btif_rc_ctrl_get_interface();
 
 /************************************************************************************
 **  Functions
@@ -121,7 +131,6 @@
 
     /* store reference to user callbacks */
     bt_hal_cbacks = callbacks;
-    config_wakelock_callback = callbacks->bt_wakelock_cb;
 
     /* add checks for individual callbacks ? */
 
@@ -256,13 +265,13 @@
     return btif_dm_cancel_discovery();
 }
 
-static int create_bond(const bt_bdaddr_t *bd_addr)
+static int create_bond(const bt_bdaddr_t *bd_addr, int transport)
 {
     /* sanity check */
     if (interface_ready() == FALSE)
         return BT_STATUS_NOT_READY;
 
-    return btif_dm_create_bond(bd_addr);
+    return btif_dm_create_bond(bd_addr, transport);
 }
 
 static int cancel_bond(const bt_bdaddr_t *bd_addr)
@@ -283,6 +292,15 @@
     return btif_dm_remove_bond(bd_addr);
 }
 
+static int get_connection_state(const bt_bdaddr_t *bd_addr)
+{
+    /* sanity check */
+    if (interface_ready() == FALSE)
+        return 0;
+
+    return btif_dm_get_connection_state(bd_addr);
+}
+
 static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
                  uint8_t pin_len, bt_pin_code_t *pin_code)
 {
@@ -303,6 +321,14 @@
     return btif_dm_ssp_reply(bd_addr, variant, accept, passkey);
 }
 
+static int read_energy_info()
+{
+    if (interface_ready() == FALSE)
+        return BT_STATUS_NOT_READY;
+    btif_dm_read_energy_info();
+    return BT_STATUS_SUCCESS;
+}
+
 static const void* get_profile_interface (const char *profile_id)
 {
     ALOGI("get_profile_interface %s", profile_id);
@@ -315,6 +341,9 @@
     if (is_profile(profile_id, BT_PROFILE_HANDSFREE_ID))
         return btif_hf_get_interface();
 
+    if (is_profile(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
+        return btif_hf_client_get_interface();
+
     if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))
         return btif_sock_get_interface();
 
@@ -322,7 +351,10 @@
         return btif_pan_get_interface();
 
     if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
-        return btif_av_get_interface();
+        return btif_av_get_src_interface();
+
+    if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
+        return btif_av_get_sink_interface();
 
     if (is_profile(profile_id, BT_PROFILE_HIDHOST_ID))
         return btif_hh_get_interface();
@@ -330,7 +362,10 @@
     if (is_profile(profile_id, BT_PROFILE_HEALTH_ID))
         return btif_hl_get_interface();
 
-#if BTA_GATT_INCLUDED == TRUE
+    if (is_profile(profile_id, BT_PROFILE_MAP_CLIENT_ID))
+        return btif_mce_get_interface();
+
+#if ( BTA_GATT_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
     if (is_profile(profile_id, BT_PROFILE_GATT_ID))
         return btif_gatt_get_interface();
 #endif
@@ -338,6 +373,9 @@
     if (is_profile(profile_id, BT_PROFILE_AV_RC_ID))
         return btif_rc_get_interface();
 
+    if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
+        return btif_rc_ctrl_get_interface();
+
     return NULL;
 }
 
@@ -387,6 +425,11 @@
     return btif_config_hci_snoop_log(enable);
 }
 
+static int set_os_callouts(bt_os_callouts_t *callouts) {
+    bt_os_callouts = callouts;
+    return BT_STATUS_SUCCESS;
+}
+
 static const bt_interface_t bluetoothInterface = {
     sizeof(bluetoothInterface),
     init,
@@ -406,6 +449,7 @@
     create_bond,
     remove_bond,
     cancel_bond,
+    get_connection_state,
     pin_reply,
     ssp_reply,
     get_profile_interface,
@@ -416,7 +460,9 @@
 #else
     NULL,
 #endif
-    config_hci_snoop_log
+    config_hci_snoop_log,
+    set_os_callouts,
+    read_energy_info,
 };
 
 const bt_interface_t* bluetooth__get_bluetooth_interface ()
diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c
old mode 100755
new mode 100644
index 3c0c293..8f3a974
--- a/btif/src/btif_av.c
+++ b/btif/src/btif_av.c
@@ -26,6 +26,7 @@
  *****************************************************************************/
 
 #include <hardware/bluetooth.h>
+#include <system/audio.h>
 #include "hardware/bt_av.h"
 
 #define LOG_TAG "BTIF_AV"
@@ -39,6 +40,7 @@
 #include "gki.h"
 #include "bd.h"
 #include "btu.h"
+#include "bt_utils.h"
 
 /*****************************************************************************
 **  Constants & Macros
@@ -76,24 +78,39 @@
     btif_sm_handle_t sm_handle;
     UINT8 flags;
     tBTA_AV_EDR edr;
+    UINT8   peer_sep;  /* sep type of peer device */
 } btif_av_cb_t;
 
+typedef struct
+{
+    bt_bdaddr_t *target_bda;
+    uint16_t uuid;
+} btif_av_connect_req_t;
+
+typedef struct
+{
+    int sample_rate;
+    int channel_count;
+} btif_av_sink_config_req_t;
+
 /*****************************************************************************
 **  Static variables
 ******************************************************************************/
-static btav_callbacks_t *bt_av_callbacks = NULL;
+static btav_callbacks_t *bt_av_src_callbacks = NULL;
+static btav_callbacks_t *bt_av_sink_callbacks = NULL;
 static btif_av_cb_t btif_av_cb;
 static TIMER_LIST_ENT tle_av_open_on_rc;
 
 /* both interface and media task needs to be ready to alloc incoming request */
-#define CHECK_BTAV_INIT() if ((bt_av_callbacks == NULL) || (btif_av_cb.sm_handle == NULL))\
+#define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \
+        || (btif_av_cb.sm_handle == NULL))\
 {\
-     BTIF_TRACE_WARNING1("%s: BTAV not initialized", __FUNCTION__);\
+     BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\
      return BT_STATUS_NOT_READY;\
 }\
 else\
 {\
-     BTIF_TRACE_EVENT1("%s", __FUNCTION__);\
+     BTIF_TRACE_EVENT("%s", __FUNCTION__);\
 }
 
 /* Helper macro to avoid code duplication in the state machine handlers */
@@ -178,8 +195,7 @@
         CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
         CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
         CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
-        CASE_RETURN_STR(BTIF_AV_RECONFIGURE_REQ_EVT)
-
+        CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
         default: return "UNKNOWN_EVENT";
    }
 }
@@ -202,15 +218,19 @@
 {
     BD_ADDR peer_addr;
     UNUSED(tle);
-
+    btif_av_connect_req_t connect_req;
+    UNUSED(tle);
     /* is there at least one RC connection - There should be */
     if (btif_rc_get_connected_peer(peer_addr)) {
-       BTIF_TRACE_DEBUG1("%s Issuing connect to the remote RC peer", __FUNCTION__);
-       btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (void*)&peer_addr);
+       BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__);
+       /* In case of AVRCP connection request, we will initiate SRC connection */
+       connect_req.target_bda = (bt_bdaddr_t*)&peer_addr;
+       connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE;
+       btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
     }
     else
     {
-        BTIF_TRACE_ERROR1("%s No connected RC peers", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__);
     }
 }
 
@@ -218,9 +238,27 @@
 **  Static functions
 ******************************************************************************/
 
+static void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr)
+{
+    if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+        HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr);
+    } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
+        HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr);
+    }
+}
+
+static void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr)
+{
+    if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+        HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr);
+    } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
+        HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr);
+    }
+}
+
 /*****************************************************************************
 **
-** Function		btif_av_state_idle_handler
+** Function     btif_av_state_idle_handler
 **
 ** Description  State managing disconnected AV link
 **
@@ -230,7 +268,7 @@
 
 static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
 {
-    BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
                      dump_av_sm_event_name(event), btif_av_cb.flags);
 
     switch (event)
@@ -258,14 +296,17 @@
         {
              if (event == BTIF_AV_CONNECT_REQ_EVT)
              {
-                 memcpy(&btif_av_cb.peer_bda, (bt_bdaddr_t*)p_data, sizeof(bt_bdaddr_t));
+                 memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda,
+                                                                   sizeof(bt_bdaddr_t));
+                 BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
+                    TRUE, BTA_SEC_NONE, ((btif_av_connect_req_t*)p_data)->uuid);
              }
              else if (event == BTA_AV_PENDING_EVT)
              {
                   bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
+                  BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
+                    TRUE, BTA_SEC_NONE, UUID_SERVCLASS_AUDIO_SOURCE);
              }
-             BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
-                    TRUE, BTA_SEC_NONE);
              btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING);
         } break;
 
@@ -280,7 +321,7 @@
              * TODO: We may need to do this only on an AVRCP Play. FixMe
              */
 
-            BTIF_TRACE_DEBUG0("BTA_AV_RC_OPEN_EVT received w/o AV");
+            BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV");
             memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
             tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
             btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
@@ -297,14 +338,14 @@
 
         case BTA_AV_RC_CLOSE_EVT:
             if (tle_av_open_on_rc.in_use) {
-                BTIF_TRACE_DEBUG0("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
+                BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
                 btu_stop_timer(&tle_av_open_on_rc);
             }
             btif_rc_handler(event, p_data);
             break;
 
         default:
-            BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+            BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
                                 dump_av_sm_event_name(event));
             return FALSE;
 
@@ -324,26 +365,31 @@
 
 static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data)
 {
-    BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
                      dump_av_sm_event_name(event), btif_av_cb.flags);
 
     switch (event)
     {
         case BTIF_SM_ENTER_EVT:
             /* inform the application that we are entering connecting state */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                      BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
             break;
 
         case BTIF_SM_EXIT_EVT:
             break;
 
+        case BTA_AV_REJECT_EVT:
+            BTIF_TRACE_DEBUG(" Received  BTA_AV_REJECT_EVT ");
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+            btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
+            break;
+
         case BTA_AV_OPEN_EVT:
         {
             tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
             btav_connection_state_t state;
             btif_sm_state_t av_state;
-            BTIF_TRACE_DEBUG2("status:%d, edr 0x%x",p_bta_data->open.status,
+            BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status,
                                p_bta_data->open.edr);
 
             if (p_bta_data->open.status == BTA_AV_SUCCESS)
@@ -351,30 +397,56 @@
                  state = BTAV_CONNECTION_STATE_CONNECTED;
                  av_state = BTIF_AV_STATE_OPENED;
                  btif_av_cb.edr = p_bta_data->open.edr;
+
+                 btif_av_cb.peer_sep = p_bta_data->open.sep;
+                 btif_a2dp_set_peer_sep(p_bta_data->open.sep);
             }
             else
             {
-                BTIF_TRACE_WARNING1("BTA_AV_OPEN_EVT::FAILED status: %d",
+                BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d",
                                      p_bta_data->open.status );
                 state = BTAV_CONNECTION_STATE_DISCONNECTED;
                 av_state  = BTIF_AV_STATE_IDLE;
             }
 
             /* inform the application of the event */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                             state, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(state, &(btif_av_cb.peer_bda));
             /* change state to open/idle based on the status */
             btif_sm_change_state(btif_av_cb.sm_handle, av_state);
-            /* if queued PLAY command,  send it now */
-            btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+            {
+                /* if queued PLAY command,  send it now */
+                btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
                                              (p_bta_data->open.status == BTA_AV_SUCCESS));
+            }
+            else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+            {
+                /* if queued PLAY command,  send it now */
+                btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE);
+                /* Bring up AVRCP connection too */
+                BTA_AvOpenRc(btif_av_cb.bta_handle);
+            }
             btif_queue_advance();
         } break;
 
+        case BTIF_AV_SINK_CONFIG_REQ_EVT:
+        {
+            btif_av_sink_config_req_t req;
+            // copy to avoid alignment problems
+            memcpy(&req, p_data, sizeof(req));
+
+            BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate,
+                    req.channel_count);
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
+                HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda),
+                        req.sample_rate, req.channel_count);
+            }
+        } break;
+
         CHECK_RC_EVENT(event, p_data);
 
         default:
-            BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+            BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
                                 dump_av_sm_event_name(event));
             return FALSE;
 
@@ -396,26 +468,38 @@
 
 static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data)
 {
-    BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
                      dump_av_sm_event_name(event), btif_av_cb.flags);
 
     switch (event)
     {
         case BTIF_SM_ENTER_EVT:
-
-            /* immediately stop transmission of frames */
-            btif_a2dp_set_tx_flush(TRUE);
-            /* wait for audioflinger to stop a2dp */
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+            {
+                /* immediately stop transmission of frames */
+                btif_a2dp_set_tx_flush(TRUE);
+                /* wait for audioflinger to stop a2dp */
+            }
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+            {
+                btif_a2dp_set_rx_flush(TRUE);
+            }
             break;
 
         case BTA_AV_STOP_EVT:
         case BTIF_AV_STOP_STREAM_REQ_EVT:
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+            {
               /* immediately flush any pending tx frames while suspend is pending */
               btif_a2dp_set_tx_flush(TRUE);
+            }
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+            {
+                btif_a2dp_set_rx_flush(TRUE);
+            }
 
-              btif_a2dp_on_stopped(NULL);
-
-              break;
+            btif_a2dp_on_stopped(NULL);
+            break;
 
         case BTIF_SM_EXIT_EVT:
             break;
@@ -423,8 +507,7 @@
         case BTA_AV_CLOSE_EVT:
 
             /* inform the application that we are disconnecting */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
 
             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
             break;
@@ -435,7 +518,7 @@
             break;
 
         default:
-            BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+            BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
                                 dump_av_sm_event_name(event));
             return FALSE;
    }
@@ -457,13 +540,13 @@
 {
     tBTA_AV *p_av = (tBTA_AV*)p_data;
 
-    BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
                      dump_av_sm_event_name(event), btif_av_cb.flags);
 
     if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) &&
          (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) )
     {
-        BTIF_TRACE_EVENT1("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
+        BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
         btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
     }
 
@@ -479,32 +562,44 @@
             break;
 
         case BTIF_AV_START_STREAM_REQ_EVT:
-            btif_a2dp_setup_codec();
+            if (btif_av_cb.peer_sep != AVDT_TSEP_SRC)
+                btif_a2dp_setup_codec();
             BTA_AvStart();
             btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START;
             break;
 
         case BTA_AV_START_EVT:
         {
-            BTIF_TRACE_EVENT3("BTA_AV_START_EVT status %d, suspending %d, init %d",
+            BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d",
                 p_av->start.status, p_av->start.suspending, p_av->start.initiator);
 
             if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
                 return TRUE;
 
-            if (btif_a2dp_on_started(&p_av->start,
-                ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) {
-                /* only clear pending flag after acknowledgement */
-                btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
+            /*  In case peer is A2DP SRC we do not want to ack commands on UIPC*/
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+            {
+                if (btif_a2dp_on_started(&p_av->start,
+                    ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0)))
+                {
+                    /* only clear pending flag after acknowledgement */
+                    btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
+                }
             }
 
             /* remain in open state if status failed */
             if (p_av->start.status != BTA_AV_SUCCESS)
                 return FALSE;
 
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
+            {
+                btif_a2dp_set_rx_flush(FALSE); /*  remove flush state, ready for streaming*/
+            }
+
             /* change state to started, send acknowledgement if start is pending */
             if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
-                btif_a2dp_on_started(NULL, TRUE);
+                if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+                    btif_a2dp_on_started(NULL, TRUE);
                 /* pending start flag will be cleared when exit current state */
             }
             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED);
@@ -513,20 +608,20 @@
 
         case BTIF_AV_DISCONNECT_REQ_EVT:
             BTA_AvClose(btif_av_cb.bta_handle);
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+                BTA_AvCloseRc(btif_av_cb.bta_handle);
+            }
 
             /* inform the application that we are disconnecting */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-               BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
             break;
 
         case BTA_AV_CLOSE_EVT:
-
-            /* avdtp link is closed */
+             /* avdtp link is closed */
             btif_a2dp_on_stopped(NULL);
 
             /* inform the application that we are disconnected */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
 
             /* change state to idle, send acknowledgement if start is pending */
             if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
@@ -540,7 +635,7 @@
             if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) &&
                 (p_av->reconfig.status == BTA_AV_SUCCESS))
             {
-               APPL_TRACE_WARNING0("reconfig done BTA_AVstart()");
+               APPL_TRACE_WARNING("reconfig done BTA_AVstart()");
                BTA_AvStart();
             }
             else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)
@@ -553,7 +648,7 @@
         CHECK_RC_EVENT(event, p_data);
 
         default:
-            BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+            BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
                                dump_av_sm_event_name(event));
             return FALSE;
 
@@ -575,7 +670,7 @@
 {
     tBTA_AV *p_av = (tBTA_AV*)p_data;
 
-    BTIF_TRACE_DEBUG3("%s event:%s flags %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
                      dump_av_sm_event_name(event), btif_av_cb.flags);
 
     switch (event)
@@ -585,16 +680,24 @@
             /* we are again in started state, clear any remote suspend flags */
             btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
 
-            HAL_CBACK(bt_av_callbacks, audio_state_cb,
-                BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
+            btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
+
+            /* increase the a2dp consumer task priority temporarily when start
+            ** audio playing, to avoid overflow the audio packet queue. */
+            adjust_priority_a2dp(TRUE);
+
             break;
 
         case BTIF_SM_EXIT_EVT:
+            /* restore the a2dp consumer task priority when stop audio playing. */
+            adjust_priority_a2dp(FALSE);
+
             break;
 
         case BTIF_AV_START_STREAM_REQ_EVT:
             /* we were remotely started, just ack back the local request */
-            btif_a2dp_on_started(NULL, TRUE);
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+                btif_a2dp_on_started(NULL, TRUE);
             break;
 
         /* fixme -- use suspend = true always to work around issue with BTA AV */
@@ -609,8 +712,16 @@
                always overrides */
             btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
 
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+            {
             /* immediately stop transmission of frames while suspend is pending */
-            btif_a2dp_set_tx_flush(TRUE);
+                btif_a2dp_set_tx_flush(TRUE);
+            }
+
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+                btif_a2dp_set_rx_flush(TRUE);
+                btif_a2dp_on_stopped(NULL);
+            }
 
             BTA_AvStop(TRUE);
             break;
@@ -619,10 +730,12 @@
 
             /* request avdtp to close */
             BTA_AvClose(btif_av_cb.bta_handle);
+            if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
+                BTA_AvCloseRc(btif_av_cb.bta_handle);
+            }
 
             /* inform the application that we are disconnecting */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
 
             /* wait in closing state until fully closed */
             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
@@ -630,7 +743,7 @@
 
         case BTA_AV_SUSPEND_EVT:
 
-            BTIF_TRACE_EVENT2("BTA_AV_SUSPEND_EVT status %d, init %d",
+            BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d",
                  p_av->suspend.status, p_av->suspend.initiator);
 
             /* a2dp suspended, stop media task until resumed */
@@ -641,8 +754,11 @@
             {
                 btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
 
+               if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
+               {
                 /* suspend failed, reset back tx flush state */
-                btif_a2dp_set_tx_flush(FALSE);
+                    btif_a2dp_set_tx_flush(FALSE);
+               }
                 return FALSE;
             }
 
@@ -656,13 +772,11 @@
                 if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0)
                     btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
 
-                HAL_CBACK(bt_av_callbacks, audio_state_cb,
-                        BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
+                btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
             }
             else
             {
-                HAL_CBACK(bt_av_callbacks, audio_state_cb,
-                        BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
+                btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
             }
 
             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
@@ -674,11 +788,9 @@
         case BTA_AV_STOP_EVT:
 
             btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
-
             btif_a2dp_on_stopped(&p_av->suspend);
 
-            HAL_CBACK(bt_av_callbacks, audio_state_cb,
-                      BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
+            btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
 
             /* if stop was successful, change state to open */
             if (p_av->suspend.status == BTA_AV_SUCCESS)
@@ -691,12 +803,10 @@
              btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
 
             /* avdtp link is closed */
-
             btif_a2dp_on_stopped(NULL);
 
             /* inform the application that we are disconnected */
-            HAL_CBACK(bt_av_callbacks, connection_state_cb,
-                BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
+            btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
 
             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
             break;
@@ -704,7 +814,7 @@
         CHECK_RC_EVENT(event, p_data);
 
         default:
-            BTIF_TRACE_WARNING2("%s : unhandled event:%s", __FUNCTION__,
+            BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
                                  dump_av_sm_event_name(event));
             return FALSE;
 
@@ -728,6 +838,43 @@
                           (char*)p_data, sizeof(tBTA_AV), NULL);
 }
 
+static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
+{
+    btif_sm_state_t state;
+    UINT8 que_len;
+    tA2D_STATUS a2d_status;
+    tA2D_SBC_CIE sbc_cie;
+    btif_av_sink_config_req_t config_req;
+
+    if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */
+    {
+        state= btif_sm_get_state(btif_av_cb.sm_handle);
+        if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */
+             (state == BTIF_AV_STATE_OPENED) )
+        {
+            que_len = btif_media_sink_enque_buf((BT_HDR *)p_data);
+            BTIF_TRACE_DEBUG(" Packets in Que %d",que_len);
+        }
+        else
+            return;
+    }
+
+    if (event == BTA_AV_MEDIA_SINK_CFG_EVT) {
+        /* send a command to BT Media Task */
+        btif_reset_decoder((UINT8*)p_data);
+
+        a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
+        if (a2d_status == A2D_SUCCESS) {
+            /* Switch to BTIF context */
+            config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
+            config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
+            btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
+                                     (char*)&config_req, sizeof(config_req), NULL);
+        } else {
+            APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+        }
+    }
+}
 /*******************************************************************************
 **
 ** Function         btif_av_init
@@ -738,7 +885,7 @@
 **
 *******************************************************************************/
 
-bt_status_t btif_av_init(void)
+bt_status_t btif_av_init()
 {
     if (btif_av_cb.sm_handle == NULL)
     {
@@ -752,7 +899,7 @@
 
         btif_a2dp_on_init();
 
-        return BT_STATUS_SUCCESS;
+       return BT_STATUS_SUCCESS;
     }
 
     return BT_STATUS_DONE;
@@ -760,27 +907,63 @@
 
 /*******************************************************************************
 **
-** Function         init
+** Function         init_src
 **
-** Description      Initializes the AV interface
+** Description      Initializes the AV interface for source mode
 **
 ** Returns          bt_status_t
 **
 *******************************************************************************/
 
-static bt_status_t init(btav_callbacks_t* callbacks )
+static bt_status_t init_src(btav_callbacks_t* callbacks)
 {
-    int status;
+    bt_status_t status;
 
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
-    if (bt_av_callbacks)
-        return BT_STATUS_DONE;
+    if (bt_av_sink_callbacks != NULL) {
+        // already did btif_av_init()
+        status = BT_STATUS_SUCCESS;
+    } else {
+        status = btif_av_init();
+    }
 
-    bt_av_callbacks = callbacks;
-    btif_av_cb.sm_handle = NULL;
+    if (status == BT_STATUS_SUCCESS) {
+        bt_av_src_callbacks = callbacks;
+    }
 
-    return btif_av_init();
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         init_sink
+**
+** Description      Initializes the AV interface for sink mode
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+
+static bt_status_t init_sink(btav_callbacks_t* callbacks)
+{
+    bt_status_t status;
+
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    if (bt_av_src_callbacks != NULL) {
+        // already did btif_av_init()
+        status = BT_STATUS_SUCCESS;
+    } else {
+        status = btif_av_init();
+    }
+
+    if (status == BT_STATUS_SUCCESS) {
+        bt_av_sink_callbacks = callbacks;
+        BTA_AvEnable_Sink(TRUE);
+    }
+
+    return status;
 }
 
 /*******************************************************************************
@@ -793,23 +976,34 @@
 **
 *******************************************************************************/
 
-static bt_status_t connect_int(bt_bdaddr_t *bd_addr)
+static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    btif_av_connect_req_t connect_req;
+    connect_req.target_bda = bd_addr;
+    connect_req.uuid = uuid;
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
-    btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)bd_addr);
+    btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
 
     return BT_STATUS_SUCCESS;
 }
 
-static bt_status_t connect(bt_bdaddr_t *bd_addr)
+static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     CHECK_BTAV_INIT();
 
     return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
 }
 
+static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    CHECK_BTAV_INIT();
+
+    return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int);
+}
+
 /*******************************************************************************
 **
 ** Function         disconnect
@@ -821,7 +1015,7 @@
 *******************************************************************************/
 static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
     CHECK_BTAV_INIT();
 
@@ -841,28 +1035,53 @@
 *******************************************************************************/
 static void cleanup(void)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
-    if (bt_av_callbacks)
-    {
-        btif_a2dp_stop_media_task();
+    btif_a2dp_stop_media_task();
 
-        btif_disable_service(BTA_A2DP_SERVICE_ID);
-        bt_av_callbacks = NULL;
+    btif_disable_service(BTA_A2DP_SERVICE_ID);
 
-        /* Also shut down the AV state machine */
-        btif_sm_shutdown(btif_av_cb.sm_handle);
-        btif_av_cb.sm_handle = NULL;
-    }
-    return;
+    /* Also shut down the AV state machine */
+    btif_sm_shutdown(btif_av_cb.sm_handle);
+    btif_av_cb.sm_handle = NULL;
 }
 
-static const btav_interface_t bt_av_interface = {
+static void cleanup_src(void) {
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    if (bt_av_src_callbacks)
+    {
+        bt_av_src_callbacks = NULL;
+        if (bt_av_sink_callbacks == NULL)
+            cleanup();
+    }
+}
+
+static void cleanup_sink(void) {
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    if (bt_av_sink_callbacks)
+    {
+        bt_av_sink_callbacks = NULL;
+        if (bt_av_src_callbacks == NULL)
+            cleanup();
+    }
+}
+
+static const btav_interface_t bt_av_src_interface = {
     sizeof(btav_interface_t),
-    init,
-    connect,
+    init_src,
+    src_connect_sink,
     disconnect,
-    cleanup,
+    cleanup_src,
+};
+
+static const btav_interface_t bt_av_sink_interface = {
+    sizeof(btav_interface_t),
+    init_sink,
+    sink_connect_src,
+    disconnect,
+    cleanup_sink,
 };
 
 /*******************************************************************************
@@ -894,13 +1113,13 @@
 {
     btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
 
-    BTIF_TRACE_DEBUG3("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
+    BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
                 btif_av_cb.sm_handle, state, btif_av_cb.flags);
 
     /* also make sure main adapter is enabled */
     if (btif_is_enabled() == 0)
     {
-        BTIF_TRACE_EVENT0("main adapter not enabled");
+        BTIF_TRACE_EVENT("main adapter not enabled");
         return FALSE;
     }
 
@@ -925,7 +1144,7 @@
 {
     btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
 
-    BTIF_TRACE_DEBUG3("btif_av_stream_started : sm hdl %d, state %d, flags %x",
+    BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x",
                 btif_av_cb.sm_handle, state, btif_av_cb.flags);
 
     /* disallow media task to start if we have pending actions */
@@ -986,7 +1205,7 @@
          BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD),
                       bte_av_callback);
 #endif
-         BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0);
+         BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback);
      }
      else {
          BTA_AvDeregister(btif_av_cb.bta_handle);
@@ -997,17 +1216,32 @@
 
 /*******************************************************************************
 **
-** Function         btif_av_get_interface
+** Function         btif_av_get_src_interface
 **
-** Description      Get the AV callback interface
+** Description      Get the AV callback interface for A2DP source profile
 **
 ** Returns          btav_interface_t
 **
 *******************************************************************************/
-const btav_interface_t *btif_av_get_interface(void)
+const btav_interface_t *btif_av_get_src_interface(void)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
-    return &bt_av_interface;
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    return &bt_av_src_interface;
+}
+
+/*******************************************************************************
+**
+** Function         btif_av_get_sink_interface
+**
+** Description      Get the AV callback interface for A2DP sink profile
+**
+** Returns          btav_interface_t
+**
+*******************************************************************************/
+const btav_interface_t *btif_av_get_sink_interface(void)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    return &bt_av_sink_interface;
 }
 
 /*******************************************************************************
diff --git a/btif/src/btif_config.c b/btif/src/btif_config.c
index e7809a7..7b5ab07 100644
--- a/btif/src/btif_config.c
+++ b/btif/src/btif_config.c
@@ -89,11 +89,10 @@
 static int pth = -1; //poll thread handle
 static cfg_node root;
 static int cached_change;
-static int processing_save_cmd;
+static int save_cmds_queued;
 static void cfg_cmd_callback(int cmd_fd, int type, int flags, uint32_t user_id);
 static inline short alloc_node(cfg_node* p, short grow);
 static inline void free_node(cfg_node* p);
-static inline void free_inode(cfg_node* p, int child);
 static inline short find_inode(const cfg_node* p, const char* name);
 static cfg_node* find_node(const char* section, const char* key, const char* name);
 static int remove_node(const char* section, const char* key, const char* name);
@@ -104,7 +103,6 @@
 static int save_cfg();
 static void load_cfg();
 static short find_next_node(const cfg_node* p, short start, char* name, int* bytes);
-static int create_dir(const char* path);
 #ifdef UNIT_TEST
 static void cfg_test_load();
 static void cfg_test_write();
@@ -339,11 +337,22 @@
 }
 int btif_config_save()
 {
+    int post_cmd = 0;
     lock_slot(&slot_lock);
-    bdld("processing_save_cmd:%d, cached change:%d", processing_save_cmd, cached_change);
-    if(!processing_save_cmd && cached_change > 0)
-        btsock_thread_post_cmd(pth, CFG_CMD_SAVE, NULL, 0, 0);
+    bdld("save_cmds_queued:%d, cached_change:%d", save_cmds_queued, cached_change);
+    if((save_cmds_queued == 0) && (cached_change > 0))
+    {
+        post_cmd = 1;
+        save_cmds_queued++;
+        bdld("post_cmd set to 1, save_cmds_queued:%d", save_cmds_queued);
+    }
     unlock_slot(&slot_lock);
+    /* don't hold lock when invoking send or else a deadlock could
+     * occur when the socket thread tries to do the actual saving.
+     */
+    if (post_cmd)
+        btsock_thread_post_cmd(pth, CFG_CMD_SAVE, NULL, 0, 0);
+
     return TRUE;
 }
 void btif_config_flush()
@@ -436,7 +445,7 @@
         } else ADD_CHILD_COUNT(p, 1);
     }
     else node = &p->child[i];
-    if(!node->name)
+    if(node && (!node->name))
         node->name = strdup(name);
     return node;
 }
@@ -691,7 +700,6 @@
    if(btif_config_save_file(file_name_new))
     {
         cached_change = 0;
-        processing_save_cmd = 0;
         chown(file_name_new, -1, AID_NET_BT_STACK);
         chmod(file_name_new, 0660);
         rename(file_name, file_name_old);
@@ -786,25 +794,34 @@
     UNUSED(size);
     UNUSED(user_id);
 
-  //bdld("cmd type:%d, size:%d", type, size);
     switch(type)
     {
         case CFG_CMD_SAVE:
         {
-            int last_cached_change = cached_change;
-            processing_save_cmd = 1;
+            int i;
+            int last_cached_change;
+
+            // grab lock while accessing cached_change.
+            lock_slot(&slot_lock);
+            bdla(save_cmds_queued > 0);
+            save_cmds_queued--;
+            last_cached_change = cached_change;
             //hold the file saving until no more change in last 3 seconds.
             bdld("wait until no more changes in short time, cached change:%d", cached_change);
-            int i;
-            for(i = 0; i < 100; i ++) //5 minitue max waiting
+            for(i = 0; i < 100; i ++) //5 minutes max waiting
             {
+                // don't sleep if there is nothing to do
+                if(cached_change == 0)
+                    break;
+                // release lock during sleep
+                unlock_slot(&slot_lock);
                 sleep(3);
-                if(cached_change == 0 || last_cached_change == cached_change)
+                lock_slot(&slot_lock);
+                if(last_cached_change == cached_change)
                     break;
                 last_cached_change = cached_change;
             }
             bdld("writing the bt_config.xml now, cached change:%d", cached_change);
-            lock_slot(&slot_lock);
             if(cached_change > 0)
                 save_cfg();
             unlock_slot(&slot_lock);
diff --git a/btif/src/btif_config_util.cpp b/btif/src/btif_config_util.cpp
index 0cc2b36..a6d9f6f 100644
--- a/btif/src/btif_config_util.cpp
+++ b/btif/src/btif_config_util.cpp
@@ -56,6 +56,41 @@
 #define BLUEDROID_VALUE_TYPE "Type"
 #define BLUEDROID_TAG_REMOTE_DEVICE "Remote Devices"
 
+#define HID_SUB_CLASS      "020208"
+#define HID_COUNTRY_CODE      "020308"
+#define HID_VIRTUAL_CABLE      "020428"
+#define HID_RECON_INNITIATE      "020528"
+#define HID_REP_DSC_1      "020636"
+#define HID_REP_DSC_2      "020635"
+#define HID_SDP_DISABLE      "020828"
+#define HID_BAT_POWER      "020928"
+#define HID_REM_WAKE      "020A28"
+#define HID_SUP_TIME      "020C09"
+#define HID_NORM_CONN      "020D28"
+#define HID_SSR_MAX_LAT      "020F09"
+#define HID_SSR_MIN_TIM      "021009"
+#define HID_VENDOR_ID      "020109"
+#define HID_PRODUCT_ID      "020209"
+#define HID_PRODUCT_VERSION      "020309"
+#define HID_APP_ID_MOUSE      1
+#define HID_APP_ID_KYB      2
+#define HID_PAIRED_DEV_PRIORITY      100
+#define HID_SSR_PARAM_INVALID    0xffff
+#define HID_RPT_DSCR_HDR_LEN_1    10
+#define HID_RPT_DSCR_HDR_LEN_2    7
+
+/* Hid Atribute Mask */
+#define HID_ATTR_MASK_VIRTUAL_CABLE        0x0001
+#define HID_ATTR_MASK_NORMALLY_CONNECTABLE 0x0002
+#define HID_ATTR_MASK_RECONN_INIT          0x0004
+#define HID_ATTR_MASK_SDP_DISABLE          0x0008
+#define HID_ATTR_MASK_BATTERY_POWER        0x0010
+#define HID_ATTR_MASK_REMOTE_WAKE          0x0020
+#define HID_ATTR_MASK_SUP_TOUT_AVLBL       0x0040
+#define HID_ATTR_MASK_SSR_MAX_LATENCY      0x0080
+#define HID_ATTR_MASK_SSR_MIN_TOUT         0x0100
+#define HID_ATTR_MASK_SEC_REQUIRED         0x8000
+
 using namespace tinyxml2;
 struct enum_user_data
 {
@@ -523,6 +558,200 @@
                         laddr[i] - ('a' - 'A') : laddr[i];
     uaddr[i] = 0;
 }
+
+static int parse_hid_attribute(const char *str, int line_size, int len)
+{
+    if (len == 0 || line_size == 0 || str == NULL || (len%2))
+        return 0;
+
+    char hex_string[len + 1], hex_bytes[len/2];
+    memcpy(hex_string, str - 1, len);
+    hex_string[len] = 0;
+    hex2bytes(hex_string, len, hex_bytes);
+    if (len == 2)
+        return hex_bytes[0];
+    else if (len == 4)
+        return hex_bytes[0] << 8 | hex_bytes[1];
+    else return 0;
+}
+
+static int parse_bluez_hid_sdp_records(const char* adapter_path, const char* bd_addr)
+{
+    //debug("in");
+    char addr[32];
+    char pattern_to_search[50];
+    upcase_addr(bd_addr, addr, sizeof(addr));
+
+    const char* map = NULL;
+    int size = 0;
+    int ret = FALSE;
+    char path[256];
+    snprintf(path, sizeof(path), "%s/%s", adapter_path, BLUEZ_SDP);
+    int fd = open_file_map(path, &map, &size);
+    //debug("in, path:%s, addr:%s, fd:%d, size:%d", path, addr, fd, size);
+    if(fd < 0 || size == 0)
+    {
+        error("open_file_map fail, fd:%d, path:%s, size:%d", fd, path, size);
+        //debug("out");
+        return FALSE;
+    }
+    int line_size = 0;
+    snprintf(pattern_to_search, sizeof(pattern_to_search), "%s#00010000", addr);
+    const char *value_line = find_value_line(map, size, pattern_to_search, &line_size);
+    int dev_sub_class = 0;
+    int app_id = 0;
+    int countrycode = 0;
+    int product = 0;
+    int vendor = 0;
+    int product_ver = 0;
+    int attr_mask = 0;
+    int ssr_max_lat = 0;
+    int ssr_min_timeout = 0;
+    int rep_desc_len = 0;
+    if(value_line && line_size)
+    {
+        char hid_sdp[line_size + 2];
+        memcpy(hid_sdp, value_line - 1, line_size);
+        hid_sdp[line_size + 1] = 0;
+        //debug("addr:%s, hid_sdp:%s", bd_addr, hid_sdp);
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SUB_CLASS, &line_size);
+        dev_sub_class = parse_hid_attribute(value_line, line_size, 2);
+        if(dev_sub_class)
+        {
+            if ((dev_sub_class & 0x80) == 0x80)
+                app_id = HID_APP_ID_MOUSE;
+            else
+                app_id = HID_APP_ID_KYB;
+            //debug("dev_sub_class:%d", dev_sub_class);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_COUNTRY_CODE, &line_size);
+        countrycode = parse_hid_attribute(value_line, line_size, 2);
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_VIRTUAL_CABLE, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_VIRTUAL_CABLE;
+            //debug("attr_mask after Virtual Unplug:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_RECON_INNITIATE, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_RECONN_INIT;
+            //debug("attr_mask after Reconnect Initiate:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REP_DSC_1, &line_size);
+        if(value_line && line_size)
+        {
+            char rep_desc[line_size + 1], rd[line_size/2 + 1];
+            char rep_dsc_len[5], rd_len[2];
+            memcpy(rep_dsc_len, value_line - 1, 4);
+            rep_dsc_len[4] = 0;
+            hex2bytes(rep_dsc_len, 4, rd_len);
+            rep_desc_len = (rd_len[0] << 8 | rd_len[1]) - (HID_RPT_DSCR_HDR_LEN_1 - 2);
+            //debug("rep_desc_len:%d", rep_desc_len);
+            memcpy(rep_desc, value_line - 1 + (HID_RPT_DSCR_HDR_LEN_1 * 2), rep_desc_len * 2);
+            rep_desc[rep_desc_len * 2] = 0;
+            hex2bytes(rep_desc, rep_desc_len* 2, rd);
+            if (rep_desc_len)
+            {
+                //debug("rep_desc:%s", rep_desc);
+                btif_config_set("Remote", bd_addr, "HidDescriptor", rd, rep_desc_len,
+                        BTIF_CFG_TYPE_BIN);
+            }
+        }
+        else
+        {
+            value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REP_DSC_2, &line_size);
+            if(value_line && line_size)
+            {
+                char rep_dsc_len[3], rd_len[1];
+                memcpy(rep_dsc_len, value_line - 1, 2);
+                rep_dsc_len[2] = 0;
+                hex2bytes(rep_dsc_len, 2, rd_len);
+                rep_desc_len = rd_len[0] - (HID_RPT_DSCR_HDR_LEN_2 - 1);
+                //debug("rep_desc_len:%d", rep_desc_len);
+                char rep_desc[(rep_desc_len * 2) + 1], rd[rep_desc_len + 1];
+                memcpy(rep_desc, value_line - 1 + (HID_RPT_DSCR_HDR_LEN_2 * 2), rep_desc_len * 2);
+                rep_desc[rep_desc_len * 2] = 0;
+                hex2bytes(rep_desc, rep_desc_len * 2, rd);
+                if (rep_desc_len)
+                {
+                    //debug("rep_desc:%s", rep_desc);
+                    btif_config_set("Remote", bd_addr, "HidDescriptor", rd, rep_desc_len,
+                            BTIF_CFG_TYPE_BIN);
+                }
+            }
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SDP_DISABLE, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_SDP_DISABLE;
+            //debug("attr_mask after SDP Disable:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_BAT_POWER, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_BATTERY_POWER;
+            //debug("attr_mask after Battery Powered:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_REM_WAKE, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_REMOTE_WAKE;
+            //debug("attr_mask after Remote Wake:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_NORM_CONN, &line_size);
+        if(parse_hid_attribute(value_line, line_size, 2))
+        {
+            attr_mask |= HID_ATTR_MASK_NORMALLY_CONNECTABLE;
+            //debug("attr_mask after Normally Conenctable:%04x", attr_mask);
+        }
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SUP_TIME, &line_size);
+        if(value_line && line_size)
+            attr_mask |= HID_ATTR_MASK_SUP_TOUT_AVLBL;
+        //debug("attr_mask after Supervision Timeout:%04x", attr_mask);
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SSR_MAX_LAT, &line_size);
+        ssr_max_lat = parse_hid_attribute(value_line, line_size, 4);
+        if(!ssr_max_lat)
+            ssr_max_lat = HID_SSR_PARAM_INVALID;
+        value_line = find_value_line(hid_sdp, strlen(hid_sdp), HID_SSR_MIN_TIM, &line_size);
+        ssr_min_timeout = parse_hid_attribute(value_line, line_size, 4);
+        if(!ssr_min_timeout)
+            ssr_min_timeout = HID_SSR_PARAM_INVALID;
+        snprintf(pattern_to_search, sizeof(pattern_to_search), "%s#00010001", addr);
+        value_line = find_value_line(map, size, pattern_to_search, &line_size);
+        if(value_line && line_size)
+        {
+            char did_sdp[line_size + 2];
+            memcpy(did_sdp, value_line - 1, line_size + 1);
+            did_sdp[line_size + 1] = 0;
+            //debug("addr:%s, did_sdp:%s", bd_addr, did_sdp);
+            value_line = find_value_line(did_sdp, strlen(did_sdp), HID_VENDOR_ID, &line_size);
+            vendor = parse_hid_attribute(value_line, line_size, 4);
+            value_line = find_value_line(did_sdp, strlen(did_sdp), HID_PRODUCT_ID, &line_size);
+            product = parse_hid_attribute(value_line, line_size, 4);
+            value_line = find_value_line(did_sdp, strlen(did_sdp), HID_PRODUCT_VERSION, &line_size);
+            product_ver = parse_hid_attribute(value_line, line_size, 4);
+         }
+    }
+    btif_config_set_int("Remote", bd_addr, "HidAttrMask", attr_mask);
+    btif_config_set_int("Remote", bd_addr, "HidSubClass", dev_sub_class);
+    btif_config_set_int("Remote", bd_addr, "HidAppId", app_id);
+    btif_config_set_int("Remote", bd_addr, "HidVendorId", vendor);
+    btif_config_set_int("Remote", bd_addr, "HidProductId", product);
+    btif_config_set_int("Remote", bd_addr, "HidVersion", product_ver);
+    btif_config_set_int("Remote", bd_addr, "HidCountryCode", countrycode);
+    btif_config_set_int("Remote", bd_addr, "HidSSRMinTimeout", ssr_min_timeout);
+    btif_config_set_int("Remote", bd_addr, "HidSSRMaxLatency", ssr_max_lat);
+    //debug("HidSubClass: %02x, app_id = %d, vendor = %04x, product = %04x, product_ver = %04x"
+    //    "countrycode = %02x, ssr_min_timeout = %04x, ssr_max_lat = %04x",
+    //    HidSubClass, app_id, vendor, product, product_ver, countrycode, ssr_min_timeout,
+    //    ssr_max_lat);
+    close_file_map(fd, map, size);
+    ret = TRUE;
+    //debug("out, ret:%d", ret);
+    return ret;
+}
+
 static int load_bluez_dev_value(const char* adapter_path, const char* bd_addr,
                                 const char* file_name, const char* cfg_value_name, int type)
 {
@@ -558,15 +787,15 @@
         else if(type == BTIF_CFG_TYPE_INT)
         {
             int v = strtol(line, NULL, 16);
-            //filter out unspported devices by its class
+            //parse sdp record in case remote device is hid
             if(strcmp(file_name, BLUEZ_CLASSES) == 0)
             {
                 switch((v & 0x1f00) >> 8)
                 {
                     case 0x5: //hid device
-                        error("skip paired hid devices");
-                        close_file_map(fd, map, size);
-                        return FALSE;
+                        info("parsing sdp for hid device %s", bd_addr);
+                        parse_bluez_hid_sdp_records(adapter_path, bd_addr);
+                        break;
                 }
             }
             btif_config_set_int("Remote", bd_addr, cfg_value_name, v);
diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c
index 5fcee4e..8964f5c 100644
--- a/btif/src/btif_core.c
+++ b/btif/src/btif_core.c
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (C) 2014 The Android Open Source Project
  *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,6 +49,7 @@
 #include "btif_util.h"
 #include "btif_sock.h"
 #include "btif_pan.h"
+#include "btif_mce.h"
 #include "btif_profile_queue.h"
 #include "btif_config.h"
 /************************************************************************************
@@ -170,7 +172,7 @@
 {
     tBTIF_CONTEXT_SWITCH_CBACK *p;
 
-    BTIF_TRACE_VERBOSE0("btif_context_switched");
+    BTIF_TRACE_VERBOSE("btif_context_switched");
 
     p = (tBTIF_CONTEXT_SWITCH_CBACK *) p_msg;
 
@@ -200,7 +202,7 @@
 {
     tBTIF_CONTEXT_SWITCH_CBACK *p_msg;
 
-    BTIF_TRACE_VERBOSE2("btif_transfer_context event %d, len %d", event, param_len);
+    BTIF_TRACE_VERBOSE("btif_transfer_context event %d, len %d", event, param_len);
 
     /* allocate and send message that will be executed in btif context */
     if ((p_msg = (tBTIF_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len)) != NULL)
@@ -277,7 +279,7 @@
     BT_HDR   *p_msg;
     UNUSED(params);
 
-    BTIF_TRACE_DEBUG0("btif task starting");
+    BTIF_TRACE_DEBUG("btif task starting");
 
     btif_associate_evt();
 
@@ -292,7 +294,7 @@
          */
         if (event == BT_EVT_TRIGGER_STACK_INIT)
         {
-            BTIF_TRACE_DEBUG0("btif_task: received trigger stack init event");
+            BTIF_TRACE_DEBUG("btif_task: received trigger stack init event");
             #if (BLE_INCLUDED == TRUE)
             btif_dm_load_ble_local_keys();
             #endif
@@ -305,7 +307,7 @@
          */
         if (event == BT_EVT_HARDWARE_INIT_FAIL)
         {
-            BTIF_TRACE_DEBUG0("btif_task: hardware init failed");
+            BTIF_TRACE_DEBUG("btif_task: hardware init failed");
             bte_main_disable();
             btif_queue_release();
             GKI_task_self_cleanup(BTIF_TASK);
@@ -323,7 +325,7 @@
         {
             while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL)
             {
-                BTIF_TRACE_VERBOSE1("btif task fetched event %x", p_msg->event);
+                BTIF_TRACE_VERBOSE("btif task fetched event %x", p_msg->event);
 
                 switch (p_msg->event)
                 {
@@ -331,7 +333,7 @@
                         btif_context_switched(p_msg);
                         break;
                     default:
-                        BTIF_TRACE_ERROR1("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK);
+                        BTIF_TRACE_ERROR("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK);
                         break;
                 }
 
@@ -342,7 +344,7 @@
 
     btif_disassociate_evt();
 
-    BTIF_TRACE_DEBUG0("btif task exiting");
+    BTIF_TRACE_DEBUG("btif task exiting");
 }
 
 
@@ -373,7 +375,7 @@
     {
         int addr_fd;
 
-        BTIF_TRACE_DEBUG1("local bdaddr is stored in %s", val);
+        BTIF_TRACE_DEBUG("local bdaddr is stored in %s", val);
 
         if ((addr_fd = open(val, O_RDONLY)) != -1)
         {
@@ -384,7 +386,7 @@
             if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)
             {
                 valid_bda = TRUE;
-                BTIF_TRACE_DEBUG6("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
+                BTIF_TRACE_DEBUG("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
                     local_addr->address[0], local_addr->address[1], local_addr->address[2],
                     local_addr->address[3], local_addr->address[4], local_addr->address[5]);
             }
@@ -399,7 +401,7 @@
         if(btif_config_get_str("Local", "Adapter", "Address", val, &val_size))
         {
             str2bd(val, local_addr);
-            BTIF_TRACE_DEBUG1("local bdaddr from bt_config.xml is  %s", val);
+            BTIF_TRACE_DEBUG("local bdaddr from bt_config.xml is  %s", val);
             return;
         }
      }
@@ -410,7 +412,7 @@
     {
         str2bd(val, local_addr);
         valid_bda = TRUE;
-        BTIF_TRACE_DEBUG6("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
+        BTIF_TRACE_DEBUG("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
             local_addr->address[0], local_addr->address[1], local_addr->address[2],
             local_addr->address[3], local_addr->address[4], local_addr->address[5]);
     }
@@ -433,11 +435,11 @@
         /* Convert to ascii, and store as a persistent property */
         bd2str(local_addr, &bdstr);
 
-        BTIF_TRACE_DEBUG2("No preset BDA. Generating BDA: %s for prop %s",
+        BTIF_TRACE_DEBUG("No preset BDA. Generating BDA: %s for prop %s",
              (char*)bdstr, PERSIST_BDADDR_PROPERTY);
 
         if (property_set(PERSIST_BDADDR_PROPERTY, (char*)bdstr) < 0)
-            BTIF_TRACE_ERROR1("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY);
+            BTIF_TRACE_ERROR("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY);
     }
 
     //save the bd address to config file
@@ -506,7 +508,7 @@
 
 static bt_status_t btif_associate_evt(void)
 {
-    BTIF_TRACE_DEBUG1("%s: notify ASSOCIATE_JVM", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s: notify ASSOCIATE_JVM", __FUNCTION__);
     HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM);
 
     return BT_STATUS_SUCCESS;
@@ -525,7 +527,7 @@
 
 bt_status_t btif_enable_bluetooth(void)
 {
-    BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH");
+    BTIF_TRACE_DEBUG("BTIF ENABLE BLUETOOTH");
 
     if (btif_core_state != BTIF_CORE_STATE_DISABLED)
     {
@@ -559,7 +561,7 @@
     bdstr_t bdstr;
 
     bdcpy(bd_addr.address, local_bd);
-    BTIF_TRACE_DEBUG3("%s: status %d, local bd [%s]", __FUNCTION__, status,
+    BTIF_TRACE_DEBUG("%s: status %d, local bd [%s]", __FUNCTION__, status,
                                                      bd2str(&bd_addr, &bdstr));
 
     if (bdcmp(btif_local_bd_addr.address,local_bd))
@@ -573,15 +575,15 @@
          * the Controller's non-volatile memory rather than in device's file
          * system.
          **/
-        BTIF_TRACE_WARNING0("***********************************************");
-        BTIF_TRACE_WARNING6("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X",
+        BTIF_TRACE_WARNING("***********************************************");
+        BTIF_TRACE_WARNING("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X",
             btif_local_bd_addr.address[0], btif_local_bd_addr.address[1],
             btif_local_bd_addr.address[2], btif_local_bd_addr.address[3],
             btif_local_bd_addr.address[4], btif_local_bd_addr.address[5]);
-        BTIF_TRACE_WARNING6("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X",
+        BTIF_TRACE_WARNING("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X",
             local_bd[0], local_bd[1], local_bd[2],
             local_bd[3], local_bd[4], local_bd[5]);
-        BTIF_TRACE_WARNING0("***********************************************");
+        BTIF_TRACE_WARNING("***********************************************");
 
         bdcpy(btif_local_bd_addr.address, local_bd);
 
@@ -607,6 +609,9 @@
     /* callback to HAL */
     if (status == BTA_SUCCESS)
     {
+        /* initialize a2dp service */
+        btif_av_init();
+
         /* init rfcomm & l2cap api */
         btif_sock_init();
 
@@ -655,11 +660,11 @@
 
     if (!btif_is_enabled())
     {
-        BTIF_TRACE_ERROR0("btif_disable_bluetooth : not yet enabled");
+        BTIF_TRACE_ERROR("btif_disable_bluetooth : not yet enabled");
         return BT_STATUS_NOT_READY;
     }
 
-    BTIF_TRACE_DEBUG0("BTIF DISABLE BLUETOOTH");
+    BTIF_TRACE_DEBUG("BTIF DISABLE BLUETOOTH");
 
     btif_dm_on_disable();
     btif_core_state = BTIF_CORE_STATE_DISABLING;
@@ -675,7 +680,7 @@
 
     if (status != BTA_SUCCESS)
     {
-        BTIF_TRACE_ERROR1("disable bt failed (%d)", status);
+        BTIF_TRACE_ERROR("disable bt failed (%d)", status);
 
         /* reset the original state to allow attempting disable again */
         btif_core_state = BTIF_CORE_STATE_ENABLED;
@@ -699,13 +704,17 @@
 
 void btif_disable_bluetooth_evt(void)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
     bte_main_enable_lpm(FALSE);
 #endif
 
-    bte_main_disable();
+#if (BLE_INCLUDED == TRUE)
+     BTA_VendorCleanup();
+#endif
+
+     bte_main_disable();
 
     /* update local state */
     btif_core_state = BTIF_CORE_STATE_DISABLED;
@@ -715,7 +724,7 @@
 
     if (btif_shutdown_pending)
     {
-        BTIF_TRACE_DEBUG1("%s: calling btif_shutdown_bluetooth", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s: calling btif_shutdown_bluetooth", __FUNCTION__);
         btif_shutdown_bluetooth();
     }
 }
@@ -734,11 +743,11 @@
 
 bt_status_t btif_shutdown_bluetooth(void)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (btif_core_state == BTIF_CORE_STATE_DISABLING)
     {
-        BTIF_TRACE_WARNING0("shutdown during disabling");
+        BTIF_TRACE_WARNING("shutdown during disabling");
         /* shutdown called before disabling is done */
         btif_shutdown_pending = 1;
         return BT_STATUS_NOT_READY;
@@ -746,7 +755,7 @@
 
     if (btif_is_enabled())
     {
-        BTIF_TRACE_WARNING0("shutdown while still enabled, initiate disable");
+        BTIF_TRACE_WARNING("shutdown while still enabled, initiate disable");
 
         /* shutdown called prior to disabling, initiate disable */
         btif_disable_bluetooth();
@@ -774,7 +783,7 @@
 
     bt_utils_cleanup();
 
-    BTIF_TRACE_DEBUG1("%s done", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s done", __FUNCTION__);
 
     return BT_STATUS_SUCCESS;
 }
@@ -793,7 +802,7 @@
 
 static bt_status_t btif_disassociate_evt(void)
 {
-    BTIF_TRACE_DEBUG1("%s: notify DISASSOCIATE_JVM", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s: notify DISASSOCIATE_JVM", __FUNCTION__);
 
     HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM);
 
@@ -835,10 +844,10 @@
 *******************************************************************************/
 bt_status_t btif_dut_mode_configure(uint8_t enable)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (btif_core_state != BTIF_CORE_STATE_ENABLED) {
-        BTIF_TRACE_ERROR0("btif_dut_mode_configure : Bluetooth not enabled");
+        BTIF_TRACE_ERROR("btif_dut_mode_configure : Bluetooth not enabled");
         return BT_STATUS_NOT_READY;
     }
 
@@ -863,9 +872,9 @@
 bt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len)
 {
     /* TODO: Check that opcode is a vendor command group */
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     if (!btif_is_dut_mode()) {
-         BTIF_TRACE_ERROR0("Bluedroid HAL needs to be init with test_mode set to 1.");
+         BTIF_TRACE_ERROR("Bluedroid HAL needs to be init with test_mode set to 1.");
          return BT_STATUS_FAIL;
     }
     BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback);
@@ -996,7 +1005,7 @@
     int num_entries = 0;
     bt_status_t status = BT_STATUS_SUCCESS;
 
-    BTIF_TRACE_EVENT1("execute storage request event : %d", event);
+    BTIF_TRACE_EVENT("execute storage request event : %d", event);
 
     switch(event)
     {
@@ -1004,7 +1013,7 @@
         {
             btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
             bt_property_t *p_prop = &(p_req->write_req.prop);
-            BTIF_TRACE_EVENT3("type: %d, len %d, 0x%x", p_prop->type,
+            BTIF_TRACE_EVENT("type: %d, len %d, 0x%x", p_prop->type,
                                p_prop->len, p_prop->val);
 
             status = btif_storage_set_adapter_property(p_prop);
@@ -1019,7 +1028,36 @@
             prop.type = p_req->read_req.type;
             prop.val = (void*)buf;
             prop.len = sizeof(buf);
-            status = btif_storage_get_adapter_property(&prop);
+            if (prop.type == BT_PROPERTY_LOCAL_LE_FEATURES)
+            {
+                #if (BLE_INCLUDED == TRUE)
+                tBTM_BLE_VSC_CB cmn_vsc_cb;
+                bt_local_le_features_t local_le_features;
+
+                /* LE features are not stored in storage. Should be retrived from stack */
+                BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+                local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
+
+                prop.len = sizeof (bt_local_le_features_t);
+                if (cmn_vsc_cb.filter_support == 1)
+                    local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
+                else
+                    local_le_features.max_adv_filter_supported = 0;
+                local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
+                local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
+                local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
+                local_le_features.scan_result_storage_size_hibyte =
+                    (cmn_vsc_cb.tot_scan_results_strg >> 8) & (0xFF);
+                local_le_features.scan_result_storage_size_lobyte =
+                    (cmn_vsc_cb.tot_scan_results_strg) & (0xFF);
+                local_le_features.activity_energy_info_supported = cmn_vsc_cb.energy_support;
+                memcpy(prop.val, &local_le_features, prop.len);
+                #endif
+            }
+            else
+            {
+                status = btif_storage_get_adapter_property(&prop);
+            }
             HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop);
         } break;
 
@@ -1034,7 +1072,7 @@
         } break;
 
         default:
-            BTIF_TRACE_ERROR2("%s invalid event id (%d)", __FUNCTION__, event);
+            BTIF_TRACE_ERROR("%s invalid event id (%d)", __FUNCTION__, event);
             break;
     }
 }
@@ -1044,7 +1082,7 @@
     bt_status_t status = BT_STATUS_FAIL;
     bt_property_t prop;
 
-    BTIF_TRACE_EVENT1("execute storage remote request event : %d", event);
+    BTIF_TRACE_EVENT("execute storage remote request event : %d", event);
 
     switch (event)
     {
@@ -1105,7 +1143,7 @@
      btif_storage_req_t *new_req = (btif_storage_req_t*)p_new_buf;
      btif_storage_req_t *old_req = (btif_storage_req_t*)p_old_buf;
 
-     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+     BTIF_TRACE_EVENT("%s", __FUNCTION__);
      switch (event)
      {
          case BTIF_CORE_STORAGE_REMOTE_WRITE:
@@ -1135,7 +1173,7 @@
 
 bt_status_t btif_get_adapter_properties(void)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
     if (!btif_is_enabled())
         return BT_STATUS_NOT_READY;
@@ -1159,7 +1197,7 @@
 {
     btif_storage_req_t req;
 
-    BTIF_TRACE_EVENT2("%s %d", __FUNCTION__, type);
+    BTIF_TRACE_EVENT("%s %d", __FUNCTION__, type);
 
     /* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */
     if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && (type != BT_PROPERTY_BDNAME))
@@ -1192,7 +1230,7 @@
     char bd_name[BTM_MAX_LOC_BD_NAME_LEN +1];
     UINT16  name_len = 0;
 
-    BTIF_TRACE_EVENT3("btif_set_adapter_property type: %d, len %d, 0x%x",
+    BTIF_TRACE_EVENT("btif_set_adapter_property type: %d, len %d, 0x%x",
                       property->type, property->len, property->val);
 
     if (!btif_is_enabled())
@@ -1207,7 +1245,7 @@
                 memcpy(bd_name,property->val, name_len);
                 bd_name[name_len] = '\0';
 
-                BTIF_TRACE_EVENT1("set property name : %s", (char *)bd_name);
+                BTIF_TRACE_EVENT("set property name : %s", (char *)bd_name);
 
                 BTA_DmSetDeviceName((char *)bd_name);
 
@@ -1239,11 +1277,11 @@
                         break;
 
                     default:
-                        BTIF_TRACE_ERROR1("invalid scan mode (0x%x)", mode);
+                        BTIF_TRACE_ERROR("invalid scan mode (0x%x)", mode);
                         return BT_STATUS_PARM_INVALID;
                 }
 
-                BTIF_TRACE_EVENT1("set property scan mode : %x", mode);
+                BTIF_TRACE_EVENT("set property scan mode : %x", mode);
 
                 BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE);
 
@@ -1266,7 +1304,7 @@
             status = BT_STATUS_FAIL;
             break;
         default:
-            BTIF_TRACE_ERROR1("btif_get_adapter_property : invalid type %d",
+            BTIF_TRACE_ERROR("btif_get_adapter_property : invalid type %d",
             property->type);
             status = BT_STATUS_FAIL;
             break;
@@ -1427,7 +1465,7 @@
 
     btif_enabled_services |= (1 << service_id);
 
-    BTIF_TRACE_DEBUG2("%s: current services:0x%x", __FUNCTION__, btif_enabled_services);
+    BTIF_TRACE_DEBUG("%s: current services:0x%x", __FUNCTION__, btif_enabled_services);
 
     if (btif_is_enabled())
     {
@@ -1460,7 +1498,7 @@
 
     btif_enabled_services &=  (tBTA_SERVICE_MASK)(~(1<<service_id));
 
-    BTIF_TRACE_DEBUG2("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services);
+    BTIF_TRACE_DEBUG("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services);
 
     if (btif_is_enabled())
     {
diff --git a/btif/src/btif_dm.c b/btif/src/btif_dm.c
index f907b67..1194c42 100644
--- a/btif/src/btif_dm.c
+++ b/btif/src/btif_dm.c
@@ -44,6 +44,34 @@
 #include "btif_config.h"
 
 #include "bta_gatt_api.h"
+
+/******************************************************************************
+**  Device specific workarounds
+******************************************************************************/
+
+/**
+ * The devices below have proven problematic during the pairing process, often
+ * requiring multiple retries to complete pairing. To avoid degrading the user
+ * experience for other devices, explicitely blacklist troubled devices here.
+ */
+static const UINT8 blacklist_pairing_retries[][3] = {
+    {0x9C, 0xDF, 0x03} // BMW car kits (Harman/Becker)
+};
+
+BOOLEAN blacklistPairingRetries(BD_ADDR bd_addr)
+{
+    const unsigned blacklist_size = sizeof(blacklist_pairing_retries)
+        / sizeof(blacklist_pairing_retries[0]);
+    for (unsigned i = 0; i != blacklist_size; ++i)
+    {
+        if (blacklist_pairing_retries[i][0] == bd_addr[0] &&
+            blacklist_pairing_retries[i][1] == bd_addr[1] &&
+            blacklist_pairing_retries[i][2] == bd_addr[2])
+            return TRUE;
+    }
+    return FALSE;
+}
+
 /******************************************************************************
 **  Constants & Macros
 ******************************************************************************/
@@ -64,6 +92,8 @@
 #define BTIF_DM_DEFAULT_INQ_MAX_DURATION    10
 #define BTIF_DM_MAX_SDP_ATTEMPTS_AFTER_PAIRING 2
 
+#define NUM_TIMEOUT_RETRIES                 5
+
 #define PROPERTY_PRODUCT_MODEL "ro.product.model"
 #define DEFAULT_LOCAL_NAME_MAX  31
 #if (DEFAULT_LOCAL_NAME_MAX > BTM_MAX_LOC_BD_NAME_LEN)
@@ -77,6 +107,8 @@
 #define BTIF_DM_INTERLEAVE_DURATION_LE_TWO    4
 #endif
 
+#define MAX_SDP_BL_ENTRIES 3
+
 #define BOND_TYPE_UNKNOWN     0
 #define BOND_TYPE_PERSISTENT  1
 #define BOND_TYPE_TEMPORARY   2
@@ -88,7 +120,10 @@
     UINT8   bond_type;
     UINT8   pin_code_len;
     UINT8   is_ssp;
+    UINT8   auth_req;
+    UINT8   io_cap;
     UINT8   autopair_attempts;
+    UINT8   timeout_retries;
     UINT8   is_local_initiated;
     UINT8   sdp_attempts;
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
@@ -126,11 +161,41 @@
     BT_OCTET16 sp_r;
     BD_ADDR  oob_bdaddr;  /* peer bdaddr*/
 } btif_dm_oob_cb_t;
+
+typedef struct
+{
+    bt_bdaddr_t  bdaddr;
+    UINT8        transport; /* 0=Unknown, 1=BR/EDR, 2=LE */
+} btif_dm_create_bond_cb_t;
+
+typedef struct
+{
+    uint8_t  status;
+    uint8_t  ctrl_state;
+    uint64_t tx_time;
+    uint64_t rx_time;
+    uint64_t idle_time;
+    uint64_t energy_used;
+} btif_activity_energy_info_cb_t;
+
+typedef struct
+{
+    unsigned int   manufact_id;
+}skip_sdp_entry_t;
+
 #define BTA_SERVICE_ID_TO_SERVICE_MASK(id)       (1 << (id))
 
+#define MAX_SDP_BL_ENTRIES 3
+#define UUID_HUMAN_INTERFACE_DEVICE "00001124-0000-1000-8000-00805f9b34fb"
+
+static skip_sdp_entry_t sdp_blacklist[] = {{76}}; //Apple Mouse and Keyboard
+
+
 /* This flag will be true if HCI_Inquiry is in progress */
 static BOOLEAN btif_dm_inquiry_in_progress = FALSE;
 
+
+
 /************************************************************************************
 **  Static variables
 ************************************************************************************/
@@ -142,7 +207,7 @@
 static btif_dm_pairing_cb_t pairing_cb;
 static btif_dm_oob_cb_t     oob_cb;
 static void btif_dm_generic_evt(UINT16 event, char* p_param);
-static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr);
+static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr, tBTA_TRANSPORT transport);
 static void btif_dm_cb_hid_remote_name(tBTM_REMOTE_DEV_NAME *p_remote_name);
 static void btif_update_remote_properties(BD_ADDR bd_addr, BD_NAME bd_name,
                                           DEV_CLASS dev_class, tBT_DEVICE_TYPE dev_type);
@@ -152,6 +217,11 @@
 static void btif_dm_ble_auth_cmpl_evt (tBTA_DM_AUTH_CMPL *p_auth_cmpl);
 static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ *p_pin_req);
 #endif
+
+static void bte_scan_filt_param_cfg_evt(UINT8 action_type,
+                                           tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+                                           tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status);
+
 static char* btif_get_default_local_name();
 /******************************************************************************
 **  Externs
@@ -160,6 +230,8 @@
 extern bt_status_t btif_hf_execute_service(BOOLEAN b_enable);
 extern bt_status_t btif_av_execute_service(BOOLEAN b_enable);
 extern bt_status_t btif_hh_execute_service(BOOLEAN b_enable);
+extern bt_status_t btif_hf_client_execute_service(BOOLEAN b_enable);
+extern bt_status_t btif_mce_execute_service(BOOLEAN b_enable);
 extern int btif_hh_connect(bt_bdaddr_t *bd_addr);
 extern void bta_gatt_convert_uuid16_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT16 uuid_16);
 
@@ -187,9 +259,16 @@
          {
               btif_hh_execute_service(b_enable);
          }break;
-
+         case BTA_HFP_HS_SERVICE_ID:
+         {
+             btif_hf_client_execute_service(b_enable);
+         }break;
+         case BTA_MAP_SERVICE_ID:
+         {
+             btif_mce_execute_service(b_enable);
+         }break;
          default:
-              BTIF_TRACE_ERROR1("%s: Unknown service being enabled", __FUNCTION__);
+              BTIF_TRACE_ERROR("%s: Unknown service being enabled", __FUNCTION__);
               return BT_STATUS_FAIL;
     }
     return BT_STATUS_SUCCESS;
@@ -287,6 +366,7 @@
                                sizeof(uint32_t), &remote_cod);
     if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr, &prop_name) == BT_STATUS_SUCCESS)
     {
+        BTIF_TRACE_ERROR("%s: remote_cod = 0x%06x", __FUNCTION__, remote_cod);
         if ((remote_cod & 0x7ff) == cod)
             return TRUE;
     }
@@ -305,6 +385,7 @@
     if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr,
                                 &prop_name) == BT_STATUS_SUCCESS)
     {
+        BTIF_TRACE_DEBUG("%s: remote_cod = 0x%06x", __FUNCTION__, remote_cod);
         if ((remote_cod & 0x700) == cod)
             return TRUE;
     }
@@ -333,6 +414,59 @@
     return FALSE;
 }
 
+/*****************************************************************************
+**
+** Function        check_sdp_bl
+**
+** Description     Checks if a given device is blacklisted to skip sdp
+**
+** Parameters     skip_sdp_entry
+**
+** Returns         TRUE if the device is present in blacklist, else FALSE
+**
+*******************************************************************************/
+BOOLEAN check_sdp_bl(const bt_bdaddr_t *remote_bdaddr)
+{
+    UINT8 i = 0;
+    UINT16 manufacturer = 0;
+    UINT8 lmp_ver = 0;
+    UINT16 lmp_subver = 0;
+    tBTM_STATUS btm_status;
+    bt_property_t prop_name;
+    bt_remote_version_t info;
+    bt_status_t status;
+
+
+    if (remote_bdaddr == NULL)
+        return FALSE;
+
+/* fetch additional info about remote device used in iop query */
+    btm_status = BTM_ReadRemoteVersion(*(BD_ADDR*)remote_bdaddr, &lmp_ver,
+                    &manufacturer, &lmp_subver);
+
+
+
+ /* if not available yet, try fetching from config database */
+    BTIF_STORAGE_FILL_PROPERTY(&prop_name, BT_PROPERTY_REMOTE_VERSION_INFO,
+                            sizeof(bt_remote_version_t), &info);
+
+    if (btif_storage_get_remote_device_property((bt_bdaddr_t *)remote_bdaddr,
+                                              &prop_name) != BT_STATUS_SUCCESS)
+    {
+
+        return FALSE;
+    }
+    manufacturer = info.manufacturer;
+
+    for (int i = 0; i < MAX_SDP_BL_ENTRIES; i++)
+    {
+        if (manufacturer == sdp_blacklist[i].manufact_id)
+            return TRUE;
+    }
+    return FALSE;
+}
+
+
 static void bond_state_changed(bt_status_t status, bt_bdaddr_t *bd_addr, bt_bond_state_t state)
 {
     /* Send bonding state only once - based on outgoing/incoming we may receive duplicates */
@@ -343,7 +477,7 @@
     {
        state = BT_BOND_STATE_NONE;
     }
-    BTIF_TRACE_DEBUG3("%s: state=%d prev_state=%d", __FUNCTION__, state, pairing_cb.state);
+    BTIF_TRACE_DEBUG("%s: state=%d prev_state=%d", __FUNCTION__, state, pairing_cb.state);
 
     HAL_CBACK(bt_hal_cbacks, bond_state_changed_cb, status, bd_addr, state);
 
@@ -419,9 +553,18 @@
 
     /* class of device */
     cod = devclass2uint(dev_class);
+    BTIF_TRACE_DEBUG("%s():cod is 0x%06x", __FUNCTION__, cod);
     if ( cod == 0) {
-        BTIF_TRACE_DEBUG1("%s():cod is 0, set as unclassified", __FUNCTION__);
-        cod = COD_UNCLASSIFIED;
+       /* Try to retrieve cod from storage */
+        BTIF_TRACE_DEBUG("%s():cod is 0, checking cod from storage", __FUNCTION__);
+        BTIF_STORAGE_FILL_PROPERTY(&properties[num_properties],
+            BT_PROPERTY_CLASS_OF_DEVICE, sizeof(cod), &cod);
+        status = btif_storage_get_remote_device_property(&bdaddr, &properties[num_properties]);
+        BTIF_TRACE_DEBUG("%s():cod retreived from storage is 0x%06x", __FUNCTION__, cod);
+        if ( cod == 0) {
+            BTIF_TRACE_DEBUG("%s():cod is again 0, set as unclassified", __FUNCTION__);
+            cod = COD_UNCLASSIFIED;
+        }
     }
 
     BTIF_STORAGE_FILL_PROPERTY(&properties[num_properties],
@@ -441,23 +584,6 @@
     HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
                      status, &bdaddr, num_properties, properties);
 }
-/*******************************************************************************
-**
-** Function         hid_remote_name_cback
-**
-** Description      Remote name callback for HID device. Called in stack context
-**                  Special handling for HID devices
-**
-** Returns          void
-**
-*******************************************************************************/
-static void hid_remote_name_cback(void *p_param)
-{
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-
-    btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_HID_REMOTE_NAME,
-        (char *)p_param, sizeof(tBTM_REMOTE_DEV_NAME), NULL);
-}
 
 /*******************************************************************************
 **
@@ -471,7 +597,7 @@
 *******************************************************************************/
 static void btif_dm_cb_hid_remote_name(tBTM_REMOTE_DEV_NAME *p_remote_name)
 {
-    BTIF_TRACE_DEBUG3("%s: status=%d pairing_cb.state=%d", __FUNCTION__, p_remote_name->status, pairing_cb.state);
+    BTIF_TRACE_DEBUG("%s: status=%d pairing_cb.state=%d", __FUNCTION__, p_remote_name->status, pairing_cb.state);
     if (pairing_cb.state == BT_BOND_STATE_BONDING)
     {
         bt_bdaddr_t remote_bd;
@@ -497,35 +623,49 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr)
+static void btif_dm_cb_create_bond(bt_bdaddr_t *bd_addr, tBTA_TRANSPORT transport)
 {
     BOOLEAN is_hid = check_cod(bd_addr, COD_HID_POINTING);
-
-
     bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
 
-    if (is_hid){
+#if BLE_INCLUDED == TRUE
+    int device_type;
+    int addr_type;
+    bdstr_t bdstr;
+    bd2str(bd_addr, &bdstr);
+    if (transport == BT_TRANSPORT_LE)
+    {
+        if (!btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type))
+        {
+            btif_config_set_int("Remote", bdstr, "DevType", BT_DEVICE_TYPE_BLE);
+        }
+        if (btif_storage_get_remote_addr_type(bd_addr, &addr_type) != BT_STATUS_SUCCESS)
+        {
+            btif_storage_set_remote_addr_type(bd_addr, BLE_ADDR_PUBLIC);
+        }
+    }
+    if((btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type) &&
+       (btif_storage_get_remote_addr_type(bd_addr, &addr_type) == BT_STATUS_SUCCESS) &&
+       (device_type == BT_DEVICE_TYPE_BLE)) || (transport == BT_TRANSPORT_LE))
+    {
+        BTA_DmAddBleDevice(bd_addr->address, addr_type, BT_DEVICE_TYPE_BLE);
+    }
+#endif
 
-            int status;
-            status = btif_hh_connect(bd_addr);
-            if(status != BT_STATUS_SUCCESS)
-                bond_state_changed(status, bd_addr, BT_BOND_STATE_NONE);
+#if BLE_INCLUDED == TRUE
+    if(is_hid && device_type != BT_DEVICE_TYPE_BLE)
+#else
+    if(is_hid)
+#endif
+    {
+        int status;
+        status = btif_hh_connect(bd_addr);
+        if(status != BT_STATUS_SUCCESS)
+            bond_state_changed(status, bd_addr, BT_BOND_STATE_NONE);
     }
     else
     {
-#if BLE_INCLUDED == TRUE
-        int device_type;
-        int addr_type;
-        bdstr_t bdstr;
-        bd2str(bd_addr, &bdstr);
-        if(btif_config_get_int("Remote", (char const *)&bdstr,"DevType", &device_type) &&
-           (btif_storage_get_remote_addr_type(bd_addr, &addr_type) == BT_STATUS_SUCCESS) &&
-           (device_type == BT_DEVICE_TYPE_BLE))
-        {
-            BTA_DmAddBleDevice(bd_addr->address, addr_type, BT_DEVICE_TYPE_BLE);
-        }
-#endif
-        BTA_DmBond ((UINT8 *)bd_addr->address);
+        BTA_DmBondByTransport((UINT8 *)bd_addr->address, transport);
     }
     /*  Track  originator of bond creation  */
     pairing_cb.is_local_initiated = TRUE;
@@ -558,6 +698,20 @@
 
 /*******************************************************************************
 **
+** Function         btif_dm_get_connection_state
+**
+** Description      Returns whether the remote device is currently connected
+**
+** Returns          0 if not connected
+**
+*******************************************************************************/
+uint16_t btif_dm_get_connection_state(const bt_bdaddr_t *bd_addr)
+{
+    return BTA_DmGetConnectionState((UINT8 *)bd_addr->address);
+}
+
+/*******************************************************************************
+**
 ** Function         search_devices_copy_cb
 **
 ** Description      Deep copy callback for search devices event
@@ -573,7 +727,7 @@
     if (!p_src)
         return;
 
-    BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_dm_search_event(event));
+    BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_dm_search_event(event));
     memcpy(p_dest_data, p_src_data, sizeof(tBTA_DM_SEARCH));
     switch (event)
     {
@@ -664,7 +818,7 @@
     cod = devclass2uint(p_pin_req->dev_class);
 
     if ( cod == 0) {
-        BTIF_TRACE_DEBUG1("%s():cod is 0, set as unclassified", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s():cod is 0, set as unclassified", __FUNCTION__);
         cod = COD_UNCLASSIFIED;
     }
 
@@ -678,12 +832,12 @@
             check_cod(&bd_addr, COD_AV_HIFI_AUDIO) ||
             check_cod(&bd_addr, COD_HID_POINTING))
         {
-            BTIF_TRACE_DEBUG1("%s()cod matches for auto pair", __FUNCTION__);
+            BTIF_TRACE_DEBUG("%s()cod matches for auto pair", __FUNCTION__);
             /*  Check if this device can be auto paired  */
             if ((btif_storage_is_device_autopair_blacklisted(&bd_addr) == FALSE) &&
                 (pairing_cb.autopair_attempts == 0))
             {
-                BTIF_TRACE_DEBUG1("%s() Attempting auto pair", __FUNCTION__);
+                BTIF_TRACE_DEBUG("%s() Attempting auto pair", __FUNCTION__);
                 pin_code.pin[0] = 0x30;
                 pin_code.pin[1] = 0x30;
                 pin_code.pin[2] = 0x30;
@@ -700,7 +854,7 @@
             if(( btif_storage_is_fixed_pin_zeros_keyboard (&bd_addr) == TRUE) &&
                (pairing_cb.autopair_attempts == 0))
             {
-                BTIF_TRACE_DEBUG1("%s() Attempting auto pair", __FUNCTION__);
+                BTIF_TRACE_DEBUG("%s() Attempting auto pair", __FUNCTION__);
                 pin_code.pin[0] = 0x30;
                 pin_code.pin[1] = 0x30;
                 pin_code.pin[2] = 0x30;
@@ -732,7 +886,7 @@
     UINT32 cod;
     BOOLEAN is_incoming = !(pairing_cb.state == BT_BOND_STATE_BONDING);
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     /* Remote properties update */
     btif_update_remote_properties(p_ssp_cfm_req->bd_addr, p_ssp_cfm_req->bd_name,
@@ -765,12 +919,12 @@
         if ((is_incoming) && ((p_ssp_cfm_req->loc_io_caps == 0x01) &&
                 (p_ssp_cfm_req->rmt_io_caps == 0x00 || p_ssp_cfm_req->rmt_io_caps == 0x03)))
         {
-            BTIF_TRACE_EVENT3("%s: User consent needed for incoming pairing request. loc_io_caps: %d, rmt_io_caps: %d",
+            BTIF_TRACE_EVENT("%s: User consent needed for incoming pairing request. loc_io_caps: %d, rmt_io_caps: %d",
                 __FUNCTION__, p_ssp_cfm_req->loc_io_caps, p_ssp_cfm_req->rmt_io_caps);
         }
         else
         {
-            BTIF_TRACE_EVENT1("%s: Auto-accept JustWorks pairing", __FUNCTION__);
+            BTIF_TRACE_EVENT("%s: Auto-accept JustWorks pairing", __FUNCTION__);
             btif_dm_ssp_reply(&bd_addr, BT_SSP_VARIANT_CONSENT, TRUE, 0);
             return;
         }
@@ -795,7 +949,7 @@
     bt_bdname_t bd_name;
     UINT32 cod;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     /* Remote properties update */
     btif_update_remote_properties(p_ssp_key_notif->bd_addr, p_ssp_key_notif->bd_name,
@@ -832,6 +986,7 @@
     bt_bdaddr_t bd_addr;
     bt_status_t status = BT_STATUS_FAIL;
     bt_bond_state_t state = BT_BOND_STATE_NONE;
+    BOOLEAN skip_sdp = FALSE;
 
     bdcpy(bd_addr.address, p_auth_cmpl->bd_addr);
     if ( (p_auth_cmpl->success == TRUE) && (p_auth_cmpl->key_present) )
@@ -840,7 +995,7 @@
             (p_auth_cmpl->key_type == HCI_LKEY_TYPE_CHANGED_COMB) || pairing_cb.bond_type == BOND_TYPE_PERSISTENT)
         {
             bt_status_t ret;
-            BTIF_TRACE_DEBUG3("%s: Storing link key. key_type=0x%x, bond_type=%d",
+            BTIF_TRACE_DEBUG("%s: Storing link key. key_type=0x%x, bond_type=%d",
                 __FUNCTION__, p_auth_cmpl->key_type, pairing_cb.bond_type);
             ret = btif_storage_add_bonded_device(&bd_addr,
                                 p_auth_cmpl->key, p_auth_cmpl->key_type,
@@ -849,30 +1004,63 @@
         }
         else
         {
-            BTIF_TRACE_DEBUG3("%s: Temporary key. Not storing. key_type=0x%x, bond_type=%d",
+            BTIF_TRACE_DEBUG("%s: Temporary key. Not storing. key_type=0x%x, bond_type=%d",
                 __FUNCTION__, p_auth_cmpl->key_type, pairing_cb.bond_type);
             if(pairing_cb.bond_type == BOND_TYPE_TEMPORARY)
             {
-                BTIF_TRACE_DEBUG1("%s: sending BT_BOND_STATE_NONE for Temp pairing",
+                BTIF_TRACE_DEBUG("%s: sending BT_BOND_STATE_NONE for Temp pairing",
                         __FUNCTION__);
                 bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_NONE);
                 return;
             }
         }
     }
+
+    // Skip SDP for certain  HID Devices
     if (p_auth_cmpl->success)
     {
+        pairing_cb.timeout_retries = 0;
         status = BT_STATUS_SUCCESS;
         state = BT_BOND_STATE_BONDED;
+        bdcpy(bd_addr.address, p_auth_cmpl->bd_addr);
 
-        /* Trigger SDP on the device */
-        pairing_cb.sdp_attempts = 1;;
+        if (check_sdp_bl(&bd_addr) && check_cod_hid(&bd_addr, COD_HID_MAJOR))
+        {
+            ALOGW("%s:skip SDP",
+                              __FUNCTION__);
+            skip_sdp = TRUE;
+        }
+        if(!pairing_cb.is_local_initiated && skip_sdp)
+        {
+            bond_state_changed(status, &bd_addr, state);
 
-        if(btif_dm_inquiry_in_progress)
-            btif_dm_cancel_discovery();
+            ALOGW("%s: Incoming HID Connection",__FUNCTION__);
+            bt_property_t prop;
+            bt_bdaddr_t bd_addr;
+            bt_uuid_t  uuid;
+            char uuid_str[128] = UUID_HUMAN_INTERFACE_DEVICE;
 
-        btif_dm_get_remote_services(&bd_addr);
-        /* Do not call bond_state_changed_cb yet. Wait till fetch remote service is complete */
+            string_to_uuid(uuid_str, &uuid);
+
+            prop.type = BT_PROPERTY_UUIDS;
+            prop.val = uuid.uu;
+            prop.len = MAX_UUID_SIZE;
+
+            /* Send the event to the BTIF */
+            HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
+                             BT_STATUS_SUCCESS, &bd_addr, 1, &prop);
+        }
+        else
+        {
+            /* Trigger SDP on the device */
+            pairing_cb.sdp_attempts = 1;;
+
+            if(btif_dm_inquiry_in_progress)
+                btif_dm_cancel_discovery();
+
+            btif_dm_get_remote_services(&bd_addr);
+            }
+            /* Do not call bond_state_changed_cb yet. Wait till fetch remote service is complete */
     }
     else
     {
@@ -880,21 +1068,42 @@
         switch(p_auth_cmpl->fail_reason)
         {
             case HCI_ERR_PAGE_TIMEOUT:
+                if (blacklistPairingRetries(bd_addr.address) && pairing_cb.timeout_retries)
+                {
+                    BTIF_TRACE_WARNING("%s() - Pairing timeout; retrying (%d) ...", __FUNCTION__, pairing_cb.timeout_retries);
+                    --pairing_cb.timeout_retries;
+                    btif_dm_cb_create_bond (&bd_addr, BTA_TRANSPORT_UNKNOWN);
+                    return;
+                }
+                /* Fall-through */
             case HCI_ERR_CONNECTION_TOUT:
                 status =  BT_STATUS_RMT_DEV_DOWN;
                 break;
 
+            case HCI_ERR_PAIRING_NOT_ALLOWED:
+                status = BT_STATUS_AUTH_REJECTED;
+                break;
+
+            case HCI_ERR_LMP_RESPONSE_TIMEOUT:
+                status =  BT_STATUS_AUTH_FAILURE;
+                break;
+
             /* map the auth failure codes, so we can retry pairing if necessary */
             case HCI_ERR_AUTH_FAILURE:
+            case HCI_ERR_KEY_MISSING:
+                btif_storage_remove_bonded_device(&bd_addr);
             case HCI_ERR_HOST_REJECT_SECURITY:
             case HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE:
             case HCI_ERR_UNIT_KEY_USED:
             case HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
             case HCI_ERR_INSUFFCIENT_SECURITY:
-                BTIF_TRACE_DEBUG1(" %s() Authentication fail ", __FUNCTION__);
+            case HCI_ERR_PEER_USER:
+            case HCI_ERR_UNSPECIFIED:
+                BTIF_TRACE_DEBUG(" %s() Authentication fail reason %d",
+                    __FUNCTION__, p_auth_cmpl->fail_reason);
                 if (pairing_cb.autopair_attempts  == 1)
                 {
-                    BTIF_TRACE_DEBUG1("%s(): Adding device to blacklist ", __FUNCTION__);
+                    BTIF_TRACE_DEBUG("%s(): Adding device to blacklist ", __FUNCTION__);
 
                     /* Add the device to dynamic black list only if this device belongs to Audio/pointing dev class  */
                     if (check_cod(&bd_addr, COD_AV_HEADSETS) ||
@@ -909,8 +1118,8 @@
                     pairing_cb.autopair_attempts++;
 
                     /* Create the Bond once again */
-                    BTIF_TRACE_DEBUG1("%s() auto pair failed. Reinitiate Bond", __FUNCTION__);
-                    btif_dm_cb_create_bond (&bd_addr);
+                    BTIF_TRACE_DEBUG("%s() auto pair failed. Reinitiate Bond", __FUNCTION__);
+                    btif_dm_cb_create_bond (&bd_addr, BTA_TRANSPORT_UNKNOWN);
                     return;
                 }
                 else
@@ -923,6 +1132,12 @@
             default:
                 status =  BT_STATUS_FAIL;
         }
+        /* Special Handling for HID Devices */
+        if (check_cod(&bd_addr, COD_HID_POINTING)) {
+            /* Remove Device as bonded in nvram as authentication failed */
+            BTIF_TRACE_DEBUG("%s(): removing hid pointing device from nvram", __FUNCTION__);
+            btif_storage_remove_bonded_device(&bd_addr);
+        }
         bond_state_changed(status, &bd_addr, state);
     }
 }
@@ -939,7 +1154,7 @@
 static void btif_dm_search_devices_evt (UINT16 event, char *p_param)
 {
     tBTA_DM_SEARCH *p_search_data;
-    BTIF_TRACE_EVENT2("%s event=%s", __FUNCTION__, dump_dm_search_event(event));
+    BTIF_TRACE_EVENT("%s event=%s", __FUNCTION__, dump_dm_search_event(event));
 
     switch (event)
     {
@@ -982,7 +1197,7 @@
             p_search_data = (tBTA_DM_SEARCH *)p_param;
             bdcpy(bdaddr.address, p_search_data->inq_res.bd_addr);
 
-            BTIF_TRACE_DEBUG3("%s() %s device_type = 0x%x\n", __FUNCTION__, bd2str(&bdaddr, &bdstr),
+            BTIF_TRACE_DEBUG("%s() %s device_type = 0x%x\n", __FUNCTION__, bd2str(&bdaddr, &bdstr),
 #if (BLE_INCLUDED == TRUE)
                     p_search_data->inq_res.device_type);
 #else
@@ -1004,7 +1219,7 @@
             if (p_search_data->inq_res.p_eir)
             {
                 BTA_GetEirService(p_search_data->inq_res.p_eir, &services);
-                BTIF_TRACE_DEBUG2("%s()EIR BTA services = %08X", __FUNCTION__, (UINT32)services);
+                BTIF_TRACE_DEBUG("%s()EIR BTA services = %08X", __FUNCTION__, (UINT32)services);
                 /* TODO:  Get the service list and check to see which uuids we got and send it back to the client. */
             }
 
@@ -1056,6 +1271,12 @@
                 ASSERTC(status == BT_STATUS_SUCCESS, "failed to save remote device (inquiry)", status);
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
                 status = btif_storage_set_remote_addr_type(&bdaddr, addr_type);
+                if (( dev_type == BT_DEVICE_TYPE_DUMO)&&
+                   (p_search_data->inq_res.flag & BTA_BLE_DMT_CONTROLLER_SPT) &&
+                   (p_search_data->inq_res.flag & BTA_BLE_DMT_HOST_SPT))
+                 {
+                    btif_storage_set_dmt_support_type (&bdaddr, TRUE);
+                 }
                 ASSERTC(status == BT_STATUS_SUCCESS, "failed to save remote addr type (inquiry)", status);
 #endif
                 /* Callback to notify upper layer of device */
@@ -1067,6 +1288,12 @@
 
         case BTA_DM_INQ_CMPL_EVT:
         {
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+            tBTA_DM_BLE_PF_FILT_PARAMS adv_filt_param;
+            memset(&adv_filt_param, 0, sizeof(tBTA_DM_BLE_PF_FILT_PARAMS));
+            BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_DELETE, 0, &adv_filt_param, NULL,
+                                     bte_scan_filt_param_cfg_evt, 0);
+#endif
         }
         break;
         case BTA_DM_DISC_CMPL_EVT:
@@ -1106,7 +1333,7 @@
 {
     tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH*)p_param;
 
-    BTIF_TRACE_EVENT2("%s:  event = %d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s:  event = %d", __FUNCTION__, event);
     switch (event)
     {
         case BTA_DM_DISC_RES_EVT:
@@ -1119,13 +1346,13 @@
 
             bdcpy(bd_addr.address, p_data->disc_res.bd_addr);
 
-            BTIF_TRACE_DEBUG3("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
+            BTIF_TRACE_DEBUG("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
                     p_data->disc_res.result, p_data->disc_res.services);
             if  ((p_data->disc_res.result != BTA_SUCCESS) &&
                  (pairing_cb.state == BT_BOND_STATE_BONDING ) &&
                  (pairing_cb.sdp_attempts < BTIF_DM_MAX_SDP_ATTEMPTS_AFTER_PAIRING))
             {
-                BTIF_TRACE_WARNING1("%s:SDP failed after bonding re-attempting", __FUNCTION__);
+                BTIF_TRACE_WARNING("%s:SDP failed after bonding re-attempting", __FUNCTION__);
                 pairing_cb.sdp_attempts++;
                 btif_dm_get_remote_services(&bd_addr);
                 return;
@@ -1140,7 +1367,7 @@
                  {
                       char temp[256];
                       uuid_to_string((bt_uuid_t*)(p_data->disc_res.p_uuid_list + (i*MAX_UUID_SIZE)), temp);
-                      BTIF_TRACE_ERROR2("Index: %d uuid:%s", i, temp);
+                      BTIF_TRACE_ERROR("Index: %d uuid:%s", i, temp);
                  }
             }
 
@@ -1151,7 +1378,7 @@
                 (bdcmp(p_data->disc_res.bd_addr, pairing_cb.bd_addr) == 0)&&
                 pairing_cb.sdp_attempts > 0)
             {
-                 BTIF_TRACE_DEBUG1("%s Remote Service SDP done. Call bond_state_changed_cb BONDED",
+                 BTIF_TRACE_DEBUG("%s Remote Service SDP done. Call bond_state_changed_cb BONDED",
                                    __FUNCTION__);
                  pairing_cb.sdp_attempts  = 0;
                  bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_BONDED);
@@ -1175,14 +1402,14 @@
 
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
         case BTA_DM_DISC_BLE_RES_EVT:
-             BTIF_TRACE_DEBUG2("%s:, services 0x%x)", __FUNCTION__,
+             BTIF_TRACE_DEBUG("%s:, services 0x%x)", __FUNCTION__,
                                 p_data->disc_ble_res.service.uu.uuid16);
              bt_uuid_t  uuid;
              int i = 0;
              int j = 15;
              if (p_data->disc_ble_res.service.uu.uuid16 == UUID_SERVCLASS_LE_HID)
              {
-                BTIF_TRACE_DEBUG1("%s: Found HOGP UUID",__FUNCTION__);
+                BTIF_TRACE_DEBUG("%s: Found HOGP UUID",__FUNCTION__);
                 bt_property_t prop;
                 bt_bdaddr_t bd_addr;
                 char temp[256];
@@ -1200,7 +1427,7 @@
                 }
 
                 uuid_to_string(&uuid, temp);
-                BTIF_TRACE_ERROR1(" uuid:%s", temp);
+                BTIF_TRACE_ERROR(" uuid:%s", temp);
 
                 bdcpy(bd_addr.address, p_data->disc_ble_res.bd_addr);
                 prop.type = BT_PROPERTY_UUIDS;
@@ -1240,7 +1467,7 @@
 {
     tBTA_DM_SEARCH *p_data = (tBTA_DM_SEARCH*)p_param;
 
-    BTIF_TRACE_EVENT2("%s:  event = %d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s:  event = %d", __FUNCTION__, event);
     switch (event)
     {
         case BTA_DM_DISC_RES_EVT:
@@ -1253,7 +1480,7 @@
             memset(&rec, 0, sizeof(bt_service_record_t));
             bdcpy(bd_addr.address, p_data->disc_res.bd_addr);
 
-            BTIF_TRACE_DEBUG3("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
+            BTIF_TRACE_DEBUG("%s:(result=0x%x, services 0x%x)", __FUNCTION__,
                     p_data->disc_res.result, p_data->disc_res.services);
             prop.type = BT_PROPERTY_SERVICE_RECORD;
             prop.val = (void*)&rec;
@@ -1296,7 +1523,7 @@
     uint32_t i;
     bt_bdaddr_t bd_addr;
 
-    BTIF_TRACE_EVENT1("btif_dm_upstreams_cback  ev: %s", dump_dm_event(event));
+    BTIF_TRACE_EVENT("btif_dm_upstreams_cback  ev: %s", dump_dm_event(event));
 
     switch (event)
     {
@@ -1323,6 +1550,11 @@
                  BTA_DmSetDeviceName(btif_get_default_local_name());
              }
 
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+             /* Enable local privacy */
+             BTA_DmBleConfigLocalPrivacy(TRUE);
+#endif
+
              /* for each of the enabled services in the mask, trigger the profile
               * enable */
              service_mask = btif_get_enabled_services_mask();
@@ -1426,7 +1658,7 @@
 
         case BTA_DM_LINK_UP_EVT:
             bdcpy(bd_addr.address, p_data->link_up.bd_addr);
-            BTIF_TRACE_DEBUG0("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
+            BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED");
 
             btif_update_remote_version_property(&bd_addr);
 
@@ -1436,13 +1668,13 @@
 
         case BTA_DM_LINK_DOWN_EVT:
             bdcpy(bd_addr.address, p_data->link_down.bd_addr);
-            BTIF_TRACE_DEBUG0("BTA_DM_LINK_DOWN_EVT. Sending BT_ACL_STATE_DISCONNECTED");
+            BTIF_TRACE_DEBUG("BTA_DM_LINK_DOWN_EVT. Sending BT_ACL_STATE_DISCONNECTED");
             HAL_CBACK(bt_hal_cbacks, acl_state_changed_cb, BT_STATUS_SUCCESS,
                       &bd_addr, BT_ACL_STATE_DISCONNECTED);
             break;
 
         case BTA_DM_HW_ERROR_EVT:
-            BTIF_TRACE_ERROR0("Received H/W Error. ");
+            BTIF_TRACE_ERROR("Received H/W Error. ");
             /* Flush storage data */
             btif_config_flush();
             usleep(100000); /* 100milliseconds */
@@ -1452,27 +1684,27 @@
 
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
         case BTA_DM_BLE_KEY_EVT:
-            BTIF_TRACE_DEBUG1("BTA_DM_BLE_KEY_EVT key_type=0x%02x ", p_data->ble_key.key_type);
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT key_type=0x%02x ", p_data->ble_key.key_type);
 
             /* If this pairing is by-product of local initiated GATT client Read or Write,
             BTA would not have sent BTA_DM_BLE_SEC_REQ_EVT event and Bond state would not
             have setup properly. Setup pairing_cb and notify App about Bonding state now*/
             if (pairing_cb.state != BT_BOND_STATE_BONDING)
             {
-                BTIF_TRACE_DEBUG0("Bond state not sent to App so far.Notify the app now");
+                BTIF_TRACE_DEBUG("Bond state not sent to App so far.Notify the app now");
                 bond_state_changed(BT_STATUS_SUCCESS, (bt_bdaddr_t*)p_data->ble_key.bd_addr,
                                    BT_BOND_STATE_BONDING);
             }
             else if (memcmp (pairing_cb.bd_addr, p_data->ble_key.bd_addr, BD_ADDR_LEN)!=0)
             {
-                BTIF_TRACE_ERROR1("BD mismatch discard BLE key_type=%d ",p_data->ble_key.key_type);
+                BTIF_TRACE_ERROR("BD mismatch discard BLE key_type=%d ",p_data->ble_key.key_type);
                 break;
             }
 
             switch (p_data->ble_key.key_type)
             {
                 case BTA_LE_KEY_PENC:
-                    BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PENC");
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PENC");
                     pairing_cb.ble.is_penc_key_rcvd = TRUE;
                     memcpy(pairing_cb.ble.penc_key.ltk,p_data->ble_key.key_value.penc_key.ltk, 16);
                     memcpy(pairing_cb.ble.penc_key.rand, p_data->ble_key.key_value.penc_key.rand,8);
@@ -1481,29 +1713,38 @@
 
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",i,pairing_cb.ble.penc_key.ltk[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",i,pairing_cb.ble.penc_key.ltk[i]);
                     }
                     for (i=0; i<8; i++)
                     {
-                        BTIF_TRACE_DEBUG2("pairing_cb.ble.penc_key.rand[%d]=0x%02x",i,pairing_cb.ble.penc_key.rand[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.rand[%d]=0x%02x",i,pairing_cb.ble.penc_key.rand[i]);
                     }
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.ediv=0x%04x",pairing_cb.ble.penc_key.ediv);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.sec_level=0x%02x",pairing_cb.ble.penc_key.sec_level);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.penc_key.key_size=0x%02x",pairing_cb.ble.penc_key.key_size);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ediv=0x%04x",pairing_cb.ble.penc_key.ediv);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.sec_level=0x%02x",pairing_cb.ble.penc_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.key_size=0x%02x",pairing_cb.ble.penc_key.key_size);
                     break;
 
                 case BTA_LE_KEY_PID:
-                    BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PID");
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PID");
                     pairing_cb.ble.is_pid_key_rcvd = TRUE;
-                    memcpy(pairing_cb.ble.pid_key, p_data->ble_key.key_value.pid_key.irk, 16);
+                    pairing_cb.ble.pid_key.addr_type = p_data->ble_key.key_value.pid_key.addr_type;
+                    memcpy(pairing_cb.ble.pid_key.irk, p_data->ble_key.key_value.pid_key.irk, 16);
+                    memcpy(pairing_cb.ble.pid_key.static_addr,
+                            p_data->ble_key.key_value.pid_key.static_addr,BD_ADDR_LEN);
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("pairing_cb.ble.pid_key[%d]=0x%02x",i,pairing_cb.ble.pid_key[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.pid_key.irk[%d]=0x%02x"
+                                            ,i,pairing_cb.ble.pid_key.irk[i]);
+                    }
+                    for (i=0; i<BD_ADDR_LEN; i++)
+                    {
+                        BTIF_TRACE_DEBUG("piaring_cb.ble.pid_address[%d] = %x"
+                                            ,i, pairing_cb.ble.pid_key.static_addr[i]);
                     }
                     break;
 
                 case BTA_LE_KEY_PCSRK:
-                    BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_PCSRK");
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PCSRK");
                     pairing_cb.ble.is_pcsrk_key_rcvd = TRUE;
                     pairing_cb.ble.pcsrk_key.counter = p_data->ble_key.key_value.pcsrk_key.counter;
                     pairing_cb.ble.pcsrk_key.sec_level = p_data->ble_key.key_value.pcsrk_key.sec_level;
@@ -1511,62 +1752,62 @@
 
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",i,pairing_cb.ble.pcsrk_key.csrk[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",i,pairing_cb.ble.pcsrk_key.csrk[i]);
                     }
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.pcsrk_key.counter=0x%08x",pairing_cb.ble.pcsrk_key.counter);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",pairing_cb.ble.pcsrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.counter=0x%08x",pairing_cb.ble.pcsrk_key.counter);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",pairing_cb.ble.pcsrk_key.sec_level);
                     break;
 
                 case BTA_LE_KEY_LENC:
-                    BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_LENC");
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LENC");
                     pairing_cb.ble.is_lenc_key_rcvd = TRUE;
                     pairing_cb.ble.lenc_key.div = p_data->ble_key.key_value.lenc_key.div;
                     pairing_cb.ble.lenc_key.key_size = p_data->ble_key.key_value.lenc_key.key_size;
                     pairing_cb.ble.lenc_key.sec_level = p_data->ble_key.key_value.lenc_key.sec_level;
 
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.div=0x%04x",pairing_cb.ble.lenc_key.div);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.key_size=0x%02x",pairing_cb.ble.lenc_key.key_size);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lenc_key.sec_level=0x%02x",pairing_cb.ble.lenc_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.div=0x%04x",pairing_cb.ble.lenc_key.div);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.key_size=0x%02x",pairing_cb.ble.lenc_key.key_size);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.sec_level=0x%02x",pairing_cb.ble.lenc_key.sec_level);
                     break;
 
 
 
                 case BTA_LE_KEY_LCSRK:
-                    BTIF_TRACE_DEBUG0("Rcv BTA_LE_KEY_LCSRK");
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LCSRK");
                     pairing_cb.ble.is_lcsrk_key_rcvd = TRUE;
                     pairing_cb.ble.lcsrk_key.counter = p_data->ble_key.key_value.lcsrk_key.counter;
                     pairing_cb.ble.lcsrk_key.div = p_data->ble_key.key_value.lcsrk_key.div;
                     pairing_cb.ble.lcsrk_key.sec_level = p_data->ble_key.key_value.lcsrk_key.sec_level;
 
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.div=0x%04x",pairing_cb.ble.lcsrk_key.div);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.counter=0x%08x",pairing_cb.ble.lcsrk_key.counter);
-                    BTIF_TRACE_DEBUG1("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",pairing_cb.ble.lcsrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.div=0x%04x",pairing_cb.ble.lcsrk_key.div);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.counter=0x%08x",pairing_cb.ble.lcsrk_key.counter);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",pairing_cb.ble.lcsrk_key.sec_level);
 
                     break;
 
                 default:
-                    BTIF_TRACE_ERROR1("unknown BLE key type (0x%02x)", p_data->ble_key.key_type);
+                    BTIF_TRACE_ERROR("unknown BLE key type (0x%02x)", p_data->ble_key.key_type);
                     break;
             }
 
             break;
         case BTA_DM_BLE_SEC_REQ_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_SEC_REQ_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_SEC_REQ_EVT. ");
             btif_dm_ble_sec_req_evt(&p_data->ble_req);
             break;
         case BTA_DM_BLE_PASSKEY_NOTIF_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_PASSKEY_NOTIF_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_NOTIF_EVT. ");
             btif_dm_ble_key_notif_evt(&p_data->key_notif);
             break;
         case BTA_DM_BLE_PASSKEY_REQ_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
             btif_dm_ble_passkey_req_evt(&p_data->pin_req);
             break;
         case BTA_DM_BLE_OOB_REQ_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_OOB_REQ_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_OOB_REQ_EVT. ");
             break;
         case BTA_DM_BLE_LOCAL_IR_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_LOCAL_IR_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_LOCAL_IR_EVT. ");
             ble_local_key_cb.is_id_keys_rcvd = TRUE;
             memcpy(&ble_local_key_cb.id_keys.irk[0], &p_data->ble_id_keys.irk[0], sizeof(BT_OCTET16));
             memcpy(&ble_local_key_cb.id_keys.ir[0], &p_data->ble_id_keys.ir[0], sizeof(BT_OCTET16));
@@ -1582,7 +1823,7 @@
                                             BT_OCTET16_LEN);
             break;
         case BTA_DM_BLE_LOCAL_ER_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_LOCAL_ER_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_LOCAL_ER_EVT. ");
             ble_local_key_cb.is_er_rcvd = TRUE;
             memcpy(&ble_local_key_cb.er[0], &p_data->ble_er[0], sizeof(BT_OCTET16));
             btif_storage_add_ble_local_key( (char *)&ble_local_key_cb.er[0],
@@ -1591,9 +1832,55 @@
             break;
 
         case BTA_DM_BLE_AUTH_CMPL_EVT:
-            BTIF_TRACE_DEBUG0("BTA_DM_BLE_KEY_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT. ");
             btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl);
             break;
+
+        case BTA_DM_LE_FEATURES_READ:
+        {
+            tBTM_BLE_VSC_CB cmn_vsc_cb;
+            bt_local_le_features_t local_le_features;
+            char buf[512];
+            bt_property_t prop;
+            prop.type = BT_PROPERTY_LOCAL_LE_FEATURES;
+            prop.val = (void*)buf;
+            prop.len = sizeof(buf);
+
+           /* LE features are not stored in storage. Should be retrived from stack */
+            BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
+            local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
+
+            prop.len = sizeof (bt_local_le_features_t);
+            if (cmn_vsc_cb.filter_support == 1)
+                local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
+             else
+                local_le_features.max_adv_filter_supported = 0;
+            local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
+            local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
+            local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
+            local_le_features.scan_result_storage_size_hibyte =
+                (cmn_vsc_cb.tot_scan_results_strg >> 8) & (0xFF);
+            local_le_features.scan_result_storage_size_lobyte =
+                (cmn_vsc_cb.tot_scan_results_strg) & (0xFF);
+            local_le_features.activity_energy_info_supported = cmn_vsc_cb.energy_support;
+            memcpy(prop.val, &local_le_features, prop.len);
+            HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop);
+            break;
+         }
+
+        case BTA_DM_ENER_INFO_READ:
+        {
+            btif_activity_energy_info_cb_t *p_ener_data = (btif_activity_energy_info_cb_t*) p_param;
+            bt_activity_energy_info energy_info;
+            energy_info.status = p_ener_data->status;
+            energy_info.ctrl_state = p_ener_data->ctrl_state;
+            energy_info.rx_time = p_ener_data->rx_time;
+            energy_info.tx_time = p_ener_data->tx_time;
+            energy_info.idle_time = p_ener_data->idle_time;
+            energy_info.energy_used = p_ener_data->energy_used;
+            HAL_CBACK(bt_hal_cbacks, energy_info_cb, &energy_info);
+            break;
+        }
 #endif
 
         case BTA_DM_AUTHORIZE_EVT:
@@ -1603,7 +1890,7 @@
         case BTA_DM_ROLE_CHG_EVT:
 
         default:
-            BTIF_TRACE_WARNING1( "btif_dm_cback : unhandled event (%d)", event );
+            BTIF_TRACE_WARNING( "btif_dm_cback : unhandled event (%d)", event );
             break;
     }
 } /* btui_security_cback() */
@@ -1620,7 +1907,7 @@
 *******************************************************************************/
 static void btif_dm_generic_evt(UINT16 event, char* p_param)
 {
-    BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
     switch(event)
     {
         case BTIF_DM_CB_DISCOVERY_STARTED:
@@ -1631,7 +1918,9 @@
 
         case BTIF_DM_CB_CREATE_BOND:
         {
-            btif_dm_cb_create_bond((bt_bdaddr_t *)p_param);
+            pairing_cb.timeout_retries = NUM_TIMEOUT_RETRIES;
+            btif_dm_create_bond_cb_t *create_bond_cb = (btif_dm_create_bond_cb_t*)p_param;
+            btif_dm_cb_create_bond(&create_bond_cb->bdaddr, create_bond_cb->transport);
         }
         break;
 
@@ -1674,7 +1963,7 @@
             break;
         default:
         {
-            BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+            BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
         }
         break;
     }
@@ -1733,7 +2022,7 @@
         }
         break;
     }
-    BTIF_TRACE_DEBUG3("%s event=%s param_len=%d", __FUNCTION__, dump_dm_search_event(event), param_len);
+    BTIF_TRACE_DEBUG("%s event=%s param_len=%d", __FUNCTION__, dump_dm_search_event(event), param_len);
 
     /* if remote name is available in EIR, set teh flag so that stack doesnt trigger RNR */
     if (event == BTA_DM_INQ_RES_EVT)
@@ -1789,6 +2078,62 @@
    btif_transfer_context(btif_dm_remote_service_record_evt, event, (char*)p_data, sizeof(tBTA_DM_SEARCH), NULL);
 }
 
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+/*******************************************************************************
+**
+** Function         bta_energy_info_cb
+**
+** Description      Switches context from BTE to BTIF for DM energy info event
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bta_energy_info_cb(tBTA_DM_BLE_TX_TIME_MS tx_time, tBTA_DM_BLE_RX_TIME_MS rx_time,
+                                    tBTA_DM_BLE_IDLE_TIME_MS idle_time,
+                                    tBTA_DM_BLE_ENERGY_USED energy_used,
+                                    tBTA_DM_CONTRL_STATE ctrl_state, tBTA_STATUS status)
+{
+    BTIF_TRACE_DEBUG("energy_info_cb-Status:%d,state=%d,tx_t=%ld, rx_t=%ld, idle_time=%ld,used=%ld",
+        status, ctrl_state, tx_time, rx_time, idle_time, energy_used);
+
+    btif_activity_energy_info_cb_t btif_cb;
+    btif_cb.status = status;
+    btif_cb.ctrl_state = ctrl_state;
+    btif_cb.tx_time = (uint64_t) tx_time;
+    btif_cb.rx_time = (uint64_t) rx_time;
+    btif_cb.idle_time =(uint64_t) idle_time;
+    btif_cb.energy_used =(uint64_t) energy_used;
+    btif_transfer_context(btif_dm_upstreams_evt, BTA_DM_ENER_INFO_READ,
+                          (char*) &btif_cb, sizeof(btif_activity_energy_info_cb_t), NULL);
+}
+#endif
+
+/*******************************************************************************
+**
+** Function         bte_scan_filt_param_cfg_evt
+**
+** Description      Scan filter param config event
+**
+** Returns          void
+**
+*******************************************************************************/
+static void bte_scan_filt_param_cfg_evt(UINT8 action_type,
+                                        tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+                                        tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+    /* This event occurs on calling BTA_DmBleCfgFilterCondition internally,
+    ** and that is why there is no HAL callback
+    */
+    if(BTA_SUCCESS != status)
+    {
+        BTIF_TRACE_ERROR("%s, %d", __FUNCTION__, status);
+    }
+    else
+    {
+        BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+    }
+}
+
 /*****************************************************************************
 **
 **   btif api functions (no context switch)
@@ -1808,12 +2153,29 @@
 {
     tBTA_DM_INQ inq_params;
     tBTA_SERVICE_MASK services = 0;
+    tBTA_DM_BLE_PF_FILT_PARAMS adv_filt_param;
 
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+    memset(&adv_filt_param, 0, sizeof(tBTA_DM_BLE_PF_FILT_PARAMS));
+    /* Cleanup anything remaining on index 0 */
+    BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_DELETE, 0, &adv_filt_param, NULL,
+                             bte_scan_filt_param_cfg_evt, 0);
+
+    /* Add an allow-all filter on index 0*/
+    adv_filt_param.dely_mode = IMMEDIATE_DELY_MODE;
+    adv_filt_param.feat_seln = ALLOW_ALL_FILTER;
+    adv_filt_param.filt_logic_type = BTA_DM_BLE_PF_FILT_LOGIC_OR;
+    adv_filt_param.list_logic_type = BTA_DM_BLE_PF_LIST_LOGIC_OR;
+    adv_filt_param.rssi_low_thres = LOWEST_RSSI_VALUE;
+    adv_filt_param.rssi_high_thres = LOWEST_RSSI_VALUE;
+    BTA_DmBleScanFilterSetup(BTA_DM_BLE_SCAN_COND_ADD, 0, &adv_filt_param, NULL,
+                             bte_scan_filt_param_cfg_evt, 0);
+
     /* TODO: Do we need to handle multiple inquiries at the same time? */
 
     /* Set inquiry params and call API */
-#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     inq_params.mode = BTA_DM_GENERAL_INQUIRY|BTA_BLE_GENERAL_INQUIRY;
 #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
     inq_params.intl_duration[0]= BTIF_DM_INTERLEAVE_DURATION_BR_ONE;
@@ -1851,7 +2213,7 @@
 *******************************************************************************/
 bt_status_t btif_dm_cancel_discovery(void)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     BTA_DmSearchCancel();
     return BT_STATUS_SUCCESS;
 }
@@ -1865,16 +2227,20 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr)
+bt_status_t btif_dm_create_bond(const bt_bdaddr_t *bd_addr, int transport)
 {
-    bdstr_t bdstr;
+    btif_dm_create_bond_cb_t create_bond_cb;
+    create_bond_cb.transport = transport;
+    bdcpy(create_bond_cb.bdaddr.address, bd_addr->address);
 
-    BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *) bd_addr, &bdstr));
+    bdstr_t bdstr;
+    BTIF_TRACE_EVENT("%s: bd_addr=%s, transport=%d", __FUNCTION__,
+            bd2str((bt_bdaddr_t *) bd_addr, &bdstr), transport);
     if (pairing_cb.state != BT_BOND_STATE_NONE)
         return BT_STATUS_BUSY;
 
     btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_CREATE_BOND,
-                          (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
+                          (char *)&create_bond_cb, sizeof(btif_dm_create_bond_cb_t), NULL);
 
     return BT_STATUS_SUCCESS;
 }
@@ -1893,7 +2259,7 @@
 {
     bdstr_t bdstr;
 
-    BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
+    BTIF_TRACE_EVENT("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
 
     /* TODO:
     **  1. Restore scan modes
@@ -1911,7 +2277,11 @@
                 BTA_DmBleSecurityGrant((UINT8 *)bd_addr->address,BTA_DM_SEC_PAIR_NOT_SPT);
             }
             else
+            {
                 BTA_DmConfirm( (UINT8 *)bd_addr->address, FALSE);
+                BTA_DmBondCancel ((UINT8 *)bd_addr->address);
+                btif_storage_remove_bonded_device((bt_bdaddr_t *)bd_addr);
+            }
         }
         else
         {
@@ -1978,7 +2348,7 @@
 {
     bdstr_t bdstr;
 
-    BTIF_TRACE_EVENT2("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
+    BTIF_TRACE_EVENT("%s: bd_addr=%s", __FUNCTION__, bd2str((bt_bdaddr_t *)bd_addr, &bdstr));
     btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_REMOVE_BOND,
                           (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
 
@@ -1998,7 +2368,9 @@
 bt_status_t btif_dm_pin_reply( const bt_bdaddr_t *bd_addr, uint8_t accept,
                                uint8_t pin_len, bt_pin_code_t *pin_code)
 {
-    BTIF_TRACE_EVENT2("%s: accept=%d", __FUNCTION__, accept);
+    BTIF_TRACE_EVENT("%s: accept=%d", __FUNCTION__, accept);
+    if (pin_code == NULL)
+        return BT_STATUS_FAIL;
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
 
     if (pairing_cb.is_le_only)
@@ -2012,7 +2384,7 @@
         {
             passkey += (multi[i] * (pin_code->pin[i] - '0'));
         }
-        BTIF_TRACE_DEBUG1("btif_dm_pin_reply: passkey: %d", passkey);
+        BTIF_TRACE_DEBUG("btif_dm_pin_reply: passkey: %d", passkey);
         BTA_DmBlePasskeyReply(remote_bd_addr, accept, passkey);
 
     }
@@ -2051,11 +2423,11 @@
         /* This is not implemented in the stack.
          * For devices with display, this is not needed
         */
-        BTIF_TRACE_WARNING1("%s: Not implemented", __FUNCTION__);
+        BTIF_TRACE_WARNING("%s: Not implemented", __FUNCTION__);
         return BT_STATUS_FAIL;
     }
     /* BT_SSP_VARIANT_CONSENT & BT_SSP_VARIANT_PASSKEY_CONFIRMATION supported */
-    BTIF_TRACE_EVENT2("%s: accept=%d", __FUNCTION__, accept);
+    BTIF_TRACE_EVENT("%s: accept=%d", __FUNCTION__, accept);
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     if (pairing_cb.is_le_only)
     {
@@ -2086,7 +2458,7 @@
 {
     bt_status_t status;
 
-    BTIF_TRACE_EVENT2("%s: type=0x%x", __FUNCTION__, prop->type);
+    BTIF_TRACE_EVENT("%s: type=0x%x", __FUNCTION__, prop->type);
     switch (prop->type)
     {
         case BT_PROPERTY_BDNAME:
@@ -2134,7 +2506,7 @@
 {
     bdstr_t bdstr;
 
-    BTIF_TRACE_EVENT2("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
+    BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
 
     BTA_DmDiscover(remote_addr->address, BTA_ALL_SERVICE_MASK,
                    bte_dm_search_services_evt, TRUE);
@@ -2157,7 +2529,7 @@
     tSDP_UUID sdp_uuid;
     bdstr_t bdstr;
 
-    BTIF_TRACE_EVENT2("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
+    BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(remote_addr, &bdstr));
 
     sdp_uuid.len = MAX_UUID_SIZE;
     memcpy(sdp_uuid.uu.uuid128, uuid->uu, MAX_UUID_SIZE);
@@ -2192,6 +2564,63 @@
     return;
 }
 
+void btif_dm_proc_io_req(BD_ADDR bd_addr, tBTA_IO_CAP *p_io_cap, tBTA_OOB_DATA *p_oob_data,
+                      tBTA_AUTH_REQ *p_auth_req, BOOLEAN is_orig)
+{
+    UINT8   yes_no_bit = BTA_AUTH_SP_YES & *p_auth_req;
+    /* if local initiated:
+    **      1. set DD + MITM
+    ** if remote initiated:
+    **      1. Copy over the auth_req from peer's io_rsp
+    **      2. Set the MITM if peer has it set or if peer has DisplayYesNo (iPhone)
+    ** as a fallback set MITM+GB if peer had MITM set
+    */
+    UNUSED (bd_addr);
+    UNUSED (p_io_cap);
+    UNUSED (p_oob_data);
+
+
+    BTIF_TRACE_DEBUG("+%s: p_auth_req=%d", __FUNCTION__, *p_auth_req);
+    if(pairing_cb.is_local_initiated)
+    {
+        /* if initing/responding to a dedicated bonding, use dedicate bonding bit */
+        *p_auth_req = BTA_AUTH_DD_BOND | BTA_AUTH_SP_YES;
+    }
+    else if (!is_orig)
+    {
+        /* peer initiated paring. They probably know what they want.
+        ** Copy the mitm from peer device.
+        */
+        BTIF_TRACE_DEBUG("%s: setting p_auth_req to peer's: %d",
+                __FUNCTION__, pairing_cb.auth_req);
+        *p_auth_req = (pairing_cb.auth_req & BTA_AUTH_BONDS);
+
+        /* copy over the MITM bit as well. In addition if the peer has DisplayYesNo, force MITM */
+        if ((yes_no_bit) || (pairing_cb.io_cap & BTM_IO_CAP_IO) )
+            *p_auth_req |= BTA_AUTH_SP_YES;
+    }
+    else if (yes_no_bit)
+    {
+        /* set the general bonding bit for stored device */
+        *p_auth_req = BTA_AUTH_GEN_BOND | yes_no_bit;
+    }
+    BTIF_TRACE_DEBUG("-%s: p_auth_req=%d", __FUNCTION__, *p_auth_req);
+}
+
+void btif_dm_proc_io_rsp(BD_ADDR bd_addr, tBTA_IO_CAP io_cap,
+                      tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req)
+{
+    UNUSED (bd_addr);
+    UNUSED (oob_data);
+
+    if(auth_req & BTA_AUTH_BONDS)
+    {
+        BTIF_TRACE_DEBUG("%s auth_req:%d", __FUNCTION__, auth_req);
+        pairing_cb.auth_req = auth_req;
+        pairing_cb.io_cap = io_cap;
+    }
+}
+
 #if (BTM_OOB_INCLUDED == TRUE)
 void btif_dm_set_oob_for_io_req(tBTA_OOB_DATA  *p_oob_data)
 {
@@ -2204,7 +2633,7 @@
     {
         *p_oob_data = TRUE;
     }
-    BTIF_TRACE_DEBUG1("btif_dm_set_oob_for_io_req *p_oob_data=%d", *p_oob_data);
+    BTIF_TRACE_DEBUG("btif_dm_set_oob_for_io_req *p_oob_data=%d", *p_oob_data);
 }
 #endif /* BTM_OOB_INCLUDED */
 
@@ -2213,18 +2642,18 @@
 {
     char prop_oob[PROPERTY_VALUE_MAX];
     property_get("service.brcm.bt.oob", prop_oob, "3");
-    BTIF_TRACE_DEBUG1("btif_dm_load_local_oob prop_oob = %s",prop_oob);
+    BTIF_TRACE_DEBUG("btif_dm_load_local_oob prop_oob = %s",prop_oob);
     if (prop_oob[0] != '3')
     {
 #if (BTM_OOB_INCLUDED == TRUE)
         if (oob_cb.sp_c[0] == 0 && oob_cb.sp_c[1] == 0 &&
             oob_cb.sp_c[2] == 0 && oob_cb.sp_c[3] == 0 )
         {
-            BTIF_TRACE_DEBUG0("btif_dm_load_local_oob: read OOB, call BTA_DmLocalOob()");
+            BTIF_TRACE_DEBUG("btif_dm_load_local_oob: read OOB, call BTA_DmLocalOob()");
             BTA_DmLocalOob();
         }
 #else
-        BTIF_TRACE_ERROR0("BTM_OOB_INCLUDED is FALSE!!(btif_dm_load_local_oob)");
+        BTIF_TRACE_ERROR("BTM_OOB_INCLUDED is FALSE!!(btif_dm_load_local_oob)");
 #endif
     }
 }
@@ -2236,16 +2665,16 @@
     char *path_b = "/data/misc/bluedroid/LOCAL/b.key";
     char *path = NULL;
     char prop_oob[PROPERTY_VALUE_MAX];
-    BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: valid=%d", valid);
+    BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: valid=%d", valid);
     if (oob_cb.sp_c[0] == 0 && oob_cb.sp_c[1] == 0 &&
         oob_cb.sp_c[2] == 0 && oob_cb.sp_c[3] == 0 &&
         valid)
     {
-        BTIF_TRACE_DEBUG0("save local OOB data in memory");
+        BTIF_TRACE_DEBUG("save local OOB data in memory");
         memcpy(oob_cb.sp_c, c, BT_OCTET16_LEN);
         memcpy(oob_cb.sp_r, r, BT_OCTET16_LEN);
         property_get("service.brcm.bt.oob", prop_oob, "3");
-        BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob prop_oob = %s",prop_oob);
+        BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob prop_oob = %s",prop_oob);
         if (prop_oob[0] == '1')
             path = path_a;
         else if (prop_oob[0] == '2')
@@ -2255,11 +2684,11 @@
             fp = fopen(path, "wb+");
             if (fp == NULL)
             {
-                BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: failed to save local OOB data to %s", path);
+                BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: failed to save local OOB data to %s", path);
             }
             else
             {
-                BTIF_TRACE_DEBUG1("btif_dm_proc_loc_oob: save local OOB data into file %s",path);
+                BTIF_TRACE_DEBUG("btif_dm_proc_loc_oob: save local OOB data into file %s",path);
                 fwrite (c , 1 , BT_OCTET16_LEN , fp );
                 fwrite (r , 1 , BT_OCTET16_LEN , fp );
                 fclose(fp);
@@ -2279,7 +2708,7 @@
     bt_bdaddr_t bt_bd_addr;
     bdcpy(oob_cb.oob_bdaddr, bd_addr);
     property_get("service.brcm.bt.oob", prop_oob, "3");
-    BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob prop_oob = %s",prop_oob);
+    BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob prop_oob = %s",prop_oob);
     if (prop_oob[0] == '1')
         path = path_b;
     else if (prop_oob[0] == '2')
@@ -2289,35 +2718,35 @@
         fp = fopen(path, "rb");
         if (fp == NULL)
         {
-            BTIF_TRACE_DEBUG1("btapp_dm_rmt_oob_reply: failed to read OOB keys from %s",path);
+            BTIF_TRACE_DEBUG("btapp_dm_rmt_oob_reply: failed to read OOB keys from %s",path);
             return FALSE;
         }
         else
         {
-            BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob: read OOB data from %s",path);
+            BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob: read OOB data from %s",path);
             fread (p_c , 1 , BT_OCTET16_LEN , fp );
             fread (p_r , 1 , BT_OCTET16_LEN , fp );
             fclose(fp);
         }
-        BTIF_TRACE_DEBUG0("----btif_dm_proc_rmt_oob: TRUE");
+        BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: TRUE");
         sprintf(t, "%02x:%02x:%02x:%02x:%02x:%02x",
                 oob_cb.oob_bdaddr[0], oob_cb.oob_bdaddr[1], oob_cb.oob_bdaddr[2],
                 oob_cb.oob_bdaddr[3], oob_cb.oob_bdaddr[4], oob_cb.oob_bdaddr[5]);
-        BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: peer_bdaddr = %s", t);
+        BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: peer_bdaddr = %s", t);
         sprintf(t, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
                 p_c[0], p_c[1], p_c[2],  p_c[3],  p_c[4],  p_c[5],  p_c[6],  p_c[7],
                 p_c[8], p_c[9], p_c[10], p_c[11], p_c[12], p_c[13], p_c[14], p_c[15]);
-        BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: c = %s",t);
+        BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: c = %s",t);
         sprintf(t, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
                 p_r[0], p_r[1], p_r[2],  p_r[3],  p_r[4],  p_r[5],  p_r[6],  p_r[7],
                 p_r[8], p_r[9], p_r[10], p_r[11], p_r[12], p_r[13], p_r[14], p_r[15]);
-        BTIF_TRACE_DEBUG1("----btif_dm_proc_rmt_oob: r = %s",t);
+        BTIF_TRACE_DEBUG("----btif_dm_proc_rmt_oob: r = %s",t);
         bdcpy(bt_bd_addr.address, bd_addr);
         btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_BOND_STATE_BONDING,
                               (char *)&bt_bd_addr, sizeof(bt_bdaddr_t), NULL);
         result = TRUE;
     }
-    BTIF_TRACE_DEBUG1("btif_dm_proc_rmt_oob result=%d",result);
+    BTIF_TRACE_DEBUG("btif_dm_proc_rmt_oob result=%d",result);
     return result;
 }
 #endif /*  BTIF_DM_OOB_TEST */
@@ -2329,7 +2758,7 @@
     bt_bdname_t bd_name;
     UINT32 cod;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     /* Remote name update */
     btif_update_remote_properties(p_ssp_key_notif->bd_addr , p_ssp_key_notif->bd_name,
@@ -2381,6 +2810,14 @@
         /*Map the HCI fail reason  to  bt status  */
         switch (p_auth_cmpl->fail_reason)
         {
+            case BTA_DM_AUTH_SMP_PAIR_AUTH_FAIL:
+            case BTA_DM_AUTH_SMP_CONFIRM_VALUE_FAIL:
+                btif_dm_remove_ble_bonding_keys();
+                status = BT_STATUS_AUTH_FAILURE;
+                break;
+            case BTA_DM_AUTH_SMP_PAIR_NOT_SUPPORT:
+                status = BT_STATUS_AUTH_REJECTED;
+                break;
             default:
                 btif_dm_remove_ble_bonding_keys();
                 status =  BT_STATUS_FAIL;
@@ -2402,7 +2839,7 @@
                                        BT_OCTET16_LEN)== BT_STATUS_SUCCESS)
     {
         ble_local_key_cb.is_er_rcvd = TRUE;
-        BTIF_TRACE_DEBUG1("%s BLE ER key loaded",__FUNCTION__ );
+        BTIF_TRACE_DEBUG("%s BLE ER key loaded",__FUNCTION__ );
     }
 
     if ((btif_storage_get_ble_local_key(BTIF_DM_LE_LOCAL_KEY_IR,(char*)&ble_local_key_cb.id_keys.ir[0],
@@ -2413,7 +2850,7 @@
                                         BT_OCTET16_LEN)== BT_STATUS_SUCCESS))
     {
         ble_local_key_cb.is_id_keys_rcvd = TRUE;
-        BTIF_TRACE_DEBUG1("%s BLE ID keys loaded",__FUNCTION__ );
+        BTIF_TRACE_DEBUG("%s BLE ID keys loaded",__FUNCTION__ );
     }
 
 }
@@ -2433,7 +2870,7 @@
         memcpy(&p_id_keys->dhk[0],  &ble_local_key_cb.id_keys.dhk[0], sizeof(BT_OCTET16));
         *p_key_mask |= BTA_BLE_LOCAL_KEY_TYPE_ID;
     }
-    BTIF_TRACE_DEBUG2("%s  *p_key_mask=0x%02x",__FUNCTION__,   *p_key_mask);
+    BTIF_TRACE_DEBUG("%s  *p_key_mask=0x%02x",__FUNCTION__,   *p_key_mask);
 }
 
 void btif_dm_save_ble_bonding_keys(void)
@@ -2441,7 +2878,7 @@
 
     bt_bdaddr_t bd_addr;
 
-    BTIF_TRACE_DEBUG1("%s",__FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s",__FUNCTION__ );
 
     bdcpy(bd_addr.address, pairing_cb.bd_addr);
 
@@ -2456,9 +2893,9 @@
     if (pairing_cb.ble.is_pid_key_rcvd)
     {
         btif_storage_add_ble_bonding_key(&bd_addr,
-                                         (char *) &pairing_cb.ble.pid_key[0],
+                                         (char *) &pairing_cb.ble.pid_key,
                                          BTIF_DM_LE_KEY_PID,
-                                         BT_OCTET16_LEN);
+                                         sizeof(btif_dm_ble_pid_keys_t));
     }
 
 
@@ -2494,7 +2931,7 @@
 {
     bt_bdaddr_t bd_addr;
 
-    BTIF_TRACE_DEBUG1("%s",__FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s",__FUNCTION__ );
 
     bdcpy(bd_addr.address, pairing_cb.bd_addr);
     btif_storage_remove_ble_bonding_keys(&bd_addr);
@@ -2515,11 +2952,11 @@
     bt_bdaddr_t bd_addr;
     bt_bdname_t bd_name;
     UINT32 cod;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (pairing_cb.state == BT_BOND_STATE_BONDING)
     {
-        BTIF_TRACE_DEBUG1("%s Discard security request", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s Discard security request", __FUNCTION__);
         return;
     }
 
@@ -2621,7 +3058,7 @@
              BTM_BleTestEnd((tBTM_CMPL_CB*) btif_dm_ble_test_end_cback);
              break;
          default:
-             BTIF_TRACE_ERROR2("%s: Unknown LE Test Mode Command 0x%x", __FUNCTION__, opcode);
+             BTIF_TRACE_ERROR("%s: Unknown LE Test Mode Command 0x%x", __FUNCTION__, opcode);
              return BT_STATUS_UNSUPPORTED;
      }
      return BT_STATUS_SUCCESS;
@@ -2636,12 +3073,28 @@
     {
         bt_bdaddr_t bd_addr;
 
-        BTIF_TRACE_DEBUG1("%s: Cancel pending pairing request", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s: Cancel pending pairing request", __FUNCTION__);
         bdcpy(bd_addr.address, pairing_cb.bd_addr);
         btif_dm_cancel_bond(&bd_addr);
     }
 }
 
+/*******************************************************************************
+**
+** Function         btif_dm_read_energy_info
+**
+** Description     Reads the energy info from controller
+**
+** Returns         void
+**
+*******************************************************************************/
+void btif_dm_read_energy_info()
+{
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+    BTA_DmBleGetEnergyInfo(bta_energy_info_cb);
+#endif
+}
+
 static char* btif_get_default_local_name() {
     if (btif_default_local_name[0] == '\0')
     {
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index c788bd8..abe35c1 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2009-2013 Broadcom Corporation
+ *  Copyright (C) 2009-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
 
 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
 
-#include "gki.h"
+#include "btif_gatt_multi_adv_util.h"
 #include <hardware/bt_gatt.h>
 #include "bta_api.h"
 #include "bta_gatt_api.h"
@@ -51,20 +51,23 @@
 #include "btif_dm.h"
 #include "btif_storage.h"
 
+#include "vendor_api.h"
+
 /*******************************************************************************
 **  Constants & Macros
 ********************************************************************************/
 
-#define ADV_FLAGS 0x02
-
 #define CHECK_BTGATT_INIT() if (bt_gatt_callbacks == NULL)\
     {\
-        ALOGW("%s: BTGATT not initialized", __FUNCTION__);\
+        BTIF_TRACE_WARNING("%s: BTGATT not initialized", __FUNCTION__);\
         return BT_STATUS_NOT_READY;\
     } else {\
-        ALOGD("%s", __FUNCTION__);\
+        BTIF_TRACE_DEBUG("%s", __FUNCTION__);\
     }
 
+#define BLE_RESOLVE_ADDR_MSB                 0x40   /* bit7, bit6 is 01 to be resolvable random */
+#define BLE_RESOLVE_ADDR_MASK                0xc0   /* bit 6, and bit7 */
+#define BTM_BLE_IS_RESOLVE_BDA(x)           ((x[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB)
 
 typedef enum {
     BTIF_GATTC_REGISTER_APP = 1000,
@@ -92,35 +95,104 @@
     BTIF_GATTC_LISTEN,
     BTIF_GATTC_SET_ADV_DATA,
     BTIF_GATTC_CONFIGURE_MTU,
+    BTIF_GATTC_CONN_PARAM_UPDT,
+    BTIF_GATTC_SCAN_FILTER_PARAM_SETUP,
+    BTIF_GATTC_SCAN_FILTER_CONFIG,
+    BTIF_GATTC_SCAN_FILTER_CLEAR,
+    BTIF_GATTC_SCAN_FILTER_ENABLE,
+    BTIF_GATTC_SET_SCAN_PARAMS,
+    BTIF_GATTC_ADV_INSTANCE_ENABLE,
+    BTIF_GATTC_ADV_INSTANCE_UPDATE,
+    BTIF_GATTC_ADV_INSTANCE_SET_DATA,
+    BTIF_GATTC_ADV_INSTANCE_DISABLE,
+    BTIF_GATTC_CONFIG_STORAGE_PARAMS,
+    BTIF_GATTC_ENABLE_BATCH_SCAN,
+    BTIF_GATTC_READ_BATCH_SCAN_REPORTS,
+    BTIF_GATTC_DISABLE_BATCH_SCAN
 } btif_gattc_event_t;
 
 #define BTIF_GATT_MAX_OBSERVED_DEV 40
 
 #define BTIF_GATT_OBSERVE_EVT   0x1000
 #define BTIF_GATTC_RSSI_EVT     0x1001
+#define BTIF_GATTC_SCAN_FILTER_EVT   0x1003
+
+#define ENABLE_BATCH_SCAN 1
+#define DISABLE_BATCH_SCAN 0
 
 /*******************************************************************************
 **  Local type definitions
 ********************************************************************************/
+typedef struct
+{
+    uint8_t report_format;
+    uint16_t data_len;
+    uint8_t num_records;
+    uint8_t *p_rep_data;
+} btgatt_batch_reports;
 
 typedef struct
 {
-    tBTA_BLE_AD_MASK mask;
-    tBTA_BLE_ADV_DATA data;
-} btgatt_adv_data;
+    uint8_t  status;
+    uint8_t  client_if;
+    uint8_t  filt_index;
+    uint8_t  adv_state;
+    uint8_t  action;
+    uint8_t  avbl_space;
+    uint8_t  lost_timeout;
+    bt_bdaddr_t bd_addr;
+    uint8_t  batch_scan_full_max;
+    uint8_t  batch_scan_trunc_max;
+    uint8_t  batch_scan_notify_threshold;
+    tBTA_BLE_SCAN_MODE scan_mode;
+    uint32_t scan_interval;
+    uint32_t scan_window;
+    tBTA_BLE_DISCARD_RULE discard_rule;
+    tBLE_ADDR_TYPE        addr_type;
+    btgatt_batch_reports read_reports;
+} btgatt_batch_track_cb_t;
+
+typedef tBTA_DM_BLE_PF_FILT_PARAMS btgatt_adv_filt_param_t;
+
+typedef struct
+{
+    uint8_t     client_if;
+    uint8_t     action;
+    tBTA_DM_BLE_PF_COND_TYPE filt_type;
+    bt_bdaddr_t bd_addr;
+    uint8_t     value[BTGATT_MAX_ATTR_LEN];
+    uint8_t     value_len;
+    uint8_t     filt_index;
+    uint16_t    conn_id;
+    uint16_t    company_id_mask;
+    bt_uuid_t   uuid;
+    bt_uuid_t   uuid_mask;
+    uint8_t     value_mask[BTGATT_MAX_ATTR_LEN];
+    uint8_t     value_mask_len;
+    uint8_t     has_mask;
+    uint8_t     addr_type;
+    uint8_t     status;
+    tBTA_DM_BLE_PF_AVBL_SPACE avbl_space;
+    tBTA_DM_BLE_SCAN_COND_OP cond_op;
+    btgatt_adv_filt_param_t adv_filt_param;
+} btgatt_adv_filter_cb_t;
 
 typedef struct
 {
     uint8_t     value[BTGATT_MAX_ATTR_LEN];
-    btgatt_adv_data adv_data;
+    uint8_t     inst_id;
     bt_bdaddr_t bd_addr;
     btgatt_srvc_id_t srvc_id;
     btgatt_srvc_id_t incl_srvc_id;
     btgatt_gatt_id_t char_id;
     btgatt_gatt_id_t descr_id;
     bt_uuid_t   uuid;
+    bt_uuid_t   uuid_mask;
     uint16_t    conn_id;
     uint16_t    len;
+    uint16_t    mask;
+    uint16_t    scan_interval;
+    uint16_t    scan_window;
     uint8_t     client_if;
     uint8_t     action;
     uint8_t     is_direct;
@@ -130,21 +202,33 @@
     uint8_t     status;
     uint8_t     addr_type;
     uint8_t     start;
+    uint8_t     has_mask;
     int8_t      rssi;
+    uint8_t     flag;
     tBT_DEVICE_TYPE device_type;
+    btgatt_transport_t transport;
 } __attribute__((packed)) btif_gattc_cb_t;
 
 typedef struct
 {
     bt_bdaddr_t bd_addr;
+    uint16_t    min_interval;
+    uint16_t    max_interval;
+    uint16_t    timeout;
+    uint16_t    latency;
+} btif_conn_param_cb_t;
+
+typedef struct
+{
+    bt_bdaddr_t bd_addr;
     BOOLEAN     in_use;
 }__attribute__((packed)) btif_gattc_dev_t;
 
 typedef struct
 {
     btif_gattc_dev_t remote_dev[BTIF_GATT_MAX_OBSERVED_DEV];
-    uint8_t        addr_type;
-    uint8_t        next_storage_idx;
+    uint8_t            addr_type;
+    uint8_t            next_storage_idx;
 }__attribute__((packed)) btif_gattc_dev_cb_t;
 
 /*******************************************************************************
@@ -160,10 +244,17 @@
 **  Static functions
 ********************************************************************************/
 
+static bt_status_t btif_gattc_multi_adv_disable(int client_if);
+static void btif_multi_adv_stop_cb(void *p_tle)
+{
+    int client_if = ((TIMER_LIST_ENT*)p_tle)->data;
+    btif_gattc_multi_adv_disable(client_if); // Does context switch
+}
+
 static void btapp_gattc_req_data(UINT16 event, char *p_dest, char *p_src)
 {
-    tBTA_GATTC *p_dest_data = (tBTA_GATTC*)p_dest;
-    tBTA_GATTC *p_src_data = (tBTA_GATTC*)p_src;
+    tBTA_GATTC *p_dest_data = (tBTA_GATTC*) p_dest;
+    tBTA_GATTC *p_src_data = (tBTA_GATTC*) p_src;
 
     if (!p_src_data || !p_dest_data)
        return;
@@ -204,7 +295,7 @@
             }
             else
             {
-                BTIF_TRACE_WARNING2("%s :Src read.p_value ptr is NULL for event  0x%x",
+                BTIF_TRACE_WARNING("%s :Src read.p_value ptr is NULL for event  0x%x",
                                     __FUNCTION__, event);
                 p_dest_data->read.p_value = NULL;
 
@@ -255,7 +346,7 @@
             memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
             p_dev_cb->addr_type = addr_type;
             p_dev_cb->remote_dev[i].in_use = TRUE;
-            ALOGD("%s device added idx=%d", __FUNCTION__, i  );
+            BTIF_TRACE_DEBUG("%s device added idx=%d", __FUNCTION__, i  );
             break;
         }
     }
@@ -266,9 +357,9 @@
         memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN);
         p_dev_cb->addr_type = addr_type;
         p_dev_cb->remote_dev[i].in_use = TRUE;
-        ALOGD("%s device overwrite idx=%d", __FUNCTION__, i  );
+        BTIF_TRACE_DEBUG("%s device overwrite idx=%d", __FUNCTION__, i  );
         p_dev_cb->next_storage_idx++;
-        if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
+        if (p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
                p_dev_cb->next_storage_idx = 0;
     }
 }
@@ -296,18 +387,18 @@
     p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-    if(p_eir_remote_name == NULL)
+    if (p_eir_remote_name == NULL)
     {
         p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
     }
 
-    if(p_eir_remote_name)
+    if (p_eir_remote_name)
     {
-         memcpy(bdname.name, p_eir_remote_name, remote_name_len);
-         bdname.name[remote_name_len]='\0';
+        memcpy(bdname.name, p_eir_remote_name, remote_name_len);
+        bdname.name[remote_name_len]='\0';
 
-        ALOGD("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
+        BTIF_TRACE_DEBUG("%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name,
               remote_name_len, p_btif_cb->device_type  );
         btif_dm_update_ble_remote_properties( p_btif_cb->bd_addr.address,   bdname.name,
                                                p_btif_cb->device_type);
@@ -318,9 +409,9 @@
 
 static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
 {
-    ALOGD("%s: Event %d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: Event %d", __FUNCTION__, event);
 
-    tBTA_GATTC *p_data = (tBTA_GATTC*)p_param;
+    tBTA_GATTC *p_data = (tBTA_GATTC*) p_param;
     switch (event)
     {
         case BTA_GATTC_REG_EVT:
@@ -460,7 +551,7 @@
         }
 
         case BTA_GATTC_ACL_EVT:
-            ALOGD("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
+            BTIF_TRACE_EVENT("BTA_GATTC_ACL_EVT: status = %d", p_data->status);
             /* Ignore for now */
             break;
 
@@ -469,14 +560,16 @@
 
         case BTIF_GATT_OBSERVE_EVT:
         {
-            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
             uint8_t remote_name_len;
             uint8_t *p_eir_remote_name=NULL;
+            bt_device_type_t dev_type;
+            bt_property_t properties;
 
             p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-            if(p_eir_remote_name == NULL)
+            if (p_eir_remote_name == NULL)
             {
                 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
@@ -496,6 +589,19 @@
                }
 
             }
+
+            if (( p_btif_cb->device_type == BT_DEVICE_TYPE_DUMO)&&
+               (p_btif_cb->flag & BTA_BLE_DMT_CONTROLLER_SPT) &&
+               (p_btif_cb->flag & BTA_BLE_DMT_HOST_SPT))
+             {
+                btif_storage_set_dmt_support_type (&(p_btif_cb->bd_addr), TRUE);
+             }
+
+             dev_type =  p_btif_cb->device_type;
+             BTIF_STORAGE_FILL_PROPERTY(&properties,
+                        BT_PROPERTY_TYPE_OF_DEVICE, sizeof(dev_type), &dev_type);
+             btif_storage_set_remote_device_property(&(p_btif_cb->bd_addr), &properties);
+
             HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb,
                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value);
             break;
@@ -503,7 +609,7 @@
 
         case BTIF_GATTC_RSSI_EVT:
         {
-            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*)p_param;
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
             HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if,
                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status);
             break;
@@ -525,8 +631,165 @@
             break;
         }
 
+        case BTA_GATTC_MULT_ADV_ENB_EVT:
+        {
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+            if (0xFF != p_btif_cb->inst_id)
+                btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false);
+            HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb
+                    , p_btif_cb->client_if
+                    , p_btif_cb->status
+                );
+            btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
+                    (p_btif_cb->status==0 ? btif_multi_adv_stop_cb : NULL));
+            break;
+        }
+
+        case BTA_GATTC_MULT_ADV_UPD_EVT:
+        {
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->multi_adv_update_cb
+                , p_btif_cb->client_if
+                , p_btif_cb->status
+            );
+            btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
+                    (p_btif_cb->status==0 ? btif_multi_adv_stop_cb : NULL));
+            break;
+        }
+
+        case BTA_GATTC_MULT_ADV_DATA_EVT:
+         {
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->multi_adv_data_cb
+                , p_btif_cb->client_if
+                , p_btif_cb->status
+            );
+            break;
+        }
+
+        case BTA_GATTC_MULT_ADV_DIS_EVT:
+        {
+            btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+            btif_gattc_clear_clientif(p_btif_cb->client_if);
+            HAL_CBACK(bt_gatt_callbacks, client->multi_adv_disable_cb
+                , p_btif_cb->client_if
+                , p_btif_cb->status
+            );
+            break;
+        }
+
+        case BTA_GATTC_ADV_DATA_EVT:
+        {
+            btif_gattc_cleanup_inst_cb(STD_ADV_INSTID);
+            /* No HAL callback available */
+            break;
+        }
+
+        case BTA_GATTC_CONGEST_EVT:
+            HAL_CBACK(bt_gatt_callbacks, client->congestion_cb
+                , p_data->congest.conn_id
+                , p_data->congest.congested
+            );
+            break;
+
+        case BTA_GATTC_BTH_SCAN_CFG_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->batchscan_cfg_storage_cb
+                , p_data->client_if
+                , p_data->status
+            );
+            break;
+        }
+
+        case BTA_GATTC_BTH_SCAN_ENB_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
+                    , ENABLE_BATCH_SCAN
+                    , p_data->client_if
+                    , p_data->status);
+            break;
+        }
+
+        case BTA_GATTC_BTH_SCAN_DIS_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
+                    , DISABLE_BATCH_SCAN
+                    , p_data->client_if
+                    , p_data->status);
+            break;
+        }
+
+        case BTA_GATTC_BTH_SCAN_THR_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->batchscan_threshold_cb
+                    , p_data->client_if);
+            break;
+        }
+
+        case BTA_GATTC_BTH_SCAN_RD_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            uint8_t *p_rep_data = NULL;
+
+            if (p_data->read_reports.data_len > 0 && NULL != p_data->read_reports.p_rep_data)
+            {
+                p_rep_data = GKI_getbuf(p_data->read_reports.data_len);
+                memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len);
+            }
+
+            HAL_CBACK(bt_gatt_callbacks, client->batchscan_reports_cb
+                    , p_data->client_if, p_data->status, p_data->read_reports.report_format
+                    , p_data->read_reports.num_records, p_data->read_reports.data_len, p_rep_data);
+            if (NULL != p_rep_data)
+                GKI_freebuf(p_rep_data);
+            break;
+        }
+
+        case BTA_GATTC_SCAN_FLT_CFG_EVT:
+        {
+            btgatt_adv_filter_cb_t *p_btif_cb = (btgatt_adv_filter_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->scan_filter_cfg_cb, p_btif_cb->action,
+                      p_btif_cb->client_if, p_btif_cb->status, p_btif_cb->cond_op,
+                      p_btif_cb->avbl_space);
+            break;
+        }
+
+        case BTA_GATTC_SCAN_FLT_PARAM_EVT:
+        {
+            btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
+            BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_PARAM_EVT: %d, %d, %d, %d",p_data->client_if,
+                p_data->action, p_data->avbl_space, p_data->status);
+            HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb
+                    , p_data->action, p_data->client_if, p_data->status
+                    , p_data->avbl_space);
+            break;
+        }
+
+        case BTA_GATTC_SCAN_FLT_STATUS_EVT:
+        {
+            btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
+            BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_STATUS_EVT: %d, %d, %d",p_data->client_if,
+                p_data->action, p_data->status);
+            HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb
+                    , p_data->action, p_data->client_if, p_data->status);
+            break;
+        }
+
+        case BTA_GATTC_ADV_VSC_EVT:
+        {
+            btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
+            HAL_CBACK(bt_gatt_callbacks, client->track_adv_event_cb
+                    ,p_data->client_if, p_data->filt_index, p_data->addr_type, &p_data->bd_addr
+                    ,p_data->adv_state);
+            break;
+        }
+
         default:
-            ALOGE("%s: Unhandled event (%d)!", __FUNCTION__, event);
+            BTIF_TRACE_ERROR("%s: Unhandled event (%d)!", __FUNCTION__, event);
             break;
     }
 
@@ -536,10 +799,163 @@
 static void bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
 {
     bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt,
-                    (uint16_t) event, (void*)p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
+                    (uint16_t) event, (void*) p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
     ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
 }
 
+static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_id,
+                                    void *p_ref, tBTA_STATUS call_status)
+{
+    btif_gattc_cb_t btif_cb;
+    tBTA_GATTC_EVT upevt;
+    uint8_t client_if = 0;
+
+    if (NULL == p_ref)
+    {
+        BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__);
+    }
+    else
+    {
+        client_if = *(UINT8 *) p_ref;
+    }
+
+    BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status,
+                       client_if);
+    btif_cb.status = call_status;
+    btif_cb.client_if = client_if;
+    btif_cb.inst_id = inst_id;
+
+    switch(event)
+    {
+        case BTA_BLE_MULTI_ADV_ENB_EVT:
+            upevt = BTA_GATTC_MULT_ADV_ENB_EVT;
+            break;
+
+        case BTA_BLE_MULTI_ADV_DISABLE_EVT:
+            upevt = BTA_GATTC_MULT_ADV_DIS_EVT;
+            break;
+
+        case BTA_BLE_MULTI_ADV_PARAM_EVT:
+            upevt = BTA_GATTC_MULT_ADV_UPD_EVT;
+            break;
+
+        case BTA_BLE_MULTI_ADV_DATA_EVT:
+            upevt = BTA_GATTC_MULT_ADV_DATA_EVT;
+            break;
+
+        default:
+            return;
+    }
+
+    bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt, (uint16_t) upevt,
+                        (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+    ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
+}
+
+static void bta_gattc_set_adv_data_cback(tBTA_STATUS call_status)
+{
+    UNUSED(call_status);
+    btif_gattc_cb_t btif_cb;
+    btif_cb.status = call_status;
+    btif_cb.action = 0;
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_DATA_EVT,
+                          (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
+static void bta_batch_scan_setup_cb (tBTA_BLE_BATCH_SCAN_EVT evt,
+                                            tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+    UINT8 upevt = 0;
+    btgatt_batch_track_cb_t btif_scan_track_cb;
+
+    btif_scan_track_cb.status = status;
+    btif_scan_track_cb.client_if = ref_value;
+    BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d",
+            status, ref_value, evt);
+
+    switch(evt)
+    {
+        case BTA_BLE_BATCH_SCAN_ENB_EVT:
+        {
+           upevt = BTA_GATTC_BTH_SCAN_ENB_EVT;
+           break;
+        }
+
+        case BTA_BLE_BATCH_SCAN_DIS_EVT:
+        {
+           upevt = BTA_GATTC_BTH_SCAN_DIS_EVT;
+           break;
+        }
+
+        case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT:
+        {
+           upevt = BTA_GATTC_BTH_SCAN_CFG_EVT;
+           break;
+        }
+
+        case BTA_BLE_BATCH_SCAN_DATA_EVT:
+        {
+           upevt = BTA_GATTC_BTH_SCAN_RD_EVT;
+           break;
+        }
+
+        case BTA_BLE_BATCH_SCAN_THRES_EVT:
+        {
+           upevt = BTA_GATTC_BTH_SCAN_THR_EVT;
+           break;
+        }
+
+        default:
+            return;
+    }
+
+    btif_transfer_context(btif_gattc_upstreams_evt, upevt,(char*) &btif_scan_track_cb,
+                          sizeof(btgatt_batch_track_cb_t), NULL);
+
+}
+
+static void bta_batch_scan_threshold_cb(tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    btgatt_batch_track_cb_t btif_scan_track_cb;
+    btif_scan_track_cb.status = 0;
+    btif_scan_track_cb.client_if = ref_value;
+
+    BTIF_TRACE_DEBUG("%s - client_if:%d",__FUNCTION__, ref_value);
+
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_THR_EVT,
+                          (char*) &btif_scan_track_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
+static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
+                                            UINT8 num_records, UINT16 data_len,
+                                            UINT8* p_rep_data, tBTA_STATUS status)
+{
+    btgatt_batch_track_cb_t btif_scan_track_cb;
+    memset(&btif_scan_track_cb, 0, sizeof(btgatt_batch_track_cb_t));
+    BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d",__FUNCTION__, ref_value, status, num_records,
+                                    data_len);
+
+    btif_scan_track_cb.status = status;
+
+    btif_scan_track_cb.client_if = ref_value;
+    btif_scan_track_cb.read_reports.report_format = report_format;
+    btif_scan_track_cb.read_reports.data_len = data_len;
+    btif_scan_track_cb.read_reports.num_records = num_records;
+
+    if (data_len > 0)
+    {
+        btif_scan_track_cb.read_reports.p_rep_data = GKI_getbuf(data_len);
+        memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len);
+        GKI_freebuf(p_rep_data);
+    }
+
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT,
+        (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+
+    if (data_len > 0)
+        GKI_freebuf(btif_scan_track_cb.read_reports.p_rep_data);
+}
+
 static void bta_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
 {
     btif_gattc_cb_t btif_cb;
@@ -553,6 +969,7 @@
             btif_cb.device_type = p_data->inq_res.device_type;
             btif_cb.rssi = p_data->inq_res.rssi;
             btif_cb.addr_type = p_data->inq_res.ble_addr_type;
+            btif_cb.flag = p_data->inq_res.flag;
             if (p_data->inq_res.p_eir)
             {
                 memcpy(btif_cb.value, p_data->inq_res.p_eir, 62);
@@ -567,19 +984,34 @@
 
         case BTA_DM_INQ_CMPL_EVT:
         {
-            BTIF_TRACE_DEBUG2("%s  BLE observe complete. Num Resp %d",
+            BTIF_TRACE_DEBUG("%s  BLE observe complete. Num Resp %d",
                               __FUNCTION__,p_data->inq_cmpl.num_resps);
             return;
         }
 
         default:
-        BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+        BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
         return;
     }
     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT,
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
 }
 
+static void bta_track_adv_event_cb(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+                                        int adv_state, tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    btgatt_batch_track_cb_t btif_scan_track_cb;
+    BTIF_TRACE_DEBUG("%s :%d, %d, %d, %d",
+        __FUNCTION__,filt_index, addr_type, adv_state, ref_value);
+    btif_scan_track_cb.filt_index = filt_index;
+    btif_scan_track_cb.addr_type = addr_type;
+    memcpy(btif_scan_track_cb.bd_addr.address, bda, sizeof(BD_ADDR));
+    btif_scan_track_cb.client_if = ref_value;
+    btif_scan_track_cb.adv_state = adv_state;
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_VSC_EVT,
+                          (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
 static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
 {
     btif_gattc_cb_t btif_cb;
@@ -592,6 +1024,45 @@
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
 }
 
+static void bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action, tBTA_DM_BLE_SCAN_COND_OP cfg_op,
+                                tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
+                                tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    btgatt_adv_filter_cb_t btif_cb;
+    btif_cb.status = status;
+    btif_cb.action = action;
+    btif_cb.cond_op = cfg_op;
+    btif_cb.avbl_space = avbl_space;
+    btif_cb.client_if = ref_value;
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_CFG_EVT,
+                          (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static void bta_scan_filt_param_setup_cb(UINT8 action_type,
+                                        tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
+                                        tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
+{
+    btgatt_adv_filter_cb_t btif_cb;
+
+    btif_cb.status = status;
+    btif_cb.action = action_type;
+    btif_cb.client_if = ref_value;
+    btif_cb.avbl_space = avbl_space;
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_PARAM_EVT,
+                          (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static void bta_scan_filt_status_cb(UINT8 action, tBTA_STATUS status,
+                                    tBTA_DM_BLE_REF_VALUE ref_value)
+{
+    btgatt_adv_filter_cb_t btif_cb;
+
+    btif_cb.status = status;
+    btif_cb.action = action;
+    btif_cb.client_if = ref_value;
+    btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_STATUS_EVT,
+                          (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
 
 static void btgattc_handle_event(uint16_t event, char* p_param)
 {
@@ -607,19 +1078,22 @@
     tBTA_GATTC_INCL_SVC_ID     out_incl_svc_id;
     tBTA_GATT_UNFMT            descr_val;
 
-    btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*)p_param;
+    btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*) p_param;
     if (!p_cb) return;
 
-    ALOGD("%s: Event %d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: Event %d", __FUNCTION__, event);
 
     switch (event)
     {
         case BTIF_GATTC_REGISTER_APP:
             btif_to_bta_uuid(&uuid, &p_cb->uuid);
+            btif_gattc_init_multi_adv_cb();
             BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
             break;
 
         case BTIF_GATTC_UNREGISTER_APP:
+            btif_gattc_clear_clientif(p_cb->client_if);
+            btif_gattc_destroy_multi_adv_cb();
             BTA_GATTC_AppDeregister(p_cb->client_if);
             break;
 
@@ -637,6 +1111,7 @@
             // Ensure device is in inquiry database
             int addr_type = 0;
             int device_type = 0;
+            tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
 
             if (btif_get_device_type(p_cb->bd_addr.address, &addr_type, &device_type) == TRUE
                   && device_type != BT_DEVICE_TYPE_BREDR)
@@ -644,10 +1119,47 @@
 
             // Mark background connections
             if (!p_cb->is_direct)
+            {
+                // Check if RPA offloading is supported, otherwise, do not start
+                // background connection, since it will not connect after address
+                // changes
+                if (BTM_BLE_IS_RESOLVE_BDA(p_cb->bd_addr.address))
+                {
+                    tBTM_BLE_VSC_CB vnd_capabilities;
+                    BTM_BleGetVendorCapabilities(&vnd_capabilities);
+                    if (!vnd_capabilities.rpa_offloading)
+                    {
+                        HAL_CBACK(bt_gatt_callbacks, client->open_cb, 0, BT_STATUS_UNSUPPORTED,
+                                        p_cb->client_if, &p_cb->bd_addr);
+                        return;
+                    }
+                }
                 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
+            }
+
+            switch(device_type)
+            {
+                case BT_DEVICE_TYPE_BREDR:
+                    transport = BTA_GATT_TRANSPORT_BR_EDR;
+                    break;
+
+                case BT_DEVICE_TYPE_BLE:
+                    transport = BTA_GATT_TRANSPORT_LE;
+                    break;
+
+                case BT_DEVICE_TYPE_DUMO:
+                    if ((p_cb->transport == GATT_TRANSPORT_LE) &&
+                        (btif_storage_is_dmt_supported_device(&(p_cb->bd_addr)) == TRUE))
+                        transport = BTA_GATT_TRANSPORT_LE;
+                    else
+                        transport = BTA_GATT_TRANSPORT_BR_EDR;
+                    break;
+            }
 
             // Connect!
-            BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct);
+            BTIF_TRACE_DEBUG ("BTA_GATTC_Open Transport  = %d, dev type = %d",
+                                transport, device_type);
+            BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct, transport);
             break;
         }
 
@@ -854,6 +1366,134 @@
             BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb);
             break;
 
+        case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP:
+        {
+            btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+            if (1 == p_adv_filt_cb->adv_filt_param.dely_mode)
+               BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
+            BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
+                &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
+                p_adv_filt_cb->client_if);
+            break;
+        }
+
+        case BTIF_GATTC_SCAN_FILTER_CONFIG:
+        {
+            btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+            tBTA_DM_BLE_PF_COND_PARAM cond;
+            memset(&cond, 0, sizeof(cond));
+
+            switch (p_adv_filt_cb->filt_type)
+            {
+                case BTA_DM_BLE_PF_ADDR_FILTER: // 0
+                    bdcpy(cond.target_addr.bda, p_adv_filt_cb->bd_addr.address);
+                    cond.target_addr.type = p_adv_filt_cb->addr_type;
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                              p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                              &cond, bta_scan_filt_cfg_cb,
+                                              p_adv_filt_cb->client_if);
+                    break;
+
+                case BTA_DM_BLE_PF_SRVC_DATA: // 1
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                            p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                            NULL, bta_scan_filt_cfg_cb, p_adv_filt_cb->client_if);
+                    break;
+
+                case BTA_DM_BLE_PF_SRVC_UUID: // 2
+                {
+                    tBTA_DM_BLE_PF_COND_MASK uuid_mask;
+
+                    cond.srvc_uuid.p_target_addr = NULL;
+                    cond.srvc_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
+                    btif_to_bta_uuid(&cond.srvc_uuid.uuid, &p_adv_filt_cb->uuid);
+
+                    cond.srvc_uuid.p_uuid_mask = NULL;
+                    if (p_adv_filt_cb->has_mask)
+                    {
+                        btif_to_bta_uuid_mask(&uuid_mask, &p_adv_filt_cb->uuid_mask);
+                        cond.srvc_uuid.p_uuid_mask = &uuid_mask;
+                    }
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                              p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                              &cond, bta_scan_filt_cfg_cb,
+                                              p_adv_filt_cb->client_if);
+                    break;
+                }
+
+                case BTA_DM_BLE_PF_SRVC_SOL_UUID: // 3
+                {
+                    cond.solicitate_uuid.p_target_addr = NULL;
+                    cond.solicitate_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
+                    btif_to_bta_uuid(&cond.solicitate_uuid.uuid, &p_adv_filt_cb->uuid);
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                              p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                              &cond, bta_scan_filt_cfg_cb,
+                                              p_adv_filt_cb->client_if);
+                    break;
+                }
+
+                case BTA_DM_BLE_PF_LOCAL_NAME: // 4
+                {
+                    cond.local_name.data_len = p_adv_filt_cb->value_len;
+                    cond.local_name.p_data = p_adv_filt_cb->value;
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                              p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                              &cond, bta_scan_filt_cfg_cb,
+                                              p_adv_filt_cb->client_if);
+                    break;
+                }
+
+                case BTA_DM_BLE_PF_MANU_DATA: // 5
+                {
+                    cond.manu_data.company_id = p_adv_filt_cb->conn_id;
+                    cond.manu_data.company_id_mask = p_adv_filt_cb->company_id_mask;
+                    cond.manu_data.data_len = p_adv_filt_cb->value_len;
+                    cond.manu_data.p_pattern = p_adv_filt_cb->value;
+                    cond.manu_data.p_pattern_mask = p_adv_filt_cb->value_mask;
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                              p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                              &cond, bta_scan_filt_cfg_cb,
+                                              p_adv_filt_cb->client_if);
+                    break;
+                }
+
+                case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: //6
+                {
+                    cond.srvc_data.data_len = p_adv_filt_cb->value_len;
+                    cond.srvc_data.p_pattern = p_adv_filt_cb->value;
+                    cond.srvc_data.p_pattern_mask = p_adv_filt_cb->value_mask;
+                    BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
+                                                p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
+                                                &cond, bta_scan_filt_cfg_cb,
+                                                p_adv_filt_cb->client_if);
+                   break;
+                }
+
+                default:
+                    BTIF_TRACE_ERROR("%s: Unknown filter type (%d)!", __FUNCTION__, p_cb->action);
+                    break;
+            }
+            break;
+        }
+
+        case BTIF_GATTC_SCAN_FILTER_CLEAR:
+        {
+            btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+            BTA_DmBleCfgFilterCondition(BTA_DM_BLE_SCAN_COND_CLEAR, BTA_DM_BLE_PF_TYPE_ALL,
+                                        p_adv_filt_cb->filt_index, NULL, bta_scan_filt_cfg_cb,
+                                        p_adv_filt_cb->client_if);
+            break;
+        }
+
+        case BTIF_GATTC_SCAN_FILTER_ENABLE:
+        {
+            btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
+            BTA_DmEnableScanFilter(p_adv_filt_cb->action, bta_scan_filt_status_cb,
+                                   p_adv_filt_cb->client_if);
+            break;
+        }
+
         case BTIF_GATTC_LISTEN:
 #if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE))
             BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL);
@@ -864,45 +1504,168 @@
 
         case BTIF_GATTC_SET_ADV_DATA:
         {
-            if (p_cb->start == 0)
-                BTA_DmBleSetAdvConfig(p_cb->adv_data.mask, &p_cb->adv_data.data);
-            else
-                BTA_DmBleSetScanRsp(p_cb->adv_data.mask, &p_cb->adv_data.data);
-
-            // Cleanup ...
-
-            // ... manufacturer data
-            if (p_cb->adv_data.data.manu.p_val != NULL)
-                GKI_freebuf(p_cb->adv_data.data.manu.p_val);
-
-            // ... service data
-            if (p_cb->adv_data.data.p_proprietary != NULL)
+            btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
+            int cbindex = CLNT_IF_IDX;
+            if (cbindex >= 0 && NULL != p_adv_data)
             {
-                int i = 0;
-                tBTA_BLE_PROP_ELEM *p_elem = p_cb->adv_data.data.p_proprietary->p_elem;
-                while (i++ != p_cb->adv_data.data.p_proprietary->num_elem && p_elem)
+                btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+                if (!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
+                    return;
+
+                if (!p_adv_data->set_scan_rsp)
                 {
-                    if (p_elem->p_val != NULL)
-                        GKI_freebuf(p_elem->p_val);
-                    ++p_elem;
+                    BTA_DmBleSetAdvConfig(p_multi_adv_data_cb->inst_cb[cbindex].mask,
+                        &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
                 }
-                if (p_cb->adv_data.data.p_proprietary->p_elem != NULL)
-                    GKI_freebuf(p_cb->adv_data.data.p_proprietary->p_elem);
-                GKI_freebuf(p_cb->adv_data.data.p_proprietary);
+                else
+                {
+                    BTA_DmBleSetScanRsp(p_multi_adv_data_cb->inst_cb[cbindex].mask,
+                        &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
+                }
+                break;
             }
+        }
 
-            // ... service list
-            if (p_cb->adv_data.data.services.p_uuid != NULL)
-                GKI_freebuf(p_cb->adv_data.data.services.p_uuid);
+        case BTIF_GATTC_ADV_INSTANCE_ENABLE:
+        {
+            btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
 
+            int cbindex = -1, arrindex = -1;
+
+            arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true);
+            if (arrindex >= 0)
+                cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+
+            if (cbindex >= 0 && arrindex >= 0)
+            {
+                btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+                memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param,
+                       &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS));
+                p_multi_adv_data_cb->inst_cb[cbindex].timeout_s = p_inst_cb->timeout_s;
+                BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__,
+                            p_multi_adv_data_cb->clntif_map[arrindex + arrindex]);
+                BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param),
+                    bta_gattc_multi_adv_cback,
+                    &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex]));
+            }
+            else
+            {
+                /* let the error propagate up from BTA layer */
+                BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__);
+                BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL);
+            }
             break;
         }
+
+        case BTIF_GATTC_ADV_INSTANCE_UPDATE:
+        {
+            btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
+            int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
+            int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+            if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
+            {
+                btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+                memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param,
+                        sizeof(tBTA_BLE_ADV_PARAMS));
+                BTA_BleUpdateAdvInstParam((UINT8)inst_id,
+                    &(p_multi_adv_data_cb->inst_cb[cbindex].param));
+            }
+            else
+                BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_UPDATE_ADV", __FUNCTION__);
+            break;
+        }
+
+        case BTIF_GATTC_ADV_INSTANCE_SET_DATA:
+        {
+            btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
+            int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX);
+            int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if);
+            if (inst_id < 0 || cbindex < 0)
+            {
+               BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_SETADV_INST_DATA", __FUNCTION__);
+               return;
+            }
+
+            if (!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
+                return;
+
+            btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+            BTA_BleCfgAdvInstData((UINT8)inst_id, p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp,
+                      p_multi_adv_data_cb->inst_cb[cbindex].mask,
+                      &p_multi_adv_data_cb->inst_cb[cbindex].data);
+            break;
+        }
+
+        case BTIF_GATTC_ADV_INSTANCE_DISABLE:
+        {
+            btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
+            int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
+            if (inst_id >=0)
+                BTA_BleDisableAdvInstance((UINT8)inst_id);
+            else
+                BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__);
+            break;
+        }
+
         case BTIF_GATTC_CONFIGURE_MTU:
             BTA_GATTC_ConfigureMTU(p_cb->conn_id, p_cb->len);
             break;
 
+        case BTIF_GATTC_CONN_PARAM_UPDT:
+        {
+            btif_conn_param_cb_t *p_conn_param_cb = (btif_conn_param_cb_t*) p_param;
+            if (BTA_DmGetConnectionState(p_conn_param_cb->bd_addr.address))
+            {
+                BTA_DmBleUpdateConnectionParams(p_conn_param_cb->bd_addr.address,
+                               p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
+                               p_conn_param_cb->latency, p_conn_param_cb->timeout);
+            } else {
+                BTA_DmSetBlePrefConnParams(p_conn_param_cb->bd_addr.address,
+                               p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
+                               p_conn_param_cb->latency, p_conn_param_cb->timeout);
+            }
+            break;
+        }
+
+        case BTIF_GATTC_SET_SCAN_PARAMS:
+            BTM_BleSetScanParams(p_cb->scan_interval, p_cb->scan_window, BTM_BLE_SCAN_MODE_ACTI);
+            break;
+
+        case BTIF_GATTC_CONFIG_STORAGE_PARAMS:
+        {
+            btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+            BTA_DmBleSetStorageParams(p_scan_track_cb->batch_scan_full_max,
+               p_scan_track_cb->batch_scan_trunc_max, p_scan_track_cb->batch_scan_notify_threshold,
+               bta_batch_scan_setup_cb, bta_batch_scan_threshold_cb, bta_batch_scan_reports_cb,
+               (tBTA_DM_BLE_REF_VALUE) p_scan_track_cb->client_if);
+            break;
+        }
+
+        case BTIF_GATTC_ENABLE_BATCH_SCAN:
+        {
+            btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+            BTA_DmBleEnableBatchScan(p_scan_track_cb->scan_mode, p_scan_track_cb->scan_interval,
+               p_scan_track_cb->scan_window, p_scan_track_cb->discard_rule,
+               p_scan_track_cb->addr_type, p_scan_track_cb->client_if);
+            break;
+        }
+
+        case BTIF_GATTC_DISABLE_BATCH_SCAN:
+        {
+            btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+            BTA_DmBleDisableBatchScan(p_scan_track_cb->client_if);
+            break;
+        }
+
+        case BTIF_GATTC_READ_BATCH_SCAN_REPORTS:
+        {
+            btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
+            BTA_DmBleReadScanReports(p_scan_track_cb->scan_mode, p_scan_track_cb->client_if);
+            break;
+        }
+
         default:
-            ALOGE("%s: Unknown event (%d)!", __FUNCTION__, event);
+            BTIF_TRACE_ERROR("%s: Unknown event (%d)!", __FUNCTION__, event);
             break;
     }
 }
@@ -929,21 +1692,22 @@
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
 }
 
-static bt_status_t btif_gattc_scan( int client_if, bool start )
+static bt_status_t btif_gattc_scan( bool start )
 {
     CHECK_BTGATT_INIT();
     btif_gattc_cb_t btif_cb;
-    btif_cb.client_if = (uint8_t) client_if;
     return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP,
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
 }
 
-static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr, bool is_direct )
+static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr,
+                                        bool is_direct,int transport)
 {
     CHECK_BTGATT_INIT();
     btif_gattc_cb_t btif_cb;
     btif_cb.client_if = (uint8_t) client_if;
     btif_cb.is_direct = is_direct ? 1 : 0;
+    btif_cb.transport = (btgatt_transport_t)transport;
     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN,
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
@@ -977,161 +1741,28 @@
                 uint16_t service_uuid_len, char* service_uuid)
 {
     CHECK_BTGATT_INIT();
-    btif_gattc_cb_t btif_cb;
-    memset(&btif_cb, 0, sizeof(btif_gattc_cb_t));
-    memset(&btif_cb.adv_data, 0, sizeof(btgatt_adv_data));
+    bt_status_t status =0;
 
-    btif_cb.client_if = (uint8_t) client_if;
-    btif_cb.start = set_scan_rsp ? 1 : 0;
+    btif_adv_data_t adv_data;
 
-    if (!set_scan_rsp)
-    {
-        btif_cb.adv_data.mask = BTM_BLE_AD_BIT_FLAGS;
-        btif_cb.adv_data.data.flag = ADV_FLAGS;
-    }
+    btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name,
+        include_txpower, min_interval, max_interval, appearance, manufacturer_len,
+        manufacturer_data, service_data_len, service_data, service_uuid_len, service_uuid,
+        &adv_data);
 
-    if (include_name)
-        btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_DEV_NAME;
+    status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
+                       (char*) &adv_data, sizeof(btif_adv_data_t), NULL);
 
-    if (include_txpower)
-        btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_TX_PWR;
+    if (NULL != adv_data.p_service_data)
+        GKI_freebuf(adv_data.p_service_data);
 
-    if (min_interval > 0 && max_interval > 0 && max_interval > min_interval)
-    {
-        btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_INT_RANGE;
-        btif_cb.adv_data.data.int_range.low = min_interval;
-        btif_cb.adv_data.data.int_range.hi = max_interval;
-    }
+    if (NULL != adv_data.p_service_uuid)
+        GKI_freebuf(adv_data.p_service_uuid);
 
-    if (appearance != 0)
-    {
-        btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_APPEARANCE;
-        btif_cb.adv_data.data.appearance = appearance;
-    }
+    if (NULL != adv_data.p_manufacturer_data)
+        GKI_freebuf(adv_data.p_manufacturer_data);
 
-    if (manufacturer_len > 0 && manufacturer_data != NULL)
-    {
-        btif_cb.adv_data.data.manu.p_val = GKI_getbuf(manufacturer_len);
-        if (btif_cb.adv_data.data.manu.p_val != NULL)
-        {
-            btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_MANU;
-            btif_cb.adv_data.data.manu.len = manufacturer_len;
-            memcpy(btif_cb.adv_data.data.manu.p_val, manufacturer_data, manufacturer_len);
-        }
-    }
-
-    tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
-    tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;
-
-    if (service_data_len > 0 && service_data != NULL)
-    {
-        p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
-        if (p_elem_service_data != NULL)
-        {
-            p_elem_service_data->p_val = GKI_getbuf(service_data_len);
-            if (p_elem_service_data->p_val != NULL)
-            {
-                p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
-                p_elem_service_data->len = service_data_len;
-                memcpy(p_elem_service_data->p_val, service_data, service_data_len);
-
-            } else {
-                GKI_freebuf(p_elem_service_data);
-                p_elem_service_data = NULL;
-            }
-        }
-    }
-
-    if (service_uuid_len > 0 && service_uuid != NULL)
-    {
-        btif_cb.adv_data.data.services.list_cmpl = FALSE;
-        btif_cb.adv_data.data.services.num_service = 0;
-
-        btif_cb.adv_data.data.services.p_uuid =
-            GKI_getbuf(service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
-        if (btif_cb.adv_data.data.services.p_uuid != NULL)
-        {
-            UINT16 *p_uuid_out = btif_cb.adv_data.data.services.p_uuid;
-            while (service_uuid_len >= LEN_UUID_128)
-            {
-                bt_uuid_t uuid;
-                memset(&uuid, 0, sizeof(bt_uuid_t));
-                memcpy(&uuid.uu, service_uuid, LEN_UUID_128);
-
-                tBT_UUID bt_uuid;
-                memset(&bt_uuid, 0, sizeof(tBT_UUID));
-                btif_to_bta_uuid(&bt_uuid, &uuid);
-
-                if (bt_uuid.len == LEN_UUID_16)
-                {
-                    btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_SERVICE;
-                    ++btif_cb.adv_data.data.services.num_service;
-                    *p_uuid_out++ = bt_uuid.uu.uuid16;
-
-                } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
-                    /* Currently, only one 128-bit UUID is supported */
-                    p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
-                    if (p_elem_service_128 != NULL)
-                    {
-                        p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
-                        if (p_elem_service_128->p_val != NULL)
-                        {
-                            p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
-                            p_elem_service_128->len = LEN_UUID_128;
-                            memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
-
-                        } else {
-                            GKI_freebuf(p_elem_service_128);
-                            p_elem_service_128 = NULL;
-                        }
-                    }
-                }
-
-                service_uuid += LEN_UUID_128;
-                service_uuid_len -= LEN_UUID_128;
-            }
-        }
-    }
-
-    if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
-    {
-        btif_cb.adv_data.data.p_proprietary = GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
-        if (btif_cb.adv_data.data.p_proprietary != NULL)
-        {
-            tBTA_BLE_PROPRIETARY *p_prop = btif_cb.adv_data.data.p_proprietary;
-            tBTA_BLE_PROP_ELEM *p_elem = NULL;
-            p_prop->num_elem = 0;
-            btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_PROPRIETARY;
-
-            if (p_elem_service_128 != NULL)
-                ++p_prop->num_elem;
-
-            if (p_elem_service_data != NULL)
-                ++p_prop->num_elem;
-
-            p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
-            p_elem = p_prop->p_elem;
-
-            if (p_elem_service_128 != NULL)
-            {
-                memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
-                GKI_freebuf(p_elem_service_128);
-            }
-
-            if (p_elem_service_data != NULL)
-            {
-                memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
-                GKI_freebuf(p_elem_service_data);
-            }
-        }
-    }
-
-#if (defined(BLE_PERIPHERAL_ADV_NAME) && (BLE_PERIPHERAL_ADV_NAME == TRUE))
-    btif_cb.adv_data.mask |= BTM_BLE_AD_BIT_DEV_NAME;
-#endif
-
-    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
-                                 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+    return status;
 }
 
 static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr )
@@ -1334,6 +1965,127 @@
                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
 }
 
+static bt_status_t btif_gattc_conn_parameter_update(const bt_bdaddr_t *bd_addr, int min_interval,
+                    int max_interval, int latency, int timeout)
+{
+    CHECK_BTGATT_INIT();
+    btif_conn_param_cb_t btif_cb;
+    btif_cb.min_interval = min_interval;
+    btif_cb.max_interval = max_interval;
+    btif_cb.latency = latency;
+    btif_cb.timeout = timeout;
+    bdcpy(btif_cb.bd_addr.address, bd_addr->address);
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONN_PARAM_UPDT,
+                                 (char*) &btif_cb, sizeof(btif_conn_param_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_param_setup(int client_if, int action,
+    int filt_index, int feat_seln, int list_logic_type, int filt_logic_type, int rssi_high_thres,
+    int rssi_low_thres, int dely_mode, int found_timeout, int lost_timeout, int found_timeout_cnt)
+{
+    CHECK_BTGATT_INIT();
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+    btgatt_adv_filter_cb_t btif_filt_cb;
+    memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+    btif_filt_cb.action = action;
+    btif_filt_cb.client_if = client_if;
+    btif_filt_cb.filt_index = filt_index;
+    btif_filt_cb.adv_filt_param.feat_seln = feat_seln;
+    btif_filt_cb.adv_filt_param.list_logic_type = list_logic_type;
+    btif_filt_cb.adv_filt_param.filt_logic_type = filt_logic_type;
+    btif_filt_cb.adv_filt_param.rssi_high_thres = rssi_high_thres;
+    btif_filt_cb.adv_filt_param.rssi_low_thres = rssi_low_thres;
+    btif_filt_cb.adv_filt_param.dely_mode = dely_mode;
+    btif_filt_cb.adv_filt_param.found_timeout = found_timeout;
+    btif_filt_cb.adv_filt_param.lost_timeout = lost_timeout;
+    btif_filt_cb.adv_filt_param.found_timeout_cnt = found_timeout_cnt;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_PARAM_SETUP,
+                                 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
+                              int filt_type, int filt_index, int company_id,
+                              int company_id_mask, const bt_uuid_t *p_uuid,
+                              const bt_uuid_t *p_uuid_mask, const bt_bdaddr_t *bd_addr,
+                              char addr_type, int data_len, char* p_data, int mask_len,
+                              char* p_mask)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_adv_filter_cb_t btif_filt_cb;
+    memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+    BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type);
+
+    /* If data is passed, both mask and data have to be the same length */
+    if (data_len != mask_len && NULL != p_data && NULL != p_mask)
+        return BT_STATUS_PARM_INVALID;
+
+    btif_filt_cb.client_if = client_if;
+    btif_filt_cb.action = action;
+    btif_filt_cb.filt_index = filt_index;
+    btif_filt_cb.filt_type = filt_type;
+    btif_filt_cb.conn_id = company_id;
+    btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
+    if (bd_addr)
+        bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
+
+    btif_filt_cb.addr_type = addr_type;
+    btif_filt_cb.has_mask = (p_uuid_mask != NULL);
+
+    if (p_uuid != NULL)
+        memcpy(&btif_filt_cb.uuid, p_uuid, sizeof(bt_uuid_t));
+    if (p_uuid_mask != NULL)
+        memcpy(&btif_filt_cb.uuid_mask, p_uuid_mask, sizeof(bt_uuid_t));
+    if (p_data != NULL && data_len != 0)
+    {
+        memcpy(btif_filt_cb.value, p_data, data_len);
+        btif_filt_cb.value_len = data_len;
+        memcpy(btif_filt_cb.value_mask, p_mask, mask_len);
+        btif_filt_cb.value_mask_len = mask_len;
+    }
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
+                                 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_clear(int client_if, int filt_index)
+{
+    CHECK_BTGATT_INIT();
+    BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, filt_index);
+
+    btgatt_adv_filter_cb_t btif_filt_cb;
+    memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+    btif_filt_cb.client_if = client_if;
+    btif_filt_cb.filt_index = filt_index;
+    btif_filt_cb.action = BTA_DM_BLE_SCAN_COND_CLEAR;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
+                                 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable)
+{
+    int action = 0;
+    CHECK_BTGATT_INIT();
+    BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, enable);
+
+    btgatt_adv_filter_cb_t btif_filt_cb;
+    memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
+    btif_filt_cb.client_if = client_if;
+    if (true == enable)
+        action = 1;
+    btif_filt_cb.action = action;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE,
+                                 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_set_scan_parameters(int scan_interval, int scan_window)
+{
+    CHECK_BTGATT_INIT();
+    btif_gattc_cb_t btif_cb;
+    btif_cb.scan_interval = scan_interval;
+    btif_cb.scan_window = scan_window;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_SCAN_PARAMS,
+                                 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
 static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr )
 {
     int device_type = 0;
@@ -1345,6 +2097,139 @@
     return 0;
 }
 
+static bt_status_t btif_gattc_multi_adv_enable(int client_if, int min_interval, int max_interval,
+                                            int adv_type, int chnl_map, int tx_power, int timeout_s)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_multi_adv_inst_cb adv_cb;
+    memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+    adv_cb.client_if = (uint8_t) client_if;
+
+    adv_cb.param.adv_int_min = min_interval;
+    adv_cb.param.adv_int_max = max_interval;
+    adv_cb.param.adv_type = adv_type;
+    adv_cb.param.channel_map = chnl_map;
+    adv_cb.param.adv_filter_policy = 0;
+    adv_cb.param.tx_power = tx_power;
+    adv_cb.timeout_s = timeout_s;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_ENABLE,
+                             (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_multi_adv_update(int client_if, int min_interval, int max_interval,
+                                            int adv_type, int chnl_map,int tx_power, int timeout_s)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_multi_adv_inst_cb adv_cb;
+    memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+    adv_cb.client_if = (uint8_t) client_if;
+
+    adv_cb.param.adv_int_min = min_interval;
+    adv_cb.param.adv_int_max = max_interval;
+    adv_cb.param.adv_type = adv_type;
+    adv_cb.param.channel_map = chnl_map;
+    adv_cb.param.adv_filter_policy = 0;
+    adv_cb.param.tx_power = tx_power;
+    adv_cb.timeout_s = timeout_s;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_UPDATE,
+                         (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_multi_adv_setdata(int client_if, bool set_scan_rsp,
+                bool include_name, bool incl_txpower, int appearance,
+                int manufacturer_len, char* manufacturer_data,
+                int service_data_len, char* service_data,
+                int service_uuid_len, char* service_uuid)
+{
+    CHECK_BTGATT_INIT();
+
+    int min_interval = 0, max_interval = 0;
+    bt_status_t status =0;
+
+    btif_adv_data_t multi_adv_data_inst;
+    memset(&multi_adv_data_inst, 0, sizeof(btif_adv_data_t));
+
+    btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name, incl_txpower,
+        min_interval, max_interval, appearance, manufacturer_len, manufacturer_data,
+        service_data_len, service_data, service_uuid_len, service_uuid, &multi_adv_data_inst);
+
+    status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_SET_DATA,
+                       (char*) &multi_adv_data_inst, sizeof(btif_adv_data_t), NULL);
+
+    if (NULL != multi_adv_data_inst.p_service_data)
+        GKI_freebuf(multi_adv_data_inst.p_service_data);
+
+    if (NULL != multi_adv_data_inst.p_service_uuid)
+        GKI_freebuf(multi_adv_data_inst.p_service_uuid);
+
+    if (NULL != multi_adv_data_inst.p_manufacturer_data)
+        GKI_freebuf(multi_adv_data_inst.p_manufacturer_data);
+
+    return status;
+}
+
+static bt_status_t btif_gattc_multi_adv_disable(int client_if)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_multi_adv_inst_cb adv_cb;
+    memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
+    adv_cb.client_if = (uint8_t) client_if;
+
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_DISABLE,
+                           (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
+}
+
+static bt_status_t btif_gattc_cfg_storage(int client_if,int batch_scan_full_max,
+    int batch_scan_trunc_max, int batch_scan_notify_threshold)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_batch_track_cb_t bt_scan_cb;
+    memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+    bt_scan_cb.client_if = (uint8_t) client_if;
+    bt_scan_cb.batch_scan_full_max = batch_scan_full_max;
+    bt_scan_cb.batch_scan_trunc_max = batch_scan_trunc_max;
+    bt_scan_cb.batch_scan_notify_threshold = batch_scan_notify_threshold;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIG_STORAGE_PARAMS,
+                                 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_enb_batch_scan(int client_if,int scan_mode, int scan_interval,
+                int scan_window, int addr_type, int discard_rule)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_batch_track_cb_t bt_scan_cb;
+    memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+    bt_scan_cb.client_if = (uint8_t) client_if;
+    bt_scan_cb.scan_mode = scan_mode;
+    bt_scan_cb.scan_interval = scan_interval;
+    bt_scan_cb.scan_window = scan_window;
+    bt_scan_cb.discard_rule = discard_rule;
+    bt_scan_cb.addr_type = addr_type;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ENABLE_BATCH_SCAN,
+                                 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_dis_batch_scan(int client_if)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_batch_track_cb_t bt_scan_cb;
+    memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+    bt_scan_cb.client_if = (uint8_t) client_if;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DISABLE_BATCH_SCAN,
+                                 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
+static bt_status_t btif_gattc_read_batch_scan_reports(int client_if, int scan_mode)
+{
+    CHECK_BTGATT_INIT();
+    btgatt_batch_track_cb_t bt_scan_cb;
+    memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
+    bt_scan_cb.client_if = (uint8_t) client_if;
+    bt_scan_cb.scan_mode = scan_mode;
+    return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_BATCH_SCAN_REPORTS,
+                                 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
+}
+
 extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params);
 
 static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params)
@@ -1373,9 +2258,23 @@
     btif_gattc_reg_for_notification,
     btif_gattc_dereg_for_notification,
     btif_gattc_read_remote_rssi,
+    btif_gattc_scan_filter_param_setup,
+    btif_gattc_scan_filter_add_remove,
+    btif_gattc_scan_filter_clear,
+    btif_gattc_scan_filter_enable,
     btif_gattc_get_device_type,
     btif_gattc_set_adv_data,
     btif_gattc_configure_mtu,
+    btif_gattc_conn_parameter_update,
+    btif_gattc_set_scan_parameters,
+    btif_gattc_multi_adv_enable,
+    btif_gattc_multi_adv_update,
+    btif_gattc_multi_adv_setdata,
+    btif_gattc_multi_adv_disable,
+    btif_gattc_cfg_storage,
+    btif_gattc_enb_batch_scan,
+    btif_gattc_dis_batch_scan,
+    btif_gattc_read_batch_scan_reports,
     btif_gattc_test_command
 };
 
diff --git a/btif/src/btif_gatt_multi_adv_util.c b/btif/src/btif_gatt_multi_adv_util.c
new file mode 100755
index 0000000..68fc3ba
--- /dev/null
+++ b/btif/src/btif_gatt_multi_adv_util.c
@@ -0,0 +1,648 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014  Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *
+ *  Filename:      btif_gatt_multi_adv_util.c
+ *
+ *  Description:   Multi ADV helper implementation
+ *
+ *******************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "btu.h"
+#include "bt_target.h"
+
+#define LOG_TAG "BtGatt.btif"
+#if (BLE_INCLUDED == TRUE)
+
+#include "btif_gatt_multi_adv_util.h"
+#include "btif_common.h"
+#include <hardware/bt_gatt.h>
+#include "bta_gatt_api.h"
+#include "btif_gatt_util.h"
+
+/*******************************************************************************
+**  Static variables
+********************************************************************************/
+static int multi_adv_enable_count = 0;
+static btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
+
+btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
+{
+    if(0 == BTM_BleMaxMultiAdvInstanceCount())
+    {
+        BTIF_TRACE_WARNING("%s - No instances found", __FUNCTION__);
+        return NULL;
+    }
+
+    BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, BTM_BleMaxMultiAdvInstanceCount());
+    if (NULL == p_multi_adv_com_data_cb)
+    {
+        BTIF_TRACE_DEBUG("Initializing in %s", __FUNCTION__);
+        p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+            memset(p_multi_adv_com_data_cb, 0, sizeof(btgatt_multi_adv_common_data));
+
+            /* Storing both client_if and inst_id details */
+            p_multi_adv_com_data_cb->clntif_map =
+                  GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+            memset(p_multi_adv_com_data_cb->clntif_map, 0 ,
+                  ( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+
+            p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() + 1 )
+                                              * sizeof(btgatt_multi_adv_inst_cb));
+            memset(p_multi_adv_com_data_cb->inst_cb, 0 ,
+                 ( BTM_BleMaxMultiAdvInstanceCount() + 1) * sizeof(btgatt_multi_adv_inst_cb));
+
+            for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i += 2)
+            {
+                p_multi_adv_com_data_cb->clntif_map[i] = INVALID_ADV_INST;
+                p_multi_adv_com_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
+            }
+        }
+    }
+
+    return p_multi_adv_com_data_cb;
+}
+
+void btif_gattc_init_multi_adv_cb(void)
+{
+    // TODO: Instead of using a fragile reference counter here, one could
+    //       simply track the client_if instances that are in the map.
+    ++multi_adv_enable_count;
+}
+
+void btif_gattc_destroy_multi_adv_cb(int client_if)
+{
+    if (multi_adv_enable_count > 0)
+        multi_adv_enable_count --;
+
+    if(multi_adv_enable_count == 0 && p_multi_adv_com_data_cb != 0)
+    {
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+            GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
+            GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
+            GKI_freebuf(p_multi_adv_com_data_cb);
+            p_multi_adv_com_data_cb = NULL;
+        }
+    }
+}
+
+int btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
+{
+    int i=1;
+
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+    if (NULL == p_multi_adv_data_cb)
+        return INVALID_ADV_INST;
+
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
+    {
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+       {
+          if (!gen_temp_instid)
+          {
+             // Write the final inst_id value obtained from stack layer
+             p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+             BTIF_TRACE_DEBUG("%s -Index: %d, Found client_if: %d", __FUNCTION__,
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
+             break;
+          }
+          else
+          {
+              //Store the passed in inst_id value
+             if (inst_id != INVALID_ADV_INST)
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+             else
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+
+             BTIF_TRACE_DEBUG("%s - Index:%d,Found client_if: %d", __FUNCTION__,
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
+             break;
+          }
+       }
+    }
+
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
+        return i;
+
+    // If client ID if is not found, then write both values
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
+    {
+        if (INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i + i])
+        {
+            p_multi_adv_data_cb->clntif_map[i + i] = client_if;
+            if (inst_id != INVALID_ADV_INST)
+               p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+            else
+                p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+            BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
+                            __FUNCTION__,i,
+                            p_multi_adv_data_cb->clntif_map[i + i],
+                            p_multi_adv_data_cb->clntif_map[i + (i + 1)]);
+            break;
+        }
+    }
+
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
+        return i;
+    return INVALID_ADV_INST;
+}
+
+int btif_multi_adv_instid_for_clientif(int client_if)
+{
+    int i=1, ret = INVALID_ADV_INST;
+
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+
+    if (NULL == p_multi_adv_data_cb)
+        return INVALID_ADV_INST;
+
+    // Retrieve the existing inst_id for the client_if value
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
+    {
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+       {
+           BTIF_TRACE_DEBUG("%s - Client if found", __FUNCTION__, client_if);
+           ret = p_multi_adv_data_cb->clntif_map[i + (i + 1)];
+       }
+    }
+
+    return ret;
+}
+
+int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index)
+{
+    int i=1;
+
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+
+    if (NULL == p_multi_adv_data_cb)
+        return INVALID_ADV_INST;
+
+    // Retrieve the array index for the inst_id value
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
+    {
+       if (value == p_multi_adv_data_cb->clntif_map[i + (i + clnt_inst_index)])
+           break;
+    }
+
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
+    {
+        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i);
+        return i;
+    }
+
+    BTIF_TRACE_DEBUG("%s Invalid instance",__FUNCTION__);
+    return INVALID_ADV_INST;
+}
+
+
+void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
+                bool include_name, bool include_txpower, int min_interval, int max_interval,
+                int appearance, int manufacturer_len, char* manufacturer_data,
+                int service_data_len, char* service_data, int service_uuid_len,
+                char* service_uuid, btif_adv_data_t *p_multi_adv_inst)
+{
+    memset(p_multi_adv_inst, 0 , sizeof(btif_adv_data_t));
+
+    p_multi_adv_inst->client_if = (uint8_t) client_if;
+    p_multi_adv_inst->set_scan_rsp = set_scan_rsp;
+    p_multi_adv_inst->include_name = include_name;
+    p_multi_adv_inst->include_txpower = include_txpower;
+    p_multi_adv_inst->min_interval = min_interval;
+    p_multi_adv_inst->max_interval = max_interval;
+    p_multi_adv_inst->appearance = appearance;
+    p_multi_adv_inst->manufacturer_len = manufacturer_len;
+
+    if (manufacturer_len > 0)
+    {
+        p_multi_adv_inst->p_manufacturer_data = GKI_getbuf(manufacturer_len);
+        memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
+    }
+
+    p_multi_adv_inst->service_data_len = service_data_len;
+    if (service_data_len > 0)
+    {
+        p_multi_adv_inst->p_service_data = GKI_getbuf(service_data_len);
+        memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
+    }
+
+    p_multi_adv_inst->service_uuid_len = service_uuid_len;
+    if (service_uuid_len > 0)
+    {
+        p_multi_adv_inst->p_service_uuid = GKI_getbuf(service_uuid_len);
+        memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
+    }
+}
+
+BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN bInstData)
+{
+    int i=0;
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+    if (NULL == p_multi_adv_data_cb || cbindex < 0)
+       return false;
+
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+    memset(&p_multi_adv_data_cb->inst_cb[cbindex].data, 0, sizeof(tBTA_BLE_ADV_DATA));
+    p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
+
+    p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp = p_adv_data->set_scan_rsp ? 1 : 0;
+    if (!p_adv_data->set_scan_rsp)
+    {
+         p_multi_adv_data_cb->inst_cb[cbindex].mask = BTM_BLE_AD_BIT_FLAGS;
+         p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_GENERAL;
+         if (p_multi_adv_data_cb->inst_cb[cbindex].timeout_s)
+             p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_LIMITED;
+         if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_type == BTA_BLE_NON_CONNECT_EVT)
+             p_multi_adv_data_cb->inst_cb[cbindex].data.flag &=
+                    ~(BTA_DM_LIMITED_DISC | BTA_DM_GENERAL_DISC);
+         if (p_multi_adv_data_cb->inst_cb[cbindex].data.flag == 0)
+            p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
+    }
+
+    if (p_adv_data->include_name)
+        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
+
+    if (p_adv_data->include_txpower)
+        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_TX_PWR;
+
+    if (false == bInstData && p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 &&
+        p_adv_data->max_interval > p_adv_data->min_interval)
+    {
+        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_INT_RANGE;
+        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
+                                        p_adv_data->min_interval;
+        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
+                                        p_adv_data->max_interval;
+    }
+    else
+    if (true == bInstData)
+    {
+        if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
+            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
+            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max >
+            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min)
+        {
+              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
+              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min;
+              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
+              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max;
+        }
+
+        if (p_adv_data->include_txpower)
+        {
+            p_multi_adv_data_cb->inst_cb[cbindex].data.tx_power =
+                p_multi_adv_data_cb->inst_cb[cbindex].param.tx_power;
+        }
+    }
+
+    if (p_adv_data->appearance != 0)
+    {
+        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_APPEARANCE;
+        p_multi_adv_data_cb->inst_cb[cbindex].data.appearance = p_adv_data->appearance;
+    }
+
+    if (p_adv_data->manufacturer_len > 0 && p_adv_data->p_manufacturer_data != NULL)
+    {
+         p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu =
+                            GKI_getbuf(sizeof(tBTA_BLE_MANU));
+         if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
+         {
+            p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val =
+                            GKI_getbuf(p_adv_data->manufacturer_len);
+            if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val != NULL)
+            {
+                 p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_MANU;
+                 p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->len =
+                                p_adv_data->manufacturer_len;
+                 memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val,
+                    p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len);
+            }
+         }
+    }
+
+    tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
+    if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL)
+    {
+         BTIF_TRACE_DEBUG("%s - In service_data", __FUNCTION__);
+         p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
+         if (p_elem_service_data != NULL)
+         {
+             p_elem_service_data->p_val = GKI_getbuf(p_adv_data->service_data_len);
+             if (p_elem_service_data->p_val != NULL)
+             {
+                 p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
+                 p_elem_service_data->len = p_adv_data->service_data_len;
+                 memcpy(p_elem_service_data->p_val, p_adv_data->p_service_data,
+                             p_adv_data->service_data_len);
+             } else {
+                     GKI_freebuf(p_elem_service_data);
+                     p_elem_service_data = NULL;
+               }
+         }
+    }
+
+    if (NULL != p_elem_service_data)
+    {
+        p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary =
+                                                   GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
+        if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary)
+        {
+            tBTA_BLE_PROP_ELEM *p_elem = NULL;
+            tBTA_BLE_PROPRIETARY *p_prop = p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary;
+            p_prop->num_elem = 0;
+            p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
+            p_prop->num_elem = 1;
+            p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
+            p_elem = p_prop->p_elem;
+            if (NULL != p_elem)
+                memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
+            GKI_freebuf(p_elem_service_data);
+        }
+    }
+
+    if (p_adv_data->service_uuid_len > 0 && NULL != p_adv_data->p_service_uuid)
+    {
+        UINT16 *p_uuid_out16 = NULL;
+        UINT32 *p_uuid_out32 = NULL;
+        while (p_adv_data->service_uuid_len >= LEN_UUID_128)
+        {
+             bt_uuid_t uuid;
+             memset(&uuid, 0, sizeof(bt_uuid_t));
+             memcpy(&uuid.uu, p_adv_data->p_service_uuid, LEN_UUID_128);
+
+             tBT_UUID bt_uuid;
+             memset(&bt_uuid, 0, sizeof(tBT_UUID));
+             btif_to_bta_uuid(&bt_uuid, &uuid);
+
+             switch(bt_uuid.len)
+             {
+                case (LEN_UUID_16):
+                {
+                  if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services)
+                  {
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services =
+                                                          GKI_getbuf(sizeof(tBTA_BLE_SERVICE));
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->list_cmpl = FALSE;
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service = 0;
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid =
+                              GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
+                      p_uuid_out16 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid;
+                  }
+
+                  if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid)
+                  {
+                     BTIF_TRACE_DEBUG("%s - In 16-UUID_data", __FUNCTION__);
+                     p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
+                     ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service;
+                     *p_uuid_out16++ = bt_uuid.uu.uuid16;
+                  }
+                  break;
+                }
+
+                case (LEN_UUID_32):
+                {
+                   if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b)
+                   {
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b =
+                                                          GKI_getbuf(sizeof(tBTA_BLE_32SERVICE));
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->list_cmpl = FALSE;
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service = 0;
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid =
+                             GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_32);
+                      p_uuid_out32 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid;
+                   }
+
+                   if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid)
+                   {
+                      BTIF_TRACE_DEBUG("%s - In 32-UUID_data", __FUNCTION__);
+                      p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_32;
+                      ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service;
+                      *p_uuid_out32++ = bt_uuid.uu.uuid32;
+                   }
+                   break;
+                }
+
+                case (LEN_UUID_128):
+                {
+                   /* Currently, only one 128-bit UUID is supported */
+                   if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
+                   {
+                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b =
+                                                          GKI_getbuf(sizeof(tBTA_BLE_128SERVICE));
+                      if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
+                      {
+                         BTIF_TRACE_DEBUG("%s - In 128-UUID_data", __FUNCTION__);
+                         p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_128;
+                         memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->uuid128,
+                                                         bt_uuid.uu.uuid128, LEN_UUID_128);
+                         BTIF_TRACE_DEBUG("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x", bt_uuid.uu.uuid128[0],
+                            bt_uuid.uu.uuid128[1],bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3],
+                            bt_uuid.uu.uuid128[4],bt_uuid.uu.uuid128[5],bt_uuid.uu.uuid128[6],
+                            bt_uuid.uu.uuid128[7],bt_uuid.uu.uuid128[8],bt_uuid.uu.uuid128[9],
+                            bt_uuid.uu.uuid128[10],bt_uuid.uu.uuid128[11],bt_uuid.uu.uuid128[12],
+                            bt_uuid.uu.uuid128[13],bt_uuid.uu.uuid128[14],bt_uuid.uu.uuid128[15]);
+                         p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->list_cmpl = TRUE;
+                      }
+                   }
+                   break;
+                }
+
+                default:
+                     break;
+             }
+
+             p_adv_data->p_service_uuid += LEN_UUID_128;
+             p_adv_data->service_uuid_len -= LEN_UUID_128;
+        }
+    }
+
+#if (defined(BLE_PERIPHERAL_ADV_NAME) && (BLE_PERIPHERAL_ADV_NAME == TRUE))
+     p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
+#endif
+     return true;
+}
+
+void btif_gattc_clear_clientif(int client_if)
+{
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+    if (NULL == p_multi_adv_data_cb)
+        return;
+
+    // Clear both the inst_id and client_if values
+    for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i+=2)
+    {
+        if (client_if == p_multi_adv_data_cb->clntif_map[i])
+        {
+            btif_gattc_cleanup_inst_cb(p_multi_adv_data_cb->clntif_map[i+1]);
+            p_multi_adv_data_cb->clntif_map[i] = INVALID_ADV_INST;
+            p_multi_adv_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
+            BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i/2, client_if);
+            break;
+        }
+    }
+}
+
+void btif_gattc_cleanup_inst_cb(int inst_id)
+{
+    int cbindex = 0;
+    // Check for invalid instance id
+    if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
+        return;
+
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+    if (NULL == p_multi_adv_data_cb)
+        return;
+
+    if (inst_id > 0)
+    {
+        cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
+        if (cbindex < 0)
+            return;
+    } else {
+        if (STD_ADV_INSTID == inst_id)
+          cbindex = STD_ADV_INSTID;
+    }
+
+    if (inst_id != INVALID_ADV_INST)
+    {
+        BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
+        btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
+        p_multi_adv_data_cb->inst_cb[cbindex].inst_id = INVALID_ADV_INST;
+    }
+}
+
+void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
+{
+    if (p_multi_inst_cb == NULL)
+        return;
+
+    // Discoverability timer cleanup
+    if (p_multi_inst_cb->tle_limited_timer.in_use)
+        btu_stop_timer_oneshot(&p_multi_inst_cb->tle_limited_timer);
+
+    // Manufacturer data cleanup
+    if (p_multi_inst_cb->data.p_manu != NULL)
+    {
+        if (p_multi_inst_cb->data.p_manu->p_val != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_manu->p_val);
+        GKI_freebuf(p_multi_inst_cb->data.p_manu);
+    }
+
+    // Proprietary data cleanup
+    if (p_multi_inst_cb->data.p_proprietary != NULL)
+    {
+        int i = 0;
+        tBTA_BLE_PROP_ELEM *p_elem = p_multi_inst_cb->data.p_proprietary->p_elem;
+        while (i++ != p_multi_inst_cb->data.p_proprietary->num_elem
+            && p_elem)
+        {
+            if (p_elem->p_val != NULL)
+                GKI_freebuf(p_elem->p_val);
+            ++p_elem;
+        }
+
+        if (p_multi_inst_cb->data.p_proprietary->p_elem != NULL)
+            GKI_freebuf(p_multi_inst_cb->data.p_proprietary->p_elem);
+        GKI_freebuf(p_multi_inst_cb->data.p_proprietary);
+    }
+
+    // Service list cleanup
+    if (p_multi_inst_cb->data.p_services != NULL)
+    {
+        if (p_multi_inst_cb->data.p_services->p_uuid != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_services->p_uuid);
+        GKI_freebuf(p_multi_inst_cb->data.p_services);
+    }
+
+    // Service data cleanup
+    if (p_multi_inst_cb->data.p_service_data != NULL)
+    {
+        if (p_multi_inst_cb->data.p_service_data->p_val != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_service_data->p_val);
+        GKI_freebuf(p_multi_inst_cb->data.p_service_data);
+    }
+
+    if (p_multi_inst_cb->data.p_services_128b != NULL)
+        GKI_freebuf(p_multi_inst_cb->data.p_services_128b);
+
+    if (p_multi_inst_cb->data.p_service_32b != NULL)
+    {
+        if (p_multi_inst_cb->data.p_service_32b->p_uuid != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_service_32b->p_uuid);
+        GKI_freebuf(p_multi_inst_cb->data.p_service_32b);
+    }
+
+    if (p_multi_inst_cb->data.p_sol_services != NULL)
+    {
+        if (p_multi_inst_cb->data.p_sol_services->p_uuid != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_sol_services->p_uuid);
+        GKI_freebuf(p_multi_inst_cb->data.p_sol_services);
+    }
+
+    if (p_multi_inst_cb->data.p_sol_service_32b != NULL)
+    {
+        if (p_multi_inst_cb->data.p_sol_service_32b->p_uuid != NULL)
+           GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b->p_uuid);
+        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
+    }
+
+    if (p_multi_inst_cb->data.p_sol_service_128b != NULL)
+        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
+}
+
+void btif_multi_adv_timer_ctrl(int client_if, TIMER_CBACK cb)
+{
+    int inst_id = btif_multi_adv_instid_for_clientif(client_if);
+    if (inst_id == INVALID_ADV_INST)
+        return;
+
+    int cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
+    if (cbindex == INVALID_ADV_INST)
+        return;
+
+    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
+    if (p_multi_adv_data_cb == NULL)
+        return;
+
+    if (cb == NULL)
+    {
+        if (p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.in_use)
+            btu_stop_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer);
+    } else {
+        if (p_multi_adv_data_cb->inst_cb[cbindex].timeout_s != 0)
+        {
+            if (p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.in_use)
+                btu_stop_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer);
+
+            memset(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer, 0, sizeof(TIMER_LIST_ENT));
+            p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.param = (UINT32)cb;
+            p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer.data = (UINT32)client_if;
+            btu_start_timer_oneshot(&p_multi_adv_data_cb->inst_cb[cbindex].tle_limited_timer,
+                    BTU_TTYPE_USER_FUNC, p_multi_adv_data_cb->inst_cb[cbindex].timeout_s);
+        }
+    }
+}
+
+#endif
diff --git a/btif/src/btif_gatt_server.c b/btif/src/btif_gatt_server.c
index 9fc4fad..503b5a3 100644
--- a/btif/src/btif_gatt_server.c
+++ b/btif/src/btif_gatt_server.c
@@ -100,9 +100,10 @@
     uint8_t             is_direct;
     uint8_t             num_handles;
     uint8_t             properties;
-    uint8_t             transport;
     uint8_t             confirm;
     uint8_t             status;
+    btgatt_transport_t  transport;
+
 } __attribute__((packed)) btif_gatts_cb_t;
 
 
@@ -320,6 +321,18 @@
             break;
         }
 
+        case BTA_GATTS_CONF_EVT:
+            HAL_CBACK(bt_gatt_callbacks, server->indication_sent_cb,
+                      p_data->req_data.conn_id, p_data->req_data.status);
+            break;
+
+        case BTA_GATTS_CONGEST_EVT:
+            HAL_CBACK(bt_gatt_callbacks, server->congestion_cb
+                , p_data->congest.conn_id
+                , p_data->congest.congested
+            );
+            break;
+
         case BTA_GATTS_MTU_EVT:
         case BTA_GATTS_OPEN_EVT:
         case BTA_GATTS_CANCEL_OPEN_EVT:
@@ -369,6 +382,7 @@
             // Ensure device is in inquiry database
             int addr_type = 0;
             int device_type = 0;
+            tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
 
             if (btif_get_device_type(p_cb->bd_addr.address, &addr_type, &device_type) == TRUE
                   && device_type != BT_DEVICE_TYPE_BREDR)
@@ -378,9 +392,32 @@
             if (!p_cb->is_direct)
                 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
 
+            switch(device_type)
+            {
+                case BT_DEVICE_TYPE_BREDR:
+                    transport = BTA_GATT_TRANSPORT_BR_EDR;
+                    break;
+
+                case BT_DEVICE_TYPE_BLE:
+                    transport = BTA_GATT_TRANSPORT_LE;
+                    break;
+
+                case BT_DEVICE_TYPE_DUMO:
+                    if ((p_cb->transport == GATT_TRANSPORT_LE) &&
+                        (btif_storage_is_dmt_supported_device(&(p_cb->bd_addr)) == TRUE))
+                        transport = BTA_GATT_TRANSPORT_LE;
+                    else
+                        transport = BTA_GATT_TRANSPORT_BR_EDR;
+                    break;
+
+                default:
+                    BTIF_TRACE_ERROR (" GATT Open :Invalid device type %d",device_type);
+                    return;
+            }
+
             // Connect!
             BTA_GATTS_Open(p_cb->server_if, p_cb->bd_addr.address,
-                           p_cb->is_direct);
+                           p_cb->is_direct, transport);
             break;
         }
 
@@ -489,12 +526,14 @@
                                  (char*) &btif_cb, sizeof(btif_gatts_cb_t), NULL);
 }
 
-static bt_status_t btif_gatts_open( int server_if, const bt_bdaddr_t *bd_addr, bool is_direct )
+static bt_status_t btif_gatts_open( int server_if, const bt_bdaddr_t *bd_addr,
+                                      bool is_direct, int transport )
 {
     CHECK_BTGATT_INIT();
     btif_gatts_cb_t btif_cb;
     btif_cb.server_if = (uint8_t) server_if;
     btif_cb.is_direct = is_direct ? 1 : 0;
+    btif_cb.transport = (btgatt_transport_t)transport;
     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
     return btif_transfer_context(btgatts_handle_event, BTIF_GATTS_OPEN,
                                  (char*) &btif_cb, sizeof(btif_gatts_cb_t), NULL);
diff --git a/btif/src/btif_gatt_test.c b/btif/src/btif_gatt_test.c
index a2cca6a..4d71ad9 100644
--- a/btif/src/btif_gatt_test.c
+++ b/btif/src/btif_gatt_test.c
@@ -101,11 +101,12 @@
 }
 
 static void btif_test_connect_cback(tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
-                                    BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                    BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport)
 {
     UNUSED(gatt_if);
     UNUSED(bda);
     UNUSED(reason);
+    UNUSED (transport);
 
     ALOGD("%s: conn_id=%d, connected=%d", __FUNCTION__, conn_id, connected);
     test_cb.conn_id = connected ? conn_id : 0;
@@ -205,6 +206,7 @@
     btif_test_discovery_result_cback,
     btif_test_discovery_complete_cback,
     NULL,
+    NULL,
     NULL
 };
 
@@ -232,17 +234,17 @@
 
         case 0x02: /* Connect */
         {
-            ALOGD("%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x (dev_type=%d)",
+            ALOGD("%s: CONNECT - device=%02x:%02x:%02x:%02x:%02x:%02x (dev_type=%d, addr_type=%d)",
                 __FUNCTION__,
                 params->bda1->address[0], params->bda1->address[1],
                 params->bda1->address[2], params->bda1->address[3],
                 params->bda1->address[4], params->bda1->address[5],
-                params->u1);
+                params->u1, params->u2);
 
             if (params->u1 == BT_DEVICE_TYPE_BLE)
-                BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE, 0);
+                BTM_SecAddBleDevice(params->bda1->address, NULL, BT_DEVICE_TYPE_BLE, params->u2);
 
-            if ( !GATT_Connect(test_cb.gatt_if, params->bda1->address, TRUE) )
+            if ( !GATT_Connect(test_cb.gatt_if, params->bda1->address, TRUE, BT_TRANSPORT_LE) )
             {
                 ALOGE("%s: GATT_Connect failed!", __FUNCTION__);
             }
diff --git a/btif/src/btif_gatt_util.c b/btif/src/btif_gatt_util.c
index 715dcd6..348bcea 100644
--- a/btif/src/btif_gatt_util.c
+++ b/btif/src/btif_gatt_util.c
@@ -43,13 +43,11 @@
 #define GATTC_READ_VALUE_TYPE_VALUE          0x0000  /* Attribute value itself */
 #define GATTC_READ_VALUE_TYPE_AGG_FORMAT     0x2905  /* Characteristic Aggregate Format*/
 
-static char BASE_UUID[16] = {
+static unsigned char BASE_UUID[16] = {
     0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
     0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 
-extern bt_status_t btif_dm_remove_bond(const bt_bdaddr_t *bd_addr);
-
 int uuidType(unsigned char* p_uuid)
 {
     int i = 0;
@@ -131,6 +129,32 @@
     memcpy(p_dest->attr_value.value, p_src->attr_value.value, GATT_MAX_ATTR_LEN);
 }
 
+void btif_to_bta_uuid_mask(tBTA_DM_BLE_PF_COND_MASK *p_mask, bt_uuid_t *p_src)
+{
+    char *p_byte = (char*)p_src;
+    int i = 0;
+
+    switch (uuidType(p_src->uu))
+    {
+        case LEN_UUID_16:
+            p_mask->uuid16_mask = (p_src->uu[13] << 8) + p_src->uu[12];
+            break;
+
+        case LEN_UUID_32:
+            p_mask->uuid32_mask = (p_src->uu[13] <<  8) + p_src->uu[12];
+            p_mask->uuid32_mask += (p_src->uu[15] << 24) + (p_src->uu[14] << 16);
+            break;
+
+        case LEN_UUID_128:
+            for(i = 0; i != 16; ++i)
+                p_mask->uuid128_mask[i] = p_byte[i];
+            break;
+
+        default:
+            break;
+    }
+}
+
 /*******************************************************************************
  * BTA -> BTIF conversion functions
  *******************************************************************************/
@@ -259,7 +283,7 @@
  * Encrypted link map handling
  *******************************************************************************/
 
-static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result);
+static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result);
 
 static BOOLEAN btif_gatt_is_link_encrypted (BD_ADDR bd_addr)
 {
@@ -269,14 +293,14 @@
     return BTA_JvIsEncrypted(bd_addr);
 }
 
-static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result)
+static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result)
 {
+    UNUSED(bd_addr);
+    UNUSED(transport);
+
     if (result != BTA_SUCCESS && result != BTA_BUSY)
     {
-        bt_bdaddr_t bda;
-        bdcpy(bda.address, bd_addr);
-
-        btif_dm_remove_bond(&bda);
+        BTIF_TRACE_WARNING("%s() - Encryption failed (%d)", __FUNCTION__, result);
     }
 }
 
@@ -286,16 +310,39 @@
 
     bt_bdaddr_t bda;
     bdcpy(bda.address, bd_addr);
+    int device_type = 0;
+    int addr_type = 0;
 
+#if (!defined(BLE_DELAY_REQUEST_ENC) || (BLE_DELAY_REQUEST_ENC == FALSE))
     if ((btif_storage_get_ble_bonding_key(&bda, BTIF_DM_LE_KEY_PENC,
                     buf, sizeof(btif_dm_ble_penc_keys_t)) == BT_STATUS_SUCCESS)
         && !btif_gatt_is_link_encrypted(bd_addr))
     {
-#if (!defined(BLE_DELAY_REQUEST_ENC) || (BLE_DELAY_REQUEST_ENC == FALSE))
-        BTA_DmSetEncryption(bd_addr,
+        tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
+
+        btif_get_device_type(bd_addr, &addr_type, &device_type);
+        switch(device_type)
+        {
+            case BT_DEVICE_TYPE_BREDR:
+                transport = BTA_GATT_TRANSPORT_BR_EDR;
+                break;
+
+            case BT_DEVICE_TYPE_BLE:
+                transport = BTA_GATT_TRANSPORT_LE;
+                break;
+
+            case BT_DEVICE_TYPE_DUMO:
+                transport = BTA_GATT_TRANSPORT_LE_BR_EDR;
+                break;
+
+            default:
+                BTIF_TRACE_ERROR (" GATT Encrypt :Invalid device type %d",device_type);
+                return;
+        }
+        BTA_DmSetEncryption(bd_addr,transport,
                             &btif_gatt_set_encryption_cb, BTM_BLE_SEC_ENCRYPT);
-#endif
     }
+#endif
 }
 
 /*******************************************************************************
diff --git a/btif/src/btif_hf.c b/btif/src/btif_hf.c
index b4ade0d..c0cc4df 100644
--- a/btif/src/btif_hf.c
+++ b/btif/src/btif_hf.c
@@ -60,6 +60,19 @@
 #define BTIF_HF_SECURITY    (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
 #endif
 
+#if (BTM_WBS_INCLUDED == TRUE )
+#ifndef BTIF_HF_FEATURES
+#define BTIF_HF_FEATURES   ( BTA_AG_FEAT_3WAY | \
+                             BTA_AG_FEAT_ECNR   | \
+                             BTA_AG_FEAT_REJECT | \
+                             BTA_AG_FEAT_ECS    | \
+                             BTA_AG_FEAT_EXTERR | \
+                             BTA_AG_FEAT_BTRH   | \
+                             BTA_AG_FEAT_VREC   | \
+                             BTA_AG_FEAT_CODEC |\
+                             BTA_AG_FEAT_UNAT)
+#endif
+#else
 #ifndef BTIF_HF_FEATURES
 #define BTIF_HF_FEATURES   ( BTA_AG_FEAT_3WAY | \
                              BTA_AG_FEAT_ECNR   | \
@@ -70,11 +83,33 @@
                              BTA_AG_FEAT_VREC   | \
                              BTA_AG_FEAT_UNAT)
 #endif
-
-#define BTIF_HF_ID_1        0
+#endif
 
 #define BTIF_HF_CALL_END_TIMEOUT       6
 
+#define BTIF_HF_INVALID_IDX       -1
+
+/* Number of BTIF-HF control blocks */
+#define BTIF_HF_NUM_CB       2
+
+/* Max HF clients supported from App */
+UINT16 btif_max_hf_clients = -1;
+
+/* HF app ids for service registration */
+typedef enum {
+    BTIF_HF_ID_1 = 0,
+    BTIF_HF_ID_2,
+#if (BTIF_HF_NUM_CB == 3)
+    BTIF_HF_ID_3
+#endif
+} bthf_hf_id_t;
+
+UINT16 bthf_hf_id[BTIF_HF_NUM_CB] = {BTIF_HF_ID_1, BTIF_HF_ID_2,
+                                    #if (BTIF_HF_NUM_CB == 3)
+                                        BTIF_HF_ID_3
+                                    #endif
+                                    };
+
 /************************************************************************************
 **  Local type definitions
 ************************************************************************************/
@@ -83,30 +118,31 @@
 **  Static variables
 ************************************************************************************/
 static bthf_callbacks_t *bt_hf_callbacks = NULL;
+static int hf_idx = BTIF_HF_INVALID_IDX;
 
 #define CHECK_BTHF_INIT() if (bt_hf_callbacks == NULL)\
     {\
-        BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
+        BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);\
         return BT_STATUS_NOT_READY;\
     }\
     else\
     {\
-        BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
+        BTIF_TRACE_EVENT("BTHF: %s", __FUNCTION__);\
     }
 
 #define CHECK_BTHF_SLC_CONNECTED() if (bt_hf_callbacks == NULL)\
     {\
-        BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
+        BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);\
         return BT_STATUS_NOT_READY;\
     }\
     else if (btif_hf_cb.state != BTHF_CONNECTION_STATE_SLC_CONNECTED)\
     {\
-        BTIF_TRACE_WARNING2("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\
+        BTIF_TRACE_WARNING("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\
         return BT_STATUS_NOT_READY;\
     }\
     else\
     {\
-        BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
+        BTIF_TRACE_EVENT("BTHF: %s", __FUNCTION__);\
     }
 
 /* BTIF-HF control block to map bdaddr to BTA handle */
@@ -120,10 +156,11 @@
     int                     num_active;
     int                     num_held;
     struct timespec         call_end_timestamp;
+    struct timespec         connected_timestamp;
     bthf_call_state_t       call_setup_state;
 } btif_hf_cb_t;
 
-static btif_hf_cb_t btif_hf_cb;
+static btif_hf_cb_t btif_hf_cb[BTIF_HF_NUM_CB];
 
 
 /************************************************************************************
@@ -133,6 +170,14 @@
 /************************************************************************************
 **  Externs
 ************************************************************************************/
+/* By default, even though codec negotiation is enabled, we will not use WBS as the default
+* codec unless this variable is set to TRUE.
+*/
+#ifndef BTIF_HF_WBS_PREFERRED
+#define BTIF_HF_WBS_PREFERRED   FALSE
+#endif
+
+BOOLEAN btif_conf_hf_force_wbs = BTIF_HF_WBS_PREFERRED;
 
 /************************************************************************************
 **  Functions
@@ -149,15 +194,41 @@
 *******************************************************************************/
 static BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
 {
-    if (((btif_hf_cb.state == BTHF_CONNECTION_STATE_CONNECTED) || (btif_hf_cb.state == BTHF_CONNECTION_STATE_SLC_CONNECTED))&&
-        ((bd_addr == NULL) || (bdcmp(bd_addr->address, btif_hf_cb.connected_bda.address) == 0)))
-        return TRUE;
-    else
+        int i;
+        for (i = 0; i < btif_max_hf_clients; ++i)
+        {
+            if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
+                 (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)) &&
+                 ((bd_addr == NULL) || (bdcmp(bd_addr->address,
+                                     btif_hf_cb[i].connected_bda.address) == 0)))
+                return TRUE;
+        }
         return FALSE;
 }
 
 /*******************************************************************************
 **
+** Function         btif_hf_idx_by_bdaddr
+**
+** Description      Internal function to get idx by bdaddr
+**
+** Returns          idx
+**
+*******************************************************************************/
+static int btif_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr)
+{
+        int i;
+        for (i = 0; i < btif_max_hf_clients; ++i)
+        {
+            if ((bdcmp(bd_addr->address,
+                                  btif_hf_cb[i].connected_bda.address) == 0))
+                return i;
+        }
+        return BTIF_HF_INVALID_IDX;
+}
+
+/*******************************************************************************
+**
 ** Function         callstate_to_callsetup
 **
 ** Description      Converts HAL call state to BTA call setup indicator value
@@ -187,7 +258,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void send_at_result(UINT8 ok_flag, UINT16 errcode)
+static void send_at_result(UINT8 ok_flag, UINT16 errcode, int idx)
 {
     tBTA_AG_RES_DATA    ag_res;
     memset (&ag_res, 0, sizeof (ag_res));
@@ -198,7 +269,7 @@
         ag_res.errcode = errcode;
     }
 
-    BTA_AgResult (btif_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res);
+    BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
 }
 
 /*******************************************************************************
@@ -221,12 +292,77 @@
     BTA_AgResult(BTA_AG_HANDLE_ALL, BTA_AG_IND_RES, &ag_res);
 }
 
-void clear_phone_state()
+void clear_phone_state_multihf(int idx)
 {
-    btif_hf_cb.call_setup_state = BTHF_CALL_STATE_IDLE;
-    btif_hf_cb.num_active = btif_hf_cb.num_held = 0;
+    btif_hf_cb[idx].call_setup_state = BTHF_CALL_STATE_IDLE;
+    btif_hf_cb[idx].num_active = btif_hf_cb[idx].num_held = 0;
 }
 
+/*******************************************************************************
+**
+** Function         btif_hf_latest_connected_idx
+**
+** Description      Returns idx for latest connected HF
+**
+** Returns          int
+**
+*******************************************************************************/
+static int btif_hf_latest_connected_idx()
+{
+      struct timespec         now, conn_time_delta;
+      int latest_conn_idx = BTIF_HF_INVALID_IDX, i;
+
+      clock_gettime(CLOCK_MONOTONIC, &now);
+      conn_time_delta.tv_sec = now.tv_sec;
+
+      for (i = 0; i < btif_max_hf_clients; i++)
+      {
+          if (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)
+          {
+              if ((now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec)
+                                            < conn_time_delta.tv_sec)
+              {
+                  conn_time_delta.tv_sec =
+                       now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec;
+                  latest_conn_idx = i;
+              }
+          }
+      }
+      return latest_conn_idx;
+}
+
+/*******************************************************************************
+**
+** Function         btif_hf_check_if_slc_connected
+**
+** Description      Returns BT_STATUS_SUCCESS if SLC is up for any HF
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t btif_hf_check_if_slc_connected()
+{
+    if (bt_hf_callbacks == NULL)
+    {
+        BTIF_TRACE_WARNING("BTHF: %s: BTHF not initialized", __FUNCTION__);
+        return BT_STATUS_NOT_READY;
+    }
+    else
+    {
+        int i;
+        for (i = 0; i < btif_max_hf_clients; i++)
+        {
+            if ((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED))
+            {
+                BTIF_TRACE_EVENT("BTHF: %s: slc connected for idx = %d",
+                                         __FUNCTION__, i);
+                return BT_STATUS_SUCCESS;
+            }
+        }
+        BTIF_TRACE_WARNING("BTHF: %s: No SLC connection up", __FUNCTION__);
+        return BT_STATUS_NOT_READY;
+    }
+}
 
 /*****************************************************************************
 **   Section name (Group of functions)
@@ -252,8 +388,10 @@
 {
     tBTA_AG *p_data = (tBTA_AG *)p_param;
     bdstr_t bdstr;
+    bt_bdaddr_t addr;
+    int idx = p_data->hdr.handle - 1;
 
-    BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hf_event(event));
+    BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_hf_event(event));
 
     switch (event)
     {
@@ -262,43 +400,54 @@
             break;
 
         case BTA_AG_REGISTER_EVT:
-            btif_hf_cb.handle = p_data->reg.hdr.handle;
+            btif_hf_cb[idx].handle = p_data->reg.hdr.handle;
+            BTIF_TRACE_DEBUG("%s: BTA_AG_REGISTER_EVT,"
+              "btif_hf_cb.handle = %d", __FUNCTION__, btif_hf_cb[idx].handle);
             break;
 
         case BTA_AG_OPEN_EVT:
             if (p_data->open.status == BTA_AG_SUCCESS)
             {
-                bdcpy(btif_hf_cb.connected_bda.address, p_data->open.bd_addr);
-                btif_hf_cb.state = BTHF_CONNECTION_STATE_CONNECTED;
-                btif_hf_cb.peer_feat = 0;
-                clear_phone_state();
+                bdcpy(btif_hf_cb[idx].connected_bda.address,
+                                  p_data->open.bd_addr);
+                btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_CONNECTED;
+                btif_hf_cb[idx].peer_feat = 0;
+                clear_phone_state_multihf(idx);
             }
-            else if (btif_hf_cb.state == BTHF_CONNECTION_STATE_CONNECTING)
+            else if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_CONNECTING)
             {
-                btif_hf_cb.state = BTHF_CONNECTION_STATE_DISCONNECTED;
+                btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
             }
             else
             {
-                BTIF_TRACE_WARNING4("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s",
-                        __FUNCTION__, p_data->open.status, btif_hf_cb.state, bd2str(&btif_hf_cb.connected_bda, &bdstr));
+                BTIF_TRACE_WARNING("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s",
+                        __FUNCTION__, p_data->open.status, btif_hf_cb[idx].state,
+                                 bd2str(&btif_hf_cb[idx].connected_bda, &bdstr));
                 break;
             }
 
-            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state, &btif_hf_cb.connected_bda);
+            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+                                                        &btif_hf_cb[idx].connected_bda);
 
-            if (btif_hf_cb.state == BTHF_CONNECTION_STATE_DISCONNECTED)
-                bdsetany(btif_hf_cb.connected_bda.address);
+            if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_DISCONNECTED)
+                bdsetany(btif_hf_cb[idx].connected_bda.address);
 
             if (p_data->open.status != BTA_AG_SUCCESS)
                 btif_queue_advance();
             break;
 
         case BTA_AG_CLOSE_EVT:
-            btif_hf_cb.state = BTHF_CONNECTION_STATE_DISCONNECTED;
-            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state, &btif_hf_cb.connected_bda);
-            bdsetany(btif_hf_cb.connected_bda.address);
-            btif_hf_cb.peer_feat = 0;
-            clear_phone_state();
+            btif_hf_cb[idx].connected_timestamp.tv_sec = 0;
+            btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
+            BTIF_TRACE_DEBUG("%s: BTA_AG_CLOSE_EVT,"
+                 "idx = %d, btif_hf_cb.handle = %d", __FUNCTION__, idx,
+                          btif_hf_cb[idx].handle);
+            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+                                                        &btif_hf_cb[idx].connected_bda);
+            bdsetany(btif_hf_cb[idx].connected_bda.address);
+            btif_hf_cb[idx].peer_feat = 0;
+            clear_phone_state_multihf(idx);
+            hf_idx = btif_hf_latest_connected_idx();
             /* If AG_OPEN was received but SLC was not setup in a specified time (10 seconds),
             ** then AG_CLOSE may be received. We need to advance the queue here
             */
@@ -306,60 +455,87 @@
             break;
 
         case BTA_AG_CONN_EVT:
-            btif_hf_cb.peer_feat = p_data->conn.peer_feat;
-            btif_hf_cb.state = BTHF_CONNECTION_STATE_SLC_CONNECTED;
+            clock_gettime(CLOCK_MONOTONIC,
+                            &btif_hf_cb[idx].connected_timestamp);
+            BTIF_TRACE_DEBUG("%s: BTA_AG_CONN_EVT, idx = %d ",
+                                                __FUNCTION__, idx);
+            btif_hf_cb[idx].peer_feat = p_data->conn.peer_feat;
+            btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_SLC_CONNECTED;
+            hf_idx = btif_hf_latest_connected_idx();
 
-            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb.state,
-                             &btif_hf_cb.connected_bda);
+            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
+                             &btif_hf_cb[idx].connected_bda);
             btif_queue_advance();
             break;
 
         case BTA_AG_AUDIO_OPEN_EVT:
-            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED, &btif_hf_cb.connected_bda);
+            hf_idx = idx;
+            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED,
+                                                        &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AUDIO_CLOSE_EVT:
-            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED, &btif_hf_cb.connected_bda);
+            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED,
+                                                           &btif_hf_cb[idx].connected_bda);
             break;
 
         /* BTA auto-responds, silently discard */
         case BTA_AG_SPK_EVT:
         case BTA_AG_MIC_EVT:
             HAL_CBACK(bt_hf_callbacks, volume_cmd_cb,
-                (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK : BTHF_VOLUME_TYPE_MIC, p_data->val.num);
+                (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK :
+                      BTHF_VOLUME_TYPE_MIC, p_data->val.num,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_A_EVT:
-            HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb);
+            if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
+                hf_idx = idx;
+            else
+                BTIF_TRACE_DEBUG("Donot set hf_idx for ATA since already in a call");
+
+            HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         /* Java needs to send OK/ERROR for these commands */
         case BTA_AG_AT_BLDN_EVT:
         case BTA_AG_AT_D_EVT:
+            if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
+                hf_idx = idx;
+            else
+                BTIF_TRACE_DEBUG("Donot set hf_idx for BLDN/D since already in a call");
+
             HAL_CBACK(bt_hf_callbacks, dial_call_cmd_cb,
-                (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL);
+                (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_CHUP_EVT:
-            HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb);
+            HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_CIND_EVT:
-            HAL_CBACK(bt_hf_callbacks, cind_cmd_cb);
+            HAL_CBACK(bt_hf_callbacks, cind_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_VTS_EVT:
-            HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0]);
+            HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0],
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_BVRA_EVT:
             HAL_CBACK(bt_hf_callbacks, vr_cmd_cb,
-                (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED : BTHF_VR_STATE_STOPPED);
+                (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED :
+                      BTHF_VR_STATE_STOPPED, &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_NREC_EVT:
             HAL_CBACK(bt_hf_callbacks, nrec_cmd_cb,
-                (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP);
+                (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP,
+                                             &btif_hf_cb[idx].connected_bda);
             break;
 
         /* TODO: Add a callback for CBC */
@@ -367,40 +543,80 @@
             break;
 
         case BTA_AG_AT_CKPD_EVT:
-            HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb);
+            HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
+#if (BTM_WBS_INCLUDED == TRUE )
+        case BTA_AG_WBS_EVT:
+            BTIF_TRACE_DEBUG("BTA_AG_WBS_EVT Set codec status %d codec %d 1=CVSD 2=MSBC", \
+                               p_data->val.hdr.status, p_data->val.num);
+            if(p_data->val.num == BTA_AG_CODEC_CVSD)
+             { HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_NO, &btif_hf_cb[idx].connected_bda);}
+            else if(p_data->val.num == BTA_AG_CODEC_MSBC)
+             {HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_YES, &btif_hf_cb[idx].connected_bda);}
+            else
+             {HAL_CBACK(bt_hf_callbacks, wbs_cb, BTHF_WBS_NONE, &btif_hf_cb[idx].connected_bda);}
+            break;
+#endif
         /* Java needs to send OK/ERROR for these commands */
         case BTA_AG_AT_CHLD_EVT:
-            HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str));
+            HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str),
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_CLCC_EVT:
-            HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb, p_data->val.num);
+            HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_COPS_EVT:
-            HAL_CBACK(bt_hf_callbacks, cops_cmd_cb);
+            HAL_CBACK(bt_hf_callbacks, cops_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_UNAT_EVT:
-            HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb,
-                             p_data->val.str);
+            HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb, p_data->val.str,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         case BTA_AG_AT_CNUM_EVT:
-            HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb);
+            HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb,
+                              &btif_hf_cb[idx].connected_bda);
             break;
 
         /* TODO: Some of these commands may need to be sent to app. For now respond with error */
         case BTA_AG_AT_BINP_EVT:
         case BTA_AG_AT_BTRH_EVT:
-            send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED);
+            send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED, idx);
+            break;
+        case BTA_AG_AT_BAC_EVT:
+            BTIF_TRACE_DEBUG("AG Bitmap of peer-codecs %d", p_data->val.num);
+#if (BTM_WBS_INCLUDED == TRUE )
+            /* If the peer supports mSBC and the BTIF prefferred codec is also mSBC, then
+            we should set the BTA AG Codec to mSBC. This would trigger a +BCS to mSBC at the time
+            of SCO connection establishment */
+            if ((btif_conf_hf_force_wbs == TRUE) && (p_data->val.num & BTA_AG_CODEC_MSBC))
+            {
+                  BTIF_TRACE_EVENT("%s btif_hf override-Preferred Codec to MSBC", __FUNCTION__);
+                  BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_MSBC);
+            }
+            else
+            {
+                  BTIF_TRACE_EVENT("%s btif_hf override-Preferred Codec to CVSD", __FUNCTION__);
+                  BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_CVSD);
+            }
+#endif
+            break;
+        case BTA_AG_AT_BCS_EVT:
+            BTIF_TRACE_DEBUG("AG final seleded codec is %d 1=CVSD 2=MSBC", p_data->val.num);
+            /*  no BTHF_WBS_NONE case, becuase HF1.6 supported device can send BCS */
+            HAL_CBACK(bt_hf_callbacks, wbs_cb,(p_data->val.num == BTA_AG_CODEC_MSBC) ? \
+                        BTHF_WBS_YES : BTHF_WBS_NO, &btif_hf_cb[idx].connected_bda);
             break;
 
-
         default:
-            BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event);
+            BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
             break;
     }
 }
@@ -452,18 +668,18 @@
 *******************************************************************************/
 static void btif_in_hf_generic_evt(UINT16 event, char *p_param)
 {
-    UNUSED(p_param);
+    int idx = btif_hf_idx_by_bdaddr((bt_bdaddr_t *)p_param);
 
-    BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
     switch (event) {
         case BTIF_HFP_CB_AUDIO_CONNECTING:
         {
             HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
-                      &btif_hf_cb.connected_bda);
+                      &btif_hf_cb[idx].connected_bda);
         } break;
         default:
         {
-            BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+            BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
         }
         break;
     }
@@ -479,9 +695,10 @@
 ** Returns         bt_status_t
 **
 *******************************************************************************/
-static bt_status_t init( bthf_callbacks_t* callbacks )
+static bt_status_t init( bthf_callbacks_t* callbacks, int max_hf_clients)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    int i;
 
     bt_hf_callbacks = callbacks;
 
@@ -495,8 +712,13 @@
     btif_enable_service(BTA_HSP_SERVICE_ID);
 #endif
 
-    memset(&btif_hf_cb, 0, sizeof(btif_hf_cb_t));
-    clear_phone_state();
+    memset(&btif_hf_cb, 0, sizeof(btif_hf_cb));
+    btif_max_hf_clients = max_hf_clients;
+    BTIF_TRACE_DEBUG("btif_max_hf_clients = %d", btif_max_hf_clients);
+    for (i = 0; i < btif_max_hf_clients; i++)
+    {
+        clear_phone_state_multihf(i);
+    }
 
     return BT_STATUS_SUCCESS;
 }
@@ -510,14 +732,28 @@
 ** Returns         bt_status_t
 **
 *******************************************************************************/
-static bt_status_t connect_int( bt_bdaddr_t *bd_addr )
+static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
 {
+    CHECK_BTHF_INIT();
+    int i;
+    for (i = 0; i < btif_max_hf_clients;)
+    {
+       if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
+              (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)))
+           i++;
+       else
+           break;
+    }
+
+    if (i == btif_max_hf_clients)
+        return BT_STATUS_BUSY;
+
     if (!is_connected(bd_addr))
     {
-        btif_hf_cb.state = BTHF_CONNECTION_STATE_CONNECTING;
-        bdcpy(btif_hf_cb.connected_bda.address, bd_addr->address);
+        btif_hf_cb[i].state = BTHF_CONNECTION_STATE_CONNECTING;
+        bdcpy(btif_hf_cb[i].connected_bda.address, bd_addr->address);
 
-        BTA_AgOpen(btif_hf_cb.handle, btif_hf_cb.connected_bda.address,
+        BTA_AgOpen(btif_hf_cb[i].handle, btif_hf_cb[i].connected_bda.address,
                    BTIF_HF_SECURITY, BTIF_HF_SERVICES);
         return BT_STATUS_SUCCESS;
     }
@@ -544,9 +780,11 @@
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(bd_addr))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
-        BTA_AgClose(btif_hf_cb.handle);
+        BTA_AgClose(btif_hf_cb[idx].handle);
         return BT_STATUS_SUCCESS;
     }
 
@@ -566,9 +804,11 @@
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(bd_addr))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
-        BTA_AgAudioOpen(btif_hf_cb.handle);
+        BTA_AgAudioOpen(btif_hf_cb[idx].handle);
 
         /* Inform the application that the audio connection has been initiated successfully */
         btif_transfer_context(btif_in_hf_generic_evt, BTIF_HFP_CB_AUDIO_CONNECTING,
@@ -592,9 +832,11 @@
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(bd_addr))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
-        BTA_AgAudioClose(btif_hf_cb.handle);
+        BTA_AgAudioClose(btif_hf_cb[idx].handle);
         return BT_STATUS_SUCCESS;
     }
 
@@ -610,17 +852,20 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t start_voice_recognition()
+static bt_status_t start_voice_recognition(bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
-    if (is_connected(NULL))
+
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
-        if (btif_hf_cb.peer_feat & BTA_AG_PEER_FEAT_VREC)
+        if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
         {
             tBTA_AG_RES_DATA ag_res;
             memset(&ag_res, 0, sizeof(ag_res));
             ag_res.state = 1;
-            BTA_AgResult (btif_hf_cb.handle, BTA_AG_BVRA_RES, &ag_res);
+            BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
 
             return BT_STATUS_SUCCESS;
         }
@@ -642,18 +887,20 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t stop_voice_recognition()
+static bt_status_t stop_voice_recognition(bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(NULL))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
-        if (btif_hf_cb.peer_feat & BTA_AG_PEER_FEAT_VREC)
+        if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
         {
             tBTA_AG_RES_DATA ag_res;
             memset(&ag_res, 0, sizeof(ag_res));
             ag_res.state = 0;
-            BTA_AgResult (btif_hf_cb.handle, BTA_AG_BVRA_RES, &ag_res);
+            BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
 
             return BT_STATUS_SUCCESS;
         }
@@ -675,16 +922,19 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t volume_control(bthf_volume_type_t type, int volume)
+static bt_status_t volume_control(bthf_volume_type_t type, int volume,
+                                                       bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
     tBTA_AG_RES_DATA ag_res;
     memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
-    if (is_connected(NULL))
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         ag_res.num = volume;
-        BTA_AgResult(btif_hf_cb.handle,
+        BTA_AgResult(btif_hf_cb[idx].handle,
                      (type == BTHF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES,
                      &ag_res);
         return BT_STATUS_SUCCESS;
@@ -733,11 +983,13 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t cops_response(const char *cops)
+static bt_status_t cops_response(const char *cops, bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(NULL))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         tBTA_AG_RES_DATA    ag_res;
 
@@ -745,7 +997,7 @@
         sprintf (ag_res.str, "0,0,\"%s\"", cops);
         ag_res.ok_flag = BTA_AG_OK_DONE;
 
-        BTA_AgResult (btif_hf_cb.handle, BTA_AG_COPS_RES, &ag_res);
+        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_COPS_RES, &ag_res);
         return BT_STATUS_SUCCESS;
     }
     return BT_STATUS_FAIL;
@@ -762,11 +1014,14 @@
 *******************************************************************************/
 static 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)
+                                     int signal, int roam, int batt_chg,
+                                                    bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(NULL))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         tBTA_AG_RES_DATA    ag_res;
 
@@ -783,7 +1038,7 @@
                 batt_chg,                                              /* Battery level */
                 ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); /* Call held */
 
-        BTA_AgResult (btif_hf_cb.handle, BTA_AG_CIND_RES, &ag_res);
+        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CIND_RES, &ag_res);
 
         return BT_STATUS_SUCCESS;
     }
@@ -800,17 +1055,18 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t formatted_at_response(const char *rsp)
+static bt_status_t formatted_at_response(const char *rsp, bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
     tBTA_AG_RES_DATA    ag_res;
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
 
-    if (is_connected(NULL))
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         /* Format the response and send */
         memset (&ag_res, 0, sizeof (ag_res));
         strncpy(ag_res.str, rsp, BTA_AG_AT_MAX_LEN);
-        BTA_AgResult (btif_hf_cb.handle, BTA_AG_UNAT_RES, &ag_res);
+        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
 
         return BT_STATUS_SUCCESS;
     }
@@ -827,14 +1083,17 @@
 ** Returns          bt_status_t
 **
 *******************************************************************************/
-static bt_status_t at_response(bthf_at_response_t response_code, int error_code)
+static bt_status_t at_response(bthf_at_response_t response_code,
+                                    int error_code, bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(NULL))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         send_at_result((response_code == BTHF_AT_RESPONSE_OK) ? BTA_AG_OK_DONE
-                        : BTA_AG_OK_ERROR, error_code);
+                        : BTA_AG_OK_ERROR, error_code, idx);
         return BT_STATUS_SUCCESS;
     }
 
@@ -854,13 +1113,15 @@
 **
 *******************************************************************************/
 static 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)
+                               bthf_call_state_t state, bthf_call_mode_t mode,
+                               bthf_call_mpty_type_t mpty, const char *number,
+                               bthf_call_addrtype_t type, bt_bdaddr_t *bd_addr)
 {
     CHECK_BTHF_INIT();
 
-    if (is_connected(NULL))
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
     {
         tBTA_AG_RES_DATA    ag_res;
         int                 xx;
@@ -874,7 +1135,7 @@
         }
         else
         {
-            BTIF_TRACE_EVENT6("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d",
+            BTIF_TRACE_EVENT("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d",
                           index, dir, state, mode, number, type);
             xx = sprintf (ag_res.str, "%d,%d,%d,%d,%d",
                          index, dir, state, mode, mpty);
@@ -887,7 +1148,7 @@
                     sprintf (&ag_res.str[xx], ",\"%s\",%d", number, type);
             }
         }
-        BTA_AgResult (btif_hf_cb.handle, BTA_AG_CLCC_RES, &ag_res);
+        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CLCC_RES, &ag_res);
 
         return BT_STATUS_SUCCESS;
     }
@@ -913,29 +1174,44 @@
     tBTA_AG_RES_DATA ag_res;
     bt_status_t status = BT_STATUS_SUCCESS;
     BOOLEAN activeCallUpdated = FALSE;
+    int idx, i;
 
-    CHECK_BTHF_SLC_CONNECTED();
+    /* hf_idx is index of connected HS that sent ATA/BLDN,
+            otherwise index of latest connected HS */
+    if (hf_idx != BTIF_HF_INVALID_IDX)
+        idx = hf_idx;
+    else
+        idx = btif_hf_latest_connected_idx();
 
-    BTIF_TRACE_DEBUG6("phone_state_change: num_active=%d [prev: %d]  num_held=%d[prev: %d]"\
-                      " call_setup=%s [prev: %s]", num_active, btif_hf_cb.num_active,
-                       num_held, btif_hf_cb.num_held,
-                       dump_hf_call_state(call_setup_state), dump_hf_call_state(btif_hf_cb.call_setup_state));
+    BTIF_TRACE_DEBUG("phone_state_change: idx = %d", idx);
+
+    /* Check if SLC is connected */
+    if (btif_hf_check_if_slc_connected() != BT_STATUS_SUCCESS)
+        return BT_STATUS_NOT_READY;
+
+    BTIF_TRACE_DEBUG("phone_state_change: num_active=%d [prev: %d]  num_held=%d[prev: %d]"
+                      " call_setup=%s [prev: %s]", num_active, btif_hf_cb[idx].num_active,
+                       num_held, btif_hf_cb[idx].num_held, dump_hf_call_state(call_setup_state),
+                       dump_hf_call_state(btif_hf_cb[idx].call_setup_state));
 
     /* if all indicators are 0, send end call and return */
     if (num_active == 0 && num_held == 0 && call_setup_state == BTHF_CALL_STATE_IDLE)
     {
-        BTIF_TRACE_DEBUG1("%s: Phone on hook", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s: Phone on hook", __FUNCTION__);
 
-        /* record call termination timestamp  if  there was an active/held call  or callsetup state > BTHF_CALL_STATE_IDLE */
-        if ((btif_hf_cb.call_setup_state != BTHF_CALL_STATE_IDLE ) || (btif_hf_cb.num_active) ||(btif_hf_cb.num_held))
+        /* record call termination timestamp  if  there was an active/held call  or
+                   callsetup state > BTHF_CALL_STATE_IDLE */
+        if ((btif_hf_cb[idx].call_setup_state != BTHF_CALL_STATE_IDLE ) ||
+                 (btif_hf_cb[idx].num_active) ||(btif_hf_cb[idx].num_held))
         {
-            BTIF_TRACE_DEBUG1("%s: Record call termination timestamp", __FUNCTION__);
-            clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb.call_end_timestamp);
+            BTIF_TRACE_DEBUG("%s: Record call termination timestamp", __FUNCTION__);
+            clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb[0].call_end_timestamp);
         }
         BTA_AgResult (BTA_AG_HANDLE_ALL, BTA_AG_END_CALL_RES, NULL);
+        hf_idx = BTIF_HF_INVALID_IDX;
 
         /* if held call was present, reset that as well */
-        if (btif_hf_cb.num_held)
+        if (btif_hf_cb[idx].num_held)
             send_indicator_update(BTA_AG_IND_CALLHELD, 0);
 
         goto update_call_states;
@@ -952,24 +1228,24 @@
     ** force the SCO to be setup. Handle this special case here prior to
     ** call setup handling
     */
-    if ( (num_active == 1) && (btif_hf_cb.num_active == 0) && (btif_hf_cb.num_held == 0) &&
-         (btif_hf_cb.call_setup_state == BTHF_CALL_STATE_IDLE) )
+    if ( (num_active == 1) && (btif_hf_cb[idx].num_active == 0) && (btif_hf_cb[idx].num_held == 0)
+         && (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE) )
     {
-        BTIF_TRACE_DEBUG1("%s: Active call notification received without call setup update",
+        BTIF_TRACE_DEBUG("%s: Active call notification received without call setup update",
                           __FUNCTION__);
 
         memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
-        ag_res.audio_handle = btif_hf_cb.handle;
+        ag_res.audio_handle = btif_hf_cb[idx].handle;
         res = BTA_AG_OUT_CALL_CONN_RES;
         BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
         activeCallUpdated = TRUE;
     }
 
     /* Ringing call changed? */
-    if (call_setup_state != btif_hf_cb.call_setup_state)
+    if (call_setup_state != btif_hf_cb[idx].call_setup_state)
     {
-        BTIF_TRACE_DEBUG3("%s: Call setup states changed. old: %s new: %s",
-            __FUNCTION__, dump_hf_call_state(btif_hf_cb.call_setup_state),
+        BTIF_TRACE_DEBUG("%s: Call setup states changed. old: %s new: %s",
+            __FUNCTION__, dump_hf_call_state(btif_hf_cb[idx].call_setup_state),
             dump_hf_call_state(call_setup_state));
         memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
 
@@ -977,22 +1253,22 @@
         {
             case BTHF_CALL_STATE_IDLE:
             {
-                switch (btif_hf_cb.call_setup_state)
+                switch (btif_hf_cb[idx].call_setup_state)
                 {
                     case BTHF_CALL_STATE_INCOMING:
-                        if (num_active > btif_hf_cb.num_active)
+                        if (num_active > btif_hf_cb[idx].num_active)
                         {
                             res = BTA_AG_IN_CALL_CONN_RES;
-                            ag_res.audio_handle = btif_hf_cb.handle;
+                            ag_res.audio_handle = btif_hf_cb[idx].handle;
                         }
-                        else if (num_held > btif_hf_cb.num_held)
+                        else if (num_held > btif_hf_cb[idx].num_held)
                             res = BTA_AG_IN_CALL_HELD_RES;
                         else
                             res = BTA_AG_CALL_CANCEL_RES;
                         break;
                     case BTHF_CALL_STATE_DIALING:
                     case BTHF_CALL_STATE_ALERTING:
-                        if (num_active > btif_hf_cb.num_active)
+                        if (num_active > btif_hf_cb[idx].num_active)
                         {
                             ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE;
                             res = BTA_AG_OUT_CALL_CONN_RES;
@@ -1001,7 +1277,7 @@
                             res = BTA_AG_CALL_CANCEL_RES;
                         break;
                     default:
-                        BTIF_TRACE_ERROR1("%s: Incorrect Call setup state transition", __FUNCTION__);
+                        BTIF_TRACE_ERROR("%s: Incorrect Call setup state transition", __FUNCTION__);
                         status = BT_STATUS_PARM_INVALID;
                         break;
                 }
@@ -1026,21 +1302,21 @@
                 }
                 break;
             case BTHF_CALL_STATE_DIALING:
-                ag_res.audio_handle = btif_hf_cb.handle;
+                ag_res.audio_handle = btif_hf_cb[idx].handle;
                 res = BTA_AG_OUT_CALL_ORIG_RES;
                 break;
             case BTHF_CALL_STATE_ALERTING:
                 /* if we went from idle->alert, force SCO setup here. dialing usually triggers it */
-                if (btif_hf_cb.call_setup_state == BTHF_CALL_STATE_IDLE)
-                ag_res.audio_handle = btif_hf_cb.handle;
+                if (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE)
+                ag_res.audio_handle = btif_hf_cb[idx].handle;
                 res = BTA_AG_OUT_CALL_ALERT_RES;
                 break;
             default:
-                BTIF_TRACE_ERROR1("%s: Incorrect new ringing call state", __FUNCTION__);
+                BTIF_TRACE_ERROR("%s: Incorrect new ringing call state", __FUNCTION__);
                 status = BT_STATUS_PARM_INVALID;
                 break;
         }
-        BTIF_TRACE_DEBUG3("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle);
+        BTIF_TRACE_DEBUG("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle);
 
         if (res)
             BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
@@ -1061,34 +1337,38 @@
     ** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043
     ** Handle call indicator change
     **/
-    if (!activeCallUpdated && ((num_active + num_held) != (btif_hf_cb.num_active + btif_hf_cb.num_held)) )
+    if (!activeCallUpdated && ((num_active + num_held) !=
+                 (btif_hf_cb[idx].num_active + btif_hf_cb[idx].num_held)) )
     {
-        BTIF_TRACE_DEBUG3("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb.num_active, num_active);
+        BTIF_TRACE_DEBUG("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb[idx].num_active, num_active);
         send_indicator_update(BTA_AG_IND_CALL, ((num_active + num_held) > 0) ? 1 : 0);
     }
 
     /* Held Changed? */
-    if (num_held != btif_hf_cb.num_held)
+    if (num_held != btif_hf_cb[idx].num_held)
     {
-        BTIF_TRACE_DEBUG3("%s: Held call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb.num_held, num_held);
+        BTIF_TRACE_DEBUG("%s: Held call states changed. old: %d new: %d",
+                        __FUNCTION__, btif_hf_cb[idx].num_held, num_held);
         send_indicator_update(BTA_AG_IND_CALLHELD, ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1)));
     }
 
     /* Calls Swapped? */
-    if ( (call_setup_state == btif_hf_cb.call_setup_state) &&
+    if ( (call_setup_state == btif_hf_cb[idx].call_setup_state) &&
          (num_active && num_held) &&
-         (num_active == btif_hf_cb.num_active) &&
-         (num_held == btif_hf_cb.num_held) )
+         (num_active == btif_hf_cb[idx].num_active) &&
+         (num_held == btif_hf_cb[idx].num_held) )
     {
-        BTIF_TRACE_DEBUG1("%s: Calls swapped", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s: Calls swapped", __FUNCTION__);
         send_indicator_update(BTA_AG_IND_CALLHELD, 1);
     }
 
 update_call_states:
-    btif_hf_cb.num_active = num_active;
-    btif_hf_cb.num_held = num_held;
-    btif_hf_cb.call_setup_state = call_setup_state;
-
+    for (i = 0; i < btif_max_hf_clients; i++)
+    {
+        btif_hf_cb[i].num_active = num_active;
+        btif_hf_cb[i].num_held = num_held;
+        btif_hf_cb[i].call_setup_state = call_setup_state;
+    }
     return status;
 }
 
@@ -1107,13 +1387,14 @@
       struct timespec         now;
 
       clock_gettime(CLOCK_MONOTONIC, &now);
-      if (now.tv_sec < btif_hf_cb.call_end_timestamp.tv_sec + BTIF_HF_CALL_END_TIMEOUT)
+      if (now.tv_sec < btif_hf_cb[0].call_end_timestamp.tv_sec +
+                                  BTIF_HF_CALL_END_TIMEOUT)
       {
           return TRUE;
       }
       else
       {
-          btif_hf_cb.call_end_timestamp.tv_sec = 0;
+          btif_hf_cb[0].call_end_timestamp.tv_sec = 0;
           return FALSE;
       }
 }
@@ -1129,7 +1410,7 @@
 *******************************************************************************/
 static void  cleanup( void )
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
     if (bt_hf_callbacks)
     {
@@ -1138,6 +1419,34 @@
     }
 }
 
+/*******************************************************************************
+**
+** Function         configure_wbs
+**
+** Description      set to over-ride the current WBS configuration.
+**                  It will not send codec setting cmd to the controller now.
+**                  It just change the configure.
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t  configure_wbs( bt_bdaddr_t *bd_addr , bthf_wbs_config_t config )
+{
+    CHECK_BTHF_INIT();
+
+    int idx = btif_hf_idx_by_bdaddr(bd_addr);
+
+    BTIF_TRACE_EVENT("%s config is %d", __FUNCTION__,config);
+    if (config == BTHF_WBS_YES)
+        BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_MSBC);
+    else if(config == BTHF_WBS_NO)
+        BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_CVSD);
+    else
+        BTA_AgSetCodec(btif_hf_cb[idx].handle,BTA_AG_CODEC_NONE);
+
+    return BT_STATUS_SUCCESS;
+}
+
 static const bthf_interface_t bthfInterface = {
     sizeof(bthfInterface),
     init,
@@ -1156,6 +1465,7 @@
     clcc_response,
     phone_state_change,
     cleanup,
+    configure_wbs,
 };
 
 /*******************************************************************************
@@ -1170,16 +1480,23 @@
 bt_status_t btif_hf_execute_service(BOOLEAN b_enable)
 {
      char * p_service_names[] = BTIF_HF_SERVICE_NAMES;
+     int i;
      if (b_enable)
      {
           /* Enable and register with BTA-AG */
           BTA_AgEnable (BTA_AG_PARSE, bte_hf_evt);
-          BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY, BTIF_HF_FEATURES,
-                         p_service_names, BTIF_HF_ID_1);
+              for (i = 0; i < btif_max_hf_clients; i++)
+              {
+                  BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY,
+                      BTIF_HF_FEATURES, p_service_names, bthf_hf_id[i]);
+              }
      }
      else {
          /* De-register AG */
-         BTA_AgDeregister(btif_hf_cb.handle);
+         for (i = 0; i < btif_max_hf_clients; i++)
+         {
+             BTA_AgDeregister(btif_hf_cb[i].handle);
+         }
          /* Disable AG */
          BTA_AgDisable();
      }
@@ -1197,6 +1514,6 @@
 *******************************************************************************/
 const bthf_interface_t *btif_hf_get_interface()
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     return &bthfInterface;
 }
diff --git a/btif/src/btif_hf_client.c b/btif/src/btif_hf_client.c
new file mode 100644
index 0000000..22d5ba2
--- /dev/null
+++ b/btif/src/btif_hf_client.c
@@ -0,0 +1,985 @@
+/******************************************************************************
+ *
+ *  Copyright (c) 2014 The Android Open Source Project
+ *  Copyright (C) 2009-2012 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ *  Filename:      btif_hf_client.c
+ *
+ *  Description:   Handsfree Profile (HF role) Bluetooth Interface
+ *
+ *
+ ***********************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_hf_client.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+
+#define LOG_TAG "BTIF_HF_CLIENT"
+#include "btif_common.h"
+#include "btif_util.h"
+#include "btif_profile_queue.h"
+#include "bt_utils.h"
+#include "bd.h"
+#include "bta_hf_client_api.h"
+
+/************************************************************************************
+**  Constants & Macros
+************************************************************************************/
+
+#ifndef BTIF_HF_CLIENT_SERVICE_NAME
+#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree")
+#endif
+
+#ifndef BTIF_HF_CLIENT_SECURITY
+#define BTIF_HF_CLIENT_SECURITY    (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
+#endif
+
+#ifndef BTIF_HF_CLIENT_FEATURES
+#define BTIF_HF_CLIENT_FEATURES   ( BTA_HF_CLIENT_FEAT_ECNR  | \
+                                    BTA_HF_CLIENT_FEAT_3WAY  | \
+                                    BTA_HF_CLIENT_FEAT_CLI   | \
+                                    BTA_HF_CLIENT_FEAT_VREC  | \
+                                    BTA_HF_CLIENT_FEAT_VOL   | \
+                                    BTA_HF_CLIENT_FEAT_ECS   | \
+                                    BTA_HF_CLIENT_FEAT_ECC   | \
+                                    BTA_HF_CLIENT_FEAT_CODEC)
+#endif
+
+/************************************************************************************
+**  Local type definitions
+************************************************************************************/
+
+/************************************************************************************
+**  Static variables
+************************************************************************************/
+static bthf_client_callbacks_t *bt_hf_client_callbacks = NULL;
+char   btif_hf_client_version[PROPERTY_VALUE_MAX];
+static UINT32 btif_hf_client_features = 0;
+
+
+#define CHECK_BTHF_CLIENT_INIT() if (bt_hf_client_callbacks == NULL)\
+    {\
+        BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
+        return BT_STATUS_NOT_READY;\
+    }\
+    else\
+    {\
+        BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
+    }
+
+#define CHECK_BTHF_CLIENT_SLC_CONNECTED() if (bt_hf_client_callbacks == NULL)\
+    {\
+        BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
+        return BT_STATUS_NOT_READY;\
+    }\
+    else if (btif_hf_client_cb.state != BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED)\
+    {\
+        BTIF_TRACE_WARNING("BTHF CLIENT: %s: SLC connection not up. state=%s",\
+                           __FUNCTION__, \
+                           dump_hf_conn_state(btif_hf_client_cb.state));\
+        return BT_STATUS_NOT_READY;\
+    }\
+    else\
+    {\
+        BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
+    }
+
+/* BTIF-HF control block to map bdaddr to BTA handle */
+typedef struct
+{
+    UINT16                          handle;
+    bt_bdaddr_t                     connected_bda;
+    bthf_client_connection_state_t  state;
+    bthf_client_vr_state_t          vr_state;
+    tBTA_HF_CLIENT_PEER_FEAT        peer_feat;
+    tBTA_HF_CLIENT_CHLD_FEAT        chld_feat;
+} btif_hf_client_cb_t;
+
+static btif_hf_client_cb_t btif_hf_client_cb;
+
+
+/************************************************************************************
+**  Static functions
+************************************************************************************/
+
+/*******************************************************************************
+**
+** Function        btif_in_hf_client_generic_evt
+**
+** Description     Processes generic events to be sent to JNI that are not triggered from the BTA.
+**                 Always runs in BTIF context
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btif_in_hf_client_generic_evt(UINT16 event, char *p_param)
+{
+    UNUSED(p_param);
+
+    BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
+    switch (event) {
+        case BTIF_HF_CLIENT_CB_AUDIO_CONNECTING:
+        {
+            HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
+                      &btif_hf_client_cb.connected_bda);
+        } break;
+        default:
+        {
+            BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
+        }
+        break;
+    }
+}
+
+/************************************************************************************
+**  Externs
+************************************************************************************/
+
+/************************************************************************************
+**  Functions
+************************************************************************************/
+
+static void clear_state(void)
+{
+    memset(&btif_hf_client_cb, 0, sizeof(btif_hf_client_cb_t));
+}
+
+static BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
+{
+    if (((btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTED) ||
+            (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED))&&
+        ((bd_addr == NULL) || (bdcmp(bd_addr->address, btif_hf_client_cb.connected_bda.address) == 0)))
+        return TRUE;
+    return FALSE;
+}
+
+/*****************************************************************************
+**   Section name (Group of functions)
+*****************************************************************************/
+
+/*****************************************************************************
+**
+**   btif hf api functions (no context switch)
+**
+*****************************************************************************/
+
+/*******************************************************************************
+**
+** Function         btif_hf_client_init
+**
+** Description     initializes the hf interface
+**
+** Returns         bt_status_t
+**
+*******************************************************************************/
+static bt_status_t init( bthf_client_callbacks_t* callbacks )
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    bt_hf_client_callbacks = callbacks;
+
+    btif_enable_service(BTA_HFP_HS_SERVICE_ID);
+
+    clear_state();
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         connect
+**
+** Description     connect to audio gateway
+**
+** Returns         bt_status_t
+**
+*******************************************************************************/
+static bt_status_t connect_int( bt_bdaddr_t *bd_addr, uint16_t uuid )
+{
+    if (is_connected(bd_addr))
+        return BT_STATUS_BUSY;
+
+    btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTING;
+    bdcpy(btif_hf_client_cb.connected_bda.address, bd_addr->address);
+
+    BTA_HfClientOpen(btif_hf_client_cb.handle, btif_hf_client_cb.connected_bda.address,
+               BTIF_HF_CLIENT_SECURITY);
+
+    return BT_STATUS_SUCCESS;
+}
+
+static bt_status_t connect( bt_bdaddr_t *bd_addr )
+{
+    BTIF_TRACE_EVENT("HFP Client version is  %s", btif_hf_client_version);
+    CHECK_BTHF_CLIENT_INIT();
+    return btif_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int);
+
+}
+
+/*******************************************************************************
+**
+** Function         disconnect
+**
+** Description      disconnect from audio gateway
+**
+** Returns         bt_status_t
+**
+*******************************************************************************/
+static bt_status_t disconnect( bt_bdaddr_t *bd_addr )
+{
+    CHECK_BTHF_CLIENT_INIT();
+
+    if (is_connected(bd_addr))
+    {
+        BTA_HfClientClose(btif_hf_client_cb.handle);
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function         connect_audio
+**
+** Description     create an audio connection
+**
+** Returns         bt_status_t
+**
+*******************************************************************************/
+static bt_status_t connect_audio( bt_bdaddr_t *bd_addr )
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (is_connected(bd_addr))
+    {
+        if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_CODEC)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BCC, 0, 0, NULL);
+        }
+        else
+        {
+            BTA_HfClientAudioOpen(btif_hf_client_cb.handle);
+        }
+
+        /* Inform the application that the audio connection has been initiated successfully */
+        btif_transfer_context(btif_in_hf_client_generic_evt, BTIF_HF_CLIENT_CB_AUDIO_CONNECTING,
+                              (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function         disconnect_audio
+**
+** Description      close the audio connection
+**
+** Returns         bt_status_t
+**
+*******************************************************************************/
+static bt_status_t disconnect_audio( bt_bdaddr_t *bd_addr )
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (is_connected(bd_addr))
+    {
+        BTA_HfClientAudioClose(btif_hf_client_cb.handle);
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_FAIL;
+}
+
+/*******************************************************************************
+**
+** Function         start_voice_recognition
+**
+** Description      start voice recognition
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t start_voice_recognition()
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 1, 0, NULL);
+
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function         stop_voice_recognition
+**
+** Description      stop voice recognition
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t stop_voice_recognition()
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 0, 0, NULL);
+
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function         volume_control
+**
+** Description      volume control
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t volume_control(bthf_client_volume_type_t type, int volume)
+{
+    BOOLEAN speaker;
+
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    switch (type)
+    {
+        case BTHF_CLIENT_VOLUME_TYPE_SPK:
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGS, volume, 0, NULL);
+            break;
+        case BTHF_CLIENT_VOLUME_TYPE_MIC:
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGM, volume, 0, NULL);
+            break;
+        default:
+            return BT_STATUS_UNSUPPORTED;
+    }
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         dial
+**
+** Description      place a call
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t dial(const char *number)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (number)
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number);
+    }
+    else
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL);
+    }
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         dial_memory
+**
+** Description      place a call with number specified by location (speed dial)
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t dial_memory(int location)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, location, 0, NULL);
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         handle_call_action
+**
+** Description      handle specified call related action
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t handle_call_action(bthf_client_call_action_t action, int idx)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    switch (action)
+    {
+    case BTHF_CLIENT_CALL_ACTION_CHLD_0:
+        if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_REL)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 0, 0, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_1:
+        // CHLD 1 is mandatory for 3 way calling
+        if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, 0, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_2:
+        // CHLD 2 is mandatory for 3 way calling
+        if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, 0, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_3:
+        if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 3, 0, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_4:
+        if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE_DETACH)
+        {
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 4, 0, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_1x:
+        if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
+        {
+            if (idx < 1)
+            {
+                return BT_STATUS_FAIL;
+            }
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, idx, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_CHLD_2x:
+        if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
+        {
+            if (idx < 1)
+            {
+                return BT_STATUS_FAIL;
+            }
+            BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, idx, NULL);
+            break;
+        }
+        return BT_STATUS_UNSUPPORTED;
+    case BTHF_CLIENT_CALL_ACTION_ATA:
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATA, 0, 0, NULL);
+        break;
+    case BTHF_CLIENT_CALL_ACTION_CHUP:
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHUP, 0, 0, NULL);
+        break;
+    case BTHF_CLIENT_CALL_ACTION_BTRH_0:
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 0, 0, NULL);
+        break;
+    case BTHF_CLIENT_CALL_ACTION_BTRH_1:
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 1, 0, NULL);
+        break;
+    case BTHF_CLIENT_CALL_ACTION_BTRH_2:
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 2, 0, NULL);
+        break;
+    default:
+        return BT_STATUS_FAIL;
+
+    }
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         query_current_calls
+**
+** Description      query list of current calls
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t query_current_calls(void)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECS)
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CLCC, 0, 0, NULL);
+
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function         query_current_operator_name
+**
+** Description      query current selected operator name
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t query_current_operator_name(void)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_COPS, 0, 0, NULL);
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         retieve_subscriber_info
+**
+** Description      retrieve subscriber number information
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t retrieve_subscriber_info(void)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CNUM, 0, 0, NULL);
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         send_dtmf
+**
+** Description      send dtmf
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t send_dtmf(char code)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VTS, code, 0, NULL);
+
+    return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         request_last_voice_tag_number
+**
+** Description      Request number from AG for VR purposes
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t request_last_voice_tag_number(void)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+
+    if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_VTAG)
+    {
+        BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BINP, 1, 0, NULL);
+
+        return BT_STATUS_SUCCESS;
+    }
+
+    return BT_STATUS_UNSUPPORTED;
+}
+
+/*******************************************************************************
+**
+** Function         cleanup
+**
+** Description      Closes the HF interface
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static void  cleanup( void )
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    if (bt_hf_client_callbacks)
+    {
+        btif_disable_service(BTA_HFP_HS_SERVICE_ID);
+        bt_hf_client_callbacks = NULL;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         send_at_cmd
+**
+** Description      Send requested AT command to rempte device.
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t send_at_cmd(int cmd,int val1,int val2,const char *arg)
+{
+    CHECK_BTHF_CLIENT_SLC_CONNECTED();
+    BTIF_TRACE_EVENT("%s Cmd %d val1 %d val2 %d arg %s",
+            __FUNCTION__,cmd,val1,val2,arg);
+    BTA_HfClientSendAT(btif_hf_client_cb.handle, cmd, val1, val2, arg);
+
+    return BT_STATUS_SUCCESS;
+}
+
+static const bthf_client_interface_t bthfClientInterface = {
+    sizeof(bthf_client_interface_t),
+    .init = init,
+    .connect = connect,
+    .disconnect = disconnect,
+    .connect_audio = connect_audio,
+    .disconnect_audio = disconnect_audio,
+    .start_voice_recognition = start_voice_recognition,
+    .stop_voice_recognition = stop_voice_recognition,
+    .volume_control = volume_control,
+    .dial = dial,
+    .dial_memory = dial_memory,
+    .handle_call_action = handle_call_action,
+    .query_current_calls = query_current_calls,
+    .query_current_operator_name = query_current_operator_name,
+    .retrieve_subscriber_info = retrieve_subscriber_info,
+    .send_dtmf = send_dtmf,
+    .request_last_voice_tag_number = request_last_voice_tag_number,
+    .cleanup = cleanup,
+    .send_at_cmd = send_at_cmd,
+};
+
+static void process_ind_evt(tBTA_HF_CLIENT_IND *ind)
+{
+    switch (ind->type)
+    {
+        case BTA_HF_CLIENT_IND_CALL:
+            HAL_CBACK(bt_hf_client_callbacks, call_cb, ind->value);
+            break;
+
+        case BTA_HF_CLIENT_IND_CALLSETUP:
+            HAL_CBACK(bt_hf_client_callbacks, callsetup_cb, ind->value);
+            break;
+        case BTA_HF_CLIENT_IND_CALLHELD:
+            HAL_CBACK(bt_hf_client_callbacks, callheld_cb, ind->value);
+            break;
+
+        case BTA_HF_CLIENT_IND_SERVICE:
+            HAL_CBACK(bt_hf_client_callbacks, network_state_cb, ind->value);
+            break;
+
+        case BTA_HF_CLIENT_IND_SIGNAL:
+            HAL_CBACK(bt_hf_client_callbacks, network_signal_cb, ind->value);
+            break;
+
+        case BTA_HF_CLIENT_IND_ROAM:
+            HAL_CBACK(bt_hf_client_callbacks, network_roaming_cb, ind->value);
+            break;
+
+        case BTA_HF_CLIENT_IND_BATTCH:
+            HAL_CBACK(bt_hf_client_callbacks, battery_level_cb, ind->value);
+            break;
+
+        default:
+            break;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         btif_hf_client_upstreams_evt
+**
+** Description      Executes HF CLIENT UPSTREAMS events in btif context
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btif_hf_client_upstreams_evt(UINT16 event, char* p_param)
+{
+    tBTA_HF_CLIENT *p_data = (tBTA_HF_CLIENT *)p_param;
+    bdstr_t bdstr;
+
+    BTIF_TRACE_DEBUG("%s: event=%s (%u)", __FUNCTION__, dump_hf_client_event(event), event);
+
+    switch (event)
+    {
+        case BTA_HF_CLIENT_ENABLE_EVT:
+        case BTA_HF_CLIENT_DISABLE_EVT:
+            break;
+
+        case BTA_HF_CLIENT_REGISTER_EVT:
+            btif_hf_client_cb.handle = p_data->reg.handle;
+            break;
+
+        case BTA_HF_CLIENT_OPEN_EVT:
+            if (p_data->open.status == BTA_HF_CLIENT_SUCCESS)
+            {
+                bdcpy(btif_hf_client_cb.connected_bda.address, p_data->open.bd_addr);
+                btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTED;
+                btif_hf_client_cb.peer_feat = 0;
+                btif_hf_client_cb.chld_feat = 0;
+                //clear_phone_state();
+            }
+            else if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTING)
+            {
+                btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
+            }
+            else
+            {
+                BTIF_TRACE_WARNING("%s: HF CLient open failed, but another device connected. status=%d state=%d connected device=%s",
+                        __FUNCTION__, p_data->open.status, btif_hf_client_cb.state, bd2str(&btif_hf_client_cb.connected_bda, &bdstr));
+                break;
+            }
+
+            HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
+                        0, 0, &btif_hf_client_cb.connected_bda);
+
+            if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED)
+                bdsetany(btif_hf_client_cb.connected_bda.address);
+
+            if (p_data->open.status != BTA_HF_CLIENT_SUCCESS)
+                btif_queue_advance();
+            break;
+
+        case BTA_HF_CLIENT_CONN_EVT:
+            btif_hf_client_cb.peer_feat = p_data->conn.peer_feat;
+            btif_hf_client_cb.chld_feat = p_data->conn.chld_feat;
+            btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED;
+
+            HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
+                        btif_hf_client_cb.peer_feat, btif_hf_client_cb.chld_feat,
+                        &btif_hf_client_cb.connected_bda);
+
+            /* Inform the application about in-band ringtone */
+            if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_INBAND)
+            {
+                HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
+            }
+
+            btif_queue_advance();
+            break;
+
+        case BTA_HF_CLIENT_CLOSE_EVT:
+            btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
+            HAL_CBACK(bt_hf_client_callbacks, connection_state_cb,  btif_hf_client_cb.state,
+                        0, 0, &btif_hf_client_cb.connected_bda);
+            bdsetany(btif_hf_client_cb.connected_bda.address);
+            btif_hf_client_cb.peer_feat = 0;
+            btif_hf_client_cb.chld_feat = 0;
+            btif_queue_advance();
+            break;
+
+        case BTA_HF_CLIENT_IND_EVT:
+            process_ind_evt(&p_data->ind);
+            break;
+
+        case BTA_HF_CLIENT_MIC_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_MIC, p_data->val.value);
+            break;
+
+        case BTA_HF_CLIENT_SPK_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_SPK, p_data->val.value);
+            break;
+
+        case BTA_HF_CLIENT_VOICE_REC_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, vr_cmd_cb, p_data->val.value);
+            break;
+
+        case BTA_HF_CLIENT_OPERATOR_NAME_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, current_operator_cb, p_data->operator.name);
+            break;
+
+        case BTA_HF_CLIENT_CLIP_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, clip_cb, p_data->number.number);
+            break;
+
+        case BTA_HF_CLIENT_BINP_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, last_voice_tag_number_callback, p_data->number.number);
+            break;
+
+        case BTA_HF_CLIENT_CCWA_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, call_waiting_cb, p_data->number.number);
+            break;
+
+        case BTA_HF_CLIENT_AT_RESULT_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, cmd_complete_cb, p_data->result.type, p_data->result.cme);
+            break;
+
+        case BTA_HF_CLIENT_CLCC_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, current_calls_cb, p_data->clcc.idx,
+                        p_data->clcc.inc ? BTHF_CLIENT_CALL_DIRECTION_INCOMING : BTHF_CLIENT_CALL_DIRECTION_OUTGOING,
+                        p_data->clcc.status,
+                        p_data->clcc.mpty ? BTHF_CLIENT_CALL_MPTY_TYPE_MULTI : BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE,
+                        p_data->clcc.number_present ? p_data->clcc.number : NULL);
+            break;
+
+        case BTA_HF_CLIENT_CNUM_EVT:
+            if (p_data->cnum.service == 4)
+            {
+                HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_VOICE);
+            }
+            else if (p_data->cnum.service == 5)
+            {
+                HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_FAX);
+            }
+            else
+            {
+                HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_UNKNOWN);
+            }
+            break;
+
+        case BTA_HF_CLIENT_BTRH_EVT:
+            if (p_data->val.value <= BTRH_CLIENT_RESP_AND_HOLD_REJECT)
+            {
+                HAL_CBACK(bt_hf_client_callbacks, resp_and_hold_cb, p_data->val.value);
+            }
+            break;
+
+        case BTA_HF_CLIENT_BSIR_EVT:
+            if (p_data->val.value != 0)
+            {
+                HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
+            }
+            else
+            {
+                HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED);
+            }
+            break;
+
+        case BTA_HF_CLIENT_AUDIO_OPEN_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED, &btif_hf_client_cb.connected_bda);
+            break;
+
+        case BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC, &btif_hf_client_cb.connected_bda);
+            break;
+
+        case BTA_HF_CLIENT_AUDIO_CLOSE_EVT:
+            HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_DISCONNECTED, &btif_hf_client_cb.connected_bda);
+            break;
+        case BTA_HF_CLIENT_RING_INDICATION:
+            HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb);
+            break;
+        default:
+            BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
+            break;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         bte_hf_client_evt
+**
+** Description      Switches context from BTE to BTIF for all HF Client events
+**
+** Returns          void
+**
+*******************************************************************************/
+
+static void bte_hf_client_evt(tBTA_HF_CLIENT_EVT event, tBTA_HF_CLIENT *p_data)
+{
+    bt_status_t status;
+
+    /* switch context to btif task context (copy full union size for convenience) */
+    status = btif_transfer_context(btif_hf_client_upstreams_evt, (uint16_t)event, (void*)p_data, sizeof(*p_data), NULL);
+
+    /* catch any failed context transfers */
+    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
+}
+
+/*******************************************************************************
+**
+** Function         btif_hf_client_execute_service
+**
+** Description      Initializes/Shuts down the service
+**
+** Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+bt_status_t btif_hf_client_execute_service(BOOLEAN b_enable)
+{
+    BTIF_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
+
+    property_get("ro.bluetooth.hfp.ver", btif_hf_client_version, "1.5");
+
+     if (b_enable)
+     {
+          /* Enable and register with BTA-HFClient */
+          BTA_HfClientEnable(bte_hf_client_evt);
+          if (strcmp(btif_hf_client_version, "1.6") == 0)
+          {
+              BTIF_TRACE_EVENT("Support Codec Nego. %d ", BTIF_HF_CLIENT_FEATURES);
+              BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, BTIF_HF_CLIENT_FEATURES,
+                      BTIF_HF_CLIENT_SERVICE_NAME);
+          }
+          else
+          {
+              BTIF_TRACE_EVENT("No Codec Nego Supported");
+              btif_hf_client_features = BTIF_HF_CLIENT_FEATURES;
+              btif_hf_client_features = btif_hf_client_features & (~BTA_HF_CLIENT_FEAT_CODEC);
+              BTIF_TRACE_EVENT("btif_hf_client_features is   %d", btif_hf_client_features);
+              BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, btif_hf_client_features,
+                      BTIF_HF_CLIENT_SERVICE_NAME);
+          }
+
+     }
+     else
+     {
+         BTA_HfClientDeregister(btif_hf_client_cb.handle);
+         BTA_HfClientDisable();
+     }
+     return BT_STATUS_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         btif_hf_get_interface
+**
+** Description      Get the hf callback interface
+**
+** Returns          bthf_interface_t
+**
+*******************************************************************************/
+const bthf_client_interface_t *btif_hf_client_get_interface(void)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    return &bthfClientInterface;
+}
diff --git a/btif/src/btif_hh.c b/btif/src/btif_hh.c
index 34b119d..8336f97 100644
--- a/btif/src/btif_hh.c
+++ b/btif/src/btif_hh.c
@@ -132,12 +132,12 @@
 
 #define CHECK_BTHH_INIT() if (bt_hh_callbacks == NULL)\
     {\
-        BTIF_TRACE_WARNING1("BTHH: %s: BTHH not initialized", __FUNCTION__);\
+        BTIF_TRACE_WARNING("BTHH: %s: BTHH not initialized", __FUNCTION__);\
         return BT_STATUS_NOT_READY;\
     }\
     else\
     {\
-        BTIF_TRACE_EVENT1("BTHH: %s", __FUNCTION__);\
+        BTIF_TRACE_EVENT("BTHH: %s", __FUNCTION__);\
     }
 
 
@@ -203,7 +203,7 @@
 
 static void toggle_os_keylockstates(int fd, int changedlockstates)
 {
-    BTIF_TRACE_EVENT3("%s: fd = %d, changedlockstates = 0x%x",
+    BTIF_TRACE_EVENT("%s: fd = %d, changedlockstates = 0x%x",
         __FUNCTION__, fd, changedlockstates);
     UINT8 hidreport[9];
     int reportIndex;
@@ -212,37 +212,37 @@
     reportIndex=4;
 
     if (changedlockstates & BTIF_HH_KEYSTATE_MASK_CAPSLOCK) {
-        BTIF_TRACE_DEBUG1("%s Setting CAPSLOCK", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s Setting CAPSLOCK", __FUNCTION__);
         hidreport[reportIndex++] = (UINT8)HID_REPORT_CAPSLOCK;
     }
 
     if (changedlockstates & BTIF_HH_KEYSTATE_MASK_NUMLOCK)  {
-        BTIF_TRACE_DEBUG1("%s Setting NUMLOCK", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s Setting NUMLOCK", __FUNCTION__);
         hidreport[reportIndex++] = (UINT8)HID_REPORT_NUMLOCK;
     }
 
     if (changedlockstates & BTIF_HH_KEYSTATE_MASK_SCROLLLOCK) {
-        BTIF_TRACE_DEBUG1("%s Setting SCROLLLOCK", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s Setting SCROLLLOCK", __FUNCTION__);
         hidreport[reportIndex++] = (UINT8) HID_REPORT_SCROLLLOCK;
     }
 
-     BTIF_TRACE_DEBUG4("Writing hidreport #1 to os: "\
+     BTIF_TRACE_DEBUG("Writing hidreport #1 to os: "\
         "%s:  %x %x %x", __FUNCTION__,
          hidreport[0], hidreport[1], hidreport[2]);
-    BTIF_TRACE_DEBUG4("%s:  %x %x %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s:  %x %x %x", __FUNCTION__,
          hidreport[3], hidreport[4], hidreport[5]);
-    BTIF_TRACE_DEBUG4("%s:  %x %x %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s:  %x %x %x", __FUNCTION__,
          hidreport[6], hidreport[7], hidreport[8]);
     bta_hh_co_write(fd , hidreport, sizeof(hidreport));
     usleep(200000);
     memset(hidreport,0,9);
     hidreport[0]=1;
-    BTIF_TRACE_DEBUG4("Writing hidreport #2 to os: "\
+    BTIF_TRACE_DEBUG("Writing hidreport #2 to os: "\
        "%s:  %x %x %x", __FUNCTION__,
          hidreport[0], hidreport[1], hidreport[2]);
-    BTIF_TRACE_DEBUG4("%s:  %x %x %x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s:  %x %x %x", __FUNCTION__,
          hidreport[3], hidreport[4], hidreport[5]);
-    BTIF_TRACE_DEBUG4("%s:  %x %x %x ", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s:  %x %x %x ", __FUNCTION__,
          hidreport[6], hidreport[7], hidreport[8]);
     bta_hh_co_write(fd , hidreport, sizeof(hidreport));
 }
@@ -286,7 +286,7 @@
                     btif_hh_keylockstates}; /* keystate */
 
     /* Set report for other keyboards */
-    BTIF_TRACE_EVENT3("%s: setting report on dev_handle %d to 0x%x",
+    BTIF_TRACE_EVENT("%s: setting report on dev_handle %d to 0x%x",
          __FUNCTION__, p_dev->dev_handle, btif_hh_keylockstates);
 
     /* Get SetReport buffer */
@@ -310,7 +310,7 @@
 {
     int keylockstates;
 
-    BTIF_TRACE_EVENT1("%s: Syncing keyboard lock states after "\
+    BTIF_TRACE_EVENT("%s: Syncing keyboard lock states after "\
         "reconnect...",__FUNCTION__);
     /*If the device is connected, update keyboard state */
     update_keyboard_lockstates(p_dev);
@@ -321,7 +321,7 @@
     keylockstates = get_keylockstates();
     if (keylockstates)
     {
-        BTIF_TRACE_DEBUG2("%s: Sending hid report to kernel "\
+        BTIF_TRACE_DEBUG("%s: Sending hid report to kernel "\
             "indicating lock key state 0x%x",__FUNCTION__,
             keylockstates);
         usleep(200000);
@@ -329,7 +329,7 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG2("%s: NOT sending hid report to kernel "\
+        BTIF_TRACE_DEBUG("%s: NOT sending hid report to kernel "\
             "indicating lock key state 0x%x",__FUNCTION__,
             keylockstates);
     }
@@ -337,29 +337,6 @@
 
 /*******************************************************************************
 **
-** Function         btif_hh_find_dev_by_handle
-**
-** Description      Return the device pointer of the specified device handle
-**
-** Returns          Device entry pointer in the device table
-*******************************************************************************/
-static btif_hh_device_t *btif_hh_find_dev_by_handle(UINT8 handle)
-{
-    UINT32 i;
-    // LOGV("%s: handle = %d", __FUNCTION__, handle);
-    for (i = 0; i < BTIF_HH_MAX_HID; i++) {
-        if (btif_hh_cb.devices[i].dev_status != BTHH_CONN_STATE_UNKNOWN &&
-            btif_hh_cb.devices[i].dev_handle == handle)
-        {
-            return &btif_hh_cb.devices[i];
-        }
-    }
-    return NULL;
-}
-
-
-/*******************************************************************************
-**
 ** Function         btif_hh_find_connected_dev_by_handle
 **
 ** Description      Return the connected device pointer of the specified device handle
@@ -436,7 +413,7 @@
     {
         if (p_dev->vup_timer_active)
         {
-            BTIF_TRACE_DEBUG0("stop VUP timer ");
+            BTIF_TRACE_DEBUG("stop VUP timer ");
             btu_stop_timer(&p_dev->vup_timer);
         }
         p_dev->vup_timer_active = FALSE;
@@ -456,7 +433,7 @@
 
     if (p_dev->vup_timer_active == FALSE)
     {
-        BTIF_TRACE_DEBUG0("Start VUP timer ");
+        BTIF_TRACE_DEBUG("Start VUP timer ");
         memset(&p_dev->vup_timer, 0, sizeof(TIMER_LIST_ENT));
         p_dev->vup_timer.param = (UINT32)btif_hh_tmr_hdlr;
         btu_start_timer(&p_dev->vup_timer, BTU_TTYPE_USER_FUNC,
@@ -464,7 +441,7 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("Restart VUP timer ");
+        BTIF_TRACE_DEBUG("Restart VUP timer ");
         btu_stop_timer(&p_dev->vup_timer);
         btu_start_timer(&p_dev->vup_timer, BTU_TTYPE_USER_FUNC,
                         BTIF_TIMEOUT_VUP_SECS);
@@ -486,7 +463,7 @@
     int i;
     for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
         if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN) == 0) {
-            BTIF_TRACE_WARNING6(" Device %02X:%02X:%02X:%02X:%02X:%02X already added",
+            BTIF_TRACE_WARNING(" Device %02X:%02X:%02X:%02X:%02X:%02X already added",
                   bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]);
             return FALSE;
         }
@@ -499,7 +476,7 @@
             btif_hh_cb.added_devices[i].bd_addr.address[4] == 0 &&
             btif_hh_cb.added_devices[i].bd_addr.address[5] == 0)
         {
-            BTIF_TRACE_WARNING6(" Added device %02X:%02X:%02X:%02X:%02X:%02X",
+            BTIF_TRACE_WARNING(" Added device %02X:%02X:%02X:%02X:%02X:%02X",
                   bda.address[0], bda.address[1], bda.address[2], bda.address[3], bda.address[4], bda.address[5]);
             memcpy(&(btif_hh_cb.added_devices[i].bd_addr), &bda, BD_ADDR_LEN);
             btif_hh_cb.added_devices[i].dev_handle = BTA_HH_INVALID_HANDLE;
@@ -508,7 +485,7 @@
         }
     }
 
-    BTIF_TRACE_WARNING1("%s: Error, out of space to add device",__FUNCTION__);
+    BTIF_TRACE_WARNING("%s: Error, out of space to add device",__FUNCTION__);
     return FALSE;
 }
 
@@ -542,7 +519,7 @@
 
     p_dev = btif_hh_find_dev_by_bda(&bd_addr);
     if (p_dev == NULL) {
-        BTIF_TRACE_WARNING6(" Oops, can't find device [%02x:%02x:%02x:%02x:%02x:%02x]",
+        BTIF_TRACE_WARNING(" Oops, can't find device [%02x:%02x:%02x:%02x:%02x:%02x]",
              bd_addr.address[0], bd_addr.address[1], bd_addr.address[2], bd_addr.address[3], bd_addr.address[4], bd_addr.address[5]);
         return;
     }
@@ -556,12 +533,12 @@
         btif_hh_cb.device_num--;
     }
     else {
-        BTIF_TRACE_WARNING1("%s: device_num = 0", __FUNCTION__);
+        BTIF_TRACE_WARNING("%s: device_num = 0", __FUNCTION__);
     }
 
     p_dev->hh_keep_polling = 0;
     p_dev->hh_poll_thread_id = -1;
-    BTIF_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+    BTIF_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
     if (p_dev->fd >= 0) {
         bta_hh_co_destroy(p_dev->fd);
         p_dev->fd = -1;
@@ -577,7 +554,7 @@
         dest->descriptor.dsc_list = (UINT8 *) GKI_getbuf(src->descriptor.dl_len);
         if (dest->descriptor.dsc_list == NULL)
         {
-            BTIF_TRACE_WARNING1("%s: Failed to allocate DSCP for CB", __FUNCTION__);
+            BTIF_TRACE_WARNING("%s: Failed to allocate DSCP for CB", __FUNCTION__);
             return FALSE;
         }
     }
@@ -587,6 +564,8 @@
     dest->product_id = src->product_id;
     dest->version    = src->version;
     dest->ctry_code  = src->ctry_code;
+    dest->ssr_max_latency = src->ssr_max_latency;
+    dest->ssr_min_tout = src->ssr_min_tout;
     return TRUE;
 }
 
@@ -604,7 +583,7 @@
 
 bt_status_t btif_hh_virtual_unplug(bt_bdaddr_t *bd_addr)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     btif_hh_device_t *p_dev;
     char bd_str[18];
     sprintf(bd_str, "%02X:%02X:%02X:%02X:%02X:%02X",
@@ -614,7 +593,7 @@
     if ((p_dev != NULL) && (p_dev->dev_status == BTHH_CONN_STATE_CONNECTED)
         && (p_dev->attr_mask & HID_VIRTUAL_CABLE))
     {
-        BTIF_TRACE_DEBUG1("%s Sending BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG", __FUNCTION__);
+        BTIF_TRACE_DEBUG("%s Sending BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG", __FUNCTION__);
         /* start the timer */
         btif_hh_start_vup_timer(bd_addr);
         p_dev->local_vup = TRUE;
@@ -623,7 +602,7 @@
     }
     else
     {
-        BTIF_TRACE_ERROR2("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
+        BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
         return BT_STATUS_FAIL;
     }
 }
@@ -648,12 +627,12 @@
     tBTA_HH_CONN conn;
     CHECK_BTHH_INIT();
     dev = btif_hh_find_dev_by_bda(bd_addr);
-    BTIF_TRACE_DEBUG0("Connect _hh");
+    BTIF_TRACE_DEBUG("Connect _hh");
     sprintf(bda_str, "%02X:%02X:%02X:%02X:%02X:%02X",
             (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
     if (dev == NULL && btif_hh_cb.device_num >= BTIF_HH_MAX_HID) {
         // No space for more HID device now.
-         BTIF_TRACE_WARNING2("%s: Error, exceeded the maximum supported HID device number %d",
+         BTIF_TRACE_WARNING("%s: Error, exceeded the maximum supported HID device number %d",
              __FUNCTION__, BTIF_HH_MAX_HID);
         return BT_STATUS_FAIL;
     }
@@ -661,7 +640,7 @@
     for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
         if (memcmp(&(btif_hh_cb.added_devices[i].bd_addr), bd_addr, BD_ADDR_LEN) == 0) {
             added_dev = &btif_hh_cb.added_devices[i];
-             BTIF_TRACE_WARNING3("%s: Device %s already added, attr_mask = 0x%x",
+             BTIF_TRACE_WARNING("%s: Device %s already added, attr_mask = 0x%x",
                  __FUNCTION__, bda_str, added_dev->attr_mask);
         }
     }
@@ -669,7 +648,7 @@
     if (added_dev != NULL) {
         if (added_dev->dev_handle == BTA_HH_INVALID_HANDLE) {
             // No space for more HID device now.
-            BTIF_TRACE_ERROR2("%s: Error, device %s added but addition failed", __FUNCTION__, bda_str);
+            BTIF_TRACE_ERROR("%s: Error, device %s added but addition failed", __FUNCTION__, bda_str);
             memset(&(added_dev->bd_addr), 0, 6);
             added_dev->dev_handle = BTA_HH_INVALID_HANDLE;
             return BT_STATUS_FAIL;
@@ -688,7 +667,7 @@
     else
     {
         // This device shall be connected from the host side.
-        BTIF_TRACE_ERROR2("%s: Error, device %s can only be reconnected from device side",
+        BTIF_TRACE_ERROR("%s: Error, device %s can only be reconnected from device side",
              __FUNCTION__, bda_str);
         return BT_STATUS_FAIL;
     }
@@ -717,7 +696,7 @@
         BTA_HhClose(p_dev->dev_handle);
     }
     else
-        BTIF_TRACE_DEBUG1("%s-- Error: device not connected:",__FUNCTION__);
+        BTIF_TRACE_DEBUG("%s-- Error: device not connected:",__FUNCTION__);
 }
 
 /*******************************************************************************
@@ -734,7 +713,7 @@
 {
     BT_HDR* p_buf = create_pbuf(size, report);
     if (p_buf == NULL) {
-        APPL_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, size = %d", __FUNCTION__, size);
+        APPL_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, size = %d", __FUNCTION__, size);
         return;
     }
     BTA_HhSetReport(p_dev->dev_handle, r_type, p_buf);
@@ -768,21 +747,21 @@
     int i;
     int len, tmplen;
 
-    BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hh_event(event));
+    BTIF_TRACE_DEBUG("%s: event=%s", __FUNCTION__, dump_hh_event(event));
 
     switch (event)
     {
         case BTA_HH_ENABLE_EVT:
-            BTIF_TRACE_DEBUG2("%s: BTA_HH_ENABLE_EVT: status =%d",__FUNCTION__, p_data->status);
+            BTIF_TRACE_DEBUG("%s: BTA_HH_ENABLE_EVT: status =%d",__FUNCTION__, p_data->status);
             if (p_data->status == BTA_HH_OK) {
                 btif_hh_cb.status = BTIF_HH_ENABLED;
-                BTIF_TRACE_DEBUG1("%s--Loading added devices",__FUNCTION__);
+                BTIF_TRACE_DEBUG("%s--Loading added devices",__FUNCTION__);
                 /* Add hid descriptors for already bonded hid devices*/
                 btif_storage_load_bonded_hid_info();
             }
             else {
                 btif_hh_cb.status = BTIF_HH_DISABLED;
-                BTIF_TRACE_WARNING1("BTA_HH_ENABLE_EVT: Error, HH enabling failed, status = %d", p_data->status);
+                BTIF_TRACE_WARNING("BTA_HH_ENABLE_EVT: Error, HH enabling failed, status = %d", p_data->status);
             }
             break;
 
@@ -797,15 +776,15 @@
                 }
             }
             else
-                BTIF_TRACE_WARNING1("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
+                BTIF_TRACE_WARNING("BTA_HH_DISABLE_EVT: Error, HH disabling failed, status = %d", p_data->status);
             break;
 
         case BTA_HH_OPEN_EVT:
-            BTIF_TRACE_WARNING3("%s: BTA_HH_OPN_EVT: handle=%d, status =%d",__FUNCTION__, p_data->conn.handle, p_data->conn.status);
+            BTIF_TRACE_WARNING("%s: BTA_HH_OPN_EVT: handle=%d, status =%d",__FUNCTION__, p_data->conn.handle, p_data->conn.status);
             if (p_data->conn.status == BTA_HH_OK) {
                 p_dev = btif_hh_find_connected_dev_by_handle(p_data->conn.handle);
                 if (p_dev == NULL) {
-                    BTIF_TRACE_WARNING1("BTA_HH_OPEN_EVT: Error, cannot find device with handle %d", p_data->conn.handle);
+                    BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, cannot find device with handle %d", p_data->conn.handle);
                     btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
                     // The connect request must come from device side and exceeded the connected
                                    // HID device number.
@@ -813,14 +792,14 @@
                     HAL_CBACK(bt_hh_callbacks, connection_state_cb, (bt_bdaddr_t*) &p_data->conn.bda,BTHH_CONN_STATE_DISCONNECTED);
                 }
                 else if (p_dev->fd < 0) {
-                    BTIF_TRACE_WARNING0("BTA_HH_OPEN_EVT: Error, failed to find the uhid driver...");
+                    BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Error, failed to find the uhid driver...");
                     memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN);
                     //remove the connection  and then try again to reconnect from the mouse side to recover
                     btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
                     BTA_HhClose(p_data->conn.handle);
                 }
                 else {
-                    BTIF_TRACE_WARNING1("BTA_HH_OPEN_EVT: Found device...Getting dscp info for handle ... %d",p_data->conn.handle);
+                    BTIF_TRACE_WARNING("BTA_HH_OPEN_EVT: Found device...Getting dscp info for handle ... %d",p_data->conn.handle);
                     memcpy(&(p_dev->bd_addr), p_data->conn.bda, BD_ADDR_LEN);
                     btif_hh_cb.status = BTIF_HH_DEV_CONNECTED;
                     // Send set_idle if the peer_device is a keyboard
@@ -841,11 +820,11 @@
             }
             break;
         case BTA_HH_CLOSE_EVT:
-            BTIF_TRACE_DEBUG2("BTA_HH_CLOSE_EVT: status = %d, handle = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_CLOSE_EVT: status = %d, handle = %d",
             p_data->dev_status.status, p_data->dev_status.handle);
             p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
             if (p_dev != NULL) {
-                BTIF_TRACE_DEBUG2("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
+                BTIF_TRACE_DEBUG("%s: uhid fd = %d", __FUNCTION__, p_dev->fd);
                 if(p_dev->vup_timer_active)
                 {
                     btif_hh_stop_vup_timer(&(p_dev->bd_addr));
@@ -853,12 +832,12 @@
                 btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
                 p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
                 HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status);
-                BTIF_TRACE_DEBUG2("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
+                BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
                 bta_hh_co_destroy(p_dev->fd);
                 p_dev->fd = -1;
             }
             else {
-                BTIF_TRACE_WARNING1("Error: cannot find device with handle %d", p_data->dev_status.handle);
+                BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->dev_status.handle);
             }
             break;
         case BTA_HH_GET_RPT_EVT: {
@@ -866,7 +845,7 @@
             UINT8 *data = NULL;
             UINT16 len = 0;
 
-            BTIF_TRACE_DEBUG2("BTA_HH_GET_RPT_EVT: status = %d, handle = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_GET_RPT_EVT: status = %d, handle = %d",
                  p_data->hs_data.status, p_data->hs_data.handle);
             p_dev = btif_hh_find_connected_dev_by_handle(p_data->hs_data.handle);
             if (p_dev) {
@@ -883,12 +862,12 @@
                               (bthh_status_t) p_data->hs_data.status);
                 }
             } else {
-                BTIF_TRACE_WARNING1("Error: cannot find device with handle %d", p_data->hs_data.handle);
+                BTIF_TRACE_WARNING("Error: cannot find device with handle %d", p_data->hs_data.handle);
             }
             break;
         }
         case BTA_HH_SET_RPT_EVT:
-            BTIF_TRACE_DEBUG2("BTA_HH_SET_RPT_EVT: status = %d, handle = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_SET_RPT_EVT: status = %d, handle = %d",
             p_data->dev_status.status, p_data->dev_status.handle);
             p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
             if (p_dev != NULL) {
@@ -900,7 +879,7 @@
 
         case BTA_HH_GET_PROTO_EVT:
             p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
-            BTIF_TRACE_WARNING4("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s",
+            BTIF_TRACE_WARNING("BTA_HH_GET_PROTO_EVT: status = %d, handle = %d, proto = [%d], %s",
                  p_data->hs_data.status, p_data->hs_data.handle,
                  p_data->hs_data.rsp_data.proto_mode,
                  (p_data->hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE) ? "Report Mode" :
@@ -918,7 +897,7 @@
             break;
 
         case BTA_HH_SET_PROTO_EVT:
-            BTIF_TRACE_DEBUG2("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_SET_PROTO_EVT: status = %d, handle = %d",
                  p_data->dev_status.status, p_data->dev_status.handle);
             p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
             if (p_dev) {
@@ -929,24 +908,22 @@
             break;
 
         case BTA_HH_GET_IDLE_EVT:
-            BTIF_TRACE_DEBUG3("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_GET_IDLE_EVT: handle = %d, status = %d, rate = %d",
                  p_data->hs_data.handle, p_data->hs_data.status,
                  p_data->hs_data.rsp_data.idle_rate);
             break;
 
         case BTA_HH_SET_IDLE_EVT:
-            BTIF_TRACE_DEBUG2("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d",
+            BTIF_TRACE_DEBUG("BTA_HH_SET_IDLE_EVT: status = %d, handle = %d",
             p_data->dev_status.status, p_data->dev_status.handle);
             break;
 
         case BTA_HH_GET_DSCP_EVT:
-            BTIF_TRACE_WARNING2("BTA_HH_GET_DSCP_EVT: status = %d, handle = %d",
-                p_data->dev_status.status, p_data->dev_status.handle);
-                len = p_data->dscp_info.descriptor.dl_len;
-                BTIF_TRACE_DEBUG1("BTA_HH_GET_DSCP_EVT: len = %d", len);
+            len = p_data->dscp_info.descriptor.dl_len;
+            BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT: len = %d", len);
             p_dev = btif_hh_cb.p_curr_dev;
             if (p_dev == NULL) {
-                BTIF_TRACE_ERROR0("BTA_HH_GET_DSCP_EVT: No HID device is currently connected");
+                BTIF_TRACE_ERROR("BTA_HH_GET_DSCP_EVT: No HID device is currently connected");
                 return;
             }
             if (p_dev->fd < 0) {
@@ -969,7 +946,7 @@
                     cached_name = "Bluetooth HID";
                 }
 
-                BTIF_TRACE_WARNING2("%s: name = %s", __FUNCTION__, cached_name);
+                BTIF_TRACE_WARNING("%s: name = %s", __FUNCTION__, cached_name);
                 bta_hh_co_send_hid_info(p_dev, cached_name,
                     p_data->dscp_info.vendor_id, p_data->dscp_info.product_id,
                     p_data->dscp_info.version,   p_data->dscp_info.ctry_code,
@@ -981,7 +958,7 @@
                     bt_status_t ret;
                     bdcpy(bda, p_dev->bd_addr.address);
                     btif_hh_copy_hid_info(&dscp_info, &p_data->dscp_info);
-                    BTIF_TRACE_DEBUG6("BTA_HH_GET_DSCP_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+                    BTIF_TRACE_DEBUG("BTA_HH_GET_DSCP_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
                               p_dev->bd_addr.address[0], p_dev->bd_addr.address[1],
                               p_dev->bd_addr.address[2],p_dev->bd_addr.address[3],
                               p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]);
@@ -994,7 +971,7 @@
                                                         len, p_data->dscp_info.descriptor.dsc_list);
 
                     ASSERTC(ret == BT_STATUS_SUCCESS, "storing hid info failed", ret);
-                    BTIF_TRACE_WARNING0("BTA_HH_GET_DSCP_EVT: Called add device");
+                    BTIF_TRACE_WARNING("BTA_HH_GET_DSCP_EVT: Called add device");
 
                     //Free buffer created for dscp_info;
                     if (dscp_info.descriptor.dl_len >0 && dscp_info.descriptor.dsc_list != NULL)
@@ -1006,7 +983,7 @@
                 }
                 else {
                     //Device already added.
-                    BTIF_TRACE_WARNING1("%s: Device already added ",__FUNCTION__);
+                    BTIF_TRACE_WARNING("%s: Device already added ",__FUNCTION__);
                 }
                 /*Sync HID Keyboard lockstates */
                 tmplen = sizeof(hid_kb_numlock_on_list)
@@ -1018,7 +995,7 @@
                         p_data->dscp_info.product_id
                         == hid_kb_numlock_on_list[i].product_id)
                     {
-                        BTIF_TRACE_DEBUG3("%s() idx[%d] Enabling "\
+                        BTIF_TRACE_DEBUG("%s() idx[%d] Enabling "\
                             "NUMLOCK for device :: %s", __FUNCTION__,
                             i, hid_kb_numlock_on_list[i].kb_name);
                         /* Enable NUMLOCK by default so that numeric
@@ -1034,7 +1011,7 @@
             break;
 
         case BTA_HH_ADD_DEV_EVT:
-            BTIF_TRACE_WARNING2("BTA_HH_ADD_DEV_EVT: status = %d, handle = %d",p_data->dev_info.status, p_data->dev_info.handle);
+            BTIF_TRACE_WARNING("BTA_HH_ADD_DEV_EVT: status = %d, handle = %d",p_data->dev_info.status, p_data->dev_info.handle);
             int i;
             for (i = 0; i < BTIF_HH_MAX_ADDED_DEV; i++) {
                 if (memcmp(btif_hh_cb.added_devices[i].bd_addr.address, p_data->dev_info.bda, 6) == 0) {
@@ -1050,21 +1027,21 @@
             }
             break;
         case BTA_HH_RMV_DEV_EVT:
-                BTIF_TRACE_DEBUG2("BTA_HH_RMV_DEV_EVT: status = %d, handle = %d",
+                BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT: status = %d, handle = %d",
                      p_data->dev_info.status, p_data->dev_info.handle);
-                BTIF_TRACE_DEBUG6("BTA_HH_RMV_DEV_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+                BTIF_TRACE_DEBUG("BTA_HH_RMV_DEV_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
                      p_data->dev_info.bda[0], p_data->dev_info.bda[1], p_data->dev_info.bda[2],
                      p_data->dev_info.bda[3], p_data->dev_info.bda[4], p_data->dev_info.bda[5]);
                 break;
 
 
         case BTA_HH_VC_UNPLUG_EVT:
-                BTIF_TRACE_DEBUG2("BTA_HH_VC_UNPLUG_EVT: status = %d, handle = %d",
+                BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT: status = %d, handle = %d",
                      p_data->dev_status.status, p_data->dev_status.handle);
                 p_dev = btif_hh_find_connected_dev_by_handle(p_data->dev_status.handle);
                 btif_hh_cb.status = BTIF_HH_DEV_DISCONNECTED;
                 if (p_dev != NULL) {
-                    BTIF_TRACE_DEBUG6("BTA_HH_VC_UNPLUG_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
+                    BTIF_TRACE_DEBUG("BTA_HH_VC_UNPLUG_EVT:bda = %02x:%02x:%02x:%02x:%02x:%02x",
                          p_dev->bd_addr.address[0], p_dev->bd_addr.address[1],
                          p_dev->bd_addr.address[2],p_dev->bd_addr.address[3],
                          p_dev->bd_addr.address[4], p_dev->bd_addr.address[5]);
@@ -1074,9 +1051,9 @@
                         btif_hh_stop_vup_timer(&(p_dev->bd_addr));
                     }
                     p_dev->dev_status = BTHH_CONN_STATE_DISCONNECTED;
-                    BTIF_TRACE_DEBUG1("%s---Sending connection state change", __FUNCTION__);
+                    BTIF_TRACE_DEBUG("%s---Sending connection state change", __FUNCTION__);
                     HAL_CBACK(bt_hh_callbacks, connection_state_cb,&(p_dev->bd_addr), p_dev->dev_status);
-                    BTIF_TRACE_DEBUG1("%s---Removing HID bond", __FUNCTION__);
+                    BTIF_TRACE_DEBUG("%s---Removing HID bond", __FUNCTION__);
                     /* If it is locally initiated VUP or remote device has its major COD as
                     Peripheral removed the bond.*/
                     if (p_dev->local_vup  || check_cod_hid(&(p_dev->bd_addr), COD_HID_MAJOR))
@@ -1098,7 +1075,7 @@
 
 
             default:
-                BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event);
+                BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
                 break;
         }
 }
@@ -1156,7 +1133,7 @@
 static void btif_hh_handle_evt(UINT16 event, char *p_param)
 {
     bt_bdaddr_t *bd_addr = (bt_bdaddr_t*)p_param;
-    BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
     int ret;
     switch(event)
     {
@@ -1174,7 +1151,7 @@
 
         case BTIF_HH_DISCONNECT_REQ_EVT:
         {
-            BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+            BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
             btif_hh_disconnect(bd_addr);
             HAL_CBACK(bt_hh_callbacks, connection_state_cb,bd_addr,BTHH_CONN_STATE_DISCONNECTING);
         }
@@ -1182,14 +1159,14 @@
 
         case BTIF_HH_VUP_REQ_EVT:
         {
-            BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+            BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
             ret = btif_hh_virtual_unplug(bd_addr);
         }
         break;
 
         default:
         {
-            BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+            BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
         }
         break;
     }
@@ -1212,7 +1189,7 @@
     int param_len = 0;
     memset(&p_data, 0, sizeof(tBTA_HH));
 
-    BTIF_TRACE_DEBUG2("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );
+    BTIF_TRACE_DEBUG("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );
 
     for (i = 0; i < BTIF_HH_MAX_HID; i++) {
         if (btif_hh_cb.devices[i].dev_status == BTHH_CONN_STATE_CONNECTED)
@@ -1248,7 +1225,7 @@
 static bt_status_t init( bthh_callbacks_t* callbacks )
 {
     UINT32 i;
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
 
     bt_hh_callbacks = callbacks;
     memset(&btif_hh_cb, 0, sizeof(btif_hh_cb));
@@ -1297,7 +1274,7 @@
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED)
     {
-        BTIF_TRACE_WARNING2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_WARNING("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
     p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
@@ -1308,7 +1285,7 @@
     }
     else
     {
-        BTIF_TRACE_WARNING1("%s: Error, device  not opened.", __FUNCTION__);
+        BTIF_TRACE_WARNING("%s: Error, device  not opened.", __FUNCTION__);
         return BT_STATUS_FAIL;
     }
 }
@@ -1332,13 +1309,13 @@
             bd_addr->address[4], bd_addr->address[5]);
     if (btif_hh_cb.status == BTIF_HH_DISABLED)
     {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
     p_dev = btif_hh_find_dev_by_bda(bd_addr);
     if (!p_dev)
     {
-        BTIF_TRACE_ERROR2("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
+        BTIF_TRACE_ERROR("%s: Error, device %s not opened.", __FUNCTION__, bd_str);
         return BT_STATUS_FAIL;
     }
     btif_transfer_context(btif_hh_handle_evt, BTIF_HH_VUP_REQ_EVT,
@@ -1362,9 +1339,9 @@
     tBTA_HH_DEV_DSCP_INFO dscp_info;
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
 
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-    BTIF_TRACE_DEBUG6("%s: sub_class = 0x%02x, app_id = %d, vendor_id = 0x%04x, "
+    BTIF_TRACE_DEBUG("%s: sub_class = 0x%02x, app_id = %d, vendor_id = 0x%04x, "
          "product_id = 0x%04x, version= 0x%04x",
          __FUNCTION__, hid_info.sub_class,
          hid_info.app_id, hid_info.vendor_id, hid_info.product_id,
@@ -1372,7 +1349,7 @@
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED)
     {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
@@ -1400,75 +1377,6 @@
 
     return BT_STATUS_SUCCESS;
 }
-/*******************************************************************************
-**
-** Function         get_idle_time
-**
-** Description      Get the HID idle time
-**
-** Returns         bt_status_t
-**
-*******************************************************************************/
-static bt_status_t get_idle_time(bt_bdaddr_t *bd_addr)
-{
-    CHECK_BTHH_INIT();
-    btif_hh_device_t *p_dev;
-    BD_ADDR* bda = (BD_ADDR*) bd_addr;
-
-    BTIF_TRACE_DEBUG6(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
-         (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-
-    if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
-        return BT_STATUS_FAIL;
-    }
-
-    p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
-    if (p_dev != NULL) {
-        //BTA_HhGetIdle(p_dev->dev_handle);
-    }
-    else {
-        return BT_STATUS_FAIL;
-    }
-    return BT_STATUS_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function         set_idle_time
-**
-** Description      Set the HID idle time
-**
-** Returns         bt_status_t
-**
-*******************************************************************************/
-static bt_status_t set_idle_time (bt_bdaddr_t *bd_addr, uint8_t idle_time)
-{
-    UNUSED(idle_time);
-
-    CHECK_BTHH_INIT();
-    btif_hh_device_t *p_dev;
-    BD_ADDR* bda = (BD_ADDR*) bd_addr;
-
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
-         (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-
-    if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
-        return BT_STATUS_FAIL;
-    }
-
-    p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
-    if (p_dev == NULL) {
-        BTIF_TRACE_WARNING6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
-             (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
-        return BT_STATUS_FAIL;
-    }
-    else {
-        //BTA_HhSetIdle(p_dev->dev_handle, idle_time);
-    }
-    return BT_STATUS_SUCCESS;
-}
 
 /*******************************************************************************
 **
@@ -1486,11 +1394,11 @@
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
     UNUSED(protocolMode);
 
-    BTIF_TRACE_DEBUG6(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG(" addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
@@ -1521,24 +1429,24 @@
     UINT8 proto_mode = protocolMode;
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
 
-    BTIF_TRACE_DEBUG2("%s:proto_mode = %d", __FUNCTION__,protocolMode);
+    BTIF_TRACE_DEBUG("%s:proto_mode = %d", __FUNCTION__,protocolMode);
 
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
     p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
     if (p_dev == NULL) {
-        BTIF_TRACE_WARNING6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_WARNING(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
     else if (protocolMode != BTA_HH_PROTO_RPT_MODE && protocolMode != BTA_HH_PROTO_BOOT_MODE) {
-        BTIF_TRACE_WARNING2("s: Error, device proto_mode = %d.", __FUNCTION__, proto_mode);
+        BTIF_TRACE_WARNING("s: Error, device proto_mode = %d.", __FUNCTION__, proto_mode);
         return BT_STATUS_FAIL;
     }
     else {
@@ -1564,26 +1472,26 @@
     btif_hh_device_t *p_dev;
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
 
-    BTIF_TRACE_DEBUG4("%s:proto_mode = %dr_type = %d, rpt_id = %d, buf_size = %d", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s:proto_mode = %dr_type = %d, rpt_id = %d, buf_size = %d", __FUNCTION__,
           reportType, reportId, bufferSize);
 
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
 
     p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
     if (p_dev == NULL) {
-        BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
     else if ( ((int) reportType) <= BTA_HH_RPTT_RESRV || ((int) reportType) > BTA_HH_RPTT_FEATURE) {
-        BTIF_TRACE_ERROR6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
@@ -1610,48 +1518,59 @@
     btif_hh_device_t *p_dev;
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
 
-    BTIF_TRACE_DEBUG2("%s:reportType = %d", __FUNCTION__,reportType);
+    BTIF_TRACE_DEBUG("%s:reportType = %d", __FUNCTION__,reportType);
 
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
 
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
     p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
     if (p_dev == NULL) {
-        BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
     else if ( ( (int) reportType) <= BTA_HH_RPTT_RESRV || ( (int) reportType) > BTA_HH_RPTT_FEATURE) {
-        BTIF_TRACE_ERROR6(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_ERROR(" Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
     else {
         int    hex_bytes_filled;
-        UINT8  hexbuf[200];
+        UINT8  *hexbuf;
         UINT16 len = (strlen(report) + 1) / 2;
 
+        hexbuf = GKI_getbuf(len);
+        if (hexbuf == NULL) {
+            BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
+                __FUNCTION__, len);
+            return BT_STATUS_FAIL;
+        }
+
         /* Build a SetReport data buffer */
-        memset(hexbuf, 0, 200);
+        memset(hexbuf, 0, len);
         //TODO
         hex_bytes_filled = ascii_2_hex(report, len, hexbuf);
-        BTIF_TRACE_DEBUG1("Hex bytes filled, hex value: %d", hex_bytes_filled);
+        BTIF_TRACE_DEBUG("Hex bytes filled, hex value: %d", hex_bytes_filled);
         if (hex_bytes_filled) {
             BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf);
             if (p_buf == NULL) {
-                BTIF_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, len = %d",
+                BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
                                   __FUNCTION__, hex_bytes_filled);
+                GKI_freebuf(hexbuf);
                 return BT_STATUS_FAIL;
             }
             BTA_HhSetReport(p_dev->dev_handle, reportType, p_buf);
+            GKI_freebuf(hexbuf);
+            return BT_STATUS_SUCCESS;
         }
-        return BT_STATUS_SUCCESS;
+        GKI_freebuf(hexbuf);
+        return BT_STATUS_FAIL;
     }
 }
 
@@ -1670,47 +1589,56 @@
     btif_hh_device_t *p_dev;
     BD_ADDR* bda = (BD_ADDR*) bd_addr;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
-    BTIF_TRACE_DEBUG6("addr = %02X:%02X:%02X:%02X:%02X:%02X",
+    BTIF_TRACE_DEBUG("addr = %02X:%02X:%02X:%02X:%02X:%02X",
          (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
 
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_ERROR2("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_ERROR("%s: Error, HH status = %d", __FUNCTION__, btif_hh_cb.status);
         return BT_STATUS_FAIL;
     }
 
     p_dev = btif_hh_find_connected_dev_by_bda(bd_addr);
     if (p_dev == NULL) {
-        BTIF_TRACE_ERROR6("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
+        BTIF_TRACE_ERROR("%s: Error, device %02X:%02X:%02X:%02X:%02X:%02X not opened.",
              (*bda)[0], (*bda)[1], (*bda)[2], (*bda)[3], (*bda)[4], (*bda)[5]);
         return BT_STATUS_FAIL;
     }
 
     else {
         int    hex_bytes_filled;
-        UINT8  hexbuf[200];
+        UINT8  *hexbuf;
         UINT16 len = (strlen(data) + 1) / 2;
 
-        /* Build a SetReport data buffer */
-        memset(hexbuf, 0, 200);
+        hexbuf = GKI_getbuf(len);
+        if (hexbuf == NULL) {
+            BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
+                __FUNCTION__, len);
+            return BT_STATUS_FAIL;
+        }
+
+        /* Build a SendData data buffer */
+        memset(hexbuf, 0, len);
         hex_bytes_filled = ascii_2_hex(data, len, hexbuf);
-        BTIF_TRACE_ERROR2("Hex bytes filled, hex value: %d, %d", hex_bytes_filled, len);
+        BTIF_TRACE_ERROR("Hex bytes filled, hex value: %d, %d", hex_bytes_filled, len);
 
         if (hex_bytes_filled) {
             BT_HDR* p_buf = create_pbuf(hex_bytes_filled, hexbuf);
             if (p_buf == NULL) {
-                BTIF_TRACE_ERROR2("%s: Error, failed to allocate RPT buffer, len = %d",
+                BTIF_TRACE_ERROR("%s: Error, failed to allocate RPT buffer, len = %d",
                                   __FUNCTION__, hex_bytes_filled);
+                GKI_freebuf(hexbuf);
                 return BT_STATUS_FAIL;
             }
             p_buf->layer_specific = BTA_HH_RPTT_OUTPUT;
             BTA_HhSendData(p_dev->dev_handle, *bda, p_buf);
+            GKI_freebuf(hexbuf);
             return BT_STATUS_SUCCESS;
         }
-
+        GKI_freebuf(hexbuf);
+        return BT_STATUS_FAIL;
     }
-    return BT_STATUS_FAIL;
 }
 
 
@@ -1725,18 +1653,18 @@
 *******************************************************************************/
 static void  cleanup( void )
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     btif_hh_device_t *p_dev;
     int i;
     if (btif_hh_cb.status == BTIF_HH_DISABLED) {
-        BTIF_TRACE_WARNING2("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status);
+        BTIF_TRACE_WARNING("%s: HH disabling or disabled already, status = %d", __FUNCTION__, btif_hh_cb.status);
         return;
     }
     btif_hh_cb.status = BTIF_HH_DISABLING;
     for (i = 0; i < BTIF_HH_MAX_HID; i++) {
          p_dev = &btif_hh_cb.devices[i];
          if (p_dev->dev_status != BTHH_CONN_STATE_UNKNOWN && p_dev->fd >= 0) {
-             BTIF_TRACE_DEBUG2("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
+             BTIF_TRACE_DEBUG("%s: Closing uhid fd = %d", __FUNCTION__, p_dev->fd);
              bta_hh_co_destroy(p_dev->fd);
              p_dev->fd = -1;
              p_dev->hh_keep_polling = 0;
@@ -1783,7 +1711,7 @@
      if (b_enable)
      {
           /* Enable and register with BTA-HH */
-          BTA_HhEnable(BTA_SEC_NONE, bte_hh_evt);
+          BTA_HhEnable(BTA_SEC_ENCRYPT, bte_hh_evt);
      }
      else {
          /* Disable HH */
@@ -1803,6 +1731,6 @@
 *******************************************************************************/
 const bthh_interface_t *btif_hh_get_interface()
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     return &bthhInterface;
 }
diff --git a/btif/src/btif_hl.c b/btif/src/btif_hl.c
index e80a0b9..64b1f59 100644
--- a/btif/src/btif_hl.c
+++ b/btif/src/btif_hl.c
@@ -41,6 +41,7 @@
 #include <ctype.h>
 #include <sys/select.h>
 #include <sys/poll.h>
+#include <sys/prctl.h>
 #include <cutils/sockets.h>
 #include <cutils/log.h>
 
@@ -89,12 +90,11 @@
 static int listen_s = -1;
 static int connected_s = -1;
 static int select_thread_id = -1;
-static int signal_fds[2];
+static int signal_fds[2] = { -1, -1 };
 static BUFFER_Q soc_queue;
 static int reg_counter;
 
 static inline int btif_hl_select_wakeup(void);
-static inline int btif_hl_select_exit(void);
 static inline int btif_hl_select_close_connected(void);
 static inline int btif_hl_close_select_thread(void);
 static UINT8 btif_hl_get_next_app_id(void);
@@ -131,12 +131,12 @@
 
 #define CHECK_BTHL_INIT() if (bt_hl_callbacks == NULL)\
     {\
-        BTIF_TRACE_WARNING1("BTHL: %s: BTHL not initialized", __FUNCTION__);\
+        BTIF_TRACE_WARNING("BTHL: %s: BTHL not initialized", __FUNCTION__);\
         return BT_STATUS_NOT_READY;\
     }\
     else\
     {\
-        BTIF_TRACE_EVENT1("BTHL: %s", __FUNCTION__);\
+        BTIF_TRACE_EVENT("BTHL: %s", __FUNCTION__);\
     }
 
 
@@ -171,7 +171,7 @@
 {
     char name[16];
     prctl(BTIF_IF_GET_NAME, name, 0, 0, 0);
-    BTIF_TRACE_DEBUG1("Process name (%s)", name);
+    BTIF_TRACE_DEBUG("Process name (%s)", name);
 }
 #define BTIF_TIMEOUT_CCH_NO_DCH_SECS   30
 /*******************************************************************************
@@ -189,6 +189,9 @@
     btif_hl_mcl_cb_t    *p_mcb;
     UINT8 i, j;
     BOOLEAN found=FALSE;
+
+    *p_app_idx = 0;
+    *p_mcl_idx = 0;
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
         p_acb  =BTIF_HL_GET_APP_CB_PTR(i);
@@ -210,7 +213,7 @@
         if (found)
             break;
     }
-    BTIF_TRACE_DEBUG5("%s found=%d channel_id=0x%08x",
+    BTIF_TRACE_DEBUG("%s found=%d channel_id=0x%08x",
                       __FUNCTION__, found, channel_id, *p_app_idx, *p_mcl_idx);
     return found;
 
@@ -232,25 +235,25 @@
 
     for (i=0; i<BTA_HL_NUM_APPS; i++)
     {
-        BTIF_TRACE_DEBUG1("btif_hl_num_dchs:i = %d",i);
+        BTIF_TRACE_DEBUG("btif_hl_num_dchs:i = %d",i);
         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
         if (p_acb && p_acb->in_use)
         {
             for (j=0; j < BTA_HL_NUM_MCLS ; j++)
             {
                 if(p_acb->mcb[j].in_use)
-                    BTIF_TRACE_DEBUG3("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
+                    BTIF_TRACE_DEBUG("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
                                         j,mcl_handle, p_acb->mcb[j].mcl_handle);
                 if (p_acb->mcb[j].in_use &&
                     (p_acb->mcb[j].mcl_handle == mcl_handle))
                 {
                     p_mcb = &p_acb->mcb[j];
-                    BTIF_TRACE_DEBUG1("btif_hl_num_dchs: mcl handle found j =%d",j);
+                    BTIF_TRACE_DEBUG("btif_hl_num_dchs: mcl handle found j =%d",j);
                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                     {
                         if (p_mcb->mdl[x].in_use)
                         {
-                            BTIF_TRACE_DEBUG1("btif_hl_num_dchs_in_use:found x =%d",x);
+                            BTIF_TRACE_DEBUG("btif_hl_num_dchs_in_use:found x =%d",x);
                             cnt++;
                         }
                     }
@@ -259,7 +262,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG2("%s dch in use count=%d", __FUNCTION__, cnt);
+    BTIF_TRACE_DEBUG("%s dch in use count=%d", __FUNCTION__, cnt);
     return cnt;
 }
 /*******************************************************************************
@@ -274,7 +277,7 @@
 {
     btif_hl_mcl_cb_t    *p_mcb;
     UINT8               i,j;
-    BTIF_TRACE_DEBUG2("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );
+    BTIF_TRACE_DEBUG("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );
 
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
@@ -284,18 +287,18 @@
 
             if (p_mcb->cch_timer_active)
             {
-                BTIF_TRACE_DEBUG3("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
+                BTIF_TRACE_DEBUG("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
                                   i, j,  p_mcb->is_connected);
                 p_mcb->cch_timer_active = FALSE;
                 if (p_mcb->is_connected)
                 {
-                    BTIF_TRACE_DEBUG3("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
+                    BTIF_TRACE_DEBUG("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
                                       i ,j, p_mcb->mcl_handle);
                     BTA_HlCchClose(p_mcb->mcl_handle);
                 }
                 else
                 {
-                    BTIF_TRACE_DEBUG2("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
+                    BTIF_TRACE_DEBUG("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
                 }
             }
         }
@@ -312,13 +315,13 @@
 void btif_hl_stop_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
 {
     btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
-    BTIF_TRACE_DEBUG4("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
+    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
                       __FUNCTION__,app_idx, mcl_idx, p_mcb->cch_timer.in_use);
 
     p_mcb->cch_timer_active = FALSE;
     if (p_mcb->cch_timer.in_use)
     {
-        BTIF_TRACE_DEBUG0("stop CCH timer ");
+        BTIF_TRACE_DEBUG("stop CCH timer ");
         btu_stop_timer(&p_mcb->cch_timer);
     }
 }
@@ -333,14 +336,14 @@
 void btif_hl_start_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
 {
     btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
-    BTIF_TRACE_DEBUG5("%s app_idx=%d, mcl_idx=%d  timer_active=%d timer_in_use=%d",
+    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d  timer_active=%d timer_in_use=%d",
                       __FUNCTION__,app_idx, mcl_idx,
                       p_mcb->cch_timer_active, p_mcb->cch_timer.in_use);
 
     p_mcb->cch_timer_active = TRUE;
     if (!p_mcb->cch_timer.in_use)
     {
-        BTIF_TRACE_DEBUG0("Start CCH timer ");
+        BTIF_TRACE_DEBUG("Start CCH timer ");
         memset(&p_mcb->cch_timer, 0, sizeof(TIMER_LIST_ENT));
         p_mcb->cch_timer.param = (UINT32)btif_hl_tmr_hdlr;
         btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
@@ -348,7 +351,7 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("Restart CCH timer ");
+        BTIF_TRACE_DEBUG("Restart CCH timer ");
         btu_stop_timer(&p_mcb->cch_timer);
         btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
                         BTIF_TIMEOUT_CCH_NO_DCH_SECS);
@@ -383,7 +386,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG4("%s found=%d mdl_id=%d mdl_idx=%d ",
+    BTIF_TRACE_DEBUG("%s found=%d mdl_id=%d mdl_idx=%d ",
                       __FUNCTION__,found, mdl_id, i);
 
     return found;
@@ -402,8 +405,8 @@
 {
     void *p_new;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-    BTIF_TRACE_DEBUG2("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
 
     if (size < 6000)
     {
@@ -411,7 +414,7 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("btif_hl_get_buf use HL large data pool");
+        BTIF_TRACE_DEBUG("btif_hl_get_buf use HL large data pool");
         p_new = GKI_getpoolbuf(4);
     }
 
@@ -430,12 +433,12 @@
 {
     if (*p != NULL)
     {
-        BTIF_TRACE_DEBUG1("%s OK", __FUNCTION__ );
+        BTIF_TRACE_DEBUG("%s OK", __FUNCTION__ );
         GKI_freebuf(*p);
         *p = NULL;
     }
     else
-        BTIF_TRACE_ERROR1("%s NULL pointer",__FUNCTION__ );
+        BTIF_TRACE_ERROR("%s NULL pointer",__FUNCTION__ );
 }
 /*******************************************************************************
 **
@@ -463,7 +466,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG1("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
+    BTIF_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
     return is_existed;
 }
 /*******************************************************************************
@@ -477,7 +480,7 @@
 *******************************************************************************/
 static void btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t *p_cb)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
     memset(p_cb, 0 , sizeof(btif_hl_delete_mdl_t));
 }
 
@@ -492,7 +495,7 @@
 *******************************************************************************/
 static void btif_hl_clean_pcb(btif_hl_pending_chan_cb_t *p_pcb)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
     memset(p_pcb, 0 , sizeof(btif_hl_pending_chan_cb_t));
 }
 
@@ -508,7 +511,7 @@
 *******************************************************************************/
 static void btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t *p_dcb)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
     btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
     btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
     memset(p_dcb, 0 , sizeof(btif_hl_mdl_cb_t));
@@ -527,7 +530,7 @@
 static void btif_hl_clean_mcl_cb(UINT8 app_idx, UINT8 mcl_idx)
 {
     btif_hl_mcl_cb_t     *p_mcb;
-    BTIF_TRACE_DEBUG3("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
+    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
     memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
 }
@@ -568,12 +571,12 @@
     BOOLEAN                 found = FALSE;
     BOOLEAN                 elem_found;
 
-    BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter");
+    BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter");
     num_recs = p_mcb->sdp.num_recs;
     num_elems = p_acb->filter.num_elems;
     if (!num_elems)
     {
-        BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
+        BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
         *p_sdp_idx = 0;
         found = TRUE;
         return found;
@@ -616,13 +619,13 @@
 
         if (found)
         {
-            BTIF_TRACE_DEBUG1("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
+            BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
             *p_sdp_idx = i;
             break;
         }
     }
 
-    BTIF_TRACE_DEBUG3("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
+    BTIF_TRACE_DEBUG("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
 
     btif_hl_reset_mdep_filter(app_idx);
 
@@ -655,7 +658,7 @@
     UINT8                mdl_idx;
 
 
-    BTIF_TRACE_DEBUG4("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
+    BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
                       __FUNCTION__, app_idx, mcl_idx, mdep_cfg_idx  );
     switch (local_cfg)
     {
@@ -676,13 +679,13 @@
             dch_mode = BTA_HL_DCH_MODE_STREAMING;
             break;
         default:
-            BTIF_TRACE_ERROR1("Invalid local_cfg=%d",local_cfg );
+            BTIF_TRACE_ERROR("Invalid local_cfg=%d",local_cfg );
             return is_reconnect_ok;
             break;
 
     }
 
-    BTIF_TRACE_DEBUG3("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
+    BTIF_TRACE_DEBUG("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
                       local_cfg, use_mdl_dch_mode, dch_mode  );
 
     for (i=0, p_mdl=&p_acb->mdl_cfg[0] ; i< BTA_HL_NUM_MDL_CFGS; i++, p_mdl++ )
@@ -694,7 +697,7 @@
             p_mdl->base.mdl_id &&
             !btif_hl_find_mdl_idx(app_idx, mcl_idx,p_mdl->base.mdl_id, &mdl_idx))
         {
-            BTIF_TRACE_DEBUG4("i=%d Matched active=%d   mdl_id =%d, mdl_dch_mode=%d",
+            BTIF_TRACE_DEBUG("i=%d Matched active=%d   mdl_id =%d, mdl_dch_mode=%d",
                               i, p_mdl->base.active, p_mdl->base.mdl_id,p_mdl->base.dch_mode);
             if (!use_mdl_dch_mode)
             {
@@ -702,7 +705,7 @@
                 {
                     is_reconnect_ok = TRUE;
                     *p_mdl_id = p_mdl->base.mdl_id;
-                    BTIF_TRACE_DEBUG2("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
+                    BTIF_TRACE_DEBUG("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
                     break;
                 }
             }
@@ -718,7 +721,7 @@
                         p_mdl1->base.dch_mode == BTA_HL_DCH_MODE_STREAMING)
                     {
                         stream_mode_avail = TRUE;
-                        BTIF_TRACE_DEBUG1("found streaming mode mdl index=%d", j);
+                        BTIF_TRACE_DEBUG("found streaming mode mdl index=%d", j);
                         break;
                     }
                 }
@@ -727,14 +730,14 @@
                 {
                     dch_mode = BTA_HL_DCH_MODE_STREAMING;
                     *p_mdl_id = p_mdl1->base.mdl_id;
-                    BTIF_TRACE_DEBUG2("reconnect is ok index=%d dch_mode=streaming  mdl_id=%d", j, *p_mdl_id);
+                    BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=streaming  mdl_id=%d", j, *p_mdl_id);
                     break;
                 }
                 else
                 {
                     dch_mode= p_mdl->base.dch_mode;
                     *p_mdl_id = p_mdl->base.mdl_id;
-                    BTIF_TRACE_DEBUG3("reconnect is ok index=%d  dch_mode=%d mdl_id=%d", i,  p_mdl->base.dch_mode, *p_mdl_id);
+                    BTIF_TRACE_DEBUG("reconnect is ok index=%d  dch_mode=%d mdl_id=%d", i,  p_mdl->base.dch_mode, *p_mdl_id);
                     break;
 
                 }
@@ -744,7 +747,7 @@
 
     }
 
-    BTIF_TRACE_DEBUG3("is_reconnect_ok  dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
+    BTIF_TRACE_DEBUG("is_reconnect_ok  dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
     return is_reconnect_ok;
 }
 
@@ -769,9 +772,9 @@
     tBTA_HL_MDL_ID              mdl_id;
     tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
 
-    BTIF_TRACE_DEBUG2("%s app_id=%d ",
+    BTIF_TRACE_DEBUG("%s app_id=%d ",
                       __FUNCTION__, app_id );
-    BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                       bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);
 
     if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -803,14 +806,14 @@
                     if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, mdep_cfg_idx, p_dch_open_api, &mdl_id ))
                     {
 
-                        BTIF_TRACE_DEBUG0("Issue DCH open" );
+                        BTIF_TRACE_DEBUG("Issue DCH open" );
                         BTA_HlDchOpen(p_mcb->mcl_handle, p_dch_open_api);
                     }
                     else
                     {
                         reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
                         reconnect_param.mdl_id = mdl_id;;
-                        BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id   );
+                        BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id   );
                         BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
                     }
 
@@ -827,7 +830,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG1("status=%d ", status);
+    BTIF_TRACE_DEBUG("status=%d ", status);
     return status;
 }
 /*******************************************************************************
@@ -856,7 +859,7 @@
 **
 *******************************************************************************/
 void btif_hl_display_bt_bda(bt_bdaddr_t *bd_addr){
-    BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                       bd_addr->address[0],   bd_addr->address[1], bd_addr->address[2],
                       bd_addr->address[3],  bd_addr->address[4],   bd_addr->address[5]);
 }
@@ -873,7 +876,7 @@
 void  btif_hl_dch_abort(UINT8 app_idx, UINT8 mcl_idx){
     btif_hl_mcl_cb_t      *p_mcb;
 
-    BTIF_TRACE_DEBUG3("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
+    BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
     if (p_mcb->is_connected)
     {
@@ -904,9 +907,9 @@
     UINT8                       app_idx, mcl_idx, chan_idx;
     BOOLEAN                     status = TRUE;
 
-    BTIF_TRACE_DEBUG5("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
                       __FUNCTION__, app_id, ctrl_psm, mdep_cfg_idx, op);
-    BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                       bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);
 
     if (btif_hl_find_app_idx(app_id, &app_idx))
@@ -957,28 +960,28 @@
             else
             {
                 status = FALSE;
-                BTIF_TRACE_ERROR0("Open CCH request discarded- No mcl cb");
+                BTIF_TRACE_ERROR("Open CCH request discarded- No mcl cb");
             }
         }
         else
         {
             status = FALSE;
-            BTIF_TRACE_ERROR0("Open CCH request discarded- already in USE");
+            BTIF_TRACE_ERROR("Open CCH request discarded- already in USE");
         }
     }
     else
     {
         status = FALSE;
-        BTIF_TRACE_ERROR1("Invalid app_id=%d", app_id);
+        BTIF_TRACE_ERROR("Invalid app_id=%d", app_id);
     }
 
     if (channel_id)
     {
-        BTIF_TRACE_DEBUG2("status=%d channel_id=0x%08x", status, *channel_id);
+        BTIF_TRACE_DEBUG("status=%d channel_id=0x%08x", status, *channel_id);
     }
     else
     {
-        BTIF_TRACE_DEBUG1("status=%d ", status);
+        BTIF_TRACE_DEBUG("status=%d ", status);
     }
     return status;
 }
@@ -1002,6 +1005,8 @@
     UINT8 i,j;
     int mdl_cfg_channel_id;
 
+    *p_app_idx = 0;
+    *p_mdl_cfg_idx =0;
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
@@ -1021,7 +1026,7 @@
         }
     }
 
-    BTIF_TRACE_EVENT5("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d  ",
+    BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d  ",
                       __FUNCTION__,found,channel_id, i,j );
     return found;
 }
@@ -1066,7 +1071,7 @@
             }
         }
     }
-    BTIF_TRACE_DEBUG5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
                       __FUNCTION__,found,i,j,k );
     return found;
 }
@@ -1101,7 +1106,7 @@
                     }
                 }
         }
-    BTIF_TRACE_EVENT6("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d  ",
+    BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d  ",
                     __FUNCTION__,found,*p_channel_id,mdl_id, app_idx,j );
     return found;
 }
@@ -1125,6 +1130,9 @@
     BOOLEAN found=FALSE;
     UINT8 i,j,k;
 
+    *p_app_idx = 0;
+    *p_mcl_idx =0;
+    *p_mdl_idx = 0;
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
@@ -1150,7 +1158,7 @@
     }
 
 
-    BTIF_TRACE_EVENT5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
+    BTIF_TRACE_EVENT("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
                       __FUNCTION__,found,i,j,k );
     return found;
 }
@@ -1176,17 +1184,17 @@
     tBTA_HL_MDEP_ROLE   peer_mdep_role;
 
 
-    BTIF_TRACE_DEBUG4("%s app_id=%d local_mdep_role=%d, data_type=%d",
+    BTIF_TRACE_DEBUG("%s app_id=%d local_mdep_role=%d, data_type=%d",
                       __FUNCTION__, app_id, local_mdep_role, data_type);
 
-    BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
+    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                       bd_addr[0],  bd_addr[1],
                       bd_addr[2],  bd_addr[3],
                       bd_addr[4],  bd_addr[5]);
 
 
-    BTIF_TRACE_DEBUG1("local_mdep_role=%d", local_mdep_role);
-    BTIF_TRACE_DEBUG1("data_type=%d", data_type);
+    BTIF_TRACE_DEBUG("local_mdep_role=%d", local_mdep_role);
+    BTIF_TRACE_DEBUG("data_type=%d", data_type);
 
     if (local_mdep_role == BTA_HL_MDEP_ROLE_SINK)
         peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
@@ -1200,18 +1208,18 @@
         {
             p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 
-            BTIF_TRACE_DEBUG2("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
-            BTIF_TRACE_DEBUG2("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
+            BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
+            BTIF_TRACE_DEBUG("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
             if (p_mcb->valid_sdp_idx)
             {
                 p_rec = &p_mcb->sdp.sdp_rec[p_mcb->sdp_idx];
                 num_mdeps = p_rec->num_mdeps;
-                BTIF_TRACE_DEBUG1("num_mdeps=%d", num_mdeps);
+                BTIF_TRACE_DEBUG("num_mdeps=%d", num_mdeps);
 
                 for (i=0; i< num_mdeps; i++)
                 {
-                    BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
-                    BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
+                    BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
+                    BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
                     if ((p_rec->mdep_cfg[i].mdep_role == peer_mdep_role) &&
                         (p_rec->mdep_cfg[i].data_type == data_type))
                     {
@@ -1224,55 +1232,10 @@
         }
     }
 
-    BTIF_TRACE_DEBUG2("found =%d  *p_peer_mdep_id=%d", found,  *p_peer_mdep_id);
+    BTIF_TRACE_DEBUG("found =%d  *p_peer_mdep_id=%d", found,  *p_peer_mdep_id);
 
     return found;
 }
-/*******************************************************************************
-**
-** Function        btif_hl_find_local_mdep_id
-**
-** Description      Find the local MDEP ID from the MDEP configuration
-**
-** Returns          BOOLEAN
-**
-*******************************************************************************/
-static BOOLEAN btif_hl_find_local_mdep_id(UINT8 app_id,
-                                          tBTA_HL_MDEP_ROLE local_mdep_role,
-                                          UINT16 mdep_data_type,
-                                          tBTA_HL_MDEP_ID *p_local_mdep_id){
-    UINT8 app_idx;
-    btif_hl_app_cb_t      *p_acb;
-    UINT8  i,j;
-    BOOLEAN found = FALSE;
-
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-
-    if (btif_hl_find_app_idx(app_id, &app_idx) )
-    {
-        p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
-
-        for (i=0; i< p_acb->sup_feature.num_of_mdeps; i++)
-        {
-            if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == local_mdep_role )
-            {
-                for (j=0; j< p_acb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types; j++)
-                {
-                    if ( p_acb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].data_type == mdep_data_type)
-                    {
-                        found = TRUE;
-                        *p_local_mdep_id = p_acb->sup_feature.mdep[i].mdep_id;
-                        return found;
-                    }
-                }
-            }
-        }
-
-
-    }
-    BTIF_TRACE_DEBUG2("found=%d local mdep id=%d", found, *p_local_mdep_id );
-    return found;
-}
 
 /*******************************************************************************
 **
@@ -1292,7 +1255,7 @@
 
     for (i=0; i< p_sup_feature->num_of_mdeps; i++)
     {
-        BTIF_TRACE_DEBUG2("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
+        BTIF_TRACE_DEBUG("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
                     p_sup_feature->mdep[i].mdep_id,app_idx);
         if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
         {
@@ -1302,7 +1265,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG5("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
+    BTIF_TRACE_DEBUG("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
                       __FUNCTION__, found,i, local_mdep_id,app_idx);
     return found;
 }
@@ -1324,6 +1287,7 @@
     btif_hl_app_cb_t  *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
     btif_hl_mcl_cb_t  *p_mcb;
 
+    *p_mcl_idx = 0;
     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
     {
         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, i);
@@ -1337,7 +1301,7 @@
     }
 
 
-    BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
+    BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
     return found;
 }
 /*******************************************************************************
@@ -1350,7 +1314,7 @@
 **
 *******************************************************************************/
 static void btif_hl_init(void){
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
     btif_hl_init_next_app_id();
     btif_hl_init_next_channel_id();
@@ -1365,7 +1329,7 @@
 **
 *******************************************************************************/
 static void btif_hl_disable(void){
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if ((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&
         (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))
@@ -1396,7 +1360,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG2("%s no_active_app=%d  ", __FUNCTION__, no_active_app );
+    BTIF_TRACE_DEBUG("%s no_active_app=%d  ", __FUNCTION__, no_active_app );
     return no_active_app;
 }
 
@@ -1427,7 +1391,7 @@
 **
 *******************************************************************************/
 static void btif_hl_set_state(btif_hl_state_t state){
-    BTIF_TRACE_DEBUG2("btif_hl_set_state:  %d ---> %d ", p_btif_hl_cb->state, state);
+    BTIF_TRACE_DEBUG("btif_hl_set_state:  %d ---> %d ", p_btif_hl_cb->state, state);
     p_btif_hl_cb->state = state;
 }
 
@@ -1442,7 +1406,7 @@
 *******************************************************************************/
 
 static btif_hl_state_t btif_hl_get_state(void){
-    BTIF_TRACE_DEBUG1("btif_hl_get_state:  %d   ", p_btif_hl_cb->state);
+    BTIF_TRACE_DEBUG("btif_hl_get_state:  %d   ", p_btif_hl_cb->state);
     return p_btif_hl_cb->state;
 }
 
@@ -1469,7 +1433,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG4("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
+    BTIF_TRACE_DEBUG("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
     return found;
 }
 
@@ -1513,7 +1477,7 @@
 
     }
 
-    BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
+    BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
                       __FUNCTION__, mdep_role, data_type, max_tx_apdu_size);
     return max_tx_apdu_size;
 }
@@ -1558,7 +1522,7 @@
     }
 
 
-    BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
+    BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
                       __FUNCTION__, mdep_role, data_type, max_rx_apdu_size);
 
     return max_rx_apdu_size;
@@ -1585,11 +1549,12 @@
             *p = BTA_HL_MDEP_ROLE_SINK;
             break;
         default:
+            *p = BTA_HL_MDEP_ROLE_SOURCE;
             status = FALSE;
             break;
     }
 
-    BTIF_TRACE_DEBUG4("%s status=%d bta_mdep_role=%d (%d:btif)",
+    BTIF_TRACE_DEBUG("%s status=%d bta_mdep_role=%d (%d:btif)",
                       __FUNCTION__, status, *p, mdep);
     return status;
 }
@@ -1620,7 +1585,7 @@
             status = FALSE;
             break;
     }
-    BTIF_TRACE_DEBUG3("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
+    BTIF_TRACE_DEBUG("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
                       __FUNCTION__, status, *p);
     return status;
 }
@@ -1654,7 +1619,7 @@
     int channel_id;
     btif_hl_cb.next_channel_id++;
     channel_id = (app_id << 16) + next_channel_id;
-    BTIF_TRACE_DEBUG4("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
                       channel_id, app_id,  next_channel_id);
     return channel_id;
 }
@@ -1670,7 +1635,7 @@
 
 static UINT8 btif_hl_get_app_id(int channel_id){
     UINT8 app_id =(UINT8) (channel_id >> 16);
-    BTIF_TRACE_DEBUG3("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
+    BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
     return app_id;
 }
 /*******************************************************************************
@@ -1724,7 +1689,7 @@
         }
     }
 
-    BTIF_TRACE_EVENT4("%s status=%d handle=%d app_idx=%d ",
+    BTIF_TRACE_EVENT("%s status=%d handle=%d app_idx=%d ",
                       __FUNCTION__, found, app_handle , i);
 
     return found;
@@ -1744,6 +1709,7 @@
     BOOLEAN found=FALSE;
     UINT8 i;
 
+    *p_app_idx = 0;
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
         if (btif_hl_cb.acb[i].in_use &&
@@ -1755,7 +1721,7 @@
         }
     }
 
-    BTIF_TRACE_EVENT4("%s found=%d app_id=%d app_idx=%d ",
+    BTIF_TRACE_EVENT("%s found=%d app_id=%d app_idx=%d ",
                       __FUNCTION__, found, app_id , i);
 
     return found;
@@ -1782,7 +1748,7 @@
         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
         {
             if (p_acb->mcb[j].in_use)
-                BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
+                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
                 "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
             if (p_acb->mcb[j].in_use &&
                 (p_acb->mcb[j].mcl_handle == mcl_handle))
@@ -1794,7 +1760,7 @@
             }
         }
     }
-    BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
                       found, i, j);
     return found;
 }
@@ -1824,12 +1790,12 @@
                 (p_acb->mcb[j].mcl_handle == mcl_handle))
             {
                     p_mcb = &p_acb->mcb[j];
-                    BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
+                    BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                     {
                         if (p_mcb->mdl[x].in_use && p_mcb->mdl[x].mdl_id == mdl_id)
                         {
-                            BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
+                            BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
                             found = TRUE;
                             *p_app_idx = i;
                             *p_mcl_idx = j;
@@ -1839,7 +1805,7 @@
             }
         }
     }
-    BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
                       found, i, j);
     return found;
 }
@@ -1863,7 +1829,7 @@
     {
         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
         if (p_acb->delete_mdl.active) {
-            BTIF_TRACE_DEBUG3("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
+            BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
                               "mdl_id=%d mcl_handle=%d",i,mdl_id,p_acb->mcb[i].mcl_handle);
         }
         if (p_acb->delete_mdl.active &&
@@ -1874,7 +1840,7 @@
             break;
         }
     }
-    BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d",__FUNCTION__,
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d",__FUNCTION__,
                       found, i);
     return found;
 }
@@ -1933,7 +1899,7 @@
             break;
         }
     }
-    BTIF_TRACE_DEBUG3("%s found=%dmcl_idx=%d",__FUNCTION__,
+    BTIF_TRACE_DEBUG("%s found=%dmcl_idx=%d",__FUNCTION__,
                       found, j);
     return found;
 }
@@ -1960,7 +1926,7 @@
             if (p_acb->mcb[j].in_use)
             {
                     p_mcb = &p_acb->mcb[j];
-                    BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
+                    BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                     {
                         if (p_mcb->mdl[x].in_use)
@@ -1977,7 +1943,7 @@
                             btif_hl_clean_mdl_cb(p_dcb);
                             if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
                                     BTA_HlCchClose(p_mcb->mcl_handle);
-                            BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", x);
+                            BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", x);
                         }
                     }
             }
@@ -2008,7 +1974,7 @@
             break;
         }
     }
-    BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
 
     return found;
 }
@@ -2026,9 +1992,10 @@
     BOOLEAN found=FALSE;
     UINT8 i;
 
+    *p_app_idx = 0;
     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
     {
-        BTIF_TRACE_DEBUG1("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
+        BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
                 btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id);
         if (btif_hl_cb.acb[i].in_use &&
             (btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id == mdep_id))
@@ -2038,7 +2005,7 @@
             break;
         }
     }
-    BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
 
     return found;
 }
@@ -2069,7 +2036,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
+    BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
     return found;
 }
 
@@ -2095,7 +2062,7 @@
             break;
         }
     }
-    BTIF_TRACE_DEBUG3("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
+    BTIF_TRACE_DEBUG("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
     return found;
 }
 
@@ -2122,7 +2089,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i);
+    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i);
     return found;
 }
 
@@ -2145,7 +2112,7 @@
     bthl_app_reg_state_t    state = BTHL_APP_REG_STATE_DEREG_SUCCESS;
     bt_status_t             status            = BT_STATUS_SUCCESS;
 
-    BTIF_TRACE_DEBUG3("%s de-reg status=%d app_handle=%d", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s de-reg status=%d app_handle=%d", __FUNCTION__,
                 p_data->dereg_cfm.status, p_data->dereg_cfm.app_handle);
 
     if (btif_hl_find_app_idx_using_app_id(p_data->dereg_cfm.app_id, &app_idx))
@@ -2160,7 +2127,7 @@
         else
             state = BTHL_APP_REG_STATE_DEREG_FAILED;
 
-        BTIF_TRACE_DEBUG2("call reg state callback app_id=%d state=%d", app_id, state);
+        BTIF_TRACE_DEBUG("call reg state callback app_id=%d state=%d", app_id, state);
         BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, app_id, state );
 
         if (btif_hl_is_no_active_app())
@@ -2185,7 +2152,7 @@
     bthl_app_reg_state_t   state = BTHL_APP_REG_STATE_REG_SUCCESS;
     bt_status_t            bt_status;
 
-    BTIF_TRACE_DEBUG3("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
+    BTIF_TRACE_DEBUG("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
 
     if (btif_hl_find_app_idx(p_data->reg_cfm.app_id, &app_idx))
     {
@@ -2201,35 +2168,13 @@
             state = BTHL_APP_REG_STATE_REG_FAILED;
         }
 
-        BTIF_TRACE_DEBUG3("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__,  p_data->reg_cfm.app_id, state);
+        BTIF_TRACE_DEBUG("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__,  p_data->reg_cfm.app_id, state);
         BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, ((int) p_data->reg_cfm.app_id), state );
     }
 }
 
 /*******************************************************************************
 **
-** Function         btif_hl_proc_sdp_info_ind
-**
-** Description      Process the SDP info indication
-**
-** Returns          Nothing
-**
-*******************************************************************************/
-static void btif_hl_proc_sdp_info_ind(tBTA_HL *p_data)
-
-{
-    btif_hl_app_cb_t         *p_acb;
-    UINT8                   app_idx;
-
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-    if (btif_hl_find_app_idx_using_handle(p_data->sdp_info_ind.app_handle, &app_idx))
-    {
-        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
-        memcpy(&p_acb->sdp_info_ind, &p_data->sdp_info_ind, sizeof(tBTA_HL_SDP_INFO_IND));
-    }
-}
-/*******************************************************************************
-**
 ** Function btif_hl_set_chan_cb_state
 **
 ** Description set the channel callback state
@@ -2244,7 +2189,7 @@
     if (cur_state != state)
     {
         p_pcb->cb_state = state;
-        BTIF_TRACE_DEBUG3("%s state %d--->%d",__FUNCTION__, cur_state, state);
+        BTIF_TRACE_DEBUG("%s state %d--->%d",__FUNCTION__, cur_state, state);
     }
 
 
@@ -2263,8 +2208,8 @@
     int             app_id = (int) btif_hl_get_app_id(p_acb->delete_mdl.channel_id);
 
     btif_hl_copy_bda(&bd_addr, p_acb->delete_mdl.bd_addr);
-    BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
-    BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
+    BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
                       p_acb->delete_mdl.mdep_cfg_idx, BTHL_CONN_STATE_DESTROYED, 0);
     btif_hl_display_bt_bda(&bd_addr);
 
@@ -2289,8 +2234,8 @@
 
     btif_hl_copy_bda(&bd_addr, p_scb->bd_addr);
 
-    BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
-    BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
+    BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
                       p_scb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0]);
     btif_hl_display_bt_bda(&bd_addr);
     BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
@@ -2315,8 +2260,8 @@
 
     if (p_pcb->in_use && p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
     {
-        BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
-        BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+        BTIF_TRACE_DEBUG("%s",__FUNCTION__);
+        BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                           p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
         btif_hl_display_bt_bda(&bd_addr);
 
@@ -2342,20 +2287,20 @@
 
     btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
 
-    BTIF_TRACE_DEBUG2("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
+    BTIF_TRACE_DEBUG("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
     if (p_pcb->in_use)
     {
-        BTIF_TRACE_DEBUG1("%p_pcb->cb_state=%d",p_pcb->cb_state);
+        BTIF_TRACE_DEBUG("%p_pcb->cb_state=%d",p_pcb->cb_state);
         if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
         {
-            BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
             btif_hl_display_bt_bda(&bd_addr);
             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
                                &bd_addr, p_pcb->mdep_cfg_idx,
                                p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
 
-            BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
             btif_hl_display_bt_bda(&bd_addr);
             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
@@ -2364,7 +2309,7 @@
         }
         else if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
         {
-            BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
+            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
             btif_hl_display_bt_bda(&bd_addr);
             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
@@ -2394,22 +2339,22 @@
     BOOLEAN                         status =FALSE;
     btif_hl_pending_chan_cb_t     *p_pcb;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     p_sdp = p_data->sdp_query_cfm.p_sdp;
     num_recs = p_sdp->num_recs;
 
-    BTIF_TRACE_DEBUG1("num of SDP records=%d",num_recs);
+    BTIF_TRACE_DEBUG("num of SDP records=%d",num_recs);
     for (i=0; i<num_recs; i++)
     {
-        BTIF_TRACE_DEBUG3("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
+        BTIF_TRACE_DEBUG("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
                           (i+1),p_sdp->sdp_rec[i].ctrl_psm, p_sdp->sdp_rec[i].data_psm);
-        BTIF_TRACE_DEBUG1("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
+        BTIF_TRACE_DEBUG("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
         num_mdeps = p_sdp->sdp_rec[i].num_mdeps;
-        BTIF_TRACE_DEBUG1("num of mdeps =%d",num_mdeps);
+        BTIF_TRACE_DEBUG("num of mdeps =%d",num_mdeps);
         for (j=0; j< num_mdeps; j++)
         {
-            BTIF_TRACE_DEBUG4("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
+            BTIF_TRACE_DEBUG("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
                               (j+1),
                               p_sdp->sdp_rec[i].mdep_cfg[j].mdep_id,
                               p_sdp->sdp_rec[i].mdep_cfg[j].data_type,
@@ -2471,7 +2416,7 @@
                                     }
                                     else
                                     {
-                                        BTIF_TRACE_DEBUG0("channel abort pending");
+                                        BTIF_TRACE_DEBUG("channel abort pending");
                                     }
                                 }
                                 break;
@@ -2481,13 +2426,13 @@
                                 break;
 
                             default:
-                                BTIF_TRACE_ERROR1("Invalid CCH oper %d", old_cch_oper);
+                                BTIF_TRACE_ERROR("Invalid CCH oper %d", old_cch_oper);
                                 break;
                         }
                     }
                     else
                     {
-                        BTIF_TRACE_ERROR0("Can not find SDP idx discard CCH Open request");
+                        BTIF_TRACE_ERROR("Can not find SDP idx discard CCH Open request");
                     }
                 }
             }
@@ -2512,7 +2457,7 @@
     UINT8                   app_idx, mcl_idx;
     int                     i;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     for(i=0; i<BTA_HL_NUM_APPS; i++)
     {
         if (btif_hl_cb.acb[i].in_use)
@@ -2532,7 +2477,7 @@
             }
             else
             {
-                BTIF_TRACE_ERROR0("The MCL already exist for cch_open_ind");
+                BTIF_TRACE_ERROR("The MCL already exist for cch_open_ind");
             }
         }
     }
@@ -2567,7 +2512,7 @@
             case BTIF_HL_PEND_DCH_OP_OPEN:
                 if (!p_pcb->abort_pending)
                 {
-                    BTIF_TRACE_DEBUG0("op BTIF_HL_PEND_DCH_OP_OPEN");
+                    BTIF_TRACE_DEBUG("op BTIF_HL_PEND_DCH_OP_OPEN");
                     dch_open.ctrl_psm = p_mcb->ctrl_psm;
                     dch_open.local_mdep_id = p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_id;
                     if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
@@ -2581,19 +2526,19 @@
                             dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
                         }
                         dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
-                        BTIF_TRACE_DEBUG1("dch_open.local_cfg=%d  ", dch_open.local_cfg);
+                        BTIF_TRACE_DEBUG("dch_open.local_cfg=%d  ", dch_open.local_cfg);
                         btif_hl_send_setup_connecting_cb(app_idx,mcl_idx);
 
                         if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, p_pcb->mdep_cfg_idx, &dch_open, &mdl_id ))
                         {
-                            BTIF_TRACE_DEBUG1("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
+                            BTIF_TRACE_DEBUG("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
                             BTA_HlDchOpen(p_mcb->mcl_handle, &dch_open);
                         }
                         else
                         {
                             reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
                             reconnect_param.mdl_id = mdl_id;;
-                            BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
+                            BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
                             BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
                         }
                         status = TRUE;
@@ -2635,18 +2580,17 @@
     BOOLEAN                  status = FALSE;
     tBTA_HL_DCH_OPEN_PARAM   dch_open;
 
-
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
     {
-        BTIF_TRACE_DEBUG1("app_idx=%d", app_idx);
+        BTIF_TRACE_DEBUG("app_idx=%d", app_idx);
         if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
         {
             p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
 
             p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
-            BTIF_TRACE_DEBUG2("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
+            BTIF_TRACE_DEBUG("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
             p_mcb->mcl_handle = p_data->cch_open_cfm.mcl_handle;
             p_mcb->is_connected = TRUE;
             status = btif_hl_proc_pending_op(app_idx, mcl_idx);
@@ -2677,7 +2621,7 @@
         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
         {
             if (p_acb->mcb[j].in_use)
-                BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
+                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
                     "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
             if (p_acb->mcb[j].in_use &&
                 (p_acb->mcb[j].mcl_handle == mcl_handle))
@@ -2704,7 +2648,7 @@
 
 {
     UINT8                   app_idx, mcl_idx;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
 }
@@ -2722,7 +2666,7 @@
 static void btif_hl_proc_cch_close_cfm(tBTA_HL *p_data)
 {
     UINT8                   app_idx, mcl_idx;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
 }
@@ -2747,7 +2691,7 @@
     tBTA_HL_DCH_CREATE_RSP  rsp_code = BTA_HL_DCH_CREATE_RSP_CFG_REJ;
     tBTA_HL_DCH_CREATE_RSP_PARAM create_rsp_param;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
 // Find the correct app_idx based on the mdep_id;
     btif_hl_find_app_idx_using_mdepId(p_data->dch_create_ind.local_mdep_id,&orig_app_idx);
@@ -2779,13 +2723,13 @@
                     break;
                 case BTA_HL_MDEP_ROLE_SINK:
 
-                    BTIF_TRACE_DEBUG0("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
+                    BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
                     if ((p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_RELIABLE) ||
                         (first_reliable_exist && (p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_STREAMING)))
                     {
                         rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
                         rsp_cfg = p_data->dch_create_ind.cfg;
-                        BTIF_TRACE_DEBUG1("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
+                        BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
                     }
                     break;
                 default:
@@ -2800,7 +2744,7 @@
 
     if (success)
     {
-        BTIF_TRACE_DEBUG2("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
+        BTIF_TRACE_DEBUG("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
         create_rsp_param.local_mdep_id = p_data->dch_create_ind.local_mdep_id;
         create_rsp_param.mdl_id = p_data->dch_create_ind.mdl_id;
         create_rsp_param.rsp_code = rsp_code;
@@ -2828,7 +2772,7 @@
     UINT8                    dc_cfg;
     BOOLEAN close_dch = FALSE;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     // Find the correct app_idx based on the mdep_id;
     btif_hl_find_app_idx_using_mdepId(p_data->dch_open_ind.local_mdep_id,&orig_app_idx);
@@ -2856,23 +2800,23 @@
 
                 if(btif_hl_find_channel_id_using_mdl_id(orig_app_idx,p_dcb->mdl_id , &p_dcb->channel_id))
                 {
-                    BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
+                    BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
                                         orig_app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
                     if (!btif_hl_create_socket(orig_app_idx, mcl_idx, mdl_idx))
                     {
-                        BTIF_TRACE_ERROR0("Unable to create socket");
+                        BTIF_TRACE_ERROR("Unable to create socket");
                         close_dch = TRUE;
                     }
                 }
                 else
                 {
-                    BTIF_TRACE_ERROR1("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id  );
+                    BTIF_TRACE_ERROR("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id  );
                     close_dch = TRUE;
                 }
             }
             else
             {
-                BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                 close_dch = TRUE;
             }
 
@@ -2909,7 +2853,7 @@
     BOOLEAN                  status = FALSE;
     BOOLEAN                  close_dch = FALSE;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     // Find the correct app_idx based on the mdep_id;
     btif_hl_find_app_idx_using_mdepId(p_data->dch_open_cfm.local_mdep_id,&app_idx);
@@ -2936,24 +2880,24 @@
                 p_dcb->mtu                  = p_data->dch_open_cfm.mtu;
                 p_dcb->channel_id           = p_pcb->channel_id;
 
-                BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
+                BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
                 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
                 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                 {
                     status = TRUE;
-                    BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
+                    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
                                       app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
                     btif_hl_clean_pcb(p_pcb);
                 }
                 else
                 {
-                    BTIF_TRACE_ERROR0("Unable to create socket");
+                    BTIF_TRACE_ERROR("Unable to create socket");
                     close_dch = TRUE;
                 }
             }
             else
             {
-                BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                 close_dch = TRUE;
             }
 
@@ -2986,7 +2930,7 @@
     BOOLEAN                  status = FALSE;
     BOOLEAN                  close_dch = FALSE;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_cfm.local_mdep_id,&app_idx);
 
@@ -3012,24 +2956,24 @@
                 p_dcb->mtu                  = p_data->dch_reconnect_cfm.mtu;
                 p_dcb->channel_id           = p_pcb->channel_id;
 
-                BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
+                BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
                 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
                 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                 {
                     status = TRUE;
-                    BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
+                    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
                                       app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
                     btif_hl_clean_pcb(p_pcb);
                 }
                 else
                 {
-                    BTIF_TRACE_ERROR0("Unable to create socket");
+                    BTIF_TRACE_ERROR("Unable to create socket");
                     close_dch = TRUE;
                 }
             }
             else
             {
-                BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                 close_dch = TRUE;
             }
 
@@ -3062,7 +3006,7 @@
     UINT8                   app_idx, mcl_idx, mdl_idx, mdep_cfg_idx, dc_cfg;
     BOOLEAN                 close_dch = FALSE;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     // Find the correct app_idx based on the mdep_id;
     btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_ind.local_mdep_id,&app_idx);
@@ -3070,7 +3014,7 @@
     if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_ind.mcl_handle, app_idx, &mcl_idx ))
     {
         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
-        BTIF_TRACE_DEBUG2("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
+        BTIF_TRACE_DEBUG("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
                                 app_idx, mcl_idx);
         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
 
@@ -3091,17 +3035,17 @@
                 p_dcb->mtu                  = p_data->dch_reconnect_ind.mtu;
                 p_dcb->channel_id           = btif_hl_get_next_channel_id(p_acb->app_id);
 
-                BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
+                BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
                                   app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
                 if (!btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                 {
-                    BTIF_TRACE_ERROR0("Unable to create socket");
+                    BTIF_TRACE_ERROR("Unable to create socket");
                     close_dch = TRUE;
                 }
             }
             else
             {
-                BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
+                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                 close_dch = TRUE;
             }
 
@@ -3135,7 +3079,7 @@
     btif_hl_mcl_cb_t         *p_mcb;
     UINT8                   app_idx, mcl_idx, mdl_idx;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_ind.mdl_handle,
                                           &app_idx, &mcl_idx, &mdl_idx ))
     {
@@ -3146,7 +3090,7 @@
         btif_hl_clean_mdl_cb(p_dcb);
         if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
             btif_hl_start_cch_timer(app_idx, mcl_idx);
-        BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", mdl_idx);
+        BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", mdl_idx);
     }
 }
 
@@ -3166,7 +3110,7 @@
     btif_hl_mcl_cb_t         *p_mcb;
     UINT8                   app_idx, mcl_idx, mdl_idx;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_cfm.mdl_handle,
                                           &app_idx, &mcl_idx, &mdl_idx ))
     {
@@ -3176,7 +3120,7 @@
         p_mcb =  BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
         if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
             btif_hl_start_cch_timer(app_idx, mcl_idx);
-        BTIF_TRACE_DEBUG1(" local DCH close success mdl_idx=%d", mdl_idx);
+        BTIF_TRACE_DEBUG(" local DCH close success mdl_idx=%d", mdl_idx);
     }
 }
 
@@ -3193,7 +3137,7 @@
 static void btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle){
 
     UINT8                   app_idx,mcl_idx;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
     btif_hl_app_cb_t  *p_acb;
     UINT8 i,j;
 
@@ -3203,7 +3147,7 @@
         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
         {
             if (p_acb->mcb[j].in_use)
-                BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
+                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
             if (p_acb->mcb[j].in_use &&
                 (p_acb->mcb[j].mcl_handle == mcl_handle))
             {
@@ -3227,7 +3171,7 @@
 static void btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle){
     UINT8                   app_idx,mcl_idx;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
     btif_hl_app_cb_t  *p_acb;
     UINT8 i,j;
 
@@ -3237,7 +3181,7 @@
         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
         {
             if (p_acb->mcb[j].in_use)
-                BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
+                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
             if (p_acb->mcb[j].in_use &&
                 (p_acb->mcb[j].mcl_handle == mcl_handle))
             {
@@ -3265,13 +3209,13 @@
     btif_hl_mdl_cb_t         *p_dcb;
     UNUSED(status);
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     if (btif_hl_find_mdl_idx_using_handle(mdl_handle,
                                           &app_idx, &mcl_idx, &mdl_idx ))
     {
         p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
         btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
-        BTIF_TRACE_DEBUG1("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
+        BTIF_TRACE_DEBUG("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
         p_dcb->tx_size = 0;
     }
 }
@@ -3291,7 +3235,7 @@
     btif_hl_mdl_cb_t         *p_dcb;
     UINT8                   app_idx, mcl_idx, mdl_idx;
 
-    BTIF_TRACE_DEBUG0("btif_hl_proc_dch_cong_ind");
+    BTIF_TRACE_DEBUG("btif_hl_proc_dch_cong_ind");
 
 
     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_cong_ind.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
@@ -3318,11 +3262,11 @@
     btif_hl_app_data_t *p_data;
     UNUSED(p_cback);
 
-    BTIF_TRACE_DEBUG3("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
+    BTIF_TRACE_DEBUG("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
 
     if(reg_counter >1)
     {
-        BTIF_TRACE_DEBUG0("btif_hl_proc_reg_request: calling uPDATE");
+        BTIF_TRACE_DEBUG("btif_hl_proc_reg_request: calling uPDATE");
         BTA_HlUpdate(app_id, p_reg_param,TRUE, btif_hl_cback);
     }
     else
@@ -3352,7 +3296,7 @@
     UINT8                           preg_idx;
     bt_status_t                     bt_status;
 
-    BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
     btif_hl_display_calling_process_name();
 
     switch (event)
@@ -3369,7 +3313,7 @@
             if (send_chan_cb)
             {
                 btif_hl_copy_bda(&bd_addr, p_data->chan_cb.bd_addr);
-                BTIF_TRACE_DEBUG4("state callbk: ch_id=0x%08x cb_state=%d state=%d  fd=%d",
+                BTIF_TRACE_DEBUG("state callbk: ch_id=0x%08x cb_state=%d state=%d  fd=%d",
                                   p_data->chan_cb.channel_id,
                                   p_data->chan_cb.cb_state,
                                   state,  p_data->chan_cb.fd);
@@ -3383,10 +3327,10 @@
         case BTIF_HL_REG_APP:
             p_acb  = BTIF_HL_GET_APP_CB_PTR(p_data->reg.app_idx);
             app_id = (int) p_acb->app_id;
-            BTIF_TRACE_DEBUG2("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
+            BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
             if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED && p_acb->reg_pending)
             {
-                BTIF_TRACE_DEBUG1("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
+                BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
                 p_acb->reg_pending = FALSE;
                 reg_param.dev_type = p_acb->dev_type;
                 reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
@@ -3397,13 +3341,13 @@
             }
             else
             {
-                BTIF_TRACE_DEBUG2("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
+                BTIF_TRACE_DEBUG("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
             }
 
             break;
 
         case BTIF_HL_UNREG_APP:
-            BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
+            BTIF_TRACE_DEBUG("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
             p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->unreg.app_idx);
             if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED)
             {
@@ -3414,12 +3358,12 @@
             }
             break;
         case BTIF_HL_UPDATE_MDL:
-            BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
+            BTIF_TRACE_DEBUG("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
             p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->update_mdl.app_idx);
             break;
 
         default:
-            BTIF_TRACE_ERROR1("Unknown event %d", event);
+            BTIF_TRACE_ERROR("Unknown event %d", event);
             break;
     }
 }
@@ -3442,13 +3386,13 @@
     btif_hl_pend_dch_op_t  pending_op;
     BOOLEAN status;
 
-    BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
     btif_hl_display_calling_process_name();
     switch (event)
     {
         case BTA_HL_REGISTER_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_REGISTER_CFM_EVT");
-            BTIF_TRACE_DEBUG3("app_id=%d app_handle=%d status=%d ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_REGISTER_CFM_EVT");
+            BTIF_TRACE_DEBUG("app_id=%d app_handle=%d status=%d ",
                               p_data->reg_cfm.app_id,
                               p_data->reg_cfm.app_handle,
                               p_data->reg_cfm.status );
@@ -3456,8 +3400,8 @@
             btif_hl_proc_reg_cfm(p_data);
             break;
         case BTA_HL_SDP_INFO_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_INFO_IND_EVT");
-            BTIF_TRACE_DEBUG5("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_INFO_IND_EVT");
+            BTIF_TRACE_DEBUG("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
                               p_data->sdp_info_ind.app_handle,
                               p_data->sdp_info_ind.ctrl_psm,
                               p_data->sdp_info_ind.data_psm,
@@ -3467,20 +3411,20 @@
             break;
 
         case BTA_HL_DEREGISTER_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DEREGISTER_CFM_EVT");
-            BTIF_TRACE_DEBUG2("app_handle=%d status=%d ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DEREGISTER_CFM_EVT");
+            BTIF_TRACE_DEBUG("app_handle=%d status=%d ",
                               p_data->dereg_cfm.app_handle,
                               p_data->dereg_cfm.status );
             btif_hl_proc_dereg_cfm(p_data);
             break;
 
         case BTA_HL_SDP_QUERY_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
-            BTIF_TRACE_DEBUG3("app_handle=%d app_id =%d,status =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
+            BTIF_TRACE_DEBUG("app_handle=%d app_id =%d,status =%d",
                               p_data->sdp_query_cfm.app_handle,p_data->sdp_query_cfm.app_id,
                               p_data->sdp_query_cfm.status);
 
-            BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                               p_data->sdp_query_cfm.bd_addr[0], p_data->sdp_query_cfm.bd_addr[1],
                               p_data->sdp_query_cfm.bd_addr[2], p_data->sdp_query_cfm.bd_addr[3],
                               p_data->sdp_query_cfm.bd_addr[4], p_data->sdp_query_cfm.bd_addr[5]);
@@ -3492,7 +3436,7 @@
 
             if (!status)
             {
-                BTIF_TRACE_DEBUG1("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
+                BTIF_TRACE_DEBUG("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
                                                         p_data->sdp_query_cfm.status);
                 if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
                 {
@@ -3525,13 +3469,13 @@
 
 
         case BTA_HL_CCH_OPEN_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
-            BTIF_TRACE_DEBUG4("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
+            BTIF_TRACE_DEBUG("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
                               p_data->cch_open_cfm.app_id,
                               p_data->cch_open_cfm.app_handle,
                               p_data->cch_open_cfm.mcl_handle,
                               p_data->cch_open_cfm.status);
-            BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                               p_data->cch_open_cfm.bd_addr[0], p_data->cch_open_cfm.bd_addr[1],
                               p_data->cch_open_cfm.bd_addr[2], p_data->cch_open_cfm.bd_addr[3],
                               p_data->cch_open_cfm.bd_addr[4], p_data->cch_open_cfm.bd_addr[5]);
@@ -3572,12 +3516,12 @@
             break;
 
         case BTA_HL_DCH_OPEN_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
-            BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=0x%x status=%d ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x status=%d ",
                               p_data->dch_open_cfm.mcl_handle,
                               p_data->dch_open_cfm.mdl_handle,
                               p_data->dch_open_cfm.status);
-            BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
+            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
                               p_data->dch_open_cfm.first_reliable,
                               p_data->dch_open_cfm.dch_mode,
                               p_data->dch_open_cfm.local_mdep_id,
@@ -3614,11 +3558,11 @@
 
 
         case BTA_HL_CCH_OPEN_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_IND_EVT");
-            BTIF_TRACE_DEBUG2("app_handle=%d mcl_handle=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_IND_EVT");
+            BTIF_TRACE_DEBUG("app_handle=%d mcl_handle=%d",
                               p_data->cch_open_ind.app_handle,
                               p_data->cch_open_ind.mcl_handle);
-            BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
+            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                               p_data->cch_open_ind.bd_addr[0], p_data->cch_open_ind.bd_addr[1],
                               p_data->cch_open_ind.bd_addr[2], p_data->cch_open_ind.bd_addr[3],
                               p_data->cch_open_ind.bd_addr[4], p_data->cch_open_ind.bd_addr[5]);
@@ -3627,10 +3571,10 @@
             break;
 
         case BTA_HL_DCH_CREATE_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CREATE_IND_EVT");
-            BTIF_TRACE_DEBUG1("mcl_handle=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CREATE_IND_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d",
                               p_data->dch_create_ind.mcl_handle );
-            BTIF_TRACE_DEBUG3("local_mdep_id =%d mdl_id=%d cfg=%d",
+            BTIF_TRACE_DEBUG("local_mdep_id =%d mdl_id=%d cfg=%d",
                               p_data->dch_create_ind.local_mdep_id,
                               p_data->dch_create_ind.mdl_id,
                               p_data->dch_create_ind.cfg);
@@ -3638,11 +3582,11 @@
             break;
 
         case BTA_HL_DCH_OPEN_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_IND_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=0x%x",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_IND_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x",
                               p_data->dch_open_ind.mcl_handle,
                               p_data->dch_open_ind.mdl_handle );
-            BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
+            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
                               p_data->dch_open_ind.first_reliable,
                               p_data->dch_open_ind.dch_mode,
                               p_data->dch_open_ind.local_mdep_id,
@@ -3653,15 +3597,15 @@
             break;
 
         case BTA_HL_DELETE_MDL_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_IND_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_id=0x%x",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_IND_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x",
                               p_data->delete_mdl_ind.mcl_handle,
                               p_data->delete_mdl_ind.mdl_id);
             break;
 
         case BTA_HL_DELETE_MDL_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
-            BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_id=0x%x status=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x status=%d",
                               p_data->delete_mdl_cfm.mcl_handle,
                               p_data->delete_mdl_cfm.mdl_id,
                               p_data->delete_mdl_cfm.status);
@@ -3676,12 +3620,12 @@
             break;
 
         case BTA_HL_DCH_RECONNECT_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
-            BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=%d status=%d   ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=%d status=%d   ",
                               p_data->dch_reconnect_cfm.mcl_handle,
                               p_data->dch_reconnect_cfm.mdl_handle,
                               p_data->dch_reconnect_cfm.status);
-            BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
+            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
                               p_data->dch_reconnect_cfm.first_reliable,
                               p_data->dch_reconnect_cfm.dch_mode,
                               p_data->dch_reconnect_cfm.mdl_id,
@@ -3719,8 +3663,8 @@
             break;
 
         case BTA_HL_CCH_CLOSE_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
                               p_data->cch_close_cfm.mcl_handle,
                               p_data->cch_close_cfm.status);
             if (p_data->cch_close_cfm.status == BTA_HL_STATUS_OK)
@@ -3730,8 +3674,8 @@
             break;
 
         case BTA_HL_CCH_CLOSE_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle =%d intentional_close=%s",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle =%d intentional_close=%s",
                               p_data->cch_close_ind.mcl_handle,
                               (p_data->cch_close_ind.intentional?"Yes":"No"));
 
@@ -3739,8 +3683,8 @@
             break;
 
         case BTA_HL_DCH_CLOSE_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
-            BTIF_TRACE_DEBUG2("mdl_handle=%d intentional_close=%s",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
+            BTIF_TRACE_DEBUG("mdl_handle=%d intentional_close=%s",
                               p_data->dch_close_ind.mdl_handle,
                               (p_data->dch_close_ind.intentional?"Yes":"No") );
 
@@ -3748,8 +3692,8 @@
             break;
 
         case BTA_HL_DCH_CLOSE_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
-            BTIF_TRACE_DEBUG2("mdl_handle=%d status=%d ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
+            BTIF_TRACE_DEBUG("mdl_handle=%d status=%d ",
                               p_data->dch_close_cfm.mdl_handle,
                               p_data->dch_close_cfm.status);
 
@@ -3760,8 +3704,8 @@
             break;
 
         case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle=%d    status=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d    status=%d",
                               p_data->echo_test_cfm.mcl_handle,
                               p_data->echo_test_cfm.status );
             /* not supported */
@@ -3769,12 +3713,12 @@
 
 
         case BTA_HL_DCH_RECONNECT_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
 
-            BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=5d",
+            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=5d",
                               p_data->dch_reconnect_ind.mcl_handle,
                               p_data->dch_reconnect_ind.mdl_handle );
-            BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
+            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
                               p_data->dch_reconnect_ind.first_reliable,
                               p_data->dch_reconnect_ind.dch_mode,
                               p_data->dch_reconnect_ind.mdl_id,
@@ -3784,22 +3728,22 @@
             break;
 
         case BTA_HL_CONG_CHG_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CONG_CHG_IND_EVT");
-            BTIF_TRACE_DEBUG2("mdl_handle=%d cong =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CONG_CHG_IND_EVT");
+            BTIF_TRACE_DEBUG("mdl_handle=%d cong =%d",
                               p_data->dch_cong_ind.mdl_handle,
                               p_data->dch_cong_ind.cong);
             btif_hl_proc_dch_cong_ind(p_data);
             break;
 
         case BTA_HL_DCH_ABORT_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_IND_EVT");
-            BTIF_TRACE_DEBUG1("mcl_handle=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_IND_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d",
                               p_data->dch_abort_ind.mcl_handle );
             btif_hl_proc_abort_ind(p_data->dch_abort_ind.mcl_handle);
             break;
         case BTA_HL_DCH_ABORT_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
-            BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
+            BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
                               p_data->dch_abort_cfm.mcl_handle,
                               p_data->dch_abort_cfm.status);
             if (p_data->dch_abort_cfm.status == BTA_HL_STATUS_OK)
@@ -3809,8 +3753,8 @@
             break;
 
         case BTA_HL_DCH_SEND_DATA_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
-            BTIF_TRACE_DEBUG2("mdl_handle=0x%x status =%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
+            BTIF_TRACE_DEBUG("mdl_handle=0x%x status =%d",
                               p_data->dch_send_data_cfm.mdl_handle,
                               p_data->dch_send_data_cfm.status);
             btif_hl_proc_send_data_cfm(p_data->dch_send_data_cfm.mdl_handle,
@@ -3818,14 +3762,14 @@
             break;
 
         case BTA_HL_DCH_RCV_DATA_IND_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
-            BTIF_TRACE_DEBUG1("mdl_handle=0x%x ",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
+            BTIF_TRACE_DEBUG("mdl_handle=0x%x ",
                               p_data->dch_rcv_data_ind.mdl_handle);
             /* do nothing here */
             break;
 
         default:
-            BTIF_TRACE_DEBUG1("Unknown Event (0x%02x)...", event);
+            BTIF_TRACE_DEBUG("Unknown Event (0x%02x)...", event);
             break;
     }
 }
@@ -3842,7 +3786,7 @@
 static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data){
     bt_status_t status;
     int param_len = 0;
-    BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
     btif_hl_display_calling_process_name();
     switch (event)
     {
@@ -3940,14 +3884,14 @@
     tBTA_HL_REG_PARAM   reg_param;
     btif_hl_app_cb_t    *p_acb;
 
-    BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
     btif_hl_display_calling_process_name();
 
     switch ( event )
     {
         case BTA_HL_CTRL_ENABLE_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
-            BTIF_TRACE_DEBUG1("status=%d", p_data->enable_cfm.status);
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
+            BTIF_TRACE_DEBUG("status=%d", p_data->enable_cfm.status);
 
             if (p_data->enable_cfm.status == BTA_HL_STATUS_OK)
             {
@@ -3966,7 +3910,7 @@
                         reg_param.p_srv_desp = p_acb->srv_desp;
                         reg_param.p_provider_name = p_acb->provider_name;
 
-                        BTIF_TRACE_DEBUG1("Register pending app_id=%d", p_acb->app_id);
+                        BTIF_TRACE_DEBUG("Register pending app_id=%d", p_acb->app_id);
                         btif_hl_proc_reg_request (i, p_acb->app_id, &reg_param, btif_hl_cback);
                     }
                 }
@@ -3974,8 +3918,8 @@
 
             break;
         case BTA_HL_CTRL_DISABLE_CFM_EVT:
-            BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
-            BTIF_TRACE_DEBUG1("status=%d",
+            BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
+            BTIF_TRACE_DEBUG("status=%d",
                               p_data->disable_cfm.status);
 
             if (p_data->disable_cfm.status == BTA_HL_STATUS_OK)
@@ -4003,7 +3947,7 @@
     bt_status_t status;
     int param_len = 0;
 
-    BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
+    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
     btif_hl_display_calling_process_name();
 
     switch ( event )
@@ -4039,7 +3983,7 @@
     UINT8 i;
 
     CHECK_BTHL_INIT();
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     btif_hl_display_calling_process_name();
 
 
@@ -4057,7 +4001,7 @@
             {
                 dch_open.ctrl_psm = p_mcb->ctrl_psm;
                 dch_open.local_mdep_id = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_id;
-                BTIF_TRACE_DEBUG4("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
+                BTIF_TRACE_DEBUG("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
                                                 mdep_cfg_index, dch_open.local_mdep_id, app_id);
                 if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
                                               p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role,
@@ -4075,7 +4019,7 @@
                                               mdep_cfg_index, BTIF_HL_PEND_DCH_OP_OPEN, channel_id ))
                     {
                         status = BT_STATUS_FAIL;
-                        BTIF_TRACE_EVENT1("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
+                        BTIF_TRACE_EVENT("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
                     }
                 }
                 else
@@ -4117,7 +4061,7 @@
         status = BT_STATUS_FAIL;
     }
 
-    BTIF_TRACE_DEBUG3("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
+    BTIF_TRACE_DEBUG("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
 
     return status;
 }
@@ -4131,7 +4075,7 @@
 **
 *******************************************************************************/
 static bt_status_t destroy_channel(int channel_id){
-    UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx;
+    UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx = 0;
     bt_status_t status = BT_STATUS_SUCCESS;
     btif_hl_mdl_cfg_t     *p_mdl;
     btif_hl_mcl_cb_t     *p_mcb;
@@ -4139,7 +4083,7 @@
     btif_hl_app_cb_t     *p_acb;
 
     CHECK_BTHL_INIT();
-    BTIF_TRACE_EVENT2("%s channel_id=0x%08x", __FUNCTION__, channel_id);
+    BTIF_TRACE_EVENT("%s channel_id=0x%08x", __FUNCTION__, channel_id);
     btif_hl_display_calling_process_name();
 
 
@@ -4167,7 +4111,7 @@
                     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                     if (p_mcb->is_connected)
                     {
-                        BTIF_TRACE_DEBUG1("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
+                        BTIF_TRACE_DEBUG("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
                         BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
                     }
                     else
@@ -4177,7 +4121,7 @@
                 }
                 else
                 {
-                    BTIF_TRACE_DEBUG0("btif_hl_delete_mdl calling btif_hl_cch_open"  );
+                    BTIF_TRACE_DEBUG("btif_hl_delete_mdl calling btif_hl_cch_open"  );
                     mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
                     p_acb->filter.num_elems =1;
                     p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[mdep_cfg_idx].data_type;
@@ -4229,7 +4173,7 @@
     btif_hl_evt_cb_t    evt_param;
 
     CHECK_BTHL_INIT();
-    BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
+    BTIF_TRACE_EVENT("%s app_id=%d", __FUNCTION__, app_id);
     btif_hl_display_calling_process_name();
 
     if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
@@ -4247,7 +4191,7 @@
         status  = BT_STATUS_FAIL;
     }
 
-    BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
+    BTIF_TRACE_DEBUG("de-reg return status=%d", status);
     return status;
 }
 /*******************************************************************************
@@ -4271,7 +4215,7 @@
     int                         len;
 
     CHECK_BTHL_INIT();
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     btif_hl_display_calling_process_name();
 
     if (btif_hl_get_state() == BTIF_HL_STATE_DISABLED)
@@ -4283,7 +4227,7 @@
 
     if (!btif_hl_find_avail_app_idx(&app_idx))
     {
-        BTIF_TRACE_ERROR0("Unable to allocate a new application control block");
+        BTIF_TRACE_ERROR("Unable to allocate a new application control block");
         return BT_STATUS_FAIL;
     }
 
@@ -4319,7 +4263,7 @@
 
         if ( !btif_hl_get_bta_mdep_role(p_mdep_cfg->mdep_role, &(p_cfg->mdep_role)))
         {
-            BTIF_TRACE_ERROR1("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
+            BTIF_TRACE_ERROR("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
             status = BT_STATUS_FAIL;
             break;
         }
@@ -4350,7 +4294,7 @@
 
             if ( !btif_hl_get_bta_channel_type(p_mdep_cfg->channel_type, &(p_acb->channel_type[i])))
             {
-                BTIF_TRACE_ERROR1("Invalid channel_type=%d", p_mdep_cfg->channel_type);
+                BTIF_TRACE_ERROR("Invalid channel_type=%d", p_mdep_cfg->channel_type);
                 status = BT_STATUS_FAIL;
                 break;
             }
@@ -4364,7 +4308,7 @@
         len = sizeof(btif_hl_reg_t);
         p_acb->reg_pending = TRUE;
         reg_counter++;
-        BTIF_TRACE_DEBUG2("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
+        BTIF_TRACE_DEBUG("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
         status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_REG_APP,
                                         (char*) &evt_param, len, NULL);
         ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
@@ -4375,7 +4319,7 @@
         btif_hl_free_app_idx(app_idx);
     }
 
-    BTIF_TRACE_DEBUG2("register_application status=%d app_id=%d", status, *app_id);
+    BTIF_TRACE_DEBUG("register_application status=%d app_id=%d", status, *app_id);
     return status;
 }
 
@@ -4399,7 +4343,7 @@
     btif_hl_evt_cb_t    evt_param;
     int                 *p_channel_id;
 
-    BTIF_TRACE_DEBUG6("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
+    BTIF_TRACE_DEBUG("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
                       __FUNCTION__, mdep_id, item_idx, p_mdl_cfg->local_mdep_id,
                       p_mdl_cfg->mdl_id, p_mdl_cfg->dch_mode );
 
@@ -4428,11 +4372,11 @@
                 {
                     p_mdl->extra.peer_mdep_id = BTA_HL_INVALID_MDEP_ID;
                 }
-                BTIF_TRACE_DEBUG4("%s app_idx=%d item_idx=%d mld_id=0x%x",
+                BTIF_TRACE_DEBUG("%s app_idx=%d item_idx=%d mld_id=0x%x",
                                   __FUNCTION__, app_idx, item_idx, p_mdl->base.mdl_id);
                 evt_param.update_mdl.app_idx = app_idx;
                 len = sizeof(btif_hl_update_mdl_t);
-                BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
+                BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
                 if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
                                                         (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
                 {
@@ -4442,7 +4386,7 @@
             }
         }
     }
-    BTIF_TRACE_DEBUG2("%s success=%d  ",__FUNCTION__, success );
+    BTIF_TRACE_DEBUG("%s success=%d  ",__FUNCTION__, success );
 
     return success;
 }
@@ -4475,7 +4419,7 @@
             memset(p_mdl, 0, sizeof(btif_hl_mdl_cfg_t));
             evt_param.update_mdl.app_idx = app_idx;
             len = sizeof(btif_hl_update_mdl_t);
-            BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
+            BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
             if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
                                                     (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
             {
@@ -4485,51 +4429,12 @@
         }
     }
 
-    BTIF_TRACE_DEBUG2("%s success=%d  ",__FUNCTION__, success );
+    BTIF_TRACE_DEBUG("%s success=%d  ",__FUNCTION__, success );
     return success;
 }
 
 /*******************************************************************************
 **
-** Function         get_device_datatype
-**
-** Description      Start SDP on remote device and look for Remote HDP Data type and role
-**
-** Returns         bt_status_t
-**
-*******************************************************************************/
-static bt_status_t get_device_datatype(int app_id, bt_bdaddr_t *bd_addr){
-    btif_hl_app_cb_t    *p_acb;
-    UINT8               app_idx;
-    bt_status_t         status = BT_STATUS_SUCCESS;
-    BD_ADDR             bda;
-    UINT8               i;
-
-    CHECK_BTHL_INIT();
-    BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
-    btif_hl_display_calling_process_name();
-
-    for (i=0; i<6; i++)
-    {
-        bda[i] = (UINT8) bd_addr->address[i];
-    }
-
-    if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
-    {
-        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
-        BTA_HlSdpQuery(app_id,p_acb->app_handle,bda);
-    }
-    else
-    {
-        status  = BT_STATUS_FAIL;
-    }
-
-    BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
-    return status;
-}
-
-/*******************************************************************************
-**
 ** Function         init
 **
 ** Description     initializes the hl interface
@@ -4540,7 +4445,7 @@
 static bt_status_t init( bthl_callbacks_t* callbacks ){
     bt_status_t status = BT_STATUS_SUCCESS;
 
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     btif_hl_display_calling_process_name();
     bt_hl_callbacks_cb = *callbacks;
     bt_hl_callbacks = &bt_hl_callbacks_cb;
@@ -4558,7 +4463,7 @@
 **
 *******************************************************************************/
 static void  cleanup( void ){
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     btif_hl_display_calling_process_name();
     if (bt_hl_callbacks)
     {
@@ -4592,7 +4497,7 @@
 **
 *******************************************************************************/
 const bthl_interface_t *btif_hl_get_interface(){
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     return &bthlInterface;
 }
 
@@ -4609,7 +4514,7 @@
     btif_hl_soc_cb_t      *p_scb = NULL;
     int maxfd=0;
 
-    BTIF_TRACE_DEBUG1("btif_hl_update_maxfd max_org_s= %d", max_org_s);
+    BTIF_TRACE_DEBUG("btif_hl_update_maxfd max_org_s= %d", max_org_s);
 
     maxfd = max_org_s;
     if (!GKI_queue_is_empty(&soc_queue))
@@ -4618,20 +4523,20 @@
         if (maxfd < p_scb->max_s)
         {
             maxfd = p_scb->max_s;
-            BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
+            BTIF_TRACE_DEBUG("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
         }
         while (p_scb != NULL)
         {
             if (maxfd < p_scb->max_s)
             {
                 maxfd = p_scb->max_s;
-                BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
+                BTIF_TRACE_DEBUG("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
             }
             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
         }
     }
 
-    BTIF_TRACE_DEBUG1("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
+    BTIF_TRACE_DEBUG("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
     return maxfd;
 }
 /*******************************************************************************
@@ -4644,7 +4549,7 @@
 **
 *******************************************************************************/
 btif_hl_soc_state_t btif_hl_get_socket_state(btif_hl_soc_cb_t *p_scb){
-    BTIF_TRACE_DEBUG1("btif_hl_get_socket_state state=%d", p_scb->state);
+    BTIF_TRACE_DEBUG("btif_hl_get_socket_state state=%d", p_scb->state);
     return p_scb->state;
 }
 /*******************************************************************************
@@ -4657,7 +4562,7 @@
 **
 *******************************************************************************/
 void btif_hl_set_socket_state(btif_hl_soc_cb_t *p_scb, btif_hl_soc_state_t new_state){
-    BTIF_TRACE_DEBUG2("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
+    BTIF_TRACE_DEBUG("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
     p_scb->state = new_state;
 }
 /*******************************************************************************
@@ -4674,13 +4579,13 @@
     UINT8               i;
     btif_hl_mdl_cb_t    *p_dcb;
     BOOLEAN             found= FALSE;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
     {
         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
         if (p_dcb && p_dcb->in_use && p_dcb->p_scb)
         {
-            BTIF_TRACE_DEBUG3("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
+            BTIF_TRACE_DEBUG("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
             btif_hl_set_socket_state (p_dcb->p_scb, BTIF_HL_SOC_STATE_W4_REL);
             p_dcb->p_scb = NULL;
             found = TRUE;
@@ -4702,8 +4607,8 @@
     btif_hl_soc_cb_t       *p_scb = NULL;
     btif_hl_mdl_cb_t      *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
-    BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
 
     if (p_dcb && p_dcb->p_scb)
     {
@@ -4729,13 +4634,13 @@
     UINT8                 soc_idx;
     BOOLEAN               status = FALSE;
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (p_dcb && ((p_scb = (btif_hl_soc_cb_t *)GKI_getbuf((UINT16)sizeof(btif_hl_soc_cb_t)))!=NULL))
     {
         if (socketpair(AF_UNIX, SOCK_STREAM, 0, p_scb->socket_id) >= 0)
         {
-            BTIF_TRACE_DEBUG2("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
+            BTIF_TRACE_DEBUG("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
             p_dcb->p_scb = p_scb;
             p_scb->app_idx = app_idx;
             p_scb->mcl_idx = mcl_idx;
@@ -4756,7 +4661,7 @@
         }
     }
 
-    BTIF_TRACE_DEBUG2("%s status=%d", __FUNCTION__, status);
+    BTIF_TRACE_DEBUG("%s status=%d", __FUNCTION__, status);
     return status;
 }
 /*******************************************************************************
@@ -4777,19 +4682,19 @@
     bt_status_t                     status;
     int                             len;
 
-    BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
 
     if (!GKI_queue_is_empty(&soc_queue))
     {
         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
-        BTIF_TRACE_DEBUG1("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
+        BTIF_TRACE_DEBUG("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
         while (p_scb != NULL)
         {
             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD)
             {
                 btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_W4_READ);
                 FD_SET(p_scb->socket_id[1], p_org_set);
-                BTIF_TRACE_DEBUG2("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
+                BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx);
                 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                 p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx);
@@ -4809,11 +4714,11 @@
                 }
             }
             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
-            BTIF_TRACE_DEBUG1("next p_scb=0x%x", p_scb);
+            BTIF_TRACE_DEBUG("next p_scb=0x%x", p_scb);
         }
     }
 
-    BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
 }
 /*******************************************************************************
 **
@@ -4834,7 +4739,7 @@
     int                             app_idx;
     bt_status_t                     status;
 
-    BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
     if (!GKI_queue_is_empty(&soc_queue))
     {
         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
@@ -4842,7 +4747,7 @@
         {
             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL)
             {
-                BTIF_TRACE_DEBUG3("app_idx=%d mcl_id=%d, mdl_idx=%d",
+                BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d",
                                   p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                 btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_IDLE);
                 if (p_scb->socket_id[1] != -1)
@@ -4866,7 +4771,7 @@
                 }
             }
             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
-            BTIF_TRACE_DEBUG1("while loop next p_scb=0x%x", p_scb);
+            BTIF_TRACE_DEBUG("while loop next p_scb=0x%x", p_scb);
         }
 
         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
@@ -4875,14 +4780,14 @@
             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE)
             {
                 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
-                BTIF_TRACE_DEBUG4("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
+                BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
                                   p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use);
                 GKI_remove_from_queue((void *)&soc_queue, p_scb);
                 btif_hl_free_buf((void **)&p_scb);
                 p_dcb->p_scb = NULL;
                 element_removed = TRUE;
             }
-            BTIF_TRACE_DEBUG2("element_removed=%d p_scb=0x%x", element_removed, p_scb);
+            BTIF_TRACE_DEBUG("element_removed=%d p_scb=0x%x", element_removed, p_scb);
             if (element_removed)
             {
                 element_removed = FALSE;
@@ -4891,10 +4796,10 @@
             else
                 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
 
-            BTIF_TRACE_DEBUG1("while loop p_scb=0x%x", p_scb);
+            BTIF_TRACE_DEBUG("while loop p_scb=0x%x", p_scb);
         }
     }
-    BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
 }
 /*******************************************************************************
 **
@@ -4907,7 +4812,7 @@
 *******************************************************************************/
 
 void btif_hl_select_wakeup_callback( fd_set *p_org_set ,  int wakeup_signal){
-    BTIF_TRACE_DEBUG2("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
+    BTIF_TRACE_DEBUG("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
 
     if (wakeup_signal == btif_hl_signal_select_wakeup )
     {
@@ -4917,7 +4822,7 @@
     {
         btif_hl_close_socket(p_org_set);
     }
-    BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
 }
 
 /*******************************************************************************
@@ -4935,24 +4840,24 @@
     int r;
     UNUSED(p_org_set);
 
-    BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
 
     if (!GKI_queue_is_empty(&soc_queue))
     {
         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
-        BTIF_TRACE_DEBUG0(" GKI queue is not empty ");
+        BTIF_TRACE_DEBUG(" GKI queue is not empty ");
         while (p_scb != NULL)
         {
             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ)
             {
                 if (FD_ISSET(p_scb->socket_id[1], p_cur_set))
                 {
-                    BTIF_TRACE_DEBUG0("read data");
-                    BTIF_TRACE_DEBUG0("state= BTIF_HL_SOC_STATE_W4_READ");
+                    BTIF_TRACE_DEBUG("read data");
+                    BTIF_TRACE_DEBUG("state= BTIF_HL_SOC_STATE_W4_READ");
                     p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                     if (p_dcb->p_tx_pkt)
                     {
-                        BTIF_TRACE_ERROR1("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
+                        BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
                         btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
                     }
                     p_dcb->p_tx_pkt =  btif_hl_get_buf (p_dcb->mtu);
@@ -4965,15 +4870,15 @@
 
                         if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0)
                         {
-                            BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data r =%d", r);
+                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r);
                             p_dcb->tx_size = r;
-                            BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
+                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
                             BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size  );
                         }
 
                         if (r <= 0 )
                         {
-                            BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback  receive failed r=%d",r);
+                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback  receive failed r=%d",r);
                             BTA_HlDchClose(p_dcb->mdl_handle );
                         }
                     }
@@ -4984,9 +4889,9 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("btif_hl_select_monitor_queue is empty");
+        BTIF_TRACE_DEBUG("btif_hl_select_monitor_queue is empty");
     }
-    BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
+    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
 }
 /*******************************************************************************
 **
@@ -4998,14 +4903,14 @@
 **
 *******************************************************************************/
 static inline int btif_hl_select_wakeup_init(fd_set* set){
-    BTIF_TRACE_DEBUG0("btif_hl_select_wakeup_init");
-    if (socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
+    BTIF_TRACE_DEBUG("%s", __func__);
+    if (signal_fds[0] == -1 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
     {
-        BTIF_TRACE_ERROR1("socketpair failed: %s", strerror(errno));
+        BTIF_TRACE_ERROR("socketpair failed: %s", strerror(errno));
         return -1;
     }
 
-    BTIF_TRACE_DEBUG2("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
+    BTIF_TRACE_DEBUG("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
     FD_SET(signal_fds[0], set);
 
     return signal_fds[0];
@@ -5022,7 +4927,7 @@
 *******************************************************************************/
 static inline int btif_hl_select_wakeup(void){
     char sig_on = btif_hl_signal_select_wakeup;
-    BTIF_TRACE_DEBUG0("btif_hl_select_wakeup");
+    BTIF_TRACE_DEBUG("btif_hl_select_wakeup");
     return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
 }
 
@@ -5037,7 +4942,7 @@
 *******************************************************************************/
 static inline int btif_hl_select_close_connected(void){
     char sig_on = btif_hl_signal_select_close_connected;
-    BTIF_TRACE_DEBUG0("btif_hl_select_close_connected");
+    BTIF_TRACE_DEBUG("btif_hl_select_close_connected");
     return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
 }
 
@@ -5054,23 +4959,16 @@
 {
     int result = 0;
     char sig_on = btif_hl_signal_select_exit;
-    BTIF_TRACE_DEBUG0("btif_hl_signal_select_exit");
+    BTIF_TRACE_DEBUG("btif_hl_signal_select_exit");
     result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
-    /* Wait for the select_thread_id to exit */
-    if (select_thread_id != -1) {
-        pthread_join(select_thread_id, NULL);
-        select_thread_id = -1;
-    }
-   /* Cleanup signal sockets */
-    if(signal_fds[0] != -1)
+    if (btif_is_enabled())
     {
-        close(signal_fds[0]);
-        signal_fds[0] = -1;
-    }
-    if(signal_fds[1] != -1)
-    {
-        close(signal_fds[1]);
-        signal_fds[1] = -1;
+        /* Wait for the select_thread_id to exit if BT is still enabled
+        and only this profile getting  cleaned up*/
+        if (select_thread_id != -1) {
+            pthread_join(select_thread_id, NULL);
+            select_thread_id = -1;
+        }
     }
     return result;
 }
@@ -5087,7 +4985,7 @@
 static inline int btif_hl_select_wake_reset(void){
     char sig_recv = 0;
 
-    BTIF_TRACE_DEBUG0("btif_hl_select_wake_reset");
+    BTIF_TRACE_DEBUG("btif_hl_select_wake_reset");
     recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
     return(int)sig_recv;
 }
@@ -5101,7 +4999,7 @@
 **
 *******************************************************************************/
 static inline int btif_hl_select_wake_signaled(fd_set* set){
-    BTIF_TRACE_DEBUG0("btif_hl_select_wake_signaled");
+    BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled");
     return FD_ISSET(signal_fds[0], set);
 }
 /*******************************************************************************
@@ -5122,7 +5020,7 @@
         close(connected_s);
     }
     listen_s = connected_s = -1;
-    BTIF_TRACE_DEBUG0("hl thread cleanup");
+    BTIF_TRACE_DEBUG("hl thread cleanup");
 }
 /*******************************************************************************
 **
@@ -5138,33 +5036,33 @@
     int r, max_curr_s, max_org_s;
     UNUSED(arg);
 
-    BTIF_TRACE_DEBUG0("entered btif_hl_select_thread");
+    BTIF_TRACE_DEBUG("entered btif_hl_select_thread");
     FD_ZERO(&org_set);
     max_org_s = btif_hl_select_wakeup_init(&org_set);
-    BTIF_TRACE_DEBUG1("max_s=%d ", max_org_s);
+    BTIF_TRACE_DEBUG("max_s=%d ", max_org_s);
 
     for (;;)
     {
         r = 0;
-        BTIF_TRACE_DEBUG0("set curr_set = org_set ");
+        BTIF_TRACE_DEBUG("set curr_set = org_set ");
         curr_set = org_set;
         max_curr_s = max_org_s;
         int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL);
-        BTIF_TRACE_DEBUG1("select unblocked ret=%d", ret);
+        BTIF_TRACE_DEBUG("select unblocked ret=%d", ret);
         if (ret == -1)
         {
-            BTIF_TRACE_DEBUG0("select() ret -1, exit the thread");
+            BTIF_TRACE_DEBUG("select() ret -1, exit the thread");
             btif_hl_thread_cleanup();
             select_thread_id = -1;
             return 0;
         }
         else if (ret)
         {
-            BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal ret=%d", ret);
+            BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal ret=%d", ret);
             if (btif_hl_select_wake_signaled(&curr_set))
             {
                 r = btif_hl_select_wake_reset();
-                BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal:%d", r);
+                BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal:%d", r);
                 if (r == btif_hl_signal_select_wakeup || r == btif_hl_signal_select_close_connected )
                 {
                     btif_hl_select_wakeup_callback(&org_set, r);
@@ -5172,7 +5070,7 @@
                 else if( r == btif_hl_signal_select_exit)
                 {
                     btif_hl_thread_cleanup();
-                    BTIF_TRACE_DEBUG0("Exit hl_select_thread for btif_hl_signal_select_exit");
+                    BTIF_TRACE_DEBUG("Exit hl_select_thread for btif_hl_signal_select_exit");
                     return 0;
                 }
             }
@@ -5181,9 +5079,9 @@
             max_org_s = btif_hl_update_maxfd(max_org_s);
         }
         else
-            BTIF_TRACE_DEBUG1("no data, select ret: %d\n", ret);
+            BTIF_TRACE_DEBUG("no data, select ret: %d\n", ret);
     }
-    BTIF_TRACE_DEBUG0("leaving hl_select_thread");
+    BTIF_TRACE_DEBUG("leaving hl_select_thread");
     return 0;
 }
 
@@ -5197,7 +5095,7 @@
 **
 *******************************************************************************/
 static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
-    BTIF_TRACE_DEBUG0("create_thread: entered");
+    BTIF_TRACE_DEBUG("create_thread: entered");
     pthread_attr_t thread_attr;
 
     pthread_attr_init(&thread_attr);
@@ -5205,10 +5103,10 @@
     pthread_t thread_id = -1;
     if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
     {
-        BTIF_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+        BTIF_TRACE_ERROR("pthread_create : %s", strerror(errno));
         return -1;
     }
-    BTIF_TRACE_DEBUG0("create_thread: thread created successfully");
+    BTIF_TRACE_DEBUG("create_thread: thread created successfully");
     return thread_id;
 }
 
@@ -5222,7 +5120,7 @@
 **
 *******************************************************************************/
 void btif_hl_soc_thread_init(void){
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     GKI_init_q(&soc_queue);
     select_thread_id = create_thread(btif_hl_select_thread, NULL);
 }
@@ -5242,7 +5140,7 @@
     btif_hl_app_cb_t          *p_acb;
     tBTA_HL_MDL_CFG *p;
     int i;
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
     if (btif_hl_find_app_idx(app_id, &app_idx))
     {
@@ -5254,6 +5152,6 @@
         result = TRUE;
     }
 
-    BTIF_TRACE_DEBUG1("result=%d", result);
+    BTIF_TRACE_DEBUG("result=%d", result);
     return result;
 }
diff --git a/btif/src/btif_mce.c b/btif/src/btif_mce.c
new file mode 100644
index 0000000..2ec2d41
--- /dev/null
+++ b/btif/src/btif_mce.c
@@ -0,0 +1,177 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright (C) 2009-2012 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ *  Filename:      btif_mce.c
+ *
+ *  Description:   Message Access Profile (MCE role) Bluetooth Interface
+ *
+ *
+ ***********************************************************************************/
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_mce.h>
+#include <stdlib.h>
+
+#define LOG_TAG "BTIF_MCE"
+#include "btif_common.h"
+#include "btif_util.h"
+#include "btif_profile_queue.h"
+#include "bta_api.h"
+#include "bta_mce_api.h"
+
+#include "bd.h"
+
+/*****************************************************************************
+**  Static variables
+******************************************************************************/
+
+static btmce_callbacks_t *bt_mce_callbacks = NULL;
+
+static void btif_mce_mas_discovery_comp_evt(UINT16 event, char *p_param)
+{
+    tBTA_MCE_MAS_DISCOVERY_COMP *evt_data = (tBTA_MCE_MAS_DISCOVERY_COMP*) p_param;
+    btmce_mas_instance_t insts[BTA_MCE_MAX_MAS_INSTANCES];
+    bt_bdaddr_t addr;
+    int i;
+
+    BTIF_TRACE_EVENT("%s:  event = %d", __FUNCTION__, event);
+
+    if (event != BTA_MCE_MAS_DISCOVERY_COMP_EVT)
+        return;
+
+    for (i = 0; i < evt_data->num_mas; i++)
+    {
+        insts[i].id = evt_data->mas[i].instance_id;
+        insts[i].scn = evt_data->mas[i].scn;
+        insts[i].msg_types = evt_data->mas[i].msg_type;
+        insts[i].p_name = evt_data->mas[i].p_srv_name;
+    }
+
+    bdcpy(addr.address, evt_data->remote_addr);
+
+    HAL_CBACK(bt_mce_callbacks, remote_mas_instances_cb, evt_data->status, &addr, evt_data->num_mas, insts);
+}
+
+static void mas_discovery_comp_copy_cb(UINT16 event, char *p_dest, char *p_src)
+{
+    tBTA_MCE_MAS_DISCOVERY_COMP *p_dest_data =  (tBTA_MCE_MAS_DISCOVERY_COMP *) p_dest;
+    tBTA_MCE_MAS_DISCOVERY_COMP *p_src_data =  (tBTA_MCE_MAS_DISCOVERY_COMP *) p_src;
+    char *p_dest_str;
+    int i;
+
+    if (!p_src)
+        return;
+
+    if (event != BTA_MCE_MAS_DISCOVERY_COMP_EVT)
+        return;
+
+    memcpy(p_dest_data, p_src_data, sizeof(tBTA_MCE_MAS_DISCOVERY_COMP));
+
+    p_dest_str = p_dest + sizeof(tBTA_MCE_MAS_DISCOVERY_COMP);
+
+    for (i = 0; i < p_src_data->num_mas; i++)
+    {
+        p_dest_data->mas[i].p_srv_name = p_dest_str;
+        memcpy(p_dest_str, p_src_data->mas[i].p_srv_name, p_src_data->mas[i].srv_name_len);
+        p_dest_str += p_src_data->mas[i].srv_name_len;
+        *(p_dest_str++) = '\0';
+    }
+}
+
+static void mce_dm_cback(tBTA_MCE_EVT event, tBTA_MCE *p_data, void *user_data)
+{
+    switch (event)
+    {
+        case BTA_MCE_MAS_DISCOVERY_COMP_EVT:
+            {
+                int i;
+                UINT16 param_len = sizeof(tBTA_MCE);
+
+                /* include space for all p_srv_name copies including null-termination */
+                for (i = 0; i < p_data->mas_disc_comp.num_mas; i++)
+                    param_len += (p_data->mas_disc_comp.mas[i].srv_name_len + 1);
+
+                /* need to deepy copy p_srv_name and null-terminate */
+                btif_transfer_context(btif_mce_mas_discovery_comp_evt, event,
+                                        (char*)p_data, param_len, mas_discovery_comp_copy_cb);
+
+                break;
+            }
+    }
+}
+
+static bt_status_t init(btmce_callbacks_t* callbacks)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+
+    bt_mce_callbacks = callbacks;
+
+    btif_enable_service(BTA_MAP_SERVICE_ID);
+
+    return BT_STATUS_SUCCESS;
+}
+
+static bt_status_t get_remote_mas_instances(bt_bdaddr_t *bd_addr)
+{
+    bdstr_t bdstr;
+
+    BTIF_TRACE_EVENT("%s: remote_addr=%s", __FUNCTION__, bd2str(bd_addr, &bdstr));
+
+    BTA_MceGetRemoteMasInstances(bd_addr->address);
+
+    return BT_STATUS_SUCCESS;
+}
+
+static const btmce_interface_t mce_if = {
+    sizeof(btmce_interface_t),
+    init,
+    get_remote_mas_instances,
+};
+
+const btmce_interface_t *btif_mce_get_interface(void)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    return &mce_if;
+}
+
+/*******************************************************************************
+**
+** Function         btif_mce_execute_service
+**
+** Description      Initializes/Shuts down the service
+**
+** Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+bt_status_t btif_mce_execute_service(BOOLEAN b_enable)
+{
+    BTIF_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
+
+     if (b_enable)
+     {
+         BTA_MceEnable(mce_dm_cback);
+     }
+     else
+     {
+         /* This is called on BT disable so no need to extra cleanup */
+     }
+     return BT_STATUS_SUCCESS;
+}
diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c
old mode 100755
new mode 100644
index 0b9b613..4b04e1e
--- a/btif/src/btif_media_task.c
+++ b/btif/src/btif_media_task.c
@@ -66,12 +66,32 @@
 #include "btif_av.h"
 #include "btif_sm.h"
 #include "btif_util.h"
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+#include "oi_codec_sbc.h"
+#include "oi_status.h"
+#endif
+#include "stdio.h"
+#include <dlfcn.h>
+
+//#define DEBUG_MEDIA_AV_FLOW TRUE
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+OI_CODEC_SBC_DECODER_CONTEXT context;
+OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
+OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
+#endif
 
 /*****************************************************************************
  **  Constants
  *****************************************************************************/
 
-//#define DEBUG_MEDIA_AV_FLOW TRUE
+#ifndef AUDIO_CHANNEL_OUT_MONO
+#define AUDIO_CHANNEL_OUT_MONO 0x01
+#endif
+
+#ifndef AUDIO_CHANNEL_OUT_STEREO
+#define AUDIO_CHANNEL_OUT_STEREO 0x03
+#endif
 
 /* BTIF media task gki event definition */
 #define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK
@@ -81,8 +101,12 @@
 
 #define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0
 #define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1
+#define BTIF_MEDIA_AVK_TASK_TIMER_ID TIMER_2
+
 #define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK
 #define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK
+#define BTIF_MEDIA_AVK_TASK_TIMER TIMER_2_EVT_MASK
+
 
 #define BTIF_MEDIA_TASK_CMD_MBOX        TASK_MBOX_0     /* cmd mailbox  */
 #define BTIF_MEDIA_TASK_DATA_MBOX       TASK_MBOX_1     /* data mailbox  */
@@ -102,7 +126,11 @@
     BTIF_MEDIA_FLUSH_AA_TX,
     BTIF_MEDIA_FLUSH_AA_RX,
     BTIF_MEDIA_AUDIO_FEEDING_INIT,
-    BTIF_MEDIA_AUDIO_RECEIVING_INIT
+    BTIF_MEDIA_AUDIO_RECEIVING_INIT,
+    BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
+    BTIF_MEDIA_AUDIO_SINK_START_DECODING,
+    BTIF_MEDIA_AUDIO_SINK_STOP_DECODING,
+    BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
 };
 
 enum {
@@ -121,6 +149,8 @@
 
 #define BTIF_MEDIA_TIME_TICK                     (20 * BTIF_MEDIA_NUM_TICK)
 #define A2DP_DATA_READ_POLL_MS    (BTIF_MEDIA_TIME_TICK / 2)
+#define BTIF_SINK_MEDIA_TIME_TICK                (20 * BTIF_MEDIA_NUM_TICK)
+
 
 /* buffer pool */
 #define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3
@@ -179,10 +209,17 @@
 /* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
 #define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
 #define A2DP_PACKET_COUNT_LOW_WATERMARK 5
-#define MAX_PCM_FRAME_NUM_PER_TICK     40
+#define MAX_PCM_FRAME_NUM_PER_TICK     10
 #define RESET_RATE_COUNTER_THRESHOLD_MS    2000
 
 //#define BTIF_MEDIA_VERBOSE_ENABLED
+/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
+#define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
+#define PACKET_PLAYED_PER_TICK_48 8
+#define PACKET_PLAYED_PER_TICK_44 7
+#define PACKET_PLAYED_PER_TICK_32 5
+#define PACKET_PLAYED_PER_TICK_16 3
+
 
 #ifdef BTIF_MEDIA_VERBOSE_ENABLED
 #define VERBOSE(fmt, ...) \
@@ -195,6 +232,13 @@
 /*****************************************************************************
  **  Data types
  *****************************************************************************/
+typedef struct
+{
+    UINT16 num_frames_to_be_processed;
+    UINT16 len;
+    UINT16 offset;
+    UINT16 layer_specific;
+} tBT_SBC_HDR;
 
 typedef struct
 {
@@ -219,7 +263,9 @@
 {
 #if (BTA_AV_INCLUDED == TRUE)
     BUFFER_Q TxAaQ;
+    BUFFER_Q RxSbcQ;
     BOOLEAN is_tx_timer;
+    BOOLEAN is_rx_timer;
     UINT16 TxAaMtuSize;
     UINT32 timestamp;
     UINT8 TxTranscoding;
@@ -231,6 +277,13 @@
     void* av_sm_hdl;
     UINT8 a2dp_cmd_pending; /* we can have max one command pending */
     BOOLEAN tx_flush; /* discards any outgoing data when true */
+    BOOLEAN rx_flush; /* discards any incoming data when true */
+    UINT8 peer_sep;
+    BOOLEAN data_channel_open;
+    UINT8   frames_to_process;
+
+    UINT32  sample_rate;
+    UINT8   channel_count;
 #endif
 
 } tBTIF_MEDIA_CB;
@@ -249,6 +302,7 @@
 
 static tBTIF_MEDIA_CB btif_media_cb;
 static int media_task_running = MEDIA_TASK_STATE_OFF;
+static UINT64 last_frame_us = 0;
 
 
 /*****************************************************************************
@@ -259,13 +313,34 @@
 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
 static void btif_a2dp_encoder_update(void);
 const char* dump_media_event(UINT16 event);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                          const OI_BYTE **frameData,
+                                          unsigned long *frameBytes,
+                                          OI_INT16 *pcmData,
+                                          unsigned long *pcmBytes);
+extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                           unsigned long *decoderData,
+                                           unsigned long decoderDataBytes,
+                                           OI_UINT8 maxChannels,
+                                           OI_UINT8 pcmStride,
+                                           OI_BOOL enhanced);
+#endif
+static void btif_media_flush_q(BUFFER_Q *p_q);
+static void btif_media_task_aa_handle_stop_decoding(void );
+static void btif_media_task_aa_rx_flush(void);
+static BOOLEAN btif_media_task_stop_decoding_req(void);
 
 /*****************************************************************************
  **  Externs
  *****************************************************************************/
 
 static void btif_media_task_handle_cmd(BT_HDR *p_msg);
-static void btif_media_task_handle_media(BT_HDR *p_msg);
+static void btif_media_task_handle_media(BT_HDR*p_msg);
+/* Handle incoming media packets A2DP SINK streaming*/
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
+#endif
 
 #if (BTA_AV_INCLUDED == TRUE)
 static void btif_media_send_aa_frame(void);
@@ -277,72 +352,32 @@
 static void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
 static void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
 static void btif_media_aa_prep_2_send(UINT8 nb_frame);
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
+static void btif_media_task_aa_handle_clear_track(void);
 #endif
-
-
+static void btif_media_task_aa_handle_start_decoding(void );
+#endif
+BOOLEAN btif_media_task_start_decoding_req(void);
+BOOLEAN btif_media_task_clear_track(void);
 /*****************************************************************************
  **  Misc helper functions
  *****************************************************************************/
 
-static void tput_mon(int is_rx, int len, int reset)
+static UINT64 time_now_us()
 {
-    /* only monitor one connection at a time for now */
-    static t_stat cur_stat;
-    struct timespec now;
-    unsigned long long prev_us;
-    unsigned long long now_us;
-
-    if (reset == TRUE)
-    {
-        memset(&cur_stat, 0, sizeof(t_stat));
-        return;
-    }
-
-    if (is_rx)
-    {
-        cur_stat.rx+=len;
-        cur_stat.rx_tot+=len;
-    }
-    else
-    {
-        cur_stat.tx+=len;
-        cur_stat.tx_tot+=len;
-    }
-    clock_gettime(CLOCK_MONOTONIC, &now);
-
-    now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
-
-    if ((now_us - cur_stat.ts_prev_us) < TPUT_STATS_INTERVAL_US)
-        return;
-
-    APPL_TRACE_WARNING4("tput rx:%d, tx:%d (bytes/s)  (tot : rx %d, tx %d bytes)",
-          (cur_stat.rx*1000000)/((now_us - cur_stat.ts_prev_us)),
-          (cur_stat.tx*1000000)/((now_us - cur_stat.ts_prev_us)),
-           cur_stat.rx_tot, cur_stat.tx_tot);
-
-    /* stats dumped. now reset stats for next interval */
-    cur_stat.rx = 0;
-    cur_stat.tx = 0;
-    cur_stat.ts_prev_us = now_us;
+    struct timespec ts_now;
+    clock_gettime(CLOCK_BOOTTIME, &ts_now);
+    return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000);
 }
 
-
 static void log_tstamps_us(char *comment)
 {
-    #define USEC_PER_SEC 1000000L
-    static struct timespec prev = {0, 0};
-    struct timespec now, diff;
-    unsigned int diff_us = 0;
-    unsigned int now_us = 0;
-
-    clock_gettime(CLOCK_MONOTONIC, &now);
-    now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
-    diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
-
-    APPL_TRACE_DEBUG4("[%s] ts %08d, diff : %08d, queue sz %d", comment, now_us, diff_us,
+    static UINT64 prev_us = 0;
+    const UINT64 now_us = time_now_us();
+    APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us,
                 btif_media_cb.TxAaQ.count);
-
-    prev = now;
+    prev_us = now_us;
 }
 
 const char* dump_media_event(UINT16 event)
@@ -361,6 +396,10 @@
         CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
+        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
+        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_START_DECODING)
+        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_STOP_DECODING)
+        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
 
         default:
             return "UNKNOWN MEDIA EVENT";
@@ -387,7 +426,7 @@
 
 static void btif_audiopath_detached(void)
 {
-    APPL_TRACE_EVENT0("## AUDIO PATH DETACHED ##");
+    APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
 
     /*  send stop request only if we are actively streaming and haven't received
         a stop request. Potentially audioflinger detached abnormally */
@@ -402,13 +441,13 @@
 {
     UINT8 ack = status;
 
-    APPL_TRACE_EVENT2("## a2dp ack : %s, status %d ##",
+    APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
           dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
 
     /* sanity check */
     if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
     {
-        APPL_TRACE_ERROR0("warning : no command pending, ignore ack");
+        APPL_TRACE_ERROR("warning : no command pending, ignore ack");
         return;
     }
 
@@ -424,13 +463,12 @@
 {
     UINT8 cmd = 0;
     int n;
-
     n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
 
     /* detach on ctrl channel means audioflinger process was terminated */
     if (n == 0)
     {
-        APPL_TRACE_EVENT0("CTRL CH DETACHED");
+        APPL_TRACE_EVENT("CTRL CH DETACHED");
         UIPC_Close(UIPC_CH_ID_AV_CTRL);
         /* we can operate only on datachannel, if af client wants to
            do send additional commands the ctrl channel would be reestablished */
@@ -438,7 +476,7 @@
         return;
     }
 
-    APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
+    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
 
     btif_media_cb.a2dp_cmd_pending = cmd;
 
@@ -472,6 +510,11 @@
 
                 /* post start event and wait for audio path to open */
                 btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+                if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+                    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
+#endif
             }
             else if (btif_av_stream_started_ready())
             {
@@ -489,8 +532,7 @@
             break;
 
         case A2DP_CTRL_CMD_STOP:
-
-            if (btif_media_cb.is_tx_timer == FALSE)
+            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
             {
                 /* we are already stopped, just ack back */
                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
@@ -498,6 +540,7 @@
             }
 
             btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
+            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
             break;
 
         case A2DP_CTRL_CMD_SUSPEND:
@@ -515,19 +558,30 @@
             }
             break;
 
+        case A2DP_CTRL_GET_AUDIO_CONFIG:
+        {
+            uint32_t sample_rate = btif_media_cb.sample_rate;
+            uint8_t channel_count = btif_media_cb.channel_count;
+
+            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
+            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
+            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
+            break;
+        }
+
         default:
-            APPL_TRACE_ERROR1("UNSUPPORTED CMD (%d)", cmd);
+            APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
             break;
     }
-    APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
+    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
 }
 
 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
 {
     UNUSED(ch_id);
 
-    APPL_TRACE_DEBUG1("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
+    APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
 
     switch(event)
     {
@@ -547,7 +601,7 @@
             break;
 
         default :
-            APPL_TRACE_ERROR1("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
+            APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
             break;
     }
 }
@@ -556,7 +610,7 @@
 {
     UNUSED(ch_id);
 
-    APPL_TRACE_DEBUG1("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
+    APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
 
     switch(event)
     {
@@ -567,11 +621,15 @@
             UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
             UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
                        (void *)A2DP_DATA_READ_POLL_MS);
-            /* Start the media task to encode SBC */
-            btif_media_task_start_aa_req();
 
-            /* make sure we update any changed sbc encoder params */
-            btif_a2dp_encoder_update();
+            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
+                /* Start the media task to encode SBC */
+                btif_media_task_start_aa_req();
+
+                /* make sure we update any changed sbc encoder params */
+                btif_a2dp_encoder_update();
+            }
+            btif_media_cb.data_channel_open = TRUE;
 
             /* ack back when media task is fully started */
             break;
@@ -579,10 +637,11 @@
         case UIPC_CLOSE_EVT:
             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
             btif_audiopath_detached();
+            btif_media_cb.data_channel_open = FALSE;
             break;
 
         default :
-            APPL_TRACE_ERROR1("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
+            APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
             break;
     }
 }
@@ -600,7 +659,7 @@
     if (!btif_av_is_peer_edr())
     {
         rate = BTIF_A2DP_NON_EDR_MAX_RATE;
-        APPL_TRACE_DEBUG1("non-edr a2dp sink detected, restrict rate to %d", rate);
+        APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
     }
 
     return rate;
@@ -621,7 +680,7 @@
     /* lookup table to convert freq */
     UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
 
-    APPL_TRACE_DEBUG0("btif_a2dp_encoder_init");
+    APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
 
     /* Retrieve the current SBC configuration (default if currently not used) */
     bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
@@ -632,7 +691,7 @@
     msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
     msg.MtuSize = minmtu;
 
-    APPL_TRACE_EVENT1("msg.ChannelMode %x", msg.ChannelMode);
+    APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
 
     /* Init the media task to encode SBC properly */
     btif_media_task_enc_init_req(&msg);
@@ -646,18 +705,18 @@
     UINT8 pref_min;
     UINT8 pref_max;
 
-    APPL_TRACE_DEBUG0("btif_a2dp_encoder_update");
+    APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
 
     /* Retrieve the current SBC configuration (default if currently not used) */
     bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
 
-    APPL_TRACE_DEBUG4("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
+    APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
             sbc_config.min_bitpool, sbc_config.min_bitpool,
             sbc_config.max_bitpool, sbc_config.max_bitpool);
 
     if (sbc_config.min_bitpool > sbc_config.max_bitpool)
     {
-        APPL_TRACE_ERROR0("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
+        APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
     }
 
     /* check if remote sink has a preferred bitpool range */
@@ -677,7 +736,7 @@
 
         if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
         {
-            APPL_TRACE_EVENT2("## adjusted our bitpool range to peer pref [%d:%d] ##",
+            APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
                 pref_min, pref_max);
         }
     }
@@ -710,11 +769,11 @@
 
     if (media_task_running != MEDIA_TASK_STATE_OFF)
     {
-        APPL_TRACE_ERROR0("warning : media task already running");
+        APPL_TRACE_ERROR("warning : media task already running");
         return GKI_FAILURE;
     }
 
-    APPL_TRACE_EVENT0("## A2DP START MEDIA TASK ##");
+    APPL_TRACE_EVENT("## A2DP START MEDIA TASK ##");
 
     /* start a2dp media task */
     retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK,
@@ -729,7 +788,7 @@
     while (media_task_running == MEDIA_TASK_STATE_OFF)
         usleep(10);
 
-    APPL_TRACE_EVENT0("## A2DP MEDIA TASK STARTED ##");
+    APPL_TRACE_EVENT("## A2DP MEDIA TASK STARTED ##");
 
     return retval;
 }
@@ -746,7 +805,7 @@
 
 void btif_a2dp_stop_media_task(void)
 {
-    APPL_TRACE_EVENT0("## A2DP STOP MEDIA TASK ##");
+    APPL_TRACE_EVENT("## A2DP STOP MEDIA TASK ##");
     GKI_destroy_task(BT_MEDIA_TASK);
 }
 
@@ -781,7 +840,7 @@
     tBTIF_AV_MEDIA_FEEDINGS media_feeding;
     tBTIF_STATUS status;
 
-    APPL_TRACE_EVENT0("## A2DP SETUP CODEC ##");
+    APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
 
     GKI_disable();
 
@@ -821,12 +880,24 @@
 
 void btif_a2dp_on_idle(void)
 {
-    APPL_TRACE_EVENT0("## ON A2DP IDLE ##");
-
-    /* Make sure media task is stopped */
-    btif_media_task_stop_aa_req();
+    APPL_TRACE_EVENT("## ON A2DP IDLE ##");
+    if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
+    {
+        /* Make sure media task is stopped */
+        btif_media_task_stop_aa_req();
+    }
 
     bta_av_co_init();
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+    {
+        btif_media_cb.rx_flush = TRUE;
+        btif_media_task_aa_rx_flush_req();
+        btif_media_task_stop_decoding_req();
+        btif_media_task_clear_track();
+        APPL_TRACE_DEBUG("Stopped BT track");
+    }
+#endif
 }
 
 /*****************************************************************************
@@ -841,12 +912,119 @@
 
 void btif_a2dp_on_open(void)
 {
-    APPL_TRACE_EVENT0("## ON A2DP OPEN ##");
+    APPL_TRACE_EVENT("## ON A2DP OPEN ##");
 
     /* always use callback to notify socket events */
     UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
 }
 
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_clear_track
+ **
+ ** Description
+ **
+ ** Returns          TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_clear_track(void)
+{
+    BT_HDR *p_buf;
+
+    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+    {
+        return FALSE;
+    }
+
+    p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
+
+    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+    return TRUE;
+}
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_stop_decoding_req
+ **
+ ** Description
+ **
+ ** Returns          TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_stop_decoding_req(void)
+{
+    BT_HDR *p_buf;
+
+    if (!btif_media_cb.is_rx_timer)
+        return TRUE;   /*  if timer is not running no need to send message */
+
+    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+    {
+        return FALSE;
+    }
+
+    p_buf->event = BTIF_MEDIA_AUDIO_SINK_STOP_DECODING;
+
+    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+    return TRUE;
+}
+
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_start_decoding_req
+ **
+ ** Description
+ **
+ ** Returns          TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_start_decoding_req(void)
+{
+    BT_HDR *p_buf;
+
+    if(btif_media_cb.is_rx_timer)
+        return FALSE;   /*  if timer is already running no need to send message */
+
+    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+    {
+        return FALSE;
+    }
+
+    p_buf->event = BTIF_MEDIA_AUDIO_SINK_START_DECODING;
+
+    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+    return TRUE;
+}
+
+/*****************************************************************************
+**
+** Function        btif_reset_decoder
+**
+** Description
+**
+** Returns
+**
+*******************************************************************************/
+
+void btif_reset_decoder(UINT8 *p_av)
+{
+    APPL_TRACE_EVENT("btif_reset_decoder");
+    APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
+            p_av[1], p_av[2], p_av[3],
+            p_av[4], p_av[5], p_av[6]);
+
+    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
+    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
+    {
+        APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
+        return;
+    }
+
+    memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
+    p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
+
+    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+}
+
 /*****************************************************************************
 **
 ** Function        btif_a2dp_on_started
@@ -862,7 +1040,7 @@
     tBTIF_STATUS status;
     BOOLEAN ack = FALSE;
 
-    APPL_TRACE_EVENT0("## ON A2DP STARTED ##");
+    APPL_TRACE_EVENT("## ON A2DP STARTED ##");
 
     if (p_av == NULL)
     {
@@ -915,7 +1093,7 @@
 {
     tBTIF_STATUS status;
 
-    APPL_TRACE_EVENT0("## A2DP_CTRL_ACK_FAILURE ##");
+    APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
     a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
 }
 
@@ -931,14 +1109,22 @@
 
 void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
 {
-    APPL_TRACE_EVENT0("## ON A2DP STOPPED ##");
-
+    APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
+    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /*  Handling for A2DP SINK cases*/
+    {
+        btif_media_cb.rx_flush = TRUE;
+        btif_media_task_aa_rx_flush_req();
+        btif_media_task_stop_decoding_req();
+        UIPC_Close(UIPC_CH_ID_AV_AUDIO);
+        btif_media_cb.data_channel_open = FALSE;
+        return;
+    }
     /* allow using this api for other than suspend */
     if (p_av != NULL)
     {
         if (p_av->status != BTA_AV_SUCCESS)
         {
-            APPL_TRACE_EVENT1("AV STOP FAILED (%d)", p_av->status);
+            APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
 
             if (p_av->initiator)
                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
@@ -969,7 +1155,14 @@
 
 void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
 {
-    APPL_TRACE_EVENT0("## ON A2DP SUSPENDED ##");
+    APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
+    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
+    {
+        btif_media_cb.rx_flush = TRUE;
+        btif_media_task_aa_rx_flush_req();
+        btif_media_task_stop_decoding_req();
+        return;
+    }
 
     /* check for status failures */
     if (p_av->status != BTA_AV_SUCCESS)
@@ -987,46 +1180,89 @@
     btif_media_task_stop_aa_req();
 }
 
+/* when true media task discards any rx frames */
+void btif_a2dp_set_rx_flush(BOOLEAN enable)
+{
+    APPL_TRACE_EVENT("## DROP RX %d ##", enable);
+    btif_media_cb.rx_flush = enable;
+}
+
 /* when true media task discards any tx frames */
 void btif_a2dp_set_tx_flush(BOOLEAN enable)
 {
-    APPL_TRACE_EVENT1("## DROP TX %d ##", enable);
+    APPL_TRACE_EVENT("## DROP TX %d ##", enable);
     btif_media_cb.tx_flush = enable;
 }
 
-/*****************************************************************************
-**
-** Function        btif_calc_pcmtime
-**
-** Description     Calculates the pcmtime equivalent of a datapacket
-**
-** Returns         microseconds
-**
-*******************************************************************************/
-
-static int btif_calc_pcmtime(UINT32 bytes_processed)
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_avk_handle_timer
+ **
+ ** Description
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+static void btif_media_task_avk_handle_timer ( void )
 {
-    int pcm_time_us = 0;
-    tBTIF_AV_MEDIA_FEED_CFG *p_cfg;
+    UINT8 count;
+    tBT_SBC_HDR *p_msg;
+    int num_sbc_frames;
+    int num_frames_to_process;
 
-    p_cfg = &btif_media_cb.media_feeding.cfg;
-
-    /* calculate corresponding pcm time based on data processed */
-    switch(btif_media_cb.media_feeding.format)
+    count = btif_media_cb.RxSbcQ.count;
+    if (0 == count)
     {
-        case BTIF_AV_CODEC_PCM:
-            pcm_time_us = (bytes_processed*1000000)/
-                          (p_cfg->pcm.num_channel*p_cfg->pcm.sampling_freq*p_cfg->pcm.bit_per_sample/8);
-            break;
-
-        default :
-            APPL_TRACE_ERROR1("mediafeeding format invalid : %d", btif_media_cb.media_feeding.format);
-            break;
+        APPL_TRACE_DEBUG("  QUE  EMPTY ");
     }
+    else
+    {
+        if (btif_media_cb.rx_flush == TRUE)
+        {
+            btif_media_flush_q(&(btif_media_cb.RxSbcQ));
+            return;
+        }
 
-    return pcm_time_us;
+        num_frames_to_process = btif_media_cb.frames_to_process;
+        APPL_TRACE_DEBUG(" Process Frames + ");
+
+        do
+        {
+            p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
+            if (p_msg == NULL)
+                return;
+            num_sbc_frames  = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
+            APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
+            APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
+            APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ.count);
+
+            if ( num_sbc_frames > num_frames_to_process) /*  Que Packet has more frames*/
+            {
+                 p_msg->num_frames_to_be_processed= num_frames_to_process;
+                 btif_media_task_handle_inc_media(p_msg);
+                 p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
+                 num_frames_to_process = 0;
+                 break;
+            }
+            else                                        /*  Que packet has less frames */
+            {
+                btif_media_task_handle_inc_media(p_msg);
+                p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
+                if( p_msg == NULL )
+                {
+                     APPL_TRACE_ERROR("Insufficient data in que ");
+                     break;
+                }
+                num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
+                GKI_freebuf(p_msg);
+            }
+        }while(num_frames_to_process > 0);
+
+        APPL_TRACE_DEBUG(" Process Frames - ");
+    }
 }
-
+#endif
 
 /*******************************************************************************
  **
@@ -1042,13 +1278,20 @@
 {
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
     static UINT16 Debug = 0;
-    APPL_TRACE_DEBUG1("btif_media_task_aa_handle_timer: %d", Debug++);
+    APPL_TRACE_DEBUG("btif_media_task_aa_handle_timer: %d", Debug++);
 #endif
 
     log_tstamps_us("media task tx timer");
 
 #if (BTA_AV_INCLUDED == TRUE)
-    btif_media_send_aa_frame();
+    if(btif_media_cb.is_tx_timer == TRUE)
+    {
+        btif_media_send_aa_frame();
+    }
+    else
+    {
+        APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
+    }
 #endif
 }
 
@@ -1066,7 +1309,7 @@
 {
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
     static UINT16 Debug = 0;
-    APPL_TRACE_DEBUG1("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
+    APPL_TRACE_DEBUG("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
 #endif
 
     /* process all the UIPC data */
@@ -1097,8 +1340,6 @@
 #if (BTA_AV_INCLUDED == TRUE)
     UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
 #endif
-
-
 }
 /*******************************************************************************
  **
@@ -1145,6 +1386,7 @@
 
         if (event & BTIF_MEDIA_TASK_DATA)
         {
+            VERBOSE("================= Received Media Packets %d ===============", event);
             /* Process all messages in the queue */
             while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL)
             {
@@ -1158,6 +1400,15 @@
             btif_media_task_aa_handle_timer();
         }
 
+        if (event & BTIF_MEDIA_AVK_TASK_TIMER)
+        {
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+            /* advance audio timer expiration for a2dp sink */
+            btif_media_task_avk_handle_timer();
+#endif
+        }
+
+
 
         VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event);
 
@@ -1176,7 +1427,7 @@
     /* Clear media task flag */
     media_task_running = MEDIA_TASK_STATE_OFF;
 
-    APPL_TRACE_DEBUG0("MEDIA TASK EXITING");
+    APPL_TRACE_DEBUG("MEDIA TASK EXITING");
 
     return 0;
 }
@@ -1216,7 +1467,7 @@
  *******************************************************************************/
 static void btif_media_flush_q(BUFFER_Q *p_q)
 {
-    while (GKI_IS_QUEUE_EMPTY(p_q) == FALSE)
+    while (!GKI_queue_is_empty(p_q))
     {
         GKI_freebuf(GKI_dequeue(p_q));
     }
@@ -1261,14 +1512,87 @@
     case BTIF_MEDIA_UIPC_RX_RDY:
         btif_media_task_aa_handle_uipc_rx_rdy();
         break;
+    case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+        btif_media_task_aa_handle_decoder_reset(p_msg);
+#endif
+        break;
+    case BTIF_MEDIA_AUDIO_SINK_START_DECODING:
+        btif_media_task_aa_handle_start_decoding();
+        break;
+    case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+        btif_media_task_aa_handle_clear_track();
+#endif
+        break;
+    case BTIF_MEDIA_AUDIO_SINK_STOP_DECODING:
+        btif_media_task_aa_handle_stop_decoding();
+        break;
+     case BTIF_MEDIA_FLUSH_AA_RX:
+        btif_media_task_aa_rx_flush();
+        break;
 #endif
     default:
-        APPL_TRACE_ERROR1("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
+        APPL_TRACE_ERROR("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
     }
     GKI_freebuf(p_msg);
     VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event));
 }
 
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_handle_inc_media
+ **
+ ** Description
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
+{
+    UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
+    int count;
+    UINT32 pcmBytes, availPcmBytes;
+    OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
+    OI_STATUS status;
+    int num_sbc_frames = p_msg->num_frames_to_be_processed;
+    UINT32 sbc_frame_len = p_msg->len - 1;
+    availPcmBytes = 2*sizeof(pcmData);
+
+    if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
+    {
+        APPL_TRACE_DEBUG(" State Changed happened in this tick ");
+        return;
+    }
+
+    // ignore data if no one is listening
+    if (!btif_media_cb.data_channel_open)
+        return;
+
+    APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
+
+    for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
+    {
+        pcmBytes = availPcmBytes;
+        status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
+                                                        (OI_UINT32 *)&sbc_frame_len,
+                                                        (OI_INT16 *)pcmDataPointer,
+                                                        (OI_UINT32 *)&pcmBytes);
+        if (!OI_SUCCESS(status)) {
+            APPL_TRACE_ERROR("Decoding failure: %d\n", status);
+            break;
+        }
+        availPcmBytes -= pcmBytes;
+        pcmDataPointer += pcmBytes/2;
+        p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
+        p_msg->len = sbc_frame_len + 1;
+    }
+
+    UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
+}
+#endif
+
 /*******************************************************************************
  **
  ** Function         btif_media_task_handle_media
@@ -1278,16 +1602,11 @@
  ** Returns          void
  **
  *******************************************************************************/
-static void btif_media_task_handle_media(BT_HDR *p_msg)
+static void btif_media_task_handle_media(BT_HDR*p_msg)
 {
-    APPL_TRACE_ERROR0("ERROR btif_media_task_handle_media: not in use");
-
+    APPL_TRACE_DEBUG(" btif_media_task_handle_media ");
     GKI_freebuf(p_msg);
 }
-
-
-
-
 #if (BTA_AV_INCLUDED == TRUE)
 /*******************************************************************************
  **
@@ -1375,7 +1694,7 @@
     BT_HDR *p_buf;
     if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
     {
-        APPL_TRACE_EVENT0("GKI failed");
+        APPL_TRACE_EVENT("GKI failed");
         return FALSE;
     }
 
@@ -1407,6 +1726,32 @@
     GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
     return TRUE;
 }
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_aa_rx_flush_req
+ **
+ ** Description
+ **
+ ** Returns          TRUE is success
+ **
+ *******************************************************************************/
+BOOLEAN btif_media_task_aa_rx_flush_req(void)
+{
+    BT_HDR *p_buf;
+
+    if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /*  Que is already empty */
+        return TRUE;
+
+    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
+    {
+        return FALSE;
+    }
+
+    p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
+
+    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
+    return TRUE;
+}
 
 /*******************************************************************************
  **
@@ -1430,6 +1775,23 @@
     GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
     return TRUE;
 }
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_aa_rx_flush
+ **
+ ** Description
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_rx_flush(void)
+{
+    /* Flush all enqueued GKI SBC  buffers (encoded) */
+    APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
+
+    btif_media_flush_q(&(btif_media_cb.RxSbcQ));
+}
+
 
 /*******************************************************************************
  **
@@ -1445,7 +1807,7 @@
     UNUSED(p_msg);
 
     /* Flush all enqueued GKI music buffers (encoded) */
-    APPL_TRACE_DEBUG0("btif_media_task_aa_tx_flush");
+    APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
 
     btif_media_cb.media_feeding_state.pcm.counter = 0;
     btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
@@ -1468,7 +1830,7 @@
 {
     tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
 
-    APPL_TRACE_DEBUG0("btif_media_task_enc_init");
+    APPL_TRACE_DEBUG("btif_media_task_enc_init");
 
     btif_media_cb.timestamp = 0;
 
@@ -1487,9 +1849,9 @@
             < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
             - sizeof(BT_HDR)) : pInitAudio->MtuSize;
 
-    APPL_TRACE_EVENT3("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
+    APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
                      btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
-    APPL_TRACE_EVENT6("      ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
+    APPL_TRACE_EVENT("      ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
             btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
             btif_media_cb.encoder.s16NumOfBlocks,
             btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
@@ -1497,7 +1859,7 @@
 
     /* Reset entirely the SBC encoder */
     SBC_Encoder_Init(&(btif_media_cb.encoder));
-    APPL_TRACE_DEBUG1("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
+    APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
 }
 
 /*******************************************************************************
@@ -1515,12 +1877,12 @@
     tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
     SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
     UINT16 s16SamplingFreq;
-    SINT16 s16BitPool;
+    SINT16 s16BitPool = 0;
     SINT16 s16BitRate;
     SINT16 s16FrameLen;
     UINT8 protect = 0;
 
-    APPL_TRACE_DEBUG3("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
+    APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
             pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
 
     /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
@@ -1545,6 +1907,16 @@
 
         do
         {
+            if (pstrEncParams->s16NumOfBlocks == 0 || pstrEncParams->s16NumOfSubBands == 0
+                || pstrEncParams->s16NumOfChannels == 0)
+            {
+                APPL_TRACE_ERROR("btif_media_task_enc_update() - Avoiding division by zero...");
+                APPL_TRACE_ERROR("btif_media_task_enc_update() - block=%d, subBands=%d, channels=%d",
+                    pstrEncParams->s16NumOfBlocks, pstrEncParams->s16NumOfSubBands,
+                    pstrEncParams->s16NumOfChannels);
+                break;
+            }
+
             if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
                 (pstrEncParams->s16ChannelMode == SBC_STEREO) )
             {
@@ -1593,12 +1965,12 @@
                 s16BitPool = 0;
             }
 
-            APPL_TRACE_EVENT2("bitpool candidate : %d (%d kbps)",
+            APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
                          s16BitPool, pstrEncParams->u16BitRate);
 
             if (s16BitPool > pUpdateAudio->MaxBitPool)
             {
-                APPL_TRACE_DEBUG1("btif_media_task_enc_update computed bitpool too large (%d)",
+                APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
                                     s16BitPool);
                 /* Decrease bitrate */
                 btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
@@ -1607,11 +1979,16 @@
             }
             else if (s16BitPool < pUpdateAudio->MinBitPool)
             {
-                APPL_TRACE_WARNING1("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
+                APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
+
                 /* Increase bitrate */
+                UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
                 btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
                 /* Record that we have increased the bitrate */
                 protect |= 2;
+                /* Check over-flow */
+                if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
+                    protect |= 3;
             }
             else
             {
@@ -1620,7 +1997,7 @@
             /* In case we have already increased and decreased the bitrate, just stop */
             if (protect == 3)
             {
-                APPL_TRACE_ERROR0("btif_media_task_enc_update could not find bitpool in range");
+                APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
                 break;
             }
         } while (1);
@@ -1628,7 +2005,7 @@
         /* Finally update the bitpool in the encoder structure */
         pstrEncParams->s16BitPool = s16BitPool;
 
-        APPL_TRACE_DEBUG2("btif_media_task_enc_update final bit rate %d, final bit pool %d",
+        APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
                 btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
 
         /* make sure we reinitialize encoder with new settings */
@@ -1649,10 +2026,10 @@
 {
     BOOLEAN reconfig_needed = FALSE;
 
-    APPL_TRACE_DEBUG0("PCM feeding:");
-    APPL_TRACE_DEBUG1("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
-    APPL_TRACE_DEBUG1("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
-    APPL_TRACE_DEBUG1("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
+    APPL_TRACE_DEBUG("PCM feeding:");
+    APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
+    APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
+    APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
 
     /* Check the PCM feeding sampling_freq */
     switch (p_feeding->feeding.cfg.pcm.sampling_freq)
@@ -1667,7 +2044,7 @@
             if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
             {
                 /* Reconfiguration needed at 48000 */
-                APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 48000");
+                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
                 btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
                 reconfig_needed = TRUE;
             }
@@ -1680,28 +2057,28 @@
             if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
             {
                 /* Reconfiguration needed at 44100 */
-                APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 44100");
+                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
                 btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
                 reconfig_needed = TRUE;
             }
             break;
         default:
-            APPL_TRACE_DEBUG0("Feeding PCM sampling_freq unsupported");
+            APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
             break;
     }
 
     /* Some AV Headsets do not support Mono => always ask for Stereo */
     if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
     {
-        APPL_TRACE_DEBUG0("SBC Reconfiguration needed in Stereo");
+        APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
         btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
         reconfig_needed = TRUE;
     }
 
     if (reconfig_needed != FALSE)
     {
-        APPL_TRACE_DEBUG1("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
-        APPL_TRACE_DEBUG6("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
+        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
+        APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
                 btif_media_cb.encoder.s16ChannelMode,
                 btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
                 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
@@ -1711,7 +2088,7 @@
     }
     else
     {
-        APPL_TRACE_DEBUG0("btif_media_task_pcm2sbc_init no SBC reconfig needed");
+        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
     }
 }
 
@@ -1729,7 +2106,7 @@
 {
     tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
 
-    APPL_TRACE_DEBUG1("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
+    APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
 
     /* Save Media Feeding information */
     btif_media_cb.feeding_mode = p_feeding->feeding_mode;
@@ -1744,41 +2121,232 @@
             break;
 
         default :
-            APPL_TRACE_ERROR1("unknown feeding format %d", p_feeding->feeding.format);
+            APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
             break;
     }
 }
 
+int btif_a2dp_get_track_frequency(UINT8 frequency) {
+    int freq = 48000;
+    switch (frequency) {
+        case A2D_SBC_IE_SAMP_FREQ_16:
+            freq = 16000;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_32:
+            freq = 32000;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_44:
+            freq = 44100;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_48:
+            freq = 48000;
+            break;
+    }
+    return freq;
+}
+
+int btif_a2dp_get_track_channel_count(UINT8 channeltype) {
+    int count = 1;
+    switch (channeltype) {
+        case A2D_SBC_IE_CH_MD_MONO:
+            count = 1;
+            break;
+        case A2D_SBC_IE_CH_MD_DUAL:
+        case A2D_SBC_IE_CH_MD_STEREO:
+        case A2D_SBC_IE_CH_MD_JOINT:
+            count = 2;
+            break;
+    }
+    return count;
+}
+
+void btif_a2dp_set_peer_sep(UINT8 sep) {
+    btif_media_cb.peer_sep = sep;
+}
+
 /*******************************************************************************
  **
- ** Function         btif_media_task_uipc_cback
+ ** Function         btif_media_task_aa_handle_stop_decoding
  **
- ** Description      UIPC call back function for synchronous mode only
+ ** Description
  **
  ** Returns          void
  **
  *******************************************************************************/
-static void btif_media_task_uipc_cback(BT_HDR *p_msg)
+static void btif_media_task_aa_handle_stop_decoding(void )
 {
-    /* Sanity check */
-    if (NULL == p_msg)
-    {
-        return;
-    }
-
-    /* Just handle RX_EVT */
-    if (p_msg->event != UIPC_RX_DATA_EVT)
-    {
-        return;
-    }
-
-    p_msg->event = BTIF_MEDIA_UIPC_RX_RDY;
-
-    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_msg);
+    btif_media_cb.is_rx_timer = FALSE;
+    GKI_stop_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID);
 }
 
 /*******************************************************************************
  **
+ ** Function         btif_media_task_aa_handle_start_decoding
+ **
+ ** Description
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_handle_start_decoding(void )
+{
+    if(btif_media_cb.is_rx_timer == TRUE)
+        return;
+    btif_media_cb.is_rx_timer = TRUE;
+    GKI_start_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_SINK_MEDIA_TIME_TICK), TRUE);
+}
+
+#if (BTA_AV_SINK_INCLUDED == TRUE)
+
+static void btif_media_task_aa_handle_clear_track (void)
+{
+    APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
+}
+
+/*******************************************************************************
+ **
+ ** Function         btif_media_task_aa_handle_decoder_reset
+ **
+ ** Description
+ **
+ ** Returns          void
+ **
+ *******************************************************************************/
+static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
+{
+    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
+    tA2D_STATUS a2d_status;
+    tA2D_SBC_CIE sbc_cie;
+    OI_STATUS       status;
+    UINT32          freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
+    UINT32          num_blocks = 16;
+    UINT32          num_subbands = 8;
+
+    APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
+            p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
+            p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
+
+    a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
+    if (a2d_status != A2D_SUCCESS)
+    {
+        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+        return;
+    }
+
+    btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
+    btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
+
+    btif_media_cb.rx_flush = FALSE;
+    APPL_TRACE_DEBUG("Reset to sink role");
+    status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
+    if (!OI_SUCCESS(status)) {
+        APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
+    }
+
+    UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
+
+    switch(sbc_cie.samp_freq)
+    {
+        case A2D_SBC_IE_SAMP_FREQ_16:
+            APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
+            freq_multiple = 16*20;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_32:
+            APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
+            freq_multiple = 32*20;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_44:
+            APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
+            freq_multiple = 441*2;
+            break;
+        case A2D_SBC_IE_SAMP_FREQ_48:
+            APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
+            freq_multiple = 48*20;
+            break;
+        default:
+            APPL_TRACE_DEBUG(" Unknown Frequency ");
+            break;
+    }
+
+    switch(sbc_cie.ch_mode)
+    {
+        case A2D_SBC_IE_CH_MD_MONO:
+            APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
+            break;
+        case A2D_SBC_IE_CH_MD_DUAL:
+            APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
+            break;
+        case A2D_SBC_IE_CH_MD_STEREO:
+            APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
+            break;
+        case A2D_SBC_IE_CH_MD_JOINT:
+            APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
+            break;
+        default:
+            APPL_TRACE_DEBUG(" Unknown Mode ");
+            break;
+    }
+
+    switch(sbc_cie.block_len)
+    {
+        case A2D_SBC_IE_BLOCKS_4:
+            APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
+            num_blocks = 4;
+            break;
+        case A2D_SBC_IE_BLOCKS_8:
+            APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
+            num_blocks = 8;
+            break;
+        case A2D_SBC_IE_BLOCKS_12:
+            APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
+            num_blocks = 12;
+            break;
+        case A2D_SBC_IE_BLOCKS_16:
+            APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
+            num_blocks = 16;
+            break;
+        default:
+            APPL_TRACE_DEBUG(" Unknown BlockLen ");
+            break;
+    }
+
+    switch(sbc_cie.num_subbands)
+    {
+        case A2D_SBC_IE_SUBBAND_4:
+            APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
+            num_subbands = 4;
+            break;
+        case A2D_SBC_IE_SUBBAND_8:
+            APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
+            num_subbands = 8;
+            break;
+        default:
+            APPL_TRACE_DEBUG(" Unknown SubBands ");
+            break;
+    }
+
+    switch(sbc_cie.alloc_mthd)
+    {
+        case A2D_SBC_IE_ALLOC_MD_S:
+            APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
+            break;
+        case A2D_SBC_IE_ALLOC_MD_L:
+            APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
+            break;
+        default:
+            APPL_TRACE_DEBUG(" Unknown Allocation Method");
+            break;
+    }
+
+    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
+
+    btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
+    APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
+}
+#endif
+
+/*******************************************************************************
+ **
  ** Function         btif_media_task_feeding_state_reset
  **
  ** Description      Reset the media feeding state
@@ -1788,7 +2356,7 @@
  *******************************************************************************/
 static void btif_media_task_feeding_state_reset(void)
 {
-    APPL_TRACE_WARNING3("overflow %d, enter %d, exit %d",
+    APPL_TRACE_WARNING("overflow %d, enter %d, exit %d",
         btif_media_cb.media_feeding_state.pcm.overflow_count,
         btif_media_cb.media_feeding_state.pcm.max_counter_enter,
         btif_media_cb.media_feeding_state.pcm.max_counter_exit);
@@ -1804,7 +2372,7 @@
                  btif_media_cb.media_feeding.cfg.pcm.num_channel *
                  BTIF_MEDIA_TIME_TICK)/1000;
 
-        APPL_TRACE_WARNING1("pcm bytes per tick %d",
+        APPL_TRACE_WARNING("pcm bytes per tick %d",
                             (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
     }
 }
@@ -1819,18 +2387,19 @@
  *******************************************************************************/
 static void btif_media_task_aa_start_tx(void)
 {
-    APPL_TRACE_DEBUG2("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
+    APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
              btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
 
     /* Use a timer to poll the UIPC, get rid of the UIPC call back */
     // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
 
     btif_media_cb.is_tx_timer = TRUE;
+    last_frame_us = 0;
 
     /* Reset the media feeding state */
     btif_media_task_feeding_state_reset();
 
-    APPL_TRACE_EVENT2("starting timer %d ticks (%d)",
+    APPL_TRACE_EVENT("starting timer %d ticks (%d)",
                   GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC);
 
     GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE);
@@ -1847,7 +2416,7 @@
  *******************************************************************************/
 static void btif_media_task_aa_stop_tx(void)
 {
-    APPL_TRACE_DEBUG1("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
+    APPL_TRACE_DEBUG("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
 
     /* Stop the timer first */
     GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID);
@@ -1857,6 +2426,7 @@
 
     /* audio engine stopped, reset tx suspended flag */
     btif_media_cb.tx_flush = 0;
+    last_frame_us = 0;
 
     /* Reset the media feeding state */
     btif_media_task_feeding_state_reset();
@@ -1884,8 +2454,15 @@
                              btif_media_cb.media_feeding.cfg.pcm.num_channel *
                              btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
 
+            UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
+            UINT64 now_us = time_now_us();
+            if (last_frame_us != 0)
+                us_this_tick = (now_us - last_frame_us);
+            last_frame_us = now_us;
+
             btif_media_cb.media_feeding_state.pcm.counter +=
-                                btif_media_cb.media_feeding_state.pcm.bytes_per_tick;
+                                btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
+                                us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
             if ((!btif_media_cb.media_feeding_state.pcm.overflow) ||
                 (btif_media_cb.TxAaQ.count < A2DP_PACKET_COUNT_LOW_WATERMARK)) {
                 if (btif_media_cb.media_feeding_state.pcm.overflow) {
@@ -1899,24 +2476,30 @@
                 }
                 /* calculate nbr of frames pending for this media tick */
                 result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
-                if (result > MAX_PCM_FRAME_NUM_PER_TICK) result = MAX_PCM_FRAME_NUM_PER_TICK;
+                if (result > MAX_PCM_FRAME_NUM_PER_TICK)
+                {
+                    APPL_TRACE_ERROR("%s() - Limiting frames to be sent from %d to %d"
+                        , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
+                    result = MAX_PCM_FRAME_NUM_PER_TICK;
+                }
                 btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
             } else {
                 result = 0;
             }
+
             VERBOSE("WRITE %d FRAMES", result);
         }
         break;
 
         default:
-            APPL_TRACE_ERROR1("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
+            APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
                     btif_media_cb.TxTranscoding);
             result = 0;
             break;
     }
 
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
-    APPL_TRACE_DEBUG1("btif_get_num_aa_frame returns %d", result);
+    APPL_TRACE_DEBUG("btif_get_num_aa_frame returns %d", result);
 #endif
 
     return (UINT8)result;
@@ -1924,6 +2507,49 @@
 
 /*******************************************************************************
  **
+ ** Function         btif_media_sink_enque_buf
+ **
+ ** Description      This function is called by the av_co to fill A2DP Sink Queue
+ **
+ **
+ ** Returns          size of the queue
+ *******************************************************************************/
+UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
+{
+    tBT_SBC_HDR *p_msg;
+
+    if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
+        return btif_media_cb.RxSbcQ.count;
+    if(btif_media_cb.RxSbcQ.count == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
+    {
+        GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
+    }
+
+    BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
+    /* allocate and Queue this buffer */
+    if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
+                        p_pkt->offset+ p_pkt->len)) != NULL)
+    {
+        memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
+        p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
+        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
+        GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
+        if(btif_media_cb.RxSbcQ.count == MAX_A2DP_DELAYED_START_FRAME_COUNT)
+        {
+            BTIF_TRACE_DEBUG(" Initiate Decoding ");
+            btif_media_task_start_decoding_req();
+        }
+    }
+    else
+    {
+        /* let caller deal with a failed allocation */
+        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
+    }
+    return btif_media_cb.RxSbcQ.count;
+}
+
+/*******************************************************************************
+ **
  ** Function         btif_media_aa_readbuf
  **
  ** Description      This function is called by the av_co to get the next buffer to send
@@ -1994,7 +2620,7 @@
             btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
             return TRUE;
         } else {
-            APPL_TRACE_WARNING2("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
+            APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
                 nb_byte_read, read_size);
             btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
             return FALSE;
@@ -2053,7 +2679,7 @@
 
     if (nb_byte_read < read_size)
     {
-        APPL_TRACE_WARNING2("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
+        APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
                 nb_byte_read, read_size);
 
         if (nb_byte_read == 0)
@@ -2081,7 +2707,7 @@
             &src_size_used);
 
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
-    APPL_TRACE_DEBUG3("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
+    APPL_TRACE_DEBUG("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
             read_size, src_size_used, dst_size_used);
 #endif
 
@@ -2108,7 +2734,7 @@
     }
 
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
-    APPL_TRACE_DEBUG3("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
+    APPL_TRACE_DEBUG("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
             btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed);
 #endif
 
@@ -2131,14 +2757,14 @@
                              btif_media_cb.encoder.s16NumOfBlocks;
 
 #if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
-    APPL_TRACE_DEBUG2("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
+    APPL_TRACE_DEBUG("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
                        nb_frame, btif_media_cb.TxAaQ.count);
 #endif
     while (nb_frame)
     {
         if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID)))
         {
-            APPL_TRACE_ERROR1 ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
+            APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
                                 btif_media_cb.TxAaQ.count);
             return;
         }
@@ -2170,7 +2796,7 @@
             }
             else
             {
-                APPL_TRACE_WARNING2("btif_media_aa_prep_sbc_2_send underflow %d, %d",
+                APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
                     nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
                 btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
                      btif_media_cb.encoder.s16NumOfSubBands *
@@ -2182,7 +2808,10 @@
 
                 /* break read loop if timer was stopped (media task stopped) */
                 if ( btif_media_cb.is_tx_timer == FALSE )
+                {
+                    GKI_freebuf(p_buf);
                     return;
+                }
             }
 
         } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
@@ -2200,7 +2829,7 @@
 
             if (btif_media_cb.tx_flush)
             {
-                APPL_TRACE_DEBUG0("### tx suspended, discarded frame ###");
+                APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
 
                 if (btif_media_cb.TxAaQ.count > 0)
                     btif_media_flush_q(&(btif_media_cb.TxAaQ));
@@ -2236,7 +2865,7 @@
 
             if (btif_media_cb.media_feeding_state.pcm.counter > reset_rate_bytes) {
                 btif_media_cb.media_feeding_state.pcm.counter = 0;
-                APPL_TRACE_WARNING0("btif_media_aa_prep_sbc_2_send:reset rate counter");
+                APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send:reset rate counter");
             }
 
             /* no more pcm to read */
@@ -2269,7 +2898,7 @@
 
 
     default:
-        APPL_TRACE_ERROR1("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
+        APPL_TRACE_ERROR("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
         break;
     }
 }
@@ -2319,59 +2948,60 @@
     a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
     if (a2d_status != A2D_SUCCESS)
     {
-        APPL_TRACE_ERROR1("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
+        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
         return;
     }
 
-    APPL_TRACE_DEBUG0("dump_codec_info");
+    APPL_TRACE_DEBUG("dump_codec_info");
 
     if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
-    {    APPL_TRACE_DEBUG1("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
+    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
-    {    APPL_TRACE_DEBUG1("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
+    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
-    {    APPL_TRACE_DEBUG1("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
+    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
-    {    APPL_TRACE_DEBUG1("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
+    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
     else
-    {    APPL_TRACE_DEBUG1("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
+    {    APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
 
     if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
-    {    APPL_TRACE_DEBUG1("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
+    {    APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
-    {    APPL_TRACE_DEBUG1("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
+    {    APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
-    {    APPL_TRACE_DEBUG1("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
+    {    APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
-    {    APPL_TRACE_DEBUG1("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
+    {    APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
     else
-    {    APPL_TRACE_DEBUG1("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
+    {    APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
 
     if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
-    {    APPL_TRACE_DEBUG1("\tblock_len:%d (4)", sbc_cie.block_len);}
+    {    APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
-    {    APPL_TRACE_DEBUG1("\tblock_len:%d (8)", sbc_cie.block_len);}
+    {    APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
-    {    APPL_TRACE_DEBUG1("\tblock_len:%d (12)", sbc_cie.block_len);}
+    {    APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
-    {    APPL_TRACE_DEBUG1("\tblock_len:%d (16)", sbc_cie.block_len);}
+    {    APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
     else
-    {    APPL_TRACE_DEBUG1("\tBAD block_len:%d", sbc_cie.block_len);}
+    {    APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
 
     if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
-    {    APPL_TRACE_DEBUG1("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
+    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
     else  if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
-    {    APPL_TRACE_DEBUG1("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
+    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
     else
-    {    APPL_TRACE_DEBUG1("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
+    {    APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
 
     if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
-    {    APPL_TRACE_DEBUG1("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
+    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
     else  if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
-    {    APPL_TRACE_DEBUG1("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
+    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
     else
-    {    APPL_TRACE_DEBUG1("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
+    {    APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
 
-    APPL_TRACE_DEBUG2("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
+    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
 
 }
+
diff --git a/btif/src/btif_pan.c b/btif/src/btif_pan.c
index 28c5156..32ae984 100644
--- a/btif/src/btif_pan.c
+++ b/btif/src/btif_pan.c
@@ -26,6 +26,7 @@
  ***********************************************************************************/
 #include <hardware/bluetooth.h>
 #include <hardware/bt_pan.h>
+#include <assert.h>
 #include <signal.h>
 #include <ctype.h>
 #include <sys/select.h>
@@ -56,7 +57,12 @@
 #include "btif_sock_thread.h"
 #include "btif_sock_util.h"
 #include "btif_pan_internal.h"
+#include "gki.h"
 
+#define FORWARD_IGNORE        1
+#define FORWARD_SUCCESS       0
+#define FORWARD_FAILURE     (-1)
+#define FORWARD_CONGEST     (-2)
 //#define PANU_DISABLED TRUE
 
 #if (PAN_NAP_DISABLED == TRUE) && (PANU_DISABLED == TRUE)
@@ -69,7 +75,9 @@
 #define BTPAN_LOCAL_ROLE (BTPAN_ROLE_PANU | BTPAN_ROLE_PANNAP)
 #endif
 
-#define asrt(s) if(!(s)) BTIF_TRACE_ERROR3("btif_pan: ## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) BTIF_TRACE_ERROR("btif_pan: ## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
 
 btpan_cb_t btpan_cb;
 
@@ -85,15 +93,8 @@
 static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id);
 static void btpan_cleanup_conn(btpan_conn_t* conn);
 static void bta_pan_callback(tBTA_PAN_EVT event, tBTA_PAN *p_data);
-/*******************************************************************************
- **
- ** Function         btpan_ini
- **
- ** Description     initializes the pan interface
- **
- ** Returns         bt_status_t
- **
- *******************************************************************************/
+static void btu_exec_tap_fd_read(void *p_param);
+
 static btpan_interface_t pan_if = {
     sizeof(pan_if),
     btpan_jni_init,
@@ -103,19 +104,31 @@
     btpan_disconnect,
     btpan_jni_cleanup
 };
+
 btpan_interface_t *btif_pan_get_interface()
 {
     return &pan_if;
 }
+
+/*******************************************************************************
+ **
+ ** Function        btif_pan_init
+ **
+ ** Description     initializes the pan interface
+ **
+ ** Returns         bt_status_t
+ **
+ *******************************************************************************/
 void btif_pan_init()
 {
-    BTIF_TRACE_DEBUG2("jni_initialized = %d, btpan_cb.enabled:%d", jni_initialized, btpan_cb.enabled);
+    BTIF_TRACE_DEBUG("jni_initialized = %d, btpan_cb.enabled:%d", jni_initialized, btpan_cb.enabled);
     stack_initialized = TRUE;
     if (jni_initialized && !btpan_cb.enabled)
     {
-        BTIF_TRACE_DEBUG0("Enabling PAN....");
+        BTIF_TRACE_DEBUG("Enabling PAN....");
         memset(&btpan_cb, 0, sizeof(btpan_cb));
         btpan_cb.tap_fd = -1;
+        btpan_cb.flow = 1;
         int i;
         for(i = 0; i < MAX_PAN_CONNS; i++)
             btpan_cleanup_conn(&btpan_cb.conns[i]);
@@ -124,6 +137,7 @@
         btpan_enable(BTPAN_LOCAL_ROLE);
     }
 }
+
 static void pan_disable()
 {
     if(btpan_cb.enabled)
@@ -132,12 +146,12 @@
         BTA_PanDisable();
         if(btpan_cb.tap_fd != -1)
         {
-            destroy_tap_read_thread();
             btpan_tap_close(btpan_cb.tap_fd);
             btpan_cb.tap_fd = -1;
         }
     }
 }
+
 void btif_pan_cleanup()
 {
     if(stack_initialized)
@@ -154,7 +168,7 @@
 static btpan_callbacks_t callback;
 static bt_status_t btpan_jni_init(const btpan_callbacks_t* callbacks)
 {
-    BTIF_TRACE_DEBUG2("stack_initialized = %d, btpan_cb.enabled:%d", stack_initialized, btpan_cb.enabled);
+    BTIF_TRACE_DEBUG("stack_initialized = %d, btpan_cb.enabled:%d", stack_initialized, btpan_cb.enabled);
     jni_initialized = TRUE;
     if(stack_initialized && !btpan_cb.enabled)
         btif_pan_init();
@@ -167,10 +181,11 @@
     pan_disable();
     jni_initialized = FALSE;
 }
+
 static inline int bta_role_to_btpan(int bta_pan_role)
 {
     int btpan_role = 0;
-    BTIF_TRACE_DEBUG1("bta_pan_role:0x%x", bta_pan_role);
+    BTIF_TRACE_DEBUG("bta_pan_role:0x%x", bta_pan_role);
     if(bta_pan_role & PAN_ROLE_NAP_SERVER)
     {
         btpan_role |= BTPAN_ROLE_PANNAP;
@@ -181,10 +196,11 @@
     }
     return btpan_role;
 }
+
 static inline int btpan_role_to_bta(int btpan_role)
 {
     int bta_pan_role = PAN_ROLE_INACTIVE;
-    BTIF_TRACE_DEBUG1("btpan_role:0x%x", btpan_role);
+    BTIF_TRACE_DEBUG("btpan_role:0x%x", btpan_role);
     if(btpan_role & BTPAN_ROLE_PANNAP)
     {
         bta_pan_role |= PAN_ROLE_NAP_SERVER;
@@ -195,14 +211,15 @@
     }
     return bta_pan_role;
 }
+
 static volatile int btpan_dev_local_role;
 static tBTA_PAN_ROLE_INFO bta_panu_info = {PANU_SERVICE_NAME, 0, PAN_SECURITY};
-static tBTA_PAN_ROLE_INFO bta_pan_nap_info = {PAN_NAP_SERVICE_NAME, 0, PAN_SECURITY};
+static tBTA_PAN_ROLE_INFO bta_pan_nap_info = {PAN_NAP_SERVICE_NAME, 1, PAN_SECURITY};
 
 static bt_status_t btpan_enable(int local_role)
 {
     int bta_pan_role;
-    BTIF_TRACE_DEBUG1("local_role:%d", local_role);
+    BTIF_TRACE_DEBUG("local_role:%d", local_role);
     bta_pan_role = btpan_role_to_bta(local_role);
 #if BTA_PAN_INCLUDED == TRUE
     BTA_PanSetRole(bta_pan_role, &bta_panu_info, NULL, &bta_pan_nap_info);
@@ -212,23 +229,26 @@
     return BT_STATUS_FAIL;
 #endif
 }
+
 static int btpan_get_local_role()
 {
-    BTIF_TRACE_DEBUG1("btpan_dev_local_role:%d", btpan_dev_local_role);
+    BTIF_TRACE_DEBUG("btpan_dev_local_role:%d", btpan_dev_local_role);
     return btpan_dev_local_role;
 }
+
 static bt_status_t btpan_connect(const bt_bdaddr_t *bd_addr, int local_role, int remote_role)
 {
-    BTIF_TRACE_DEBUG2("local_role:%d, remote_role:%d", local_role, remote_role);
+    BTIF_TRACE_DEBUG("local_role:%d, remote_role:%d", local_role, remote_role);
     int bta_local_role = btpan_role_to_bta(local_role);
     int bta_remote_role = btpan_role_to_bta(remote_role);
     btpan_new_conn(-1, bd_addr->address, bta_local_role, bta_remote_role);
     BTA_PanOpen((UINT8*)bd_addr->address, bta_local_role, bta_remote_role);
     return BT_STATUS_SUCCESS;
 }
+
 static void btif_in_pan_generic_evt(UINT16 event, char *p_param)
 {
-    BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
+    BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
     switch (event) {
         case BTIF_PAN_CB_DISCONNECTING:
         {
@@ -246,11 +266,12 @@
         } break;
         default:
         {
-            BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
+            BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
         }
         break;
     }
 }
+
 static bt_status_t btpan_disconnect(const bt_bdaddr_t *bd_addr)
 {
     btpan_conn_t* conn = btpan_find_conn_addr(bd_addr->address);
@@ -264,24 +285,25 @@
     }
     return BT_STATUS_FAIL;
 }
-static int pth = -1;
+
+static int pan_pth = -1;
 void create_tap_read_thread(int tap_fd)
 {
-    if(pth < 0)
-    {
-        pth = btsock_thread_create(btpan_tap_fd_signaled, NULL);
-        if(pth >= 0)
-            btsock_thread_add_fd(pth, tap_fd, 0, SOCK_THREAD_FD_RD, 0);
-    }
+    if(pan_pth < 0)
+        pan_pth = btsock_thread_create(btpan_tap_fd_signaled, NULL);
+    if(pan_pth >= 0)
+        btsock_thread_add_fd(pan_pth, tap_fd, 0, SOCK_THREAD_FD_RD, 0);
 }
+
 void destroy_tap_read_thread(void)
 {
-    if(pth >= 0)
+    if(pan_pth >= 0)
     {
-        btsock_thread_exit(pth);
-        pth = -1;
+        btsock_thread_exit(pan_pth);
+        pan_pth = -1;
     }
 }
+
 static int tap_if_up(const char *devname, BD_ADDR addr)
 {
     struct ifreq ifr;
@@ -295,7 +317,7 @@
     err = ioctl(sk, SIOCGIFHWADDR, &ifr);
     if(err < 0)
     {
-        BTIF_TRACE_ERROR2("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
+        BTIF_TRACE_ERROR("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
         close(sk);
         return -1;
     }
@@ -308,10 +330,20 @@
     /*         ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2], */
     /*         ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]); */
 
+    /* The IEEE has specified that the most significant bit of the most significant byte is used to
+     * determine a multicast address. If its a 1, that means multicast, 0 means unicast.
+     * Kernel returns an error if we try to set a multicast address for the tun-tap ethernet interface.
+     * Mask this bit to avoid any issue with auto generated address.
+     */
+    if (ifr.ifr_hwaddr.sa_data[0] & 0x01) {
+        BTIF_TRACE_WARNING("Not a unicast MAC address, force multicast bit flipping");
+        ifr.ifr_hwaddr.sa_data[0] &= ~0x01;
+    }
+
     err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr);
 
     if (err < 0) {
-        BTIF_TRACE_ERROR2("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
+        BTIF_TRACE_ERROR("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
         close(sk);
         return -1;
     }
@@ -327,12 +359,12 @@
 
 
     if (err < 0) {
-        BTIF_TRACE_ERROR2("Could not bring up network interface:%s, errno:%d", devname, errno);
+        BTIF_TRACE_ERROR("Could not bring up network interface:%s, errno:%d", devname, errno);
         close(sk);
         return -1;
     }
     close(sk);
-    BTIF_TRACE_DEBUG1("network interface: %s is up", devname);
+    BTIF_TRACE_DEBUG("network interface: %s is up", devname);
     return 0;
 }
 
@@ -354,6 +386,18 @@
 
     return 0;
 }
+
+void btpan_set_flow_control(BOOLEAN enable) {
+    if (btpan_cb.tap_fd == -1)
+        return;
+
+    btpan_cb.flow = enable;
+    if (enable) {
+        btsock_thread_add_fd(pan_pth, btpan_cb.tap_fd, 0, SOCK_THREAD_FD_RD, 0);
+        bta_dmexecutecallback(btu_exec_tap_fd_read, (void *)btpan_cb.tap_fd);
+    }
+}
+
 int btpan_tap_open()
 {
     struct ifreq ifr;
@@ -365,7 +409,7 @@
     //system("insmod /system/lib/modules/tun.ko");
     if( (fd = open(clonedev, O_RDWR)) < 0 ) {
 
-        BTIF_TRACE_DEBUG2("could not open %s, err:%d", clonedev, errno);
+        BTIF_TRACE_DEBUG("could not open %s, err:%d", clonedev, errno);
         return fd;
     }
 
@@ -377,19 +421,22 @@
     /* try to create the device */
     if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 )//|| tap_setup_ip(TAP_IF_NAME) == FALSE)
     {
-        BTIF_TRACE_DEBUG2("ioctl error:%d, errno:%s", err, strerror(errno));
+        BTIF_TRACE_DEBUG("ioctl error:%d, errno:%s", err, strerror(errno));
         close(fd);
         return err;
     }
     BTM_GetLocalDeviceAddr (local_addr);
     if(tap_if_up(TAP_IF_NAME, local_addr) == 0)
     {
+        int flags = fcntl(fd, F_GETFL, 0);
+        fcntl(fd, F_SETFL, flags | O_NONBLOCK);
         return fd;
     }
-    BTIF_TRACE_ERROR1("can not bring up tap interface:%s", TAP_IF_NAME);
+    BTIF_TRACE_ERROR("can not bring up tap interface:%s", TAP_IF_NAME);
     close(fd);
     return -1;
 }
+
 int btpan_tap_send(int tap_fd, const BD_ADDR src, const BD_ADDR dst, UINT16 proto, const char* buf,
                     UINT16 len, BOOLEAN ext, BOOLEAN forward)
 {
@@ -417,18 +464,22 @@
         //btnet_send(btpan_cb.conn[i].sock.sock, &buffer, (len + sizeof(tETH_HDR)));
         //dump_bin("packet to network", packet, len + sizeof(tETH_HDR));
         int ret = write(tap_fd, packet, len + sizeof(tETH_HDR));
-        BTIF_TRACE_DEBUG1("ret:%d", ret);
+        BTIF_TRACE_DEBUG("ret:%d", ret);
         return ret;
     }
     return -1;
 
 }
+
 int btpan_tap_close(int fd)
 {
     tap_if_down(TAP_IF_NAME);
     close(fd);
+    if(pan_pth >= 0)
+        btsock_thread_wakeup(pan_pth);
     return 0;
 }
+
 btpan_conn_t * btpan_find_conn_handle(UINT16 handle)
 {
     int i;
@@ -437,6 +488,7 @@
             return &btpan_cb.conns[i];
     return NULL;
 }
+
 btpan_conn_t* btpan_find_conn_addr(const BD_ADDR addr)
 {
     int i;
@@ -445,6 +497,7 @@
             return &btpan_cb.conns[i];
     return NULL;
 }
+
 static void btpan_cleanup_conn(btpan_conn_t* conn)
 {
     if(conn)
@@ -456,15 +509,16 @@
         conn->local_role = conn->remote_role = 0;
     }
 }
+
 btpan_conn_t* btpan_new_conn(int handle, const BD_ADDR addr, int local_role, int remote_role )
 {
     int i;
     for(i = 0; i < MAX_PAN_CONNS; i++)
     {
-        BTIF_TRACE_DEBUG2("conns[%d]:%d", i, btpan_cb.conns[i].handle);
+        BTIF_TRACE_DEBUG("conns[%d]:%d", i, btpan_cb.conns[i].handle);
         if(btpan_cb.conns[i].handle == -1)
         {
-            BTIF_TRACE_DEBUG3("handle:%d, local_role:%d, remote_role:%d", handle, local_role, remote_role);
+            BTIF_TRACE_DEBUG("handle:%d, local_role:%d, remote_role:%d", handle, local_role, remote_role);
 
             btpan_cb.conns[i].handle = handle;
             bdcpy(btpan_cb.conns[i].peer, addr);
@@ -473,58 +527,51 @@
             return &btpan_cb.conns[i];
         }
     }
-    BTIF_TRACE_DEBUG1("MAX_PAN_CONNS:%d exceeded, return NULL as failed", MAX_PAN_CONNS);
+    BTIF_TRACE_DEBUG("MAX_PAN_CONNS:%d exceeded, return NULL as failed", MAX_PAN_CONNS);
     return NULL;
 }
 
 void btpan_close_handle(btpan_conn_t *p)
 {
-    BTIF_TRACE_DEBUG1("btpan_close_handle : close handle %d", p->handle);
+    BTIF_TRACE_DEBUG("btpan_close_handle : close handle %d", p->handle);
     p->handle = -1;
     p->local_role = -1;
     p->remote_role = -1;
     memset(&p->peer, 0, 6);
 }
-static inline int should_forward(tETH_HDR* hdr)
+
+static inline bool should_forward(tETH_HDR* hdr)
 {
-    if(ntohs(hdr->h_proto) == ETH_P_IP || ntohs(hdr->h_proto) == ETH_P_ARP)
-        return TRUE;
-    BTIF_TRACE_DEBUG1("unknown proto:%x", ntohs(hdr->h_proto));
-    return FALSE;
+    uint16_t proto = ntohs(hdr->h_proto);
+    if(proto == ETH_P_IP || proto == ETH_P_ARP || proto == ETH_P_IPV6)
+        return true;
+    BTIF_TRACE_DEBUG("unknown proto:%x", proto);
+    return false;
 }
-#if BTA_PAN_INCLUDED == TRUE
-extern void bta_pan_ci_rx_write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
-        UINT8 *p_data, UINT16 len, BOOLEAN ext);
-#else
-static void bta_pan_ci_rx_write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol,
-        UINT8 *p_data, UINT16 len, BOOLEAN ext)
-{
-    UNUSED(handle);
-    UNUSED(dst);
-    UNUSED(src);
-    UNUSED(protocol);
-    UNUSED(p_data);
-    UNUSED(len);
-    UNUSED(ext);
-}
-#endif
-static void forward_bnep(tETH_HDR* eth_hdr, char * packet, int size)
-{
+
+static int forward_bnep(tETH_HDR* eth_hdr, BT_HDR *hdr) {
     int broadcast = eth_hdr->h_dest[0] & 1;
     int i;
-    for(i = 0; i < MAX_PAN_CONNS; i++)
-    {
+
+    // Find the right connection to send this frame over.
+    for (i = 0; i < MAX_PAN_CONNS; i++) {
         UINT16 handle = btpan_cb.conns[i].handle;
-        if(handle != (UINT16)-1 &&
+        if (handle != (UINT16)-1 &&
                 (broadcast || memcmp(btpan_cb.conns[i].eth_addr, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0
-                 || memcmp(btpan_cb.conns[i].peer, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0))
-        {
-            BTIF_TRACE_DEBUG1("calling bta_pan_ci_rx_write, handle:%d", handle);
-            bta_pan_ci_rx_write(handle, eth_hdr->h_dest, eth_hdr->h_src,
-                    ntohs(eth_hdr->h_proto), (UINT8*)packet, size, 0);
-            break;
+                 || memcmp(btpan_cb.conns[i].peer, eth_hdr->h_dest, sizeof(BD_ADDR)) == 0)) {
+            int result = PAN_WriteBuf(handle, eth_hdr->h_dest, eth_hdr->h_src, ntohs(eth_hdr->h_proto), hdr, 0);
+            switch (result) {
+                case PAN_Q_SIZE_EXCEEDED:
+                    return FORWARD_CONGEST;
+                case PAN_SUCCESS:
+                    return FORWARD_SUCCESS;
+                default:
+                    return FORWARD_FAILURE;
+            }
         }
     }
+    GKI_freebuf(hdr);
+    return FORWARD_IGNORE;
 }
 
 static void bta_pan_callback_transfer(UINT16 event, char *p_param)
@@ -533,7 +580,7 @@
     switch(event)
     {
         case BTA_PAN_ENABLE_EVT:
-            BTIF_TRACE_DEBUG0("BTA_PAN_ENABLE_EVT");
+            BTIF_TRACE_DEBUG("BTA_PAN_ENABLE_EVT");
             break;
         case BTA_PAN_SET_ROLE_EVT:
             {
@@ -548,7 +595,7 @@
                 btpan_conn_t* conn;
                 bdstr_t bds;
                 bd2str((bt_bdaddr_t*)p_data->opening.bd_addr, &bds);
-                BTIF_TRACE_DEBUG2("BTA_PAN_OPENING_EVT handle %d, addr: %s", p_data->opening.handle, bds);
+                BTIF_TRACE_DEBUG("BTA_PAN_OPENING_EVT handle %d, addr: %s", p_data->opening.handle, bds);
                 conn = btpan_find_conn_addr(p_data->opening.bd_addr);
 
                 asrt(conn != NULL);
@@ -561,7 +608,7 @@
                             (const bt_bdaddr_t*)p_data->opening.bd_addr, btpan_conn_local_role, btpan_remote_role);
                 }
                 else
-                    BTIF_TRACE_ERROR0("connection not found");
+                    BTIF_TRACE_ERROR("connection not found");
                 break;
             }
         case BTA_PAN_OPEN_EVT:
@@ -572,6 +619,9 @@
                 /*         p_data->open.bd_addr[3], p_data->open.bd_addr[4], p_data->open.bd_addr[5]); */
                 btpan_connection_state_t state;
                 bt_status_t status;
+                btpan_conn_t *conn = btpan_find_conn_handle(p_data->open.handle);
+
+                ALOGV("%s pan connection open status: %d", __func__, p_data->open.status);
                 if(p_data->open.status == BTA_PAN_SUCCESS)
                 {
                     state = BTPAN_STATE_CONNECTED;
@@ -581,8 +631,8 @@
                 {
                     state = BTPAN_STATE_DISCONNECTED;
                     status = BT_STATUS_FAIL;
+                    btpan_cleanup_conn(conn);
                 }
-                btpan_conn_t* conn = btpan_find_conn_handle(p_data->open.handle);
                 /* debug("BTA_PAN_OPEN_EVT handle:%d, conn:%p",  p_data->open.handle, conn); */
                 /* debug("conn bta local_role:%d, bta remote role:%d", conn->local_role, conn->remote_role); */
                 int btpan_conn_local_role = bta_role_to_btpan(p_data->open.local_role);
@@ -608,11 +658,11 @@
                     btpan_cleanup_conn(conn);
                 }
                 else
-                    BTIF_TRACE_ERROR1("pan handle not found (%d)", p_data->close.handle);
+                    BTIF_TRACE_ERROR("pan handle not found (%d)", p_data->close.handle);
                 break;
             }
         default:
-            BTIF_TRACE_WARNING1("Unknown pan event %d", event);
+            BTIF_TRACE_WARNING("Unknown pan event %d", event);
             break;
     }
 }
@@ -621,36 +671,100 @@
 {
     btif_transfer_context(bta_pan_callback_transfer, event, (char*)p_data, sizeof(tBTA_PAN), NULL);
 }
-#define MAX_PACKET_SIZE 2000
-static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id)
-{
-    char packet[MAX_PACKET_SIZE];
-    tETH_HDR eth_hdr;
-    UNUSED(type);
-    UNUSED(user_id);
 
-    if(flags & SOCK_THREAD_FD_EXCEPTION)
-    {
-        BTIF_TRACE_ERROR1("pan tap fd:%d exception", fd);
-    }
-    else if(flags & SOCK_THREAD_FD_RD)
-    {
-        /* debug("tab fd read trigged,  data"); */
-        int size = read(fd, packet, MAX_PACKET_SIZE);
-        /* debug("tap fd read trigged, read size:%d", size); */
-        memcpy(&eth_hdr, &packet, sizeof(tETH_HDR));
-        /* debug("eth src = %02x:%02x:%02x:%02x:%02x:%02x", */
-        /*         eth_hdr.h_src[0],  eth_hdr.h_src[1], eth_hdr.h_src[2], eth_hdr.h_src[3], */
-        /*         eth_hdr.h_src[4], eth_hdr.h_src[5]); */
-        /* debug("eth dest = %02x:%02x:%02x:%02x:%02x:%02x", */
-        /*         eth_hdr.h_dest[0], eth_hdr.h_dest[1], eth_hdr.h_dest[2], eth_hdr.h_dest[3], */
-        /*         eth_hdr.h_dest[4], eth_hdr.h_dest[5]); */
-        //dump_bin("eth packet received", packet, size);
-        if(should_forward(&eth_hdr))
-        {
-            forward_bnep(&eth_hdr, packet + sizeof(tETH_HDR),  size - sizeof(tETH_HDR));
+#define IS_EXCEPTION(e) ((e) & (POLLHUP | POLLRDHUP | POLLERR | POLLNVAL))
+static void btu_exec_tap_fd_read(void *p_param) {
+    struct pollfd ufd;
+    int fd = (int)p_param;
+
+    if (fd == -1 || fd != btpan_cb.tap_fd)
+        return;
+
+    // Don't occupy BTU context too long, avoid GKI buffer overruns and
+    // give other profiles a chance to run by limiting the amount of memory
+    // PAN can use from the shared pool buffer.
+    for(int i = 0; i < PAN_POOL_MAX && btif_is_enabled() && btpan_cb.flow; i++) {
+        BT_HDR *buffer = (BT_HDR *)GKI_getpoolbuf(PAN_POOL_ID);
+        if (!buffer) {
+            BTIF_TRACE_WARNING("%s unable to allocate buffer for packet.", __func__);
+            break;
         }
-        btsock_thread_add_fd(pth, fd, 0, SOCK_THREAD_FD_RD | SOCK_THREAD_ADD_FD_SYNC, 0);
+        buffer->offset = PAN_MINIMUM_OFFSET;
+        buffer->len = GKI_get_buf_size(buffer) - sizeof(BT_HDR) - buffer->offset;
+
+        UINT8 *packet = (UINT8 *)buffer + sizeof(BT_HDR) + buffer->offset;
+
+        // If we don't have an undelivered packet left over, pull one from the TAP driver.
+        // We save it in the congest_packet right away in case we can't deliver it in this
+        // attempt.
+        if (!btpan_cb.congest_packet_size) {
+            ssize_t ret = read(fd, btpan_cb.congest_packet, sizeof(btpan_cb.congest_packet));
+            switch (ret) {
+                case -1:
+                    BTIF_TRACE_ERROR("%s unable to read from driver: %s", __func__, strerror(errno));
+                    GKI_freebuf(buffer);
+                    return;
+                case 0:
+                    BTIF_TRACE_WARNING("%s end of file reached.", __func__);
+                    GKI_freebuf(buffer);
+                    return;
+                default:
+                    btpan_cb.congest_packet_size = ret;
+                    break;
+            }
+        }
+
+        memcpy(packet, btpan_cb.congest_packet, MIN(btpan_cb.congest_packet_size, buffer->len));
+        buffer->len = MIN(btpan_cb.congest_packet_size, buffer->len);
+
+        if (buffer->len > sizeof(tETH_HDR) && should_forward((tETH_HDR *)packet)) {
+            // Extract the ethernet header from the buffer since the PAN_WriteBuf inside
+            // forward_bnep can't handle two pointers that point inside the same GKI buffer.
+            tETH_HDR hdr;
+            memcpy(&hdr, packet, sizeof(tETH_HDR));
+
+            // Skip the ethernet header.
+            buffer->len -= sizeof(tETH_HDR);
+            buffer->offset += sizeof(tETH_HDR);
+            if (forward_bnep(&hdr, buffer) != FORWARD_CONGEST)
+                btpan_cb.congest_packet_size = 0;
+        } else {
+            BTIF_TRACE_WARNING("%s dropping packet of length %d", __func__, buffer->len);
+            btpan_cb.congest_packet_size = 0;
+            GKI_freebuf(buffer);
+        }
+
+        // Bail out of the loop if reading from the TAP fd would block.
+        ufd.fd = fd;
+        ufd.events = POLLIN;
+        ufd.revents = 0;
+        if(poll(&ufd, 1, 0) <= 0 || IS_EXCEPTION(ufd.revents)) {
+            btsock_thread_add_fd(pan_pth, fd, 0, SOCK_THREAD_FD_RD, 0);
+            return;
+        }
     }
 }
 
+static void btif_pan_close_all_conns() {
+    int i;
+    if (!stack_initialized)
+        return;
+
+    for (i = 0; i < MAX_PAN_CONNS; ++i)
+        if (btpan_cb.conns[i].handle != -1)
+            BTA_PanClose(btpan_cb.conns[i].handle);
+}
+
+static void btpan_tap_fd_signaled(int fd, int type, int flags, uint32_t user_id) {
+    assert(btpan_cb.tap_fd == fd);
+
+    if (btpan_cb.tap_fd != fd)
+        return;
+
+    if(flags & SOCK_THREAD_FD_EXCEPTION) {
+        btpan_cb.tap_fd = -1;
+        btpan_tap_close(fd);
+        btif_pan_close_all_conns();
+    } else if(flags & SOCK_THREAD_FD_RD)
+        bta_dmexecutecallback(btu_exec_tap_fd_read, (void *)fd);
+}
diff --git a/btif/src/btif_profile_queue.c b/btif/src/btif_profile_queue.c
index 4af3b53..12cec2e 100644
--- a/btif/src/btif_profile_queue.c
+++ b/btif/src/btif_profile_queue.c
@@ -30,6 +30,7 @@
 #include "btif_common.h"
 #include "btif_profile_queue.h"
 #include "gki.h"
+#include "list.h"
 
 /*******************************************************************************
 **  Local type definitions
@@ -37,81 +38,64 @@
 
 typedef enum {
   BTIF_QUEUE_CONNECT_EVT,
-  BTIF_QUEUE_ADVANCE_EVT
+  BTIF_QUEUE_ADVANCE_EVT,
 } btif_queue_event_t;
 
-typedef struct connect_node_tag
-{
+typedef struct {
     bt_bdaddr_t bda;
     uint16_t uuid;
-    uint16_t busy;
-    void *p_cb;
-    struct connect_node_tag *p_next;
-} __attribute__((packed))connect_node_t;
-
+    bool busy;
+    btif_connect_cb_t connect_cb;
+} connect_node_t;
 
 /*******************************************************************************
 **  Static variables
 *******************************************************************************/
 
-static connect_node_t *connect_queue;
-
+static list_t *connect_queue;
 
 /*******************************************************************************
 **  Queue helper functions
 *******************************************************************************/
 
-static void queue_int_add(connect_node_t *p_param)
-{
-    connect_node_t *p_list = connect_queue;
+static void queue_int_add(connect_node_t *p_param) {
     connect_node_t *p_node = GKI_getbuf(sizeof(connect_node_t));
     ASSERTC(p_node != NULL, "Failed to allocate new list node", 0);
 
     memcpy(p_node, p_param, sizeof(connect_node_t));
 
-    if (connect_queue == NULL)
-    {
-        connect_queue = p_node;
-        return;
+    if (!connect_queue) {
+        connect_queue = list_new(GKI_freebuf);
+        ASSERTC(connect_queue != NULL, "Failed to allocate list", 0);
     }
 
-    while (p_list->p_next)
-        p_list = p_list->p_next;
-    p_list->p_next = p_node;
+    list_append(connect_queue, p_node);
 }
 
-static void queue_int_advance()
-{
-    connect_node_t *p_head = connect_queue;
-    if (connect_queue == NULL)
-        return;
-
-    connect_queue = connect_queue->p_next;
-    GKI_freebuf(p_head);
+static void queue_int_advance() {
+    if (connect_queue && !list_is_empty(connect_queue))
+        list_remove(connect_queue, list_front(connect_queue));
 }
 
-static bt_status_t queue_int_connect_next()
-{
-    connect_node_t* p_head = connect_queue;
-
-    if (p_head == NULL)
+static bt_status_t queue_int_connect_next() {
+    if (!connect_queue || list_is_empty(connect_queue))
         return BT_STATUS_FAIL;
 
-    /* If the queue is currently busy, we return  success anyway,
-     * since the connection has been queued... */
-    if (p_head->busy != FALSE)
+    connect_node_t *p_head = list_front(connect_queue);
+
+    // If the queue is currently busy, we return success anyway,
+    // since the connection has been queued...
+    if (p_head->busy)
         return BT_STATUS_SUCCESS;
 
-    p_head->busy = TRUE;
-    return (*(btif_connect_cb_t*)p_head->p_cb)(&p_head->bda);
+    p_head->busy = true;
+    return p_head->connect_cb(&p_head->bda, p_head->uuid);
 }
 
-static void queue_int_handle_evt(UINT16 event, char *p_param)
-{
-    switch(event)
-    {
+static void queue_int_handle_evt(UINT16 event, char *p_param) {
+    switch(event) {
         case BTIF_QUEUE_CONNECT_EVT:
-            queue_int_add((connect_node_t*)p_param);
+            queue_int_add((connect_node_t *)p_param);
             break;
 
         case BTIF_QUEUE_ADVANCE_EVT:
@@ -132,17 +116,15 @@
 ** Returns          BT_STATUS_SUCCESS if successful
 **
 *******************************************************************************/
-bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda,
-                        btif_connect_cb_t *connect_cb)
-{
+bt_status_t btif_queue_connect(uint16_t uuid, const bt_bdaddr_t *bda, btif_connect_cb_t connect_cb) {
     connect_node_t node;
     memset(&node, 0, sizeof(connect_node_t));
-    memcpy(&(node.bda), bda, sizeof(bt_bdaddr_t));
+    memcpy(&node.bda, bda, sizeof(bt_bdaddr_t));
     node.uuid = uuid;
-    node.p_cb = connect_cb;
+    node.connect_cb = connect_cb;
 
     return btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_CONNECT_EVT,
-                          (char*)&node, sizeof(connect_node_t), NULL);
+                          (char *)&node, sizeof(connect_node_t), NULL);
 }
 
 /*******************************************************************************
@@ -155,13 +137,11 @@
 ** Returns          void
 **
 *******************************************************************************/
-void btif_queue_advance()
-{
+void btif_queue_advance() {
     btif_transfer_context(queue_int_handle_evt, BTIF_QUEUE_ADVANCE_EVT,
                           NULL, 0, NULL);
 }
 
-
 /*******************************************************************************
 **
 ** Function         btif_queue_release
@@ -171,17 +151,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void btif_queue_release()
-{
-    connect_node_t *current = connect_queue;
-
-    while (current != NULL)
-    {
-         connect_node_t *next = current->p_next;
-         GKI_freebuf(current);
-         current = next;
-    }
-
+void btif_queue_release() {
+    list_free(connect_queue);
     connect_queue = NULL;
 }
-
diff --git a/btif/src/btif_rc.c b/btif/src/btif_rc.c
old mode 100755
new mode 100644
index 068d096..de6c328
--- a/btif/src/btif_rc.c
+++ b/btif/src/btif_rc.c
@@ -62,10 +62,10 @@
 #define MAX_CMD_QUEUE_LEN 8
 
 #define CHECK_RC_CONNECTED                                                                  \
-    BTIF_TRACE_DEBUG1("## %s ##", __FUNCTION__);                                            \
+    BTIF_TRACE_DEBUG("## %s ##", __FUNCTION__);                                            \
     if(btif_rc_cb.rc_connected == FALSE)                                                    \
     {                                                                                       \
-        BTIF_TRACE_WARNING1("Function %s() called when RC is not connected", __FUNCTION__); \
+        BTIF_TRACE_WARNING("Function %s() called when RC is not connected", __FUNCTION__); \
         return BT_STATUS_NOT_READY;                                                         \
     }
 
@@ -80,7 +80,7 @@
 {                                                                                              \
     if(btif_rc_cb.rc_pdu_info[index].is_rsp_pending == FALSE)                                  \
     {                                                                                          \
-        BTIF_TRACE_WARNING1("%s Not sending response as no PDU was registered", __FUNCTION__); \
+        BTIF_TRACE_WARNING("%s Not sending response as no PDU was registered", __FUNCTION__); \
         return BT_STATUS_UNHANDLED;                                                            \
     }                                                                                          \
     send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_pdu_info[index].label,                \
@@ -180,7 +180,12 @@
 
 static const UINT8 rc_white_addr_prefix[][3] = {
     {0x94, 0xCE, 0x2C}, // Sony SBH50
-    {0x30, 0x17, 0xC8}  // Sony wm600
+    {0x30, 0x17, 0xC8} // Sony wm600
+};
+
+static const char* rc_white_name[] = {
+    "SBH50",
+    "MW600"
 };
 
 static void send_reject_response (UINT8 rc_handle, UINT8 label,
@@ -204,6 +209,7 @@
 ******************************************************************************/
 static btif_rc_cb_t btif_rc_cb;
 static btrc_callbacks_t *bt_rc_callbacks = NULL;
+static btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
 
 /*****************************************************************************
 **  Static functions
@@ -226,7 +232,7 @@
 int send_event (int fd, uint16_t type, uint16_t code, int32_t value)
 {
     struct uinput_event event;
-    BTIF_TRACE_DEBUG4("%s type:%u code:%u value:%d", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s type:%u code:%u value:%d", __FUNCTION__,
         type, code, value);
     memset(&event, 0, sizeof(event));
     event.type  = type;
@@ -238,7 +244,7 @@
 
 void send_key (int fd, uint16_t key, int pressed)
 {
-    BTIF_TRACE_DEBUG4("%s fd:%d key:%u pressed:%d", __FUNCTION__,
+    BTIF_TRACE_DEBUG("%s fd:%d key:%u pressed:%d", __FUNCTION__,
         fd, key, pressed);
 
     if (fd < 0)
@@ -246,7 +252,7 @@
         return;
     }
 
-    BTIF_TRACE_DEBUG3("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
+    BTIF_TRACE_DEBUG("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
     send_event(fd, EV_KEY, key, pressed);
     send_event(fd, EV_SYN, SYN_REPORT, 0);
 }
@@ -261,7 +267,7 @@
            return 0;
         }
     }
-    BTIF_TRACE_ERROR1("%s ERROR: uinput device is not in the system", __FUNCTION__);
+    BTIF_TRACE_ERROR("%s ERROR: uinput device is not in the system", __FUNCTION__);
     return -1;
 }
 
@@ -278,7 +284,7 @@
         break;
     }
     if (x == MAX_UINPUT_PATHS) {
-        BTIF_TRACE_ERROR1("%s ERROR: uinput device open failed", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s ERROR: uinput device open failed", __FUNCTION__);
         return -1;
     }
     memset(&dev, 0, sizeof(dev));
@@ -291,7 +297,7 @@
     dev.id.version = 0x0000;
 
     if (write(fd, &dev, sizeof(dev)) < 0) {
-        BTIF_TRACE_ERROR1("%s Unable to write device information", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s Unable to write device information", __FUNCTION__);
         close(fd);
         return -1;
     }
@@ -307,7 +313,7 @@
         ioctl(fd, UI_SET_KEYBIT, x);
 
     if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
-        BTIF_TRACE_ERROR1("%s Unable to create uinput device", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s Unable to create uinput device", __FUNCTION__);
         close(fd);
         return -1;
     }
@@ -318,13 +324,13 @@
 {
     char *name = "AVRCP";
 
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     uinput_fd = uinput_create(name);
     if (uinput_fd < 0) {
-        BTIF_TRACE_ERROR3("%s AVRCP: Failed to initialize uinput for %s (%d)",
+        BTIF_TRACE_ERROR("%s AVRCP: Failed to initialize uinput for %s (%d)",
                           __FUNCTION__, name, uinput_fd);
     } else {
-        BTIF_TRACE_DEBUG3("%s AVRCP: Initialized uinput for %s (fd=%d)",
+        BTIF_TRACE_DEBUG("%s AVRCP: Initialized uinput for %s (fd=%d)",
                           __FUNCTION__, name, uinput_fd);
     }
     return uinput_fd;
@@ -332,7 +338,7 @@
 
 void close_uinput (void)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     if (uinput_fd > 0) {
         ioctl(uinput_fd, UI_DEV_DESTROY);
 
@@ -365,11 +371,11 @@
     {
         rc_features |= BTRC_FEAT_METADATA;
     }
-    BTIF_TRACE_DEBUG2("%s: rc_features=0x%x", __FUNCTION__, rc_features);
+    BTIF_TRACE_DEBUG("%s: rc_features=0x%x", __FUNCTION__, rc_features);
     HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
 
 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
-     BTIF_TRACE_DEBUG1("Checking for feature flags in btif_rc_handler with label %d",
+     BTIF_TRACE_DEBUG("Checking for feature flags in btif_rc_handler with label %d",
                         btif_rc_cb.rc_vol_label);
      // Register for volume change on connect
       if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
@@ -386,7 +392,7 @@
             p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
             if(NULL!=p_transaction)
             {
-               BTIF_TRACE_DEBUG1("register_volumechange already in progress for label %d",
+               BTIF_TRACE_DEBUG("register_volumechange already in progress for label %d",
                                   btif_rc_cb.rc_vol_label);
                return;
             }
@@ -414,10 +420,13 @@
  ***************************************************************************/
 void handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
 {
-    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
+    BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
     bt_status_t result = BT_STATUS_SUCCESS;
     int i;
     char bd_str[18];
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    bt_bdaddr_t rc_addr;
+#endif
 
     if(p_rc_open->status == BTA_AV_SUCCESS)
     {
@@ -438,10 +447,17 @@
         {
             init_uinput();
         }
+#if (AVRC_CTLR_INCLUDED == TRUE)
+        bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
+        /* report connection state if device is AVRCP target */
+        if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) {
+            HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, TRUE, &rc_addr);
+        }
+#endif
     }
     else
     {
-        BTIF_TRACE_ERROR2("%s Connect failed with error code: %d",
+        BTIF_TRACE_ERROR("%s Connect failed with error code: %d",
             __FUNCTION__, p_rc_open->status);
         btif_rc_cb.rc_connected = FALSE;
     }
@@ -457,16 +473,34 @@
  ***************************************************************************/
 void handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
 {
-    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    bt_bdaddr_t rc_addr;
+    tBTA_AV_FEAT features;
+#endif
+    BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
 
     btif_rc_cb.rc_handle = 0;
     btif_rc_cb.rc_connected = FALSE;
     memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
+    memset(btif_rc_cb.rc_notif, 0, sizeof(btif_rc_cb.rc_notif));
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    features = btif_rc_cb.rc_features;
+#endif
     btif_rc_cb.rc_features = 0;
     btif_rc_cb.rc_vol_label=MAX_LABEL;
     btif_rc_cb.rc_volume=MAX_VOLUME;
     init_all_transactions();
     close_uinput();
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
+#endif
+    memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    /* report connection state if device is AVRCP target */
+    if (features & BTA_AV_FEAT_RCTG) {
+        HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, FALSE, &rc_addr);
+    }
+#endif
 }
 
 /***************************************************************************
@@ -483,7 +517,7 @@
     const char *status;
     int pressed, i;
 
-    BTIF_TRACE_DEBUG2("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
+    BTIF_TRACE_DEBUG("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
 
     /* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
     if (p_remote_cmd)
@@ -493,7 +527,7 @@
         {
             if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
             {
-                APPL_TRACE_WARNING1("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
+                APPL_TRACE_WARNING("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
                 btif_rc_cb.rc_pending_play = TRUE;
             }
             return;
@@ -501,7 +535,7 @@
 
         if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
         {
-            APPL_TRACE_WARNING1("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
+            APPL_TRACE_WARNING("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
             btif_rc_cb.rc_pending_play = FALSE;
             return;
         }
@@ -525,7 +559,7 @@
        (btif_hf_call_terminated_recently() == TRUE) &&
        (check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
     {
-        BTIF_TRACE_DEBUG2("%s:Dropping the play/Pause command received right after call end cmd:%d",
+        BTIF_TRACE_DEBUG("%s:Dropping the play/Pause command received right after call end cmd:%d",
                            __FUNCTION__,p_remote_cmd->rc_id);
         return;
     }
@@ -537,7 +571,7 @@
 
     for (i = 0; key_map[i].name != NULL; i++) {
         if (p_remote_cmd->rc_id == key_map[i].avrcp) {
-            BTIF_TRACE_DEBUG3("%s: %s %s", __FUNCTION__, key_map[i].name, status);
+            BTIF_TRACE_DEBUG("%s: %s %s", __FUNCTION__, key_map[i].name, status);
 
            /* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
             * and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
@@ -548,7 +582,7 @@
             */
             if ((key_map[i].release_quirk == 1) && (pressed == 0))
             {
-                BTIF_TRACE_DEBUG2("%s: AVRC %s Release Faked earlier, drowned now",
+                BTIF_TRACE_DEBUG("%s: AVRC %s Release Faked earlier, drowned now",
                                   __FUNCTION__, key_map[i].name);
                 return;
             }
@@ -556,7 +590,7 @@
             if ((key_map[i].release_quirk == 1) && (pressed == 1))
             {
                 GKI_delay(30); // 30ms
-                BTIF_TRACE_DEBUG2("%s: AVRC %s Release quirk enabled, send release now",
+                BTIF_TRACE_DEBUG("%s: AVRC %s Release quirk enabled, send release now",
                                   __FUNCTION__, key_map[i].name);
                 send_key(uinput_fd, key_map[i].mapped_id, 0);
             }
@@ -565,10 +599,50 @@
     }
 
     if (key_map[i].name == NULL)
-        BTIF_TRACE_ERROR3("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
+        BTIF_TRACE_ERROR("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
                         p_remote_cmd->rc_id, status);
 }
 
+/***************************************************************************
+ *  Function       handle_rc_passthrough_rsp
+ *
+ *  - Argument:    tBTA_AV_REMOTE_RSP passthrough command response
+ *
+ *  - Description: Remote control passthrough response handler
+ *
+ ***************************************************************************/
+void handle_rc_passthrough_rsp ( tBTA_AV_REMOTE_RSP *p_remote_rsp)
+{
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    const char *status;
+    if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
+    {
+        int key_state;
+        if (p_remote_rsp->key_state == AVRC_STATE_RELEASE)
+        {
+            status = "released";
+            key_state = 1;
+        }
+        else
+        {
+            status = "pressed";
+            key_state = 0;
+        }
+
+        BTIF_TRACE_DEBUG("%s: rc_id=%d status=%s", __FUNCTION__, p_remote_rsp->rc_id, status);
+
+        release_transaction(p_remote_rsp->label);
+        HAL_CBACK(bt_rc_ctrl_callbacks, passthrough_rsp_cb, p_remote_rsp->rc_id, key_state);
+    }
+    else
+    {
+        BTIF_TRACE_ERROR("%s DUT does not support AVRCP controller role", __FUNCTION__);
+    }
+#else
+    BTIF_TRACE_ERROR("%s AVRCP controller role is not enabled", __FUNCTION__);
+#endif
+}
+
 void handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
 {
     tAVRC_RESPONSE avrc_rsp = {0};
@@ -602,16 +676,16 @@
     tAVRC_STS status;
     int param_len;
 
-    BTIF_TRACE_EVENT1("+ %s", __FUNCTION__);
+    BTIF_TRACE_EVENT("+ %s", __FUNCTION__);
 
     if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
     {
-        BTIF_TRACE_WARNING1("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
+        BTIF_TRACE_WARNING("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
         return;
     }
     if (pmeta_msg->len < 3)
     {
-        BTIF_TRACE_WARNING2("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
+        BTIF_TRACE_WARNING("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
             pmeta_msg->len);
         return;
     }
@@ -628,14 +702,14 @@
      }
      else
      {
-         BTIF_TRACE_DEBUG3("%s:Discard vendor dependent rsp. code: %d label:%d.",
+         BTIF_TRACE_DEBUG("%s:Discard vendor dependent rsp. code: %d label:%d.",
              __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
      }
      return;
 }
 #else
 {
-        BTIF_TRACE_DEBUG3("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
+        BTIF_TRACE_DEBUG("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
             __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
         return;
 }
@@ -643,13 +717,13 @@
       }
 
     status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
-    BTIF_TRACE_DEBUG3("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
+    BTIF_TRACE_DEBUG("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
                        avrc_command.cmd.pdu, pmeta_msg->label);
 
     if (status != AVRC_STS_NO_ERROR)
     {
         /* return error */
-        BTIF_TRACE_WARNING2("%s: Error in parsing received metamsg command. status: 0x%02x",
+        BTIF_TRACE_WARNING("%s: Error in parsing received metamsg command. status: 0x%02x",
             __FUNCTION__, status);
         send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
     }
@@ -661,7 +735,7 @@
         {
             UINT8 event_id = avrc_command.reg_notif.event_id;
             param_len = sizeof(tAVRC_REG_NOTIF_CMD);
-            BTIF_TRACE_EVENT4("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
+            BTIF_TRACE_EVENT("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
             __FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
             btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
             btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
@@ -674,7 +748,7 @@
 
         }
 
-        BTIF_TRACE_EVENT2("%s: Passing received metamsg command to app. pdu: %s",
+        BTIF_TRACE_EVENT("%s: Passing received metamsg command to app. pdu: %s",
             __FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
 
         /* Since handle_rc_metamsg_cmd() itself is called from
@@ -694,12 +768,12 @@
  ***************************************************************************/
 void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
 {
-    BTIF_TRACE_DEBUG2 ("%s event:%s", __FUNCTION__, dump_rc_event(event));
+    BTIF_TRACE_DEBUG ("%s event:%s", __FUNCTION__, dump_rc_event(event));
     switch (event)
     {
         case BTA_AV_RC_OPEN_EVT:
         {
-            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_open.peer_features);
+            BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_open.peer_features);
             handle_rc_connect( &(p_data->rc_open) );
         }break;
 
@@ -710,30 +784,39 @@
 
         case BTA_AV_REMOTE_CMD_EVT:
         {
-            BTIF_TRACE_DEBUG2("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
+            BTIF_TRACE_DEBUG("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
                                p_data->remote_cmd.key_state);
             handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
         }
         break;
+#if (AVRC_CTLR_INCLUDED == TRUE)
+        case BTA_AV_REMOTE_RSP_EVT:
+        {
+            BTIF_TRACE_DEBUG("RSP: rc_id:0x%x key_state:%d", p_data->remote_rsp.rc_id,
+                               p_data->remote_rsp.key_state);
+            handle_rc_passthrough_rsp( (&p_data->remote_rsp) );
+        }
+        break;
+#endif
         case BTA_AV_RC_FEAT_EVT:
         {
-            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_feat.peer_features);
+            BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_feat.peer_features);
             btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
             handle_rc_features();
         }
         break;
         case BTA_AV_META_MSG_EVT:
         {
-            BTIF_TRACE_DEBUG2("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
+            BTIF_TRACE_DEBUG("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
                 p_data->meta_msg.label);
-            BTIF_TRACE_DEBUG3("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
+            BTIF_TRACE_DEBUG("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
                 p_data->meta_msg.len, p_data->meta_msg.rc_handle);
             /* handle the metamsg command */
             handle_rc_metamsg_cmd(&(p_data->meta_msg));
         }
         break;
         default:
-            BTIF_TRACE_DEBUG1("Unhandled RC event : 0x%x", event);
+            BTIF_TRACE_DEBUG("Unhandled RC event : 0x%x", event);
     }
 }
 
@@ -766,13 +849,13 @@
 {
     UNUSED(peer_addr);
 
-    BTIF_TRACE_DEBUG2("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
+    BTIF_TRACE_DEBUG("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
     if (btif_rc_cb.rc_pending_play)
     {
         if (bSendToApp)
         {
             tBTA_AV_REMOTE_CMD remote_cmd;
-            APPL_TRACE_DEBUG1("%s: Sending queued PLAYED event to app", __FUNCTION__);
+            APPL_TRACE_DEBUG("%s: Sending queued PLAYED event to app", __FUNCTION__);
 
             memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
             remote_cmd.rc_handle  = btif_rc_cb.rc_handle;
@@ -812,7 +895,7 @@
 
     if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
     {
-        BTIF_TRACE_DEBUG4("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
+        BTIF_TRACE_DEBUG("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
             __FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
         BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
     }
@@ -838,11 +921,11 @@
 
     if (!pmetamsg_resp)
     {
-        BTIF_TRACE_WARNING1("%s: Invalid response received from application", __FUNCTION__);
+        BTIF_TRACE_WARNING("%s: Invalid response received from application", __FUNCTION__);
         return;
     }
 
-    BTIF_TRACE_EVENT5("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
+    BTIF_TRACE_EVENT("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
         rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
 
     if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
@@ -881,7 +964,7 @@
 
         /* de-register this notification for a CHANGED response */
         btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
-        BTIF_TRACE_DEBUG4("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
+        BTIF_TRACE_DEBUG("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
              btif_rc_cb.rc_handle, event_id, bNotify);
         if (bNotify)
         {
@@ -891,7 +974,7 @@
             if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
                 pmetamsg_resp, &p_msg)) )
             {
-                BTIF_TRACE_DEBUG3("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
+                BTIF_TRACE_DEBUG("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
                      __FUNCTION__, btif_rc_cb.rc_handle, event_id);
                 bSent = TRUE;
                 BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
@@ -899,7 +982,7 @@
             }
             else
             {
-                BTIF_TRACE_WARNING2("%s failed to build metamsg response. status: 0x%02x",
+                BTIF_TRACE_WARNING("%s failed to build metamsg response. status: 0x%02x",
                     __FUNCTION__, status);
             }
 
@@ -907,7 +990,7 @@
 
         if (!bSent)
         {
-            BTIF_TRACE_DEBUG2("%s: Notification not sent, as there are no RC connections or the \
+            BTIF_TRACE_DEBUG("%s: Notification not sent, as there are no RC connections or the \
                 CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
         }
     }
@@ -926,7 +1009,7 @@
         }
         else
         {
-            BTIF_TRACE_ERROR2("%s: failed to build metamsg response. status: 0x%02x",
+            BTIF_TRACE_ERROR("%s: failed to build metamsg response. status: 0x%02x",
                 __FUNCTION__, status);
         }
     }
@@ -962,7 +1045,7 @@
 *******************************************************************************/
 static void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
 {
-    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
+    BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
         dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
 
     switch (event)
@@ -1008,33 +1091,9 @@
             }
             else
             {
-                int attr_cnt, filled_attr_count;
-
-                num_attr = 0;
-                /* Attribute IDs from 1 to AVRC_MAX_NUM_MEDIA_ATTR_ID are only valid,
-                 * hence HAL definition limits the attributes to AVRC_MAX_NUM_MEDIA_ATTR_ID.
-                 * Fill only valid entries.
-                 */
-                for (attr_cnt = 0; (attr_cnt < pavrc_cmd->get_elem_attrs.num_attr) &&
-                    (num_attr < AVRC_MAX_NUM_MEDIA_ATTR_ID); attr_cnt++)
-                {
-                    if ((pavrc_cmd->get_elem_attrs.attrs[attr_cnt] > 0) &&
-                        (pavrc_cmd->get_elem_attrs.attrs[attr_cnt] <= AVRC_MAX_NUM_MEDIA_ATTR_ID))
-                    {
-                        /* Skip the duplicate entries : PTS sends duplicate entries for Fragment cases
-                         */
-                        for (filled_attr_count = 0; filled_attr_count < num_attr; filled_attr_count++)
-                        {
-                            if (element_attrs[filled_attr_count] == pavrc_cmd->get_elem_attrs.attrs[attr_cnt])
-                                break;
-                        }
-                        if (filled_attr_count == num_attr)
-                        {
-                            element_attrs[num_attr] = pavrc_cmd->get_elem_attrs.attrs[attr_cnt];
-                            num_attr++;
-                        }
-                    }
-                }
+                num_attr = pavrc_cmd->get_elem_attrs.num_attr;
+                memcpy(element_attrs, pavrc_cmd->get_elem_attrs.attrs, sizeof(UINT32)
+                    *pavrc_cmd->get_elem_attrs.num_attr);
             }
             FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
             HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
@@ -1045,7 +1104,7 @@
             if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
                 pavrc_cmd->reg_notif.param == 0)
             {
-                BTIF_TRACE_WARNING1("%s Device registering position changed with illegal param 0.",
+                BTIF_TRACE_WARNING("%s Device registering position changed with illegal param 0.",
                     __FUNCTION__);
                 send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
                 /* de-register this notification for a rejected response */
@@ -1059,7 +1118,7 @@
         case AVRC_PDU_INFORM_DISPLAY_CHARSET:
         {
             tAVRC_RESPONSE avrc_rsp;
-            BTIF_TRACE_EVENT1("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
+            BTIF_TRACE_EVENT("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
             if(btif_rc_cb.rc_connected == TRUE)
             {
                 memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
@@ -1093,7 +1152,7 @@
 *******************************************************************************/
 static void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
 {
-    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
+    BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
         dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
 
 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
@@ -1109,7 +1168,7 @@
 
         case AVRC_PDU_SET_ABSOLUTE_VOLUME:
         {
-            BTIF_TRACE_DEBUG2("Set absolute volume change event received: volume %d,ctype %d",
+            BTIF_TRACE_DEBUG("Set absolute volume change event received: volume %d,ctype %d",
                 pavrc_resp->volume.volume,ctype);
             if(AVRC_RSP_ACCEPT==ctype)
                 btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
@@ -1138,7 +1197,7 @@
 *******************************************************************************/
 static bt_status_t init(btrc_callbacks_t* callbacks )
 {
-    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
+    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
     bt_status_t result = BT_STATUS_SUCCESS;
 
     if (bt_rc_callbacks)
@@ -1153,6 +1212,32 @@
     return result;
 }
 
+/*******************************************************************************
+**
+** Function         init_ctrl
+**
+** Description      Initializes the AVRC interface
+**
+** Returns          bt_status_t
+**
+*******************************************************************************/
+static bt_status_t init_ctrl(btrc_ctrl_callbacks_t* callbacks )
+{
+    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
+    bt_status_t result = BT_STATUS_SUCCESS;
+
+    if (bt_rc_ctrl_callbacks)
+        return BT_STATUS_DONE;
+
+    bt_rc_ctrl_callbacks = callbacks;
+    memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
+    btif_rc_cb.rc_vol_label=MAX_LABEL;
+    btif_rc_cb.rc_volume=MAX_VOLUME;
+    lbl_init();
+
+    return result;
+}
+
 /***************************************************************************
 **
 ** Function         get_play_status_rsp
@@ -1213,7 +1298,7 @@
             element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
             element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
             element_attrs[i].name.p_str = p_attrs[i].text;
-            BTIF_TRACE_DEBUG5("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
+            BTIF_TRACE_DEBUG("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
                 __FUNCTION__, (unsigned int)element_attrs[i].attr_id,
                 element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
                 element_attrs[i].name.p_str);
@@ -1244,7 +1329,12 @@
 {
     tAVRC_RESPONSE avrc_rsp;
     CHECK_RC_CONNECTED
-    BTIF_TRACE_EVENT2("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
+    BTIF_TRACE_EVENT("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
+    if (btif_rc_cb.rc_notif[event_id-1].bNotify == FALSE)
+    {
+        BTIF_TRACE_ERROR("Avrcp Event id not registered: event_id = %x", event_id);
+        return BT_STATUS_NOT_READY;
+    }
     memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
     avrc_rsp.reg_notif.event_id = event_id;
 
@@ -1260,7 +1350,7 @@
             avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
             break;
         default:
-            BTIF_TRACE_WARNING2("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
+            BTIF_TRACE_WARNING("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
             return BT_STATUS_UNHANDLED;
     }
 
@@ -1290,7 +1380,7 @@
 ***************************************************************************/
 static bt_status_t set_volume(uint8_t volume)
 {
-    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
     CHECK_RC_CONNECTED
     tAVRC_STS status = BT_STATUS_UNSUPPORTED;
     rc_transaction_t *p_transaction=NULL;
@@ -1298,7 +1388,7 @@
     if(btif_rc_cb.rc_volume==volume)
     {
         status=BT_STATUS_DONE;
-        BTIF_TRACE_ERROR2("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
+        BTIF_TRACE_ERROR("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
         return status;
     }
 
@@ -1308,7 +1398,7 @@
         tAVRC_COMMAND avrc_cmd = {0};
         BT_HDR *p_msg = NULL;
 
-        BTIF_TRACE_DEBUG2("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
+        BTIF_TRACE_DEBUG("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
         avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
         avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
         avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
@@ -1319,7 +1409,7 @@
             bt_status_t tran_status=get_transaction(&p_transaction);
             if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
             {
-                BTIF_TRACE_DEBUG2("%s msgreq being sent out with label %d",
+                BTIF_TRACE_DEBUG("%s msgreq being sent out with label %d",
                                    __FUNCTION__,p_transaction->lbl);
                 BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
                 status =  BT_STATUS_SUCCESS;
@@ -1328,14 +1418,14 @@
             {
                 if(NULL!=p_msg)
                    GKI_freebuf(p_msg);
-                BTIF_TRACE_ERROR2("%s: failed to obtain transaction details. status: 0x%02x",
+                BTIF_TRACE_ERROR("%s: failed to obtain transaction details. status: 0x%02x",
                                     __FUNCTION__, tran_status);
                 status = BT_STATUS_FAIL;
             }
         }
         else
         {
-            BTIF_TRACE_ERROR2("%s: failed to build absolute volume command. status: 0x%02x",
+            BTIF_TRACE_ERROR("%s: failed to build absolute volume command. status: 0x%02x",
                                 __FUNCTION__, status);
             status = BT_STATUS_FAIL;
         }
@@ -1365,7 +1455,7 @@
     bt_status_t tran_status;
     rc_transaction_t *p_transaction=NULL;
 
-    BTIF_TRACE_DEBUG2("%s called with label:%d",__FUNCTION__,lbl);
+    BTIF_TRACE_DEBUG("%s called with label:%d",__FUNCTION__,lbl);
 
     avrc_cmd.cmd.opcode=0x00;
     avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
@@ -1379,17 +1469,17 @@
          if(NULL!=p_transaction)
          {
              BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
-             BTIF_TRACE_DEBUG1("%s:BTA_AvMetaCmd called",__FUNCTION__);
+             BTIF_TRACE_DEBUG("%s:BTA_AvMetaCmd called",__FUNCTION__);
          }
          else
          {
             if(NULL!=p_msg)
                GKI_freebuf(p_msg);
-            BTIF_TRACE_ERROR2("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
+            BTIF_TRACE_ERROR("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
          }
     }
     else
-        BTIF_TRACE_ERROR2("%s failed to build command:%d",__FUNCTION__,BldResp);
+        BTIF_TRACE_ERROR("%s failed to build command:%d",__FUNCTION__,BldResp);
 }
 
 
@@ -1413,7 +1503,7 @@
       || AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
     {
         status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
-        BTIF_TRACE_DEBUG6("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
+        BTIF_TRACE_DEBUG("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
           __FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
           status, pmeta_msg->label);
 
@@ -1437,14 +1527,14 @@
             && btif_rc_cb.rc_vol_label!=pmeta_msg->label)
             {
                 // Just discard the message, if the device sends back with an incorrect label
-                BTIF_TRACE_DEBUG3("%s:Discarding register notfn in rsp.code: %d and label %d",
+                BTIF_TRACE_DEBUG("%s:Discarding register notfn in rsp.code: %d and label %d",
                 __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
                 return;
             }
     }
     else
     {
-        BTIF_TRACE_DEBUG3("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
+        BTIF_TRACE_DEBUG("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
         __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
         return;
     }
@@ -1463,7 +1553,7 @@
           release_transaction(pmeta_msg->label);
      }
 
-     BTIF_TRACE_EVENT2("%s: Passing received metamsg response to app. pdu: %s",
+     BTIF_TRACE_EVENT("%s: Passing received metamsg response to app. pdu: %s",
              __FUNCTION__, dump_rc_pdu(avrc_response.pdu));
      btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
                                 pmeta_msg->label);
@@ -1481,7 +1571,7 @@
 ***************************************************************************/
 static void cleanup()
 {
-    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
+    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
     close_uinput();
     if (bt_rc_callbacks)
     {
@@ -1492,6 +1582,42 @@
 }
 
 
+static bt_status_t send_passthrough_cmd(bt_bdaddr_t *bd_addr, uint8_t key_code, uint8_t key_state)
+{
+    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
+#if (AVRC_CTLR_INCLUDED == TRUE)
+    CHECK_RC_CONNECTED
+    rc_transaction_t *p_transaction=NULL;
+    BTIF_TRACE_DEBUG("%s: key-code: %d, key-state: %d", __FUNCTION__,
+                                                    key_code, key_state);
+    if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
+    {
+        tAVRC_MSG_PASS avrc_cmd;
+        bt_status_t tran_status = get_transaction(&p_transaction);
+        if(BT_STATUS_SUCCESS == tran_status && NULL != p_transaction)
+        {
+            BTA_AvRemoteCmd(btif_rc_cb.rc_handle, p_transaction->lbl,
+                (tBTA_AV_RC)key_code, (tBTA_AV_STATE)key_state);
+            status =  BT_STATUS_SUCCESS;
+            BTIF_TRACE_DEBUG("%s: succesfully sent passthrough command to BTA", __FUNCTION__);
+        }
+        else
+        {
+            status =  BT_STATUS_FAIL;
+            BTIF_TRACE_DEBUG("%s: error in fetching transaction", __FUNCTION__);
+        }
+    }
+    else
+    {
+        status =  BT_STATUS_FAIL;
+        BTIF_TRACE_DEBUG("%s: feature not supported", __FUNCTION__);
+    }
+#else
+    BTIF_TRACE_DEBUG("%s: feature not enabled", __FUNCTION__);
+#endif
+    return status;
+}
+
 static const btrc_interface_t bt_rc_interface = {
     sizeof(bt_rc_interface),
     init,
@@ -1508,22 +1634,44 @@
     cleanup,
 };
 
+static const btrc_ctrl_interface_t bt_rc_ctrl_interface = {
+    sizeof(bt_rc_ctrl_interface),
+    init_ctrl,
+    send_passthrough_cmd,
+    cleanup,
+};
+
 /*******************************************************************************
 **
 ** Function         btif_rc_get_interface
 **
-** Description      Get the AVRCP callback interface
+** Description      Get the AVRCP Target callback interface
 **
 ** Returns          btav_interface_t
 **
 *******************************************************************************/
 const btrc_interface_t *btif_rc_get_interface(void)
 {
-    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
     return &bt_rc_interface;
 }
 
 /*******************************************************************************
+**
+** Function         btif_rc_ctrl_get_interface
+**
+** Description      Get the AVRCP Controller callback interface
+**
+** Returns          btav_interface_t
+**
+*******************************************************************************/
+const btrc_ctrl_interface_t *btif_rc_ctrl_get_interface(void)
+{
+    BTIF_TRACE_EVENT("%s", __FUNCTION__);
+    return &bt_rc_ctrl_interface;
+}
+
+/*******************************************************************************
 **      Function         initialize_transaction
 **
 **      Description    Initializes fields of the transaction structure
@@ -1600,7 +1748,7 @@
         else
         {
             transaction = &(device.transaction[lbl]);
-            BTIF_TRACE_DEBUG2("%s: Got transaction.label: %d",__FUNCTION__,lbl);
+            BTIF_TRACE_DEBUG("%s: Got transaction.label: %d",__FUNCTION__,lbl);
         }
     }
 
@@ -1628,7 +1776,7 @@
     {
         if (FALSE==device.transaction[i].in_use)
         {
-            BTIF_TRACE_DEBUG2("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
+            BTIF_TRACE_DEBUG("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
             device.transaction[i].in_use = TRUE;
             *ptransaction = &(device.transaction[i]);
             result = BT_STATUS_SUCCESS;
@@ -1656,7 +1804,7 @@
     /* If the transaction is in use... */
     if (transaction != NULL)
     {
-        BTIF_TRACE_DEBUG2("%s: lbl: %d", __FUNCTION__, lbl);
+        BTIF_TRACE_DEBUG("%s: lbl: %d", __FUNCTION__, lbl);
         initialize_transaction(lbl);
     }
 }
@@ -1685,17 +1833,31 @@
 static BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
 {
     int i;
+    char *dev_name_str = NULL;
     int whitelist_size = sizeof(rc_white_addr_prefix)/sizeof(rc_white_addr_prefix[0]);
+
     for (i = 0; i < whitelist_size; i++) {
         if (rc_white_addr_prefix[i][0] == peer_dev[0] &&
             rc_white_addr_prefix[i][1] == peer_dev[1] &&
             rc_white_addr_prefix[i][2] == peer_dev[2]) {
-            BTIF_TRACE_DEBUG3("whitelist absolute volume for %02x:%02x:%02x",
-                                peer_dev[0], peer_dev[1], peer_dev[2]);
+            BTIF_TRACE_DEBUG("whitelist absolute volume for %02x:%02x:%02x",
+                              peer_dev[0], peer_dev[1], peer_dev[2]);
             return FALSE;
         }
     }
-    BTIF_TRACE_WARNING3("blacklist absolute volume for %02x:%02x:%02x",
-                        peer_dev[0], peer_dev[1], peer_dev[2]);
+
+    dev_name_str = BTM_SecReadDevName(peer_dev);
+    whitelist_size = sizeof(rc_white_name)/sizeof(char*);
+    if (dev_name_str != NULL) {
+        for (i = 0; i < whitelist_size; i++) {
+            if (strcmp(dev_name_str, rc_white_name[i]) == 0) {
+                BTIF_TRACE_DEBUG("whitelist absolute volume for %s", dev_name_str);
+                return FALSE;
+            }
+        }
+    }
+
+    BTIF_TRACE_WARNING("blacklist absolute volume for %02x:%02x:%02x, name = %s",
+                        peer_dev[0], peer_dev[1], peer_dev[2], dev_name_str);
     return TRUE;
 }
diff --git a/btif/src/btif_sm.c b/btif/src/btif_sm.c
index cb4e5ad..e3ccbf8 100644
--- a/btif/src/btif_sm.c
+++ b/btif/src/btif_sm.c
@@ -79,7 +79,7 @@
 
     if (p_handlers == NULL)
     {
-        BTIF_TRACE_ERROR1("%s : p_handlers is NULL", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s : p_handlers is NULL", __FUNCTION__);
         return NULL;
     }
 
@@ -108,7 +108,7 @@
 
     if (p_cb == NULL)
     {
-        BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
         return;
     }
     GKI_os_free((void*)p_cb);
@@ -129,7 +129,7 @@
 
     if (p_cb == NULL)
     {
-        BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
         return 0;
     }
 
@@ -156,7 +156,7 @@
 
     if (p_cb == NULL)
     {
-        BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
         return BT_STATUS_FAIL;
     }
 
@@ -186,7 +186,7 @@
 
     if (p_cb == NULL)
     {
-        BTIF_TRACE_ERROR1("%s : Invalid handle", __FUNCTION__);
+        BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__);
         return BT_STATUS_FAIL;
     }
 
diff --git a/btif/src/btif_sock.c b/btif/src/btif_sock.c
index 621a91e..4136cda 100644
--- a/btif/src/btif_sock.c
+++ b/btif/src/btif_sock.c
@@ -71,22 +71,22 @@
     {
         //fix me, the process doesn't exit right now. don't set the init flag for now
         //binit = 1;
-        BTIF_TRACE_DEBUG0("btsock initializing...");
+        BTIF_TRACE_DEBUG("btsock initializing...");
         btsock_thread_init();
         int handle = btsock_thread_create(btsock_signaled, NULL);
         if(handle >= 0 && btsock_rfc_init(handle) == BT_STATUS_SUCCESS)
         {
-            BTIF_TRACE_DEBUG0("btsock successfully initialized");
+            BTIF_TRACE_DEBUG("btsock successfully initialized");
             return BT_STATUS_SUCCESS;
         }
     }
-    else BTIF_TRACE_ERROR0("btsock interface already initialized");
+    else BTIF_TRACE_ERROR("btsock interface already initialized");
     return BT_STATUS_FAIL;
 }
 void btif_sock_cleanup()
 {
     btsock_rfc_cleanup();
-    BTIF_TRACE_DEBUG0("leaving");
+    BTIF_TRACE_DEBUG("leaving");
 }
 
 static bt_status_t btsock_listen(btsock_type_t type, const char* service_name,
@@ -94,7 +94,7 @@
 {
     if((service_uuid == NULL && channel <= 0) || sock_fd == NULL)
     {
-        BTIF_TRACE_ERROR3("invalid parameters, uuid:%p, channel:%d, sock_fd:%p", service_uuid, channel, sock_fd);
+        BTIF_TRACE_ERROR("invalid parameters, uuid:%p, channel:%d, sock_fd:%p", service_uuid, channel, sock_fd);
         return BT_STATUS_PARM_INVALID;
     }
     *sock_fd = -1;
@@ -105,15 +105,15 @@
             status = btsock_rfc_listen(service_name, service_uuid, channel, sock_fd, flags);
             break;
         case BTSOCK_L2CAP:
-            BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
+            BTIF_TRACE_ERROR("bt l2cap socket type not supported, type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
         case BTSOCK_SCO:
-            BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
+            BTIF_TRACE_ERROR("bt sco socket not supported, type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
         default:
-            BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
+            BTIF_TRACE_ERROR("unknown bt socket type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
     }
@@ -124,7 +124,7 @@
 {
     if((uuid == NULL && channel <= 0) || bd_addr == NULL || sock_fd == NULL)
     {
-        BTIF_TRACE_ERROR4("invalid parameters, bd_addr:%p, uuid:%p, channel:%d, sock_fd:%p",
+        BTIF_TRACE_ERROR("invalid parameters, bd_addr:%p, uuid:%p, channel:%d, sock_fd:%p",
                 bd_addr, uuid, channel, sock_fd);
         return BT_STATUS_PARM_INVALID;
     }
@@ -136,15 +136,15 @@
             status = btsock_rfc_connect(bd_addr, uuid, channel, sock_fd, flags);
             break;
         case BTSOCK_L2CAP:
-            BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
+            BTIF_TRACE_ERROR("bt l2cap socket type not supported, type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
         case BTSOCK_SCO:
-            BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
+            BTIF_TRACE_ERROR("bt sco socket not supported, type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
         default:
-            BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
+            BTIF_TRACE_ERROR("unknown bt socket type:%d", type);
             status = BT_STATUS_UNSUPPORTED;
             break;
     }
@@ -158,13 +158,13 @@
             btsock_rfc_signaled(fd, flags, user_id);
             break;
         case BTSOCK_L2CAP:
-            BTIF_TRACE_ERROR2("bt l2cap socket type not supported, fd:%d, flags:%d", fd, flags);
+            BTIF_TRACE_ERROR("bt l2cap socket type not supported, fd:%d, flags:%d", fd, flags);
             break;
         case BTSOCK_SCO:
-            BTIF_TRACE_ERROR2("bt sco socket type not supported, fd:%d, flags:%d", fd, flags);
+            BTIF_TRACE_ERROR("bt sco socket type not supported, fd:%d, flags:%d", fd, flags);
             break;
         default:
-            BTIF_TRACE_ERROR3("unknown socket type:%d, fd:%d, flags:%d", type, fd, flags);
+            BTIF_TRACE_ERROR("unknown socket type:%d, fd:%d, flags:%d", type, fd, flags);
             break;
     }
 }
diff --git a/btif/src/btif_sock_rfc.c b/btif/src/btif_sock_rfc.c
index abb2a97..d934c52 100644
--- a/btif/src/btif_sock_rfc.c
+++ b/btif/src/btif_sock_rfc.c
@@ -23,6 +23,7 @@
  *  Description:   Handsfree Profile Bluetooth Interface
  *
  ***********************************************************************************/
+#include <assert.h>
 #include <hardware/bluetooth.h>
 #include <hardware/bt_sock.h>
 #include <sys/types.h>
@@ -51,10 +52,11 @@
 #include "bta_jv_api.h"
 #include "bta_jv_co.h"
 #include "port_api.h"
+#include "list.h"
 
 #include <cutils/log.h>
 #include <hardware/bluetooth.h>
-#define asrt(s) if(!(s)) APPL_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) APPL_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
 
 extern void uuid_to_string(bt_uuid_t *p_uuid, char *str);
 static inline void logu(const char* title, const uint8_t * p_uuid)
@@ -92,7 +94,7 @@
   int rfc_handle;
   int rfc_port_handle;
   int role;
-  BUFFER_Q incoming_que;
+  list_t *incoming_queue;
 } rfc_slot_t;
 
 static rfc_slot_t rfc_slots[MAX_RFC_CHANNEL];
@@ -100,9 +102,6 @@
 static volatile int pth = -1; //poll thread handle
 static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
 static void cleanup_rfc_slot(rfc_slot_t* rs);
-static inline void close_rfc_connection(int rfc_handle, int server);
-static bt_status_t dm_get_remote_service_record(bt_bdaddr_t *remote_addr,
-                                                    bt_uuid_t *uuid);
 static void *rfcomm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
 static inline BOOLEAN send_app_scn(rfc_slot_t* rs);
 static pthread_mutex_t slot_lock;
@@ -122,11 +121,6 @@
     }
     else memcpy(dest, src, 6);
 }
-static inline void free_gki_que(BUFFER_Q* q)
-{
-    while(!GKI_queue_is_empty(q))
-           GKI_freebuf(GKI_dequeue(q));
-}
 static void init_rfc_slots()
 {
     int i;
@@ -136,7 +130,8 @@
         rfc_slots[i].scn = -1;
         rfc_slots[i].sdp_handle = 0;
         rfc_slots[i].fd = rfc_slots[i].app_fd = -1;
-        GKI_init_q(&rfc_slots[i].incoming_que);
+        rfc_slots[i].incoming_queue = list_new(GKI_freebuf);
+        assert(rfc_slots[i].incoming_queue != NULL);
     }
     BTA_JvEnable(jv_dm_cback);
     init_slot_lock(&slot_lock);
@@ -156,8 +151,10 @@
     int i;
     for(i = 0; i < MAX_RFC_CHANNEL; i++)
     {
-        if(rfc_slots[i].id)
+        if(rfc_slots[i].id) {
             cleanup_rfc_slot(&rfc_slots[i]);
+            list_free(rfc_slots[i].incoming_queue);
+        }
     }
     unlock_slot(&slot_lock);
 }
@@ -173,7 +170,7 @@
     }
     return NULL;
 }
-static inline rfc_slot_t* find_rfc_slot_by_id(uint32_t id, const char* label)
+static inline rfc_slot_t* find_rfc_slot_by_id(uint32_t id)
 {
     int i;
     if(id)
@@ -186,7 +183,7 @@
             }
         }
     }
-    APPL_TRACE_WARNING2("invalid rfc slot id: %d, %s", id, label);
+    APPL_TRACE_WARNING("invalid rfc slot id: %d", id);
     return NULL;
 }
 static inline rfc_slot_t* find_rfc_slot_by_pending_sdp()
@@ -217,7 +214,7 @@
         if(rfc_slots[i].id && rfc_slots[i].f.doing_sdp_request)
                 return &rfc_slots[i];
     }
-    APPL_TRACE_DEBUG0("can not find any slot is requesting sdp");
+    APPL_TRACE_DEBUG("can not find any slot is requesting sdp");
     return NULL;
 }
 
@@ -234,7 +231,7 @@
                     return &rfc_slots[i];
                 else
                 {
-                    APPL_TRACE_ERROR0("invalid rfc slot id, cannot be 0");
+                    APPL_TRACE_ERROR("invalid rfc slot id, cannot be 0");
                     break;
                 }
             }
@@ -256,7 +253,7 @@
         int fds[2] = {-1, -1};
         if(socketpair(AF_LOCAL, SOCK_STREAM, 0, fds))
         {
-            APPL_TRACE_ERROR1("socketpair failed, errno:%d", errno);
+            APPL_TRACE_ERROR("socketpair failed, errno:%d", errno);
             return NULL;
         }
         rs->fd = fds[0];
@@ -283,35 +280,44 @@
                                         int open_handle, int new_listen_handle)
 {
     rfc_slot_t *accept_rs = alloc_rfc_slot(addr, srv_rs->service_name, srv_rs->service_uuid, srv_rs->scn, 0, FALSE);
-    clear_slot_flag(&accept_rs->f);
-    accept_rs->f.server = FALSE;
-    accept_rs->f.connected = TRUE;
-    accept_rs->security = srv_rs->security;
-    accept_rs->mtu = srv_rs->mtu;
-    accept_rs->role = srv_rs->role;
-    accept_rs->rfc_handle = open_handle;
-    accept_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(open_handle);
-     //now update listen rfc_handle of server slot
-    srv_rs->rfc_handle = new_listen_handle;
-    srv_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(new_listen_handle);
-    BTIF_TRACE_DEBUG4("create_srv_accept__rfc_slot(open_handle: 0x%x, new_listen_handle:"
-            "0x%x) accept_rs->rfc_handle:0x%x, srv_rs_listen->rfc_handle:0x%x"
-      ,open_handle, new_listen_handle, accept_rs->rfc_port_handle, srv_rs->rfc_port_handle);
-    asrt(accept_rs->rfc_port_handle != srv_rs->rfc_port_handle);
-  //now swap the slot id
-    uint32_t new_listen_id = accept_rs->id;
-    accept_rs->id = srv_rs->id;
-    srv_rs->id = new_listen_id;
-    return accept_rs;
+    if( accept_rs)
+    {
+        clear_slot_flag(&accept_rs->f);
+        accept_rs->f.server = FALSE;
+        accept_rs->f.connected = TRUE;
+        accept_rs->security = srv_rs->security;
+        accept_rs->mtu = srv_rs->mtu;
+        accept_rs->role = srv_rs->role;
+        accept_rs->rfc_handle = open_handle;
+        accept_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(open_handle);
+        //now update listen rfc_handle of server slot
+        srv_rs->rfc_handle = new_listen_handle;
+        srv_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(new_listen_handle);
+        BTIF_TRACE_DEBUG("create_srv_accept__rfc_slot(open_handle: 0x%x, new_listen_handle:"
+                "0x%x) accept_rs->rfc_handle:0x%x, srv_rs_listen->rfc_handle:0x%x"
+                ,open_handle, new_listen_handle, accept_rs->rfc_port_handle, srv_rs->rfc_port_handle);
+        asrt(accept_rs->rfc_port_handle != srv_rs->rfc_port_handle);
+        //now swap the slot id
+        uint32_t new_listen_id = accept_rs->id;
+        accept_rs->id = srv_rs->id;
+        srv_rs->id = new_listen_id;
+
+        return accept_rs;
+    }
+    else
+    {
+        APPL_TRACE_ERROR(" accept_rs is NULL %s", __FUNCTION__);
+        return NULL;
+    }
 }
 bt_status_t btsock_rfc_listen(const char* service_name, const uint8_t* service_uuid, int channel,
                             int* sock_fd, int flags)
 {
 
-    APPL_TRACE_DEBUG1("btsock_rfc_listen, service_name:%s", service_name);
+    APPL_TRACE_DEBUG("btsock_rfc_listen, service_name:%s", service_name);
     if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
     {
-        APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd, service_uuid);
+        APPL_TRACE_ERROR("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd, service_uuid);
         return BT_STATUS_PARM_INVALID;
     }
     *sock_fd = -1;
@@ -333,12 +339,17 @@
     rfc_slot_t* rs = alloc_rfc_slot(NULL, service_name, service_uuid, channel, flags, TRUE);
     if(rs)
     {
-        APPL_TRACE_DEBUG1("BTA_JvCreateRecordByUser:%s", service_name);
-        BTA_JvCreateRecordByUser((void *)rs->id);
+        APPL_TRACE_DEBUG("BTA_JvCreateRecordByUser:%s", service_name);
+        BTA_JvCreateRecordByUser((void *)(intptr_t)rs->id);
         *sock_fd = rs->app_fd;
         rs->app_fd = -1; //the fd ownership is transferred to app
-        status = BT_STATUS_SUCCESS;
-        btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id);
+        if (btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id)) {
+            status = BT_STATUS_SUCCESS;
+        }
+        else
+        {
+            cleanup_rfc_slot(rs);
+        }
     }
     unlock_slot(&slot_lock);
     return status;
@@ -348,7 +359,7 @@
 {
     if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
     {
-        APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd,
+        APPL_TRACE_ERROR("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd,
                           service_uuid);
         return BT_STATUS_PARM_INVALID;
     }
@@ -362,9 +373,9 @@
     {
         if(is_uuid_empty(service_uuid))
         {
-            APPL_TRACE_DEBUG1("connecting to rfcomm channel:%d without service discovery", channel);
+            APPL_TRACE_DEBUG("connecting to rfcomm channel:%d without service discovery", channel);
             if(BTA_JvRfcommConnect(rs->security, rs->role, rs->scn, rs->addr.address,
-                        rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
+                        rfcomm_cback, (void*)(intptr_t)rs->id) == BTA_JV_SUCCESS)
             {
                 if(send_app_scn(rs))
                 {
@@ -390,7 +401,7 @@
             rfc_slot_t* rs_doing_sdp = find_rfc_slot_requesting_sdp();
             if(rs_doing_sdp == NULL)
             {
-                BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)rs->id);
+                BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)(intptr_t)rs->id);
                 rs->f.pending_sdp_request = FALSE;
                 rs->f.doing_sdp_request = TRUE;
             }
@@ -413,13 +424,13 @@
     {
         if(BTM_TryAllocateSCN(rs->scn) == FALSE)
         {
-            APPL_TRACE_ERROR1("rfc channel:%d already in use", scn);
+            APPL_TRACE_ERROR("rfc channel:%d already in use", scn);
             return FALSE;
         }
     }
     else if((rs->scn = BTM_AllocateSCN()) == 0)
     {
-        APPL_TRACE_ERROR0("run out of rfc channels");
+        APPL_TRACE_ERROR("run out of rfc channels");
         return FALSE;
     }
     if((rs->sdp_handle = add_rfc_sdp_rec(rs->service_name, rs->service_uuid, rs->scn)) <= 0)
@@ -473,7 +484,7 @@
     {
         if(rs->f.server && !rs->f.closing && rs->rfc_handle)
         {
-            BTA_JvRfcommStopServer(rs->rfc_handle, (void*)rs->id);
+            BTA_JvRfcommStopServer(rs->rfc_handle, (void*)(uintptr_t)rs->id);
             rs->rfc_handle = 0;
         }
         if(rs->f.server)
@@ -483,7 +494,7 @@
 }
 static void cleanup_rfc_slot(rfc_slot_t* rs)
 {
-    APPL_TRACE_DEBUG4("cleanup slot:%d, fd:%d, scn:%d, sdp_handle:0x%x", rs->id, rs->fd, rs->scn, rs->sdp_handle);
+    APPL_TRACE_DEBUG("cleanup slot:%d, fd:%d, scn:%d, sdp_handle:0x%x", rs->id, rs->fd, rs->scn, rs->sdp_handle);
     if(rs->fd != -1)
     {
         shutdown(rs->fd, 2);
@@ -502,12 +513,12 @@
     }
     if(rs->rfc_handle && !rs->f.closing && !rs->f.server)
     {
-        APPL_TRACE_DEBUG1("closing rfcomm connection, rfc_handle:0x%x", rs->rfc_handle);
-        BTA_JvRfcommClose(rs->rfc_handle, (void*)rs->id);
+        APPL_TRACE_DEBUG("closing rfcomm connection, rfc_handle:0x%x", rs->rfc_handle);
+        BTA_JvRfcommClose(rs->rfc_handle, (void*)(uintptr_t)rs->id);
         rs->rfc_handle = 0;
     }
     free_rfc_slot_scn(rs);
-    free_gki_que(&rs->incoming_que);
+    list_clear(rs->incoming_queue);
 
     rs->rfc_port_handle = 0;
     //cleanup the flag
@@ -542,7 +553,7 @@
     {
         if(sock_send_fd(fd, (const uint8_t*)&cs, sizeof(cs), send_fd) == sizeof(cs))
             return TRUE;
-        else APPL_TRACE_ERROR2("sock_send_fd failed, fd:%d, send_fd:%d", fd, send_fd);
+        else APPL_TRACE_ERROR("sock_send_fd failed, fd:%d, send_fd:%d", fd, send_fd);
     }
     else if(sock_send_all(fd, (const uint8_t*)&cs, sizeof(cs)) == sizeof(cs))
     {
@@ -552,8 +563,8 @@
 }
 static void on_cl_rfc_init(tBTA_JV_RFCOMM_CL_INIT *p_init, uint32_t id)
 {
-    lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_cl_rfc_init");
+   lock_slot(&slot_lock);
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
         if (p_init->status != BTA_JV_SUCCESS)
@@ -568,7 +579,7 @@
 static void  on_srv_rfc_listen_started(tBTA_JV_RFCOMM_START *p_start, uint32_t id)
 {
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_srv_rfc_listen_started");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
         if (p_start->status != BTA_JV_SUCCESS)
@@ -580,7 +591,7 @@
             if(!send_app_scn(rs))
             {
                 //closed
-                APPL_TRACE_DEBUG1("send_app_scn() failed, close rs->id:%d", rs->id);
+                APPL_TRACE_DEBUG("send_app_scn() failed, close rs->id:%d", rs->id);
                 cleanup_rfc_slot(rs);
             }
         }
@@ -591,7 +602,7 @@
 {
     uint32_t new_listen_slot_id = 0;
     lock_slot(&slot_lock);
-    rfc_slot_t* srv_rs = find_rfc_slot_by_id(id, "on_srv_rfc_connect");
+    rfc_slot_t* srv_rs = find_rfc_slot_by_id(id);
     if(srv_rs)
     {
         rfc_slot_t* accept_rs = create_srv_accept_rfc_slot(srv_rs, (const bt_bdaddr_t*)p_open->rem_bda,
@@ -601,9 +612,9 @@
             //start monitor the socket
             btsock_thread_add_fd(pth, srv_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, srv_rs->id);
             btsock_thread_add_fd(pth, accept_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, accept_rs->id);
-            APPL_TRACE_DEBUG1("sending connect signal & app fd:%dto app server to accept() the connection",
+            APPL_TRACE_DEBUG("sending connect signal & app fd:%dto app server to accept() the connection",
                              accept_rs->app_fd);
-            APPL_TRACE_DEBUG2("server fd:%d, scn:%d", srv_rs->fd, srv_rs->scn);
+            APPL_TRACE_DEBUG("server fd:%d, scn:%d", srv_rs->fd, srv_rs->scn);
             send_app_connect_signal(srv_rs->fd, &accept_rs->addr, srv_rs->scn, 0, accept_rs->app_fd);
             accept_rs->app_fd = -1; //the fd is closed after sent to app
             new_listen_slot_id = srv_rs->id;
@@ -615,22 +626,22 @@
 static void on_cli_rfc_connect(tBTA_JV_RFCOMM_OPEN *p_open, uint32_t id)
 {
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_cli_rfc_connect");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs && p_open->status == BTA_JV_SUCCESS)
     {
         rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(p_open->handle);
         bd_copy(rs->addr.address, p_open->rem_bda, 0);
         //notify app rfc is connected
-        APPL_TRACE_DEBUG4("call send_app_connect_signal, slot id:%d, fd:%d, rfc scn:%d, server:%d",
+        APPL_TRACE_DEBUG("call send_app_connect_signal, slot id:%d, fd:%d, rfc scn:%d, server:%d",
                          rs->id, rs->fd, rs->scn, rs->f.server);
         if(send_app_connect_signal(rs->fd, &rs->addr, rs->scn, 0, -1))
         {
             //start monitoring the socketpair to get call back when app writing data
-            APPL_TRACE_DEBUG3("on_rfc_connect_ind, connect signal sent, slot id:%d, rfc scn:%d, server:%d",
+            APPL_TRACE_DEBUG("on_rfc_connect_ind, connect signal sent, slot id:%d, rfc scn:%d, server:%d",
                              rs->id, rs->scn, rs->f.server);
             rs->f.connected = TRUE;
         }
-        else APPL_TRACE_ERROR0("send_app_connect_signal failed");
+        else APPL_TRACE_ERROR("send_app_connect_signal failed");
     }
     else if(rs)
         cleanup_rfc_slot(rs);
@@ -640,10 +651,10 @@
 {
     UNUSED(p_close);
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_close");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
-        APPL_TRACE_DEBUG4("on_rfc_close, slot id:%d, fd:%d, rfc scn:%d, server:%d",
+        APPL_TRACE_DEBUG("on_rfc_close, slot id:%d, fd:%d, rfc scn:%d, server:%d",
                          rs->id, rs->fd, rs->scn, rs->f.server);
         free_rfc_slot_scn(rs);
         // rfc_handle already closed when receiving rfcomm close event from stack.
@@ -657,7 +668,7 @@
     UNUSED(p);
 
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_write_done");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs && !rs->f.outgoing_congest)
     {
         //mointer the fd for any outgoing data
@@ -668,7 +679,7 @@
 static void on_rfc_outgoing_congest(tBTA_JV_RFCOMM_CONG *p, uint32_t id)
 {
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "on_rfc_outgoing_congest");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
         rs->f.outgoing_congest = p->cong ? 1 : 0;
@@ -683,50 +694,50 @@
 {
     int rc;
     void* new_user_data = NULL;
-    APPL_TRACE_DEBUG1("event=%s", jv_evt[event]);
+    APPL_TRACE_DEBUG("event=%s", jv_evt[event]);
 
     switch (event)
     {
     case BTA_JV_RFCOMM_START_EVT:
-        on_srv_rfc_listen_started(&p_data->rfc_start, (uint32_t)user_data);
+        on_srv_rfc_listen_started(&p_data->rfc_start, (uintptr_t)user_data);
         break;
 
     case BTA_JV_RFCOMM_CL_INIT_EVT:
-        on_cl_rfc_init(&p_data->rfc_cl_init, (uint32_t)user_data);
+        on_cl_rfc_init(&p_data->rfc_cl_init, (uintptr_t)user_data);
         break;
 
     case BTA_JV_RFCOMM_OPEN_EVT:
         BTA_JvSetPmProfile(p_data->rfc_open.handle,BTA_JV_PM_ID_1,BTA_JV_CONN_OPEN);
-        on_cli_rfc_connect(&p_data->rfc_open, (uint32_t)user_data);
+        on_cli_rfc_connect(&p_data->rfc_open, (uintptr_t)user_data);
         break;
     case BTA_JV_RFCOMM_SRV_OPEN_EVT:
         BTA_JvSetPmProfile(p_data->rfc_srv_open.handle,BTA_JV_PM_ALL,BTA_JV_CONN_OPEN);
-        new_user_data = (void*)on_srv_rfc_connect(&p_data->rfc_srv_open, (uint32_t)user_data);
+        new_user_data = (void*)(intptr_t)on_srv_rfc_connect(&p_data->rfc_srv_open, (uintptr_t)user_data);
         break;
 
     case BTA_JV_RFCOMM_CLOSE_EVT:
-        APPL_TRACE_DEBUG1("BTA_JV_RFCOMM_CLOSE_EVT: user_data:%d", (uint32_t)user_data);
-        on_rfc_close(&p_data->rfc_close, (uint32_t)user_data);
+        APPL_TRACE_DEBUG("BTA_JV_RFCOMM_CLOSE_EVT: user_data:%d", (uintptr_t)user_data);
+        on_rfc_close(&p_data->rfc_close, (uintptr_t)user_data);
         break;
 
     case BTA_JV_RFCOMM_READ_EVT:
-        APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_READ_EVT not used");
+        APPL_TRACE_DEBUG("BTA_JV_RFCOMM_READ_EVT not used");
         break;
 
     case BTA_JV_RFCOMM_WRITE_EVT:
-        on_rfc_write_done(&p_data->rfc_write, (uint32_t)user_data);
+        on_rfc_write_done(&p_data->rfc_write, (uintptr_t)user_data);
         break;
 
     case BTA_JV_RFCOMM_DATA_IND_EVT:
-        APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_DATA_IND_EVT not used");
+        APPL_TRACE_DEBUG("BTA_JV_RFCOMM_DATA_IND_EVT not used");
         break;
 
     case BTA_JV_RFCOMM_CONG_EVT:
         //on_rfc_cong(&p_data->rfc_cong);
-        on_rfc_outgoing_congest(&p_data->rfc_cong, (uint32_t)user_data);
+        on_rfc_outgoing_congest(&p_data->rfc_cong, (uintptr_t)user_data);
         break;
     default:
-        APPL_TRACE_ERROR2("unhandled event %d, slot id:%d", event, (uint32_t)user_data);
+        APPL_TRACE_ERROR("unhandled event %d, slot id:%d", event, (uintptr_t)user_data);
         break;
     }
     return new_user_data;
@@ -734,23 +745,23 @@
 
 static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data)
 {
-    uint32_t id = (uint32_t)user_data;
-    APPL_TRACE_DEBUG2("jv_dm_cback: event:%d, slot id:%d", event, id);
+    uint32_t id = (uintptr_t)user_data;
+    APPL_TRACE_DEBUG("jv_dm_cback: event:%d, slot id:%d", event, id);
     switch(event)
     {
         case BTA_JV_CREATE_RECORD_EVT:
             {
                 lock_slot(&slot_lock);
-                rfc_slot_t* rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_CREATE_RECORD_EVT");
+                rfc_slot_t* rs = find_rfc_slot_by_id(id);
                 if(rs && create_server_sdp_record(rs))
                 {
                     //now start the rfcomm server after sdp & channel # assigned
                     BTA_JvRfcommStartServer(rs->security, rs->role, rs->scn, MAX_RFC_SESSION, rfcomm_cback,
-                                            (void*)rs->id);
+                                            (void*)(uintptr_t)rs->id);
                 }
                 else if(rs)
                 {
-                    APPL_TRACE_ERROR1("jv_dm_cback: cannot start server, slot found:%p", rs);
+                    APPL_TRACE_ERROR("jv_dm_cback: cannot start server, slot found:%p", rs);
                     cleanup_rfc_slot(rs);
                 }
                 unlock_slot(&slot_lock);
@@ -762,14 +773,14 @@
                 lock_slot(&slot_lock);
                 if(p_data->disc_comp.status == BTA_JV_SUCCESS && p_data->disc_comp.scn)
                 {
-                    APPL_TRACE_DEBUG3("BTA_JV_DISCOVERY_COMP_EVT, slot id:%d, status:%d, scn:%d",
+                    APPL_TRACE_DEBUG("BTA_JV_DISCOVERY_COMP_EVT, slot id:%d, status:%d, scn:%d",
                                       id, p_data->disc_comp.status, p_data->disc_comp.scn);
 
-                    rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_DISCOVERY_COMP_EVT");
+                    rs = find_rfc_slot_by_id(id);
                     if(rs && rs->f.doing_sdp_request)
                     {
                         if(BTA_JvRfcommConnect(rs->security, rs->role, p_data->disc_comp.scn, rs->addr.address,
-                                    rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
+                                    rfcomm_cback, (void*)(uintptr_t)rs->id) == BTA_JV_SUCCESS)
                         {
                             rs->scn = p_data->disc_comp.scn;
                             rs->f.doing_sdp_request = FALSE;
@@ -780,28 +791,28 @@
                     }
                     else if(rs)
                     {
-                        APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT no pending sdp request, slot id:%d, \
+                        APPL_TRACE_ERROR("DISCOVERY_COMP_EVT no pending sdp request, slot id:%d, \
                                 flag sdp pending:%d, flag sdp doing:%d",
                                 id, rs->f.pending_sdp_request, rs->f.doing_sdp_request);
                     }
                 }
                 else
                 {
-                    APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT slot id:%d, failed to find channel, \
+                    APPL_TRACE_ERROR("DISCOVERY_COMP_EVT slot id:%d, failed to find channle, \
                                       status:%d, scn:%d", id, p_data->disc_comp.status,
                                       p_data->disc_comp.scn);
-                    rs = find_rfc_slot_by_id(id, "jv_dm_cback: BTA_JV_DISCOVERY_COMP_EVT, no channel");
+                    rs = find_rfc_slot_by_id(id);
                     if(rs)
                         cleanup_rfc_slot(rs);
                 }
                 rs = find_rfc_slot_by_pending_sdp();
                 if(rs)
                 {
-                    APPL_TRACE_DEBUG0("BTA_JV_DISCOVERY_COMP_EVT, start another pending scn sdp request");
+                    APPL_TRACE_DEBUG("BTA_JV_DISCOVERY_COMP_EVT, start another pending scn sdp request");
                     tSDP_UUID sdp_uuid;
                     sdp_uuid.len = 16;
                     memcpy(sdp_uuid.uu.uuid128, rs->service_uuid, sizeof(sdp_uuid.uu.uuid128));
-                    BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)rs->id);
+                    BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)(uintptr_t)rs->id);
                     rs->f.pending_sdp_request = FALSE;
                     rs->f.doing_sdp_request = TRUE;
                 }
@@ -809,7 +820,7 @@
                 break;
             }
         default:
-            APPL_TRACE_DEBUG2("unhandled event:%d, slot id:%d", event, id);
+            APPL_TRACE_DEBUG("unhandled event:%d, slot id:%d", event, id);
             break;
     }
 
@@ -829,7 +840,7 @@
     if(sent > 0 && sent < p_buf->len)
     {
         //sent partial
-        APPL_TRACE_ERROR2("send partial, sent:%d, p_buf->len:%d", sent, p_buf->len);
+        APPL_TRACE_ERROR("send partial, sent:%d, p_buf->len:%d", sent, p_buf->len);
         p_buf->offset += sent;
         p_buf->len -= sent;
         return SENT_PARTIAL;
@@ -838,39 +849,37 @@
     if(sent < 0 &&
         (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))
     {
-        APPL_TRACE_ERROR1("send none, EAGAIN or EWOULDBLOCK, errno:%d", errno);
+        APPL_TRACE_ERROR("send none, EAGAIN or EWOULDBLOCK, errno:%d", errno);
         return SENT_NONE;
     }
-    APPL_TRACE_ERROR3("unknown send() error, sent:%d, p_buf->len:%d,  errno:%d", sent, p_buf->len, errno);
+    APPL_TRACE_ERROR("unknown send() error, sent:%d, p_buf->len:%d,  errno:%d", sent, p_buf->len, errno);
     return SENT_FAILED;
 }
 static BOOLEAN flush_incoming_que_on_wr_signal(rfc_slot_t* rs)
 {
-    while(!GKI_queue_is_empty(&rs->incoming_que))
+    while(!list_is_empty(rs->incoming_queue))
     {
-        BT_HDR *p_buf = GKI_dequeue(&rs->incoming_que);
+        BT_HDR *p_buf = list_front(rs->incoming_queue);
         int sent = send_data_to_app(rs->fd, p_buf);
         switch(sent)
         {
             case SENT_NONE:
             case SENT_PARTIAL:
-                //add it back to the queue at same position
-                GKI_enqueue_head (&rs->incoming_que, p_buf);
                 //monitor the fd to get callback when app is ready to receive data
                 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
                 return TRUE;
             case SENT_ALL:
-                GKI_freebuf(p_buf);
+                list_remove(rs->incoming_queue, p_buf);
                 break;
             case SENT_FAILED:
-                GKI_freebuf(p_buf);
+                list_remove(rs->incoming_queue, p_buf);
                 return FALSE;
         }
     }
 
     //app is ready to receive data, tell stack to start the data flow
     //fix me: need a jv flow control api to serialize the call in stack
-    APPL_TRACE_DEBUG3("enable data flow, rfc_handle:0x%x, rfc_port_handle:0x%x, user_id:%d",
+    APPL_TRACE_DEBUG("enable data flow, rfc_handle:0x%x, rfc_port_handle:0x%x, user_id:%d",
                         rs->rfc_handle, rs->rfc_port_handle, rs->id);
     extern int PORT_FlowControl_MaxCredit(UINT16 handle, BOOLEAN enable);
     PORT_FlowControl_MaxCredit(rs->rfc_port_handle, TRUE);
@@ -879,10 +888,10 @@
 void btsock_rfc_signaled(int fd, int flags, uint32_t user_id)
 {
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(user_id, "btsock_rfc_signaled");
+    rfc_slot_t* rs = find_rfc_slot_by_id(user_id);
     if(rs)
     {
-        APPL_TRACE_DEBUG3("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
+        APPL_TRACE_DEBUG("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
         BOOLEAN need_close = FALSE;
         if(flags & SOCK_THREAD_FD_RD)
         {
@@ -895,11 +904,18 @@
                     //make sure there's data pending in case the peer closed the socket
                     if(!(flags & SOCK_THREAD_FD_EXCEPTION) ||
                                 (ioctl(rs->fd, FIONREAD, &size) == 0 && size))
-                        BTA_JvRfcommWrite(rs->rfc_handle, (UINT32)rs->id);
+                    {
+                        int rfc_handle = rs->rfc_handle;
+                        UINT32 rs_id = rs->id;
+                        //unlock before BTA_JvRfcommWrite to avoid deadlock on concurrnet multi rfcomm connectoins
+                        unlock_slot(&slot_lock);
+                        BTA_JvRfcommWrite(rfc_handle, rs_id);
+                        return;
+                    }
                 }
                 else
                 {
-                    APPL_TRACE_ERROR2("SOCK_THREAD_FD_RD signaled when rfc is not connected, \
+                    APPL_TRACE_ERROR("SOCK_THREAD_FD_RD signaled when rfc is not connected, \
                                       slot id:%d, channel:%d", rs->id, rs->scn);
                     need_close = TRUE;
                 }
@@ -911,7 +927,7 @@
             if(!rs->f.connected || !flush_incoming_que_on_wr_signal(rs))
             {
                 need_close = TRUE;
-                APPL_TRACE_ERROR2("SOCK_THREAD_FD_WR signaled when rfc is not connected \
+                APPL_TRACE_ERROR("SOCK_THREAD_FD_WR signaled when rfc is not connected \
                                   or app closed fd, slot id:%d, channel:%d", rs->id, rs->scn);
             }
 
@@ -922,12 +938,12 @@
             if(need_close || ioctl(rs->fd, FIONREAD, &size) != 0 || size == 0 )
             {
                 //cleanup when no data pending
-                APPL_TRACE_DEBUG3("SOCK_THREAD_FD_EXCEPTION, cleanup, flags:%x, need_close:%d, pending size:%d",
+                APPL_TRACE_DEBUG("SOCK_THREAD_FD_EXCEPTION, cleanup, flags:%x, need_close:%d, pending size:%d",
                                 flags, need_close, size);
                 cleanup_rfc_slot(rs);
             }
             else
-                APPL_TRACE_DEBUG3("SOCK_THREAD_FD_EXCEPTION, cleanup pending, flags:%x, need_close:%d, pending size:%d",
+                APPL_TRACE_DEBUG("SOCK_THREAD_FD_EXCEPTION, cleanup pending, flags:%x, need_close:%d, pending size:%d",
                                 flags, need_close, size);
         }
     }
@@ -936,14 +952,14 @@
 
 int bta_co_rfc_data_incoming(void *user_data, BT_HDR *p_buf)
 {
-    uint32_t id = (uint32_t)user_data;
+    uint32_t id = (uintptr_t)user_data;
     int ret = 0;
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_incoming");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
-        if(!GKI_queue_is_empty(&rs->incoming_que))
-            GKI_enqueue(&rs->incoming_que, p_buf);
+        if(!list_is_empty(rs->incoming_queue))
+            list_append(rs->incoming_queue, p_buf);
         else
         {
             int sent = send_data_to_app(rs->fd, p_buf);
@@ -952,7 +968,7 @@
                 case SENT_NONE:
                 case SENT_PARTIAL:
                     //add it to the end of the queue
-                    GKI_enqueue(&rs->incoming_que, p_buf);
+                    list_append(rs->incoming_queue, p_buf);
                     //monitor the fd to get callback when app is ready to receive data
                     btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
                     break;
@@ -972,34 +988,34 @@
 }
 int bta_co_rfc_data_outgoing_size(void *user_data, int *size)
 {
-    uint32_t id = (uint32_t)user_data;
+    uint32_t id = (uintptr_t)user_data;
     int ret = FALSE;
     *size = 0;
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_outgoing_size");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
         if(ioctl(rs->fd, FIONREAD, size) == 0)
         {
-            APPL_TRACE_DEBUG2("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
+            APPL_TRACE_DEBUG("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
             ret = TRUE;
         }
         else
         {
-            APPL_TRACE_ERROR2("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
+            APPL_TRACE_ERROR("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
             cleanup_rfc_slot(rs);
         }
     }
-    else APPL_TRACE_ERROR1("bta_co_rfc_data_outgoing_size, invalid slot id:%d", id);
+    else APPL_TRACE_ERROR("bta_co_rfc_data_outgoing_size, invalid slot id:%d", id);
     unlock_slot(&slot_lock);
     return ret;
 }
 int bta_co_rfc_data_outgoing(void *user_data, UINT8* buf, UINT16 size)
 {
-    uint32_t id = (uint32_t)user_data;
+    uint32_t id = (uintptr_t)user_data;
     int ret = FALSE;
     lock_slot(&slot_lock);
-    rfc_slot_t* rs = find_rfc_slot_by_id(id, "bta_co_rfc_data_outgoing");
+    rfc_slot_t* rs = find_rfc_slot_by_id(id);
     if(rs)
     {
         int received = recv(rs->fd, buf, size, 0);
@@ -1007,12 +1023,13 @@
             ret = TRUE;
         else
         {
-            APPL_TRACE_ERROR4("recv error, errno:%d, fd:%d, size:%d, received:%d",
+            APPL_TRACE_ERROR("recv error, errno:%d, fd:%d, size:%d, received:%d",
                              errno, rs->fd, size, received);
             cleanup_rfc_slot(rs);
         }
     }
-    else APPL_TRACE_ERROR1("bta_co_rfc_data_outgoing, invalid slot id:%d", id);
+    else APPL_TRACE_ERROR("bta_co_rfc_data_outgoing, invalid slot id:%d", id);
     unlock_slot(&slot_lock);
     return ret;
 }
+
diff --git a/btif/src/btif_sock_sdp.c b/btif/src/btif_sock_sdp.c
index e02a609..afd99ce 100644
--- a/btif/src/btif_sock_sdp.c
+++ b/btif/src/btif_sock_sdp.c
@@ -29,6 +29,7 @@
 #include <hardware/bt_sock.h>
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <stdlib.h>
 #include <errno.h>
 
 #define LOG_TAG "BTIF_SOCK_SDP"
@@ -114,7 +115,7 @@
             }
         }
     }
-    else APPL_TRACE_ERROR1("failed to create sdp record, service_name:%s", name);
+    else APPL_TRACE_ERROR("failed to create sdp record, service_name:%s", name);
     return 0;
 }
 
@@ -143,11 +144,11 @@
     UINT32              sdp_handle = 0;
     tBTA_PBS_CFG *p_bta_pbs_cfg = (tBTA_PBS_CFG *)&bta_pbs_cfg;
 
-    APPL_TRACE_DEBUG2("add_pbap_sdd:scn %d, service name %s", scn, p_service_name);
+    APPL_TRACE_DEBUG("add_pbap_sdd:scn %d, service name %s", scn, p_service_name);
 
     if ((sdp_handle = SDP_CreateRecord()) == 0)
     {
-        APPL_TRACE_ERROR0("PBS SDP: Unable to register PBS Service");
+        APPL_TRACE_ERROR("PBS SDP: Unable to register PBS Service");
         return sdp_handle;
     }
 
@@ -198,12 +199,12 @@
     {
         SDP_DeleteRecord(sdp_handle);
         sdp_handle = 0;
-        APPL_TRACE_ERROR0("bta_pbs_sdp_register FAILED");
+        APPL_TRACE_ERROR("bta_pbs_sdp_register FAILED");
     }
     else
     {
         bta_sys_add_uuid(pbs_service);  /* UUID_SERVCLASS_PBAP_PSE */
-        APPL_TRACE_DEBUG1("PBS:  SDP Registered (handle 0x%08x)", sdp_handle);
+        APPL_TRACE_DEBUG("PBS:  SDP Registered (handle 0x%08x)", sdp_handle);
     }
 
     return sdp_handle;
@@ -213,10 +214,6 @@
  * a channel number to a hard coded SDP entry.
  * TODO: expose a prober SDP API, to avoid hacks like this, and make it possible
  *        to set useful names for the ServiceName */
-#define BTA_MAP_MSG_TYPE_EMAIL    0x01
-#define BTA_MAP_MSG_TYPE_SMS_GSM  0x02
-#define BTA_MAP_MSG_TYPE_SMS_CDMA 0x04
-#define BTA_MAP_MSG_TYPE_MMS      0x08
 
 #define BTA_MAPS_DEFAULT_VERSION 0x0101 /* MAP 1.1 */
 typedef struct
@@ -225,18 +222,7 @@
     const char* service_name;          /* Description of the MAS instance */
     UINT8       supported_message_types;/* Server supported message types - SMS/MMS/EMAIL */
 } tBTA_MAPS_CFG;
-const tBTA_MAPS_CFG bta_maps_cfg_sms =
-{
-    0,                  /* Mas id 0 is for SMS/MMS */
-    "MAP SMS",
-    BTA_MAP_MSG_TYPE_SMS_GSM | BTA_MAP_MSG_TYPE_SMS_CDMA
-};
-const tBTA_MAPS_CFG bta_maps_cfg_email =
-{
-    1,                  /* Mas id 1 is for EMAIL */
-    "MAP EMAIL",
-    BTA_MAP_MSG_TYPE_EMAIL
-};
+
 static int add_maps_sdp(const char* p_service_name, int scn)
 {
 
@@ -245,14 +231,35 @@
     UINT16              browse = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
     BOOLEAN             status = FALSE;
     UINT32              sdp_handle = 0;
-    // TODO: To add support for EMAIL set below depending on the scn to either SMS or Email
-    const tBTA_MAPS_CFG *p_bta_maps_cfg = &bta_maps_cfg_sms;
+    char                map_handle_buf[3];
+    char                map_type_buf[3];
+    char                *map_name = (char*)&(p_service_name[4]);
+    tBTA_MAPS_CFG       bta_maps_cfg;
+    tBTA_MAPS_CFG       *p_bta_maps_cfg;
+    APPL_TRACE_DEBUG("add_maps_sdp: scn %d, service name %s", scn, p_service_name);
 
-    APPL_TRACE_DEBUG2("add_maps_sdd:scn %d, service name %s", scn, p_service_name);
+    /* Service name for map is build as XX|YY|name where XX and YY is
+     * MasId and Type flag as 2byte hex as string */
+    map_handle_buf[0] = p_service_name[0];
+    map_handle_buf[1] = p_service_name[1];
+    map_handle_buf[2] = '\0';
+
+    map_type_buf[0]   = p_service_name[2];
+    map_type_buf[1]   = p_service_name[3];
+    map_type_buf[2]   = '\0';
+
+    p_bta_maps_cfg = &bta_maps_cfg;
+    p_bta_maps_cfg->mas_id = (UINT16)strtol(&map_handle_buf[0],NULL, 16);
+    p_bta_maps_cfg->supported_message_types = (UINT16)strtol(&map_type_buf[0],NULL, 16);
+    p_bta_maps_cfg->service_name = map_name;
+
+    APPL_TRACE_DEBUG("  service_name: %s, mas-id: %d, flags: 0x%02x",
+            p_bta_maps_cfg->service_name, p_bta_maps_cfg->mas_id,
+            p_bta_maps_cfg->supported_message_types);
 
     if ((sdp_handle = SDP_CreateRecord()) == 0)
     {
-        APPL_TRACE_ERROR0("MAPS SDP: Unable to register MAPS Service");
+        APPL_TRACE_ERROR("MAPS SDP: Unable to register MAPS Service");
         return sdp_handle;
     }
 
@@ -304,12 +311,12 @@
     {
         SDP_DeleteRecord(sdp_handle);
         sdp_handle = 0;
-        APPL_TRACE_ERROR0("bta_mass_sdp_register FAILED");
+        APPL_TRACE_ERROR("bta_mass_sdp_register FAILED");
     }
     else
     {
         bta_sys_add_uuid(service);  /* UUID_SERVCLASS_MESSAGE_ACCESS */
-        APPL_TRACE_DEBUG1("MAPSS:  SDP Registered (handle 0x%08x)", sdp_handle);
+        APPL_TRACE_DEBUG("MAPSS:  SDP Registered (handle 0x%08x)", sdp_handle);
     }
 
     return sdp_handle;
@@ -353,7 +360,7 @@
     UINT32 sdp_handle;
     tBTA_OP_FMT_MASK    formats = BTUI_OPS_FORMATS;
 
-    APPL_TRACE_DEBUG2("scn %d, service name %s", scn, p_service_name);
+    APPL_TRACE_DEBUG("scn %d, service name %s", scn, p_service_name);
 
     sdp_handle = SDP_CreateRecord();
 
@@ -416,7 +423,7 @@
     tSDP_PROTOCOL_ELEM  proto_elem_list[SPP_NUM_PROTO_ELEMS];
     int              sdp_handle;
 
-    APPL_TRACE_DEBUG2("scn %d, service name %s", scn, service_name);
+    APPL_TRACE_DEBUG("scn %d, service name %s", scn, service_name);
 
     /* register the service */
     if ((sdp_handle = SDP_CreateRecord()) != FALSE)
@@ -450,12 +457,11 @@
 }
 
 
-
 static int add_rfc_sdp_by_uuid(const char* name, const uint8_t* uuid, int scn)
 {
     int handle = 0;
 
-    APPL_TRACE_DEBUG2("name:%s, scn:%d", name, scn);
+    APPL_TRACE_DEBUG("name:%s, scn:%d", name, scn);
 
     /*
         Bluetooth Socket API relies on having preregistered bluez sdp records for HSAG, HFAG, OPP & PBAP
@@ -546,7 +552,7 @@
 
 void del_rfc_sdp_rec(int handle)
 {
-    APPL_TRACE_DEBUG1("del_rfc_sdp_rec: handle:0x%x", handle);
+    APPL_TRACE_DEBUG("del_rfc_sdp_rec: handle:0x%x", handle);
     if(handle != -1 && handle != 0)
         BTA_JvDeleteRecord( handle );
 }
diff --git a/btif/src/btif_sock_thread.c b/btif/src/btif_sock_thread.c
index 475b8de..687a1c5 100644
--- a/btif/src/btif_sock_thread.c
+++ b/btif/src/btif_sock_thread.c
@@ -60,16 +60,16 @@
 #include "btif_sock_util.h"
 
 #include <cutils/log.h>
-#define asrt(s) if(!(s)) APPL_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) APPL_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
 #define print_events(events) do { \
-    APPL_TRACE_DEBUG1("print poll event:%x", events); \
-    if (events & POLLIN) APPL_TRACE_DEBUG0(  "   POLLIN "); \
-    if (events & POLLPRI) APPL_TRACE_DEBUG0( "   POLLPRI "); \
-    if (events & POLLOUT) APPL_TRACE_DEBUG0( "   POLLOUT "); \
-    if (events & POLLERR) APPL_TRACE_DEBUG0( "   POLLERR "); \
-    if (events & POLLHUP) APPL_TRACE_DEBUG0( "   POLLHUP "); \
-    if (events & POLLNVAL) APPL_TRACE_DEBUG0("   POLLNVAL "); \
-    if (events & POLLRDHUP) APPL_TRACE_DEBUG0("   POLLRDHUP"); \
+    APPL_TRACE_DEBUG("print poll event:%x", events); \
+    if (events & POLLIN) APPL_TRACE_DEBUG(  "   POLLIN "); \
+    if (events & POLLPRI) APPL_TRACE_DEBUG( "   POLLPRI "); \
+    if (events & POLLOUT) APPL_TRACE_DEBUG( "   POLLOUT "); \
+    if (events & POLLERR) APPL_TRACE_DEBUG( "   POLLERR "); \
+    if (events & POLLHUP) APPL_TRACE_DEBUG( "   POLLHUP "); \
+    if (events & POLLNVAL) APPL_TRACE_DEBUG("   POLLNVAL "); \
+    if (events & POLLRDHUP) APPL_TRACE_DEBUG("   POLLRDHUP"); \
     } while(0)
 
 #define MAX_THREAD 8
@@ -116,7 +116,7 @@
 {
     int opts;
     opts = fcntl(s, F_GETFL);
-    if (opts<0) APPL_TRACE_ERROR1("set blocking (%s)", strerror(errno));
+    if (opts<0) APPL_TRACE_ERROR("set blocking (%s)", strerror(errno));
     if(blocking)
         opts &= ~O_NONBLOCK;
     else opts |= O_NONBLOCK;
@@ -126,17 +126,17 @@
 static inline int create_server_socket(const char* name)
 {
     int s = socket(AF_LOCAL, SOCK_STREAM, 0);
-    APPL_TRACE_DEBUG1("covert name to android abstract name:%s", name);
+    APPL_TRACE_DEBUG("covert name to android abstract name:%s", name);
     if(socket_local_server_bind(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT) >= 0)
     {
         if(listen(s, 5) == 0)
         {
-            APPL_TRACE_DEBUG2("listen to local socket:%s, fd:%d", name, s);
+            APPL_TRACE_DEBUG("listen to local socket:%s, fd:%d", name, s);
             return s;
         }
-        else APPL_TRACE_ERROR3("listen to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
+        else APPL_TRACE_ERROR("listen to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
     }
-    else APPL_TRACE_ERROR3("create local socket:%s fd:%d, failed, errno:%d", name, s, errno);
+    else APPL_TRACE_ERROR("create local socket:%s fd:%d, failed, errno:%d", name, s, errno);
     close(s);
     return -1;
 }
@@ -146,10 +146,10 @@
     set_socket_blocking(s, TRUE);
     if(socket_local_client_connect(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) >= 0)
     {
-        APPL_TRACE_DEBUG2("connected to local socket:%s, fd:%d", name, s);
+        APPL_TRACE_DEBUG("connected to local socket:%s, fd:%d", name, s);
         return s;
     }
-    else APPL_TRACE_ERROR3("connect to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
+    else APPL_TRACE_ERROR("connect to local socket:%s, fd:%d failed, errno:%d", name, s, errno);
     close(s);
     return -1;
 }
@@ -158,7 +158,7 @@
     struct sockaddr_un client_address;
     socklen_t clen;
     int fd = accept(s, (struct sockaddr*)&client_address, &clen);
-    APPL_TRACE_DEBUG2("accepted fd:%d for server fd:%d", fd, s);
+    APPL_TRACE_DEBUG("accepted fd:%d for server fd:%d", fd, s);
     return fd;
 }
 static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg)
@@ -169,7 +169,7 @@
     pthread_t thread_id = -1;
     if( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
     {
-        APPL_TRACE_ERROR1("pthread_create : %s", strerror(errno));
+        APPL_TRACE_ERROR("pthread_create : %s", strerror(errno));
         return -1;
     }
     return thread_id;
@@ -181,14 +181,14 @@
     //revserd order to save guard uninitialized access to 0 index
     for(i = MAX_THREAD - 1; i >=0; i--)
     {
-        APPL_TRACE_DEBUG2("ts[%d].used:%d", i, ts[i].used);
+        APPL_TRACE_DEBUG("ts[%d].used:%d", i, ts[i].used);
         if(!ts[i].used)
         {
             ts[i].used = 1;
             return i;
         }
     }
-    APPL_TRACE_ERROR0("execeeded max thread count");
+    APPL_TRACE_ERROR("execeeded max thread count");
     return -1;
 }
 static void free_thread_slot(int h)
@@ -198,12 +198,12 @@
         close_cmd_fd(h);
         ts[h].used = 0;
     }
-    else APPL_TRACE_ERROR1("invalid thread handle:%d", h);
+    else APPL_TRACE_ERROR("invalid thread handle:%d", h);
 }
 int btsock_thread_init()
 {
     static int initialized;
-    APPL_TRACE_DEBUG1("in initialized:%d", initialized);
+    APPL_TRACE_DEBUG("in initialized:%d", initialized);
     if(!initialized)
     {
         initialized = 1;
@@ -228,13 +228,13 @@
     lock_slot(&thread_slot_lock);
     int h = alloc_thread_slot();
     unlock_slot(&thread_slot_lock);
-    APPL_TRACE_DEBUG1("alloc_thread_slot ret:%d", h);
+    APPL_TRACE_DEBUG("alloc_thread_slot ret:%d", h);
     if(h >= 0)
     {
         init_poll(h);
-        if((ts[h].thread_id = create_thread(sock_poll_thread, (void*)h)) != -1)
+        if((ts[h].thread_id = create_thread(sock_poll_thread, (void*)(uintptr_t)h)) != -1)
         {
-            APPL_TRACE_DEBUG2("h:%d, thread id:%d", h, ts[h].thread_id);
+            APPL_TRACE_DEBUG("h:%d, thread id:%d", h, ts[h].thread_id);
             ts[h].callback = callback;
             ts[h].cmd_callback = cmd_callback;
         }
@@ -253,10 +253,10 @@
     asrt(ts[h].cmd_fdr == -1 && ts[h].cmd_fdw == -1);
     if(socketpair(AF_UNIX, SOCK_STREAM, 0, &ts[h].cmd_fdr) < 0)
     {
-        APPL_TRACE_ERROR1("socketpair failed: %s", strerror(errno));
+        APPL_TRACE_ERROR("socketpair failed: %s", strerror(errno));
         return;
     }
-    APPL_TRACE_DEBUG3("h:%d, cmd_fdr:%d, cmd_fdw:%d", h, ts[h].cmd_fdr, ts[h].cmd_fdw);
+    APPL_TRACE_DEBUG("h:%d, cmd_fdr:%d, cmd_fdw:%d", h, ts[h].cmd_fdr, ts[h].cmd_fdw);
     //add the cmd fd for read & write
     add_poll(h, ts[h].cmd_fdr, 0, SOCK_THREAD_FD_RD, 0);
 }
@@ -285,12 +285,12 @@
 {
     if(h < 0 || h >= MAX_THREAD)
     {
-        APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+        APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
         return FALSE;
     }
     if(ts[h].cmd_fdw == -1)
     {
-        APPL_TRACE_ERROR0("cmd socket is not created. socket thread may not initialized");
+        APPL_TRACE_ERROR("cmd socket is not created. socket thread may not initialized");
         return FALSE;
     }
     if(flags & SOCK_THREAD_ADD_FD_SYNC)
@@ -303,26 +303,26 @@
             add_poll(h, fd, type, flags, user_id);
             return TRUE;
         }
-        APPL_TRACE_DEBUG0("THREAD_ADD_FD_SYNC is not called in poll thread, fallback to async");
+        APPL_TRACE_DEBUG("THREAD_ADD_FD_SYNC is not called in poll thread, fallback to async");
     }
     sock_cmd_t cmd = {CMD_ADD_FD, fd, type, flags, user_id};
-    APPL_TRACE_DEBUG2("adding fd:%d, flags:0x%x", fd, flags);
+    APPL_TRACE_DEBUG("adding fd:%d, flags:0x%x", fd, flags);
     return send(ts[h].cmd_fdw, &cmd, sizeof(cmd), 0) == sizeof(cmd);
 }
 int btsock_thread_post_cmd(int h, int type, const unsigned char* data, int size, uint32_t user_id)
 {
     if(h < 0 || h >= MAX_THREAD)
     {
-        APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+        APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
         return FALSE;
     }
     if(ts[h].cmd_fdw == -1)
     {
-        APPL_TRACE_ERROR0("cmd socket is not created. socket thread may not initialized");
+        APPL_TRACE_ERROR("cmd socket is not created. socket thread may not initialized");
         return FALSE;
     }
     sock_cmd_t cmd = {CMD_USER_PRIVATE, 0, type, size, user_id};
-    APPL_TRACE_DEBUG3("post cmd type:%d, size:%d, h:%d, ", type, size, h);
+    APPL_TRACE_DEBUG("post cmd type:%d, size:%d, h:%d, ", type, size, h);
     sock_cmd_t* cmd_send = &cmd;
     int size_send = sizeof(cmd);
     if(data && size)
@@ -336,7 +336,7 @@
         }
         else
         {
-            APPL_TRACE_ERROR3("alloca failed at h:%d, cmd type:%d, size:%d", h, type, size_send);
+            APPL_TRACE_ERROR("alloca failed at h:%d, cmd type:%d, size:%d", h, type, size_send);
             return FALSE;
         }
     }
@@ -346,12 +346,12 @@
 {
     if(h < 0 || h >= MAX_THREAD)
     {
-        APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+        APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
         return FALSE;
     }
     if(ts[h].cmd_fdw == -1)
     {
-        APPL_TRACE_ERROR1("thread handle:%d, cmd socket is not created", h);
+        APPL_TRACE_ERROR("thread handle:%d, cmd socket is not created", h);
         return FALSE;
     }
     sock_cmd_t cmd = {CMD_WAKEUP, 0, 0, 0, 0};
@@ -361,12 +361,12 @@
 {
     if(h < 0 || h >= MAX_THREAD)
     {
-        APPL_TRACE_ERROR1("invalid bt thread handle:%d", h);
+        APPL_TRACE_ERROR("invalid bt thread handle:%d", h);
         return FALSE;
     }
     if(ts[h].cmd_fdw == -1)
     {
-        APPL_TRACE_ERROR0("cmd socket is not created");
+        APPL_TRACE_ERROR("cmd socket is not created");
         return FALSE;
     }
     sock_cmd_t cmd = {CMD_EXIT, 0, 0, 0, 0};
@@ -410,7 +410,7 @@
     ps->pfd.fd = fd;
     ps->user_id = user_id;
     if(ps->type != 0 && ps->type != type)
-        APPL_TRACE_ERROR2("poll socket type should not changed! type was:%d, type now:%d", ps->type, type);
+        APPL_TRACE_ERROR("poll socket type should not changed! type was:%d, type now:%d", ps->type, type);
     ps->type = type;
     ps->flags = flags;
     ps->pfd.events = flags2pevents(flags);
@@ -442,7 +442,7 @@
         ++ts[h].poll_count;
         return;
     }
-    APPL_TRACE_ERROR1("exceeded max poll slot:%d!", MAX_POLL);
+    APPL_TRACE_ERROR("exceeded max poll slot:%d!", MAX_POLL);
 }
 static inline void remove_poll(int h, poll_slot_t* ps, int flags)
 {
@@ -467,10 +467,10 @@
     int fd = ts[h].cmd_fdr;
     if(recv(fd, &cmd, sizeof(cmd), MSG_WAITALL) != sizeof(cmd))
     {
-        APPL_TRACE_ERROR1("recv cmd errno:%d", errno);
+        APPL_TRACE_ERROR("recv cmd errno:%d", errno);
         return FALSE;
     }
-    APPL_TRACE_DEBUG1("cmd.id:%d", cmd.id);
+    APPL_TRACE_DEBUG("cmd.id:%d", cmd.id);
     switch(cmd.id)
     {
         case CMD_ADD_FD:
@@ -486,7 +486,7 @@
         case CMD_EXIT:
             return FALSE;
         default:
-            APPL_TRACE_DEBUG1("unknown cmd: %d", cmd.id);
+            APPL_TRACE_DEBUG("unknown cmd: %d", cmd.id);
              break;
     }
     return TRUE;
@@ -538,7 +538,7 @@
     {
         if(ps_i >= MAX_POLL)
         {
-            APPL_TRACE_ERROR4("exceed max poll range, ps_i:%d, MAX_POLL:%d, count:%d, ts[h].poll_count:%d",
+            APPL_TRACE_ERROR("exceed max poll range, ps_i:%d, MAX_POLL:%d, count:%d, ts[h].poll_count:%d",
                     ps_i, MAX_POLL, count, ts[h].poll_count);
             return;
         }
@@ -556,14 +556,14 @@
 {
     struct pollfd pfds[MAX_POLL];
     memset(pfds, 0, sizeof(pfds));
-    int h = (int)arg;
+    int h = (intptr_t)arg;
     for(;;)
     {
         prepare_poll_fds(h, pfds);
         int ret = poll(pfds, ts[h].poll_count, -1);
         if(ret == -1)
         {
-            APPL_TRACE_ERROR2("poll ret -1, exit the thread, errno:%d, err:%s", errno, strerror(errno));
+            APPL_TRACE_ERROR("poll ret -1, exit the thread, errno:%d, err:%s", errno, strerror(errno));
             break;
         }
         if(ret != 0)
@@ -574,7 +574,7 @@
                 asrt(pfds[0].fd == ts[h].cmd_fdr);
                 if(!process_cmd_sock(h))
                 {
-                    APPL_TRACE_DEBUG1("h:%d, process_cmd_sock return false, exit...", h);
+                    APPL_TRACE_DEBUG("h:%d, process_cmd_sock return false, exit...", h);
                     break;
                 }
                 if(ret == 1)
@@ -584,10 +584,10 @@
             if(need_process_data_fd)
                 process_data_sock(h, pfds, ret);
         }
-        else {APPL_TRACE_DEBUG1("no data, select ret: %d", ret)};
+        else {APPL_TRACE_DEBUG("no data, select ret: %d", ret)};
     }
     ts[h].thread_id = -1;
-    APPL_TRACE_DEBUG1("socket poll thread exiting, h:%d", h);
+    APPL_TRACE_DEBUG("socket poll thread exiting, h:%d", h);
     return 0;
 }
 
diff --git a/btif/src/btif_sock_util.c b/btif/src/btif_sock_util.c
index 5b5de69..42089ed 100644
--- a/btif/src/btif_sock_util.c
+++ b/btif/src/btif_sock_util.c
@@ -66,7 +66,7 @@
 #include "bta_jv_co.h"
 #include "port_api.h"
 
-#define asrt(s) if(!(s)) BTIF_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
+#define asrt(s) if(!(s)) BTIF_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
 
 
 int sock_send_all(int sock_fd, const uint8_t* buf, int len)
@@ -79,7 +79,7 @@
         while(ret < 0 && errno == EINTR);
         if(ret <= 0)
         {
-            BTIF_TRACE_ERROR3("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret);
+            BTIF_TRACE_ERROR("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret);
             return -1;
         }
         buf += ret;
@@ -97,7 +97,7 @@
         while(ret < 0 && errno == EINTR);
         if(ret <= 0)
         {
-            BTIF_TRACE_ERROR3("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret);
+            BTIF_TRACE_ERROR("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret);
             return -1;
         }
         buf += ret;
@@ -145,7 +145,7 @@
         } while (ret < 0 && errno == EINTR);
 
         if (ret < 0) {
-            BTIF_TRACE_ERROR5("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s",
+            BTIF_TRACE_ERROR("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s",
                               sock_fd, send_fd, (int)ret, errno, strerror(errno));
             ret_len = -1;
             break;
@@ -157,7 +157,7 @@
         // Wipes out any msg_control too
         memset(&msg, 0, sizeof(msg));
     }
-    BTIF_TRACE_DEBUG1("close fd:%d after sent", send_fd);
+    BTIF_TRACE_DEBUG("close fd:%d after sent", send_fd);
     close(send_fd);
     return ret_len;
 }
diff --git a/btif/src/btif_storage.c b/btif/src/btif_storage.c
index 8f41ce5..5b1bf96 100644
--- a/btif/src/btif_storage.c
+++ b/btif/src/btif_storage.c
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (c) 2014 The Android Open Source Project
  *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,7 +42,9 @@
 #include "btif_storage.h"
 #include "btif_util.h"
 #include "bd.h"
+#include "config.h"
 #include "gki.h"
+#include "osi.h"
 #include "bta_hh_api.h"
 #include "btif_hh.h"
 
@@ -81,9 +84,6 @@
 #define BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR "DynamicAddressBlacklist"
 
 #define BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR ","
-#define BTIF_AUTO_PAIR_CONF_SPACE ' '
-#define BTIF_AUTO_PAIR_CONF_COMMENT '#'
-#define BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER "="
 
 
 /* This is a local property to add a device found */
@@ -186,35 +186,6 @@
 
 /*******************************************************************************
 **
-** Function         btif_in_make_filename
-**
-** Description      Internal helper function to create NVRAM file path
-**                  from address and filename
-**
-** Returns          NVRAM file path if successfull, NULL otherwise
-**
-*******************************************************************************/
-static char* btif_in_make_filename(bt_bdaddr_t *bd_addr, char *fname)
-{
-    static char path[256];
-    bdstr_t bdstr;
-
-    if (fname == NULL)return NULL;
-    if (bd_addr)
-    {
-        sprintf(path, "%s/%s/%s", BTIF_STORAGE_PATH_BLUEDROID,
-                bd2str(bd_addr, &bdstr), fname);
-    }
-    else
-    {
-        /* local adapter */
-        sprintf(path, "%s/LOCAL/%s", BTIF_STORAGE_PATH_BLUEDROID, fname);
-    }
-
-    return(char*)path;
-}
-/*******************************************************************************
-**
 ** Function         btif_in_split_uuids_string_to_list
 **
 ** Description      Internal helper function to split the string of UUIDs
@@ -249,11 +220,11 @@
     bdstr_t bdstr = {0};
     if(remote_bd_addr)
         bd2str(remote_bd_addr, &bdstr);
-    BTIF_TRACE_DEBUG3("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
+    BTIF_TRACE_DEBUG("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
     char value[1024];
     if(prop->len <= 0 || prop->len > (int)sizeof(value) - 1)
     {
-        BTIF_TRACE_ERROR2("property type:%d, len:%d is invalid", prop->type, prop->len);
+        BTIF_TRACE_ERROR("property type:%d, len:%d is invalid", prop->type, prop->len);
         return FALSE;
     }
     switch(prop->type)
@@ -274,11 +245,15 @@
                                 BTIF_STORAGE_PATH_REMOTE_NAME, value);
             else btif_config_set_str("Local", "Adapter",
                                 BTIF_STORAGE_KEY_ADAPTER_NAME, value);
+            /* save name immediately */
+            btif_config_save();
             break;
         case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
             strncpy(value, (char*)prop->val, prop->len);
             value[prop->len]='\0';
             btif_config_set_str("Remote", bdstr, BTIF_STORAGE_PATH_REMOTE_ALIASE, value);
+            /* save friendly name immediately */
+            btif_config_save();
             break;
         case BT_PROPERTY_ADAPTER_SCAN_MODE:
             btif_config_set_int("Local", "Adapter",
@@ -331,7 +306,7 @@
          } break;
 
         default:
-             BTIF_TRACE_ERROR1("Unknow prop type:%d", prop->type);
+             BTIF_TRACE_ERROR("Unknow prop type:%d", prop->type);
              return FALSE;
     }
     return TRUE;
@@ -341,10 +316,10 @@
     bdstr_t bdstr = {0};
     if(remote_bd_addr)
         bd2str(remote_bd_addr, &bdstr);
-    BTIF_TRACE_DEBUG3("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
+    BTIF_TRACE_DEBUG("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len);
     if(prop->len <= 0)
     {
-        BTIF_TRACE_ERROR2("property type:%d, len:%d is invalid", prop->type, prop->len);
+        BTIF_TRACE_ERROR("property type:%d, len:%d is invalid", prop->type, prop->len);
         return FALSE;
     }
     int ret = FALSE;
@@ -446,12 +421,58 @@
          } break;
 
         default:
-            BTIF_TRACE_ERROR1("Unknow prop type:%d", prop->type);
+            BTIF_TRACE_ERROR("Unknow prop type:%d", prop->type);
             return FALSE;
     }
     return ret;
 }
 
+/*******************************************************************************
+**
+** Function         btif_in_fetch_bonded_devices
+**
+** Description      Internal helper function to fetch the bonded devices
+**                  from NVRAM
+**
+** Returns          BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+static bt_status_t btif_in_fetch_bonded_device(char *bdstr)
+{
+    BOOLEAN bt_linkkey_file_found=FALSE;
+    int device_type;
+
+        int type = BTIF_CFG_TYPE_BIN;
+        LINK_KEY link_key;
+        int size = sizeof(link_key);
+        if(btif_config_get("Remote", bdstr, "LinkKey", (char*)link_key, &size, &type))
+        {
+            int linkkey_type;
+            if(btif_config_get_int("Remote", bdstr, "LinkKeyType", &linkkey_type))
+            {
+                bt_linkkey_file_found = TRUE;
+            }
+            else
+            {
+                bt_linkkey_file_found = FALSE;
+            }
+        }
+#if (BLE_INCLUDED == TRUE)
+        if((btif_in_fetch_bonded_ble_device(bdstr, FALSE, NULL) != BT_STATUS_SUCCESS)
+                && (!bt_linkkey_file_found))
+        {
+            BTIF_TRACE_DEBUG("Remote device:%s, no link key or ble key found", bdstr);
+            return BT_STATUS_FAIL;
+        }
+#else
+        if((!bt_linkkey_file_found))
+        {
+            BTIF_TRACE_DEBUG("Remote device:%s, no link key found", bdstr);
+            return BT_STATUS_FAIL;
+        }
+#endif
+    return BT_STATUS_SUCCESS;
+}
 
 /*******************************************************************************
 **
@@ -465,7 +486,7 @@
 *******************************************************************************/
 static bt_status_t btif_in_fetch_bonded_devices(btif_bonded_devices_t *p_bonded_devices, int add)
 {
-    BTIF_TRACE_DEBUG1("in add:%d", add);
+    BTIF_TRACE_DEBUG("in add:%d", add);
     memset(p_bonded_devices, 0, sizeof(btif_bonded_devices_t));
 
     char kname[128], vname[128];
@@ -480,7 +501,7 @@
     do
     {
         kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size);
-        BTIF_TRACE_DEBUG2("Remote device:%s, size:%d", kname, kname_size);
+        BTIF_TRACE_DEBUG("Remote device:%s, size:%d", kname, kname_size);
         int type = BTIF_CFG_TYPE_BIN;
         LINK_KEY link_key;
         int size = sizeof(link_key);
@@ -517,49 +538,26 @@
 #if (BLE_INCLUDED == TRUE)
                 bt_linkkey_file_found = FALSE;
 #else
-                BTIF_TRACE_ERROR1("bounded device:%s, LinkKeyType or PinLength is invalid", kname);
+                BTIF_TRACE_ERROR("bounded device:%s, LinkKeyType or PinLength is invalid", kname);
 #endif
             }
         }
 #if (BLE_INCLUDED == TRUE)
             if(!(btif_in_fetch_bonded_ble_device(kname,add, p_bonded_devices)) && (!bt_linkkey_file_found))
             {
-                BTIF_TRACE_DEBUG1("Remote device:%s, no link key or ble key found", kname);
+                BTIF_TRACE_DEBUG("Remote device:%s, no link key or ble key found", kname);
             }
 #else
             if(!bt_linkkey_file_found)
-                BTIF_TRACE_DEBUG1("Remote device:%s, no link key", kname);
+                BTIF_TRACE_DEBUG("Remote device:%s, no link key", kname);
 #endif
         kname_size = sizeof(kname);
         kname[0] = 0;
     } while(kpos != -1);
-    BTIF_TRACE_DEBUG0("out");
+    BTIF_TRACE_DEBUG("out");
     return BT_STATUS_SUCCESS;
 }
 
-static int hex_str_to_int(const char* str, int size)
-{
-    int  n = 0;
-    char c = *str++;
-    while (size-- != 0)
-    {
-        n <<= 4;
-        if (c >= '0' && c <= '9') {
-            n |= c - '0';
-        }
-        else if (c >= 'a' && c <= 'z') {
-            n |= c - 'a' + 10;
-        }
-        else // (c >= 'A' && c <= 'Z')
-        {
-            n |= c - 'A' + 10;
-        }
-
-        c = *str++;
-    }
-    return n;
-}
-
 /************************************************************************************
 **  Externs
 ************************************************************************************/
@@ -605,7 +603,7 @@
 
         btif_in_fetch_bonded_devices(&bonded_devices, 0);
 
-        BTIF_TRACE_DEBUG2("%s: Number of bonded devices: %d Property:BT_PROPERTY_ADAPTER_BONDED_DEVICES", __FUNCTION__, bonded_devices.num_devices);
+        BTIF_TRACE_DEBUG("%s: Number of bonded devices: %d Property:BT_PROPERTY_ADAPTER_BONDED_DEVICES", __FUNCTION__, bonded_devices.num_devices);
 
         if (bonded_devices.num_devices > 0)
         {
@@ -624,7 +622,7 @@
         uint32_t i;
 
         tBTA_SERVICE_MASK service_mask = btif_get_enabled_services_mask();
-        BTIF_TRACE_ERROR2("%s service_mask:0x%x", __FUNCTION__, service_mask);
+        BTIF_TRACE_ERROR("%s service_mask:0x%x", __FUNCTION__, service_mask);
         for (i=0; i < BTA_MAX_SERVICE_ID; i++)
         {
             /* This should eventually become a function when more services are enabled */
@@ -652,6 +650,12 @@
                                               p_uuid+num_uuids);
                             num_uuids++;
                         }break;
+                    case BTA_HFP_HS_SERVICE_ID:
+                        {
+                            uuid16_to_uuid128(UUID_SERVCLASS_HF_HANDSFREE,
+                                              p_uuid+num_uuids);
+                            num_uuids++;
+                        }break;
                 }
             }
         }
@@ -783,7 +787,8 @@
     int ret = btif_config_set_int("Remote", bdstr, "LinkKeyType", (int)key_type);
     ret &= btif_config_set_int("Remote", bdstr, "PinLength", (int)pin_length);
     ret &= btif_config_set("Remote", bdstr, "LinkKey", (const char*)link_key, sizeof(LINK_KEY), BTIF_CFG_TYPE_BIN);
-    btif_config_save();
+    /* write bonded info immediately */
+    btif_config_flush();
     return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
 }
 
@@ -801,11 +806,16 @@
 {
     bdstr_t bdstr;
     bd2str(remote_bd_addr, &bdstr);
-    BTIF_TRACE_DEBUG1("in bd addr:%s", bdstr);
-    int ret = btif_config_remove("Remote", bdstr, "LinkKeyType");
-    ret &= btif_config_remove("Remote", bdstr, "PinLength");
-    ret &= btif_config_remove("Remote", bdstr, "LinkKey");
-    btif_config_save();
+    BTIF_TRACE_DEBUG("in bd addr:%s", bdstr);
+    int ret = 1;
+    if(btif_config_exist("Remote", bdstr, "LinkKeyType"))
+        ret &= btif_config_remove("Remote", bdstr, "LinkKeyType");
+    if(btif_config_exist("Remote", bdstr, "PinLength"))
+        ret &= btif_config_remove("Remote", bdstr, "PinLength");
+    if(btif_config_exist("Remote", bdstr, "LinkKey"))
+        ret &= btif_config_remove("Remote", bdstr, "LinkKey");
+    /* write bonded info immediately */
+    btif_config_flush();
     return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
 
 }
@@ -894,7 +904,7 @@
         free(devices_list);
     }
 
-    BTIF_TRACE_EVENT2("%s: %d bonded devices found", __FUNCTION__, bonded_devices.num_devices);
+    BTIF_TRACE_EVENT("%s: %d bonded devices found", __FUNCTION__, bonded_devices.num_devices);
 
     {
         for (i = 0; i < bonded_devices.num_devices; i++)
@@ -1041,7 +1051,7 @@
 {
     bdstr_t bdstr;
     bd2str(remote_bd_addr, &bdstr);
-    BTIF_TRACE_DEBUG2(" %s in bd addr:%s",__FUNCTION__, bdstr);
+    BTIF_TRACE_DEBUG(" %s in bd addr:%s",__FUNCTION__, bdstr);
     int ret = 1;
     if(btif_config_exist("Remote", bdstr, "LE_KEY_PENC"))
         ret &= btif_config_remove("Remote", bdstr, "LE_KEY_PENC");
@@ -1166,13 +1176,14 @@
     bt_bdaddr_t bd_addr;
     BD_ADDR bta_bd_addr;
     BOOLEAN is_device_added =FALSE;
+    BOOLEAN key_found = FALSE;
     tBTA_LE_KEY_VALUE *p;
 
     if(!btif_config_get_int("Remote", remote_bd_addr,"DevType", &device_type))
         return BT_STATUS_FAIL;
     if(device_type == BT_DEVICE_TYPE_BLE)
     {
-            BTIF_TRACE_DEBUG2("%s %s found a BLE device", __FUNCTION__,remote_bd_addr);
+            BTIF_TRACE_DEBUG("%s %s found a BLE device", __FUNCTION__,remote_bd_addr);
             str2bd(remote_bd_addr, &bd_addr);
             bdcpy(bta_bd_addr, bd_addr.address);
             if (btif_storage_get_remote_addr_type(&bd_addr, &addr_type) != BT_STATUS_SUCCESS)
@@ -1196,24 +1207,25 @@
                     p = (tBTA_LE_KEY_VALUE *)buf;
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("penc_key.ltk[%d]=0x%02x",i,p->penc_key.ltk[i]);
+                        BTIF_TRACE_DEBUG("penc_key.ltk[%d]=0x%02x",i,p->penc_key.ltk[i]);
                     }
                     for (i=0; i<8; i++)
                     {
-                        BTIF_TRACE_DEBUG2("penc_key.rand[%d]=0x%02x",i,p->penc_key.rand[i]);
+                        BTIF_TRACE_DEBUG("penc_key.rand[%d]=0x%02x",i,p->penc_key.rand[i]);
                     }
-                    BTIF_TRACE_DEBUG1("p->penc_key.ediv=0x%04x",p->penc_key.ediv);
-                    BTIF_TRACE_DEBUG1("p->penc_key.sec_level=0x%02x",p->penc_key.sec_level);
-                    BTIF_TRACE_DEBUG1("p->penc_key.key_size=0x%02x",p->penc_key.key_size);
+                    BTIF_TRACE_DEBUG("p->penc_key.ediv=0x%04x",p->penc_key.ediv);
+                    BTIF_TRACE_DEBUG("p->penc_key.sec_level=0x%02x",p->penc_key.sec_level);
+                    BTIF_TRACE_DEBUG("p->penc_key.key_size=0x%02x",p->penc_key.key_size);
                     BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PENC);
                 }
+                key_found = TRUE;
             }
 
             memset(buf, 0, sizeof(buf));
             if (btif_storage_get_ble_bonding_key(&bd_addr,
                                                  BTIF_DM_LE_KEY_PID,
                                                  buf,
-                                                 sizeof(btif_dm_ble_pcsrk_keys_t)) == BT_STATUS_SUCCESS)
+                                                 sizeof(btif_dm_ble_pid_keys_t)) == BT_STATUS_SUCCESS)
             {
                 if(add)
                 {
@@ -1225,11 +1237,19 @@
                     p = (tBTA_LE_KEY_VALUE *)buf;
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("p->pid_key[%d]=0x%02x",i,p->pid_key.irk[i]);
+                        BTIF_TRACE_DEBUG("p->pid_key.irk[%d]=0x%02x"
+                                            ,i,p->pid_key.irk[i]);
+                    }
+                    BTIF_TRACE_DEBUG("p->pid_key.addr_type=%d",p->pid_key.addr_type);
+                    for (i=0; i<BD_ADDR_LEN; i++)
+                    {
+                        BTIF_TRACE_DEBUG("p->pid_key.static_addr[%d]=%02x"
+                                            ,i,p->pid_key.static_addr[i]);
                     }
 
                     BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PID);
                 }
+                key_found = TRUE;
             }
 
             memset(buf, 0, sizeof(buf));
@@ -1249,13 +1269,14 @@
                     p = (tBTA_LE_KEY_VALUE *)buf;
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG2("p->pcsrk_key.csrk[%d]=0x%02x",i, p->psrk_key.csrk[i]);
+                        BTIF_TRACE_DEBUG("p->pcsrk_key.csrk[%d]=0x%02x",i, p->psrk_key.csrk[i]);
                     }
-                    BTIF_TRACE_DEBUG1("p->pcsrk_key.counter=0x%08x",p->psrk_key.counter);
-                    BTIF_TRACE_DEBUG1("p->pcsrk_key.sec_level=0x%02x",p->psrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("p->pcsrk_key.counter=0x%08x",p->psrk_key.counter);
+                    BTIF_TRACE_DEBUG("p->pcsrk_key.sec_level=0x%02x",p->psrk_key.sec_level);
 
                     BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PCSRK);
                 }
+                key_found = TRUE;
             }
 
             memset(buf, 0, sizeof(buf));
@@ -1272,12 +1293,13 @@
                         is_device_added = TRUE;
                     }
                     p = (tBTA_LE_KEY_VALUE *)buf;
-                    BTIF_TRACE_DEBUG1("p->lenc_key.div=0x%04x",p->lenc_key.div);
-                    BTIF_TRACE_DEBUG1("p->lenc_key.key_size=0x%02x",p->lenc_key.key_size);
-                    BTIF_TRACE_DEBUG1("p->lenc_key.sec_level=0x%02x",p->lenc_key.sec_level);
+                    BTIF_TRACE_DEBUG("p->lenc_key.div=0x%04x",p->lenc_key.div);
+                    BTIF_TRACE_DEBUG("p->lenc_key.key_size=0x%02x",p->lenc_key.key_size);
+                    BTIF_TRACE_DEBUG("p->lenc_key.sec_level=0x%02x",p->lenc_key.sec_level);
 
                     BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_LENC);
                 }
+                key_found = TRUE;
             }
 
             memset(buf, 0, sizeof(buf));
@@ -1294,12 +1316,13 @@
                         is_device_added = TRUE;
                     }
                     p = (tBTA_LE_KEY_VALUE *)buf;
-                    BTIF_TRACE_DEBUG1("p->lcsrk_key.div=0x%04x",p->lcsrk_key.div);
-                    BTIF_TRACE_DEBUG1("p->lcsrk_key.counter=0x%08x",p->lcsrk_key.counter);
-                    BTIF_TRACE_DEBUG1("p->lcsrk_key.sec_level=0x%02x",p->lcsrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("p->lcsrk_key.div=0x%04x",p->lcsrk_key.div);
+                    BTIF_TRACE_DEBUG("p->lcsrk_key.counter=0x%08x",p->lcsrk_key.counter);
+                    BTIF_TRACE_DEBUG("p->lcsrk_key.sec_level=0x%02x",p->lcsrk_key.sec_level);
 
                     BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_LCSRK);
                 }
+                key_found = TRUE;
             }
 
             /* Fill in the bonded devices */
@@ -1309,7 +1332,10 @@
                 btif_gatts_add_bonded_dev_from_nv(bta_bd_addr);
             }
 
-            return BT_STATUS_SUCCESS;
+            if(key_found)
+                return BT_STATUS_SUCCESS;
+            else
+                return BT_STATUS_FAIL;
     }
     return BT_STATUS_FAIL;
 }
@@ -1362,7 +1388,7 @@
                                                     UINT16 ssr_min_tout, UINT16 dl_len, UINT8 *dsc_list)
 {
     bdstr_t bdstr;
-    BTIF_TRACE_DEBUG0("btif_storage_add_hid_device_info:");
+    BTIF_TRACE_DEBUG("btif_storage_add_hid_device_info:");
     bd2str(remote_bd_addr, &bdstr);
     btif_config_set_int("Remote", bdstr, "HidAttrMask", attr_mask);
     btif_config_set_int("Remote", bdstr, "HidSubClass", sub_class);
@@ -1409,53 +1435,64 @@
     do
     {
         kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size);
-        BTIF_TRACE_DEBUG2("Remote device:%s, size:%d", kname, kname_size);
+        BTIF_TRACE_DEBUG("Remote device:%s, size:%d", kname, kname_size);
         int value;
-        if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
+        if(btif_in_fetch_bonded_device(kname) == BT_STATUS_SUCCESS)
         {
-            attr_mask = (uint16_t)value;
-
-            btif_config_get_int("Remote", kname, "HidSubClass", &value);
-            sub_class = (uint8_t)value;
-
-            btif_config_get_int("Remote", kname, "HidAppId", &value);
-            app_id = (uint8_t)value;
-
-            btif_config_get_int("Remote", kname, "HidVendorId", &value);
-            dscp_info.vendor_id = (uint16_t) value;
-
-            btif_config_get_int("Remote", kname, "HidProductId", &value);
-            dscp_info.product_id = (uint16_t) value;
-
-            btif_config_get_int("Remote", kname, "HidVersion", &value);
-            dscp_info.version = (uint8_t) value;
-
-            btif_config_get_int("Remote", kname, "HidCountryCode", &value);
-            dscp_info.ctry_code = (uint8_t) value;
-
-            value = 0;
-            btif_config_get_int("Remote", kname, "HidSSRMaxLatency", &value);
-            dscp_info.ssr_max_latency = (uint16_t) value;
-
-            value = 0;
-            btif_config_get_int("Remote", kname, "HidSSRMinTimeout", &value);
-            dscp_info.ssr_min_tout = (uint16_t) value;
-
-            int len = 0;
-            int type;
-            btif_config_get("Remote", kname, "HidDescriptor", NULL, &len, &type);
-            if(len > 0)
+            if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
             {
-                dscp_info.descriptor.dl_len = (uint16_t)len;
-                dscp_info.descriptor.dsc_list = (uint8_t*)alloca(len);
-                btif_config_get("Remote", kname, "HidDescriptor", (char*)dscp_info.descriptor.dsc_list, &len, &type);
+                attr_mask = (uint16_t)value;
+
+                btif_config_get_int("Remote", kname, "HidSubClass", &value);
+                sub_class = (uint8_t)value;
+
+                btif_config_get_int("Remote", kname, "HidAppId", &value);
+                app_id = (uint8_t)value;
+
+                btif_config_get_int("Remote", kname, "HidVendorId", &value);
+                dscp_info.vendor_id = (uint16_t) value;
+
+                btif_config_get_int("Remote", kname, "HidProductId", &value);
+                dscp_info.product_id = (uint16_t) value;
+
+                btif_config_get_int("Remote", kname, "HidVersion", &value);
+                dscp_info.version = (uint8_t) value;
+
+                btif_config_get_int("Remote", kname, "HidCountryCode", &value);
+                dscp_info.ctry_code = (uint8_t) value;
+
+                value = 0;
+                btif_config_get_int("Remote", kname, "HidSSRMaxLatency", &value);
+                dscp_info.ssr_max_latency = (uint16_t) value;
+
+                value = 0;
+                btif_config_get_int("Remote", kname, "HidSSRMinTimeout", &value);
+                dscp_info.ssr_min_tout = (uint16_t) value;
+
+                int len = 0;
+                int type;
+                btif_config_get("Remote", kname, "HidDescriptor", NULL, &len, &type);
+                if(len > 0)
+                {
+                    dscp_info.descriptor.dl_len = (uint16_t)len;
+                    dscp_info.descriptor.dsc_list = (uint8_t*)alloca(len);
+                    btif_config_get("Remote", kname, "HidDescriptor", (char*)dscp_info.descriptor.dsc_list, &len, &type);
+                }
+                str2bd(kname, &bd_addr);
+                // add extracted information to BTA HH
+                if (btif_hh_add_added_dev(bd_addr,attr_mask))
+                {
+                    BTA_HhAddDev(bd_addr.address, attr_mask, sub_class,
+                            app_id, dscp_info);
+                }
             }
-            str2bd(kname, &bd_addr);
-            // add extracted information to BTA HH
-            if (btif_hh_add_added_dev(bd_addr,attr_mask))
+        }
+        else
+        {
+            if(btif_config_get_int("Remote", kname, "HidAttrMask", &value))
             {
-                BTA_HhAddDev(bd_addr.address, attr_mask, sub_class,
-                        app_id, dscp_info);
+                btif_storage_remove_hid_info(&bd_addr);
+                str2bd(kname, &bd_addr);
             }
         }
     } while(kpos != -1);
@@ -1533,7 +1570,7 @@
         {
             if ((read_size != value_size) || (read_type != BTIF_CFG_TYPE_BIN) )
             {
-                BTIF_TRACE_ERROR4("%s  value_size=%d read_size=%d read_type=%d",
+                BTIF_TRACE_ERROR("%s  value_size=%d read_size=%d read_type=%d",
                                   __FUNCTION__, value_size, read_size, read_type);
                 bt_status = BT_STATUS_FAIL;
             }
@@ -1541,7 +1578,7 @@
 
     }
 
-    BTIF_TRACE_DEBUG3("%s  status=%d value_size=%d", __FUNCTION__, bt_status, value_size);
+    BTIF_TRACE_DEBUG("%s  status=%d value_size=%d", __FUNCTION__, bt_status, value_size);
     return bt_status;
 }
 
@@ -1556,59 +1593,34 @@
 **                  BT_STATUS_FAIL otherwise
 **
 *******************************************************************************/
-
-bt_status_t btif_storage_load_autopair_device_list()
-{
-    char *key_name, *key_value;
-    int i=0;
-    char linebuf[BTIF_STORAGE_MAX_LINE_SZ];
-    char *line;
-    FILE *fp;
-
-    if(!btif_config_exist("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, NULL))
-    {
-        /* first time loading of auto pair blacklist configuration  */
-
-        fp = fopen (BTIF_AUTO_PAIR_CONF_FILE, "r");
-
-        if (fp == NULL)
-        {
-            ALOGE("%s: Failed to open auto pair blacklist conf file at %s", __FUNCTION__,BTIF_AUTO_PAIR_CONF_FILE );
-            return BT_STATUS_FAIL;
-        }
-
-        /* read through auto_pairing.conf file and create the key value pairs specific to  auto pair blacklist devices */
-        while (fgets(linebuf, BTIF_STORAGE_MAX_LINE_SZ, fp) != NULL)
-        {
-            /* trip  leading white spaces */
-            while (linebuf[i] == BTIF_AUTO_PAIR_CONF_SPACE)
-                i++;
-
-            /* skip  commented lines */
-            if (linebuf[i] == BTIF_AUTO_PAIR_CONF_COMMENT)
-                continue;
-
-            line = (char*)&(linebuf[i]);
-
-            if (line == NULL)
-                continue;
-
-            key_name = strtok(line, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER);
-
-            if (key_name == NULL)
-                continue;
-            else if((strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR) == 0) ||
-                    (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME) ==0) ||
-                    (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST) ==0 ) ||
-                    (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME) == 0) ||
-                    (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR) == 0))
-            {
-                key_value = strtok(NULL, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER);
-                btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, key_name, key_value);
-            }
-        }
-        fclose(fp);
+bt_status_t btif_storage_load_autopair_device_list() {
+    // Configuration has already been loaded. No need to reload.
+    if (btif_config_exist("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, NULL)) {
+        return BT_STATUS_SUCCESS;
     }
+
+    static const char *key_names[] = {
+        BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR,
+        BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME,
+        BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST,
+        BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME,
+        BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR,
+    };
+
+    config_t *config = config_new(BTIF_AUTO_PAIR_CONF_FILE);
+    if (!config) {
+        ALOGE("%s failed to open auto pair blacklist conf file '%s'.", __func__, BTIF_AUTO_PAIR_CONF_FILE);
+        return BT_STATUS_FAIL;
+    }
+
+    for (size_t i = 0; i < ARRAY_SIZE(key_names); ++i) {
+        const char *value = config_get_string(config, CONFIG_DEFAULT_SECTION, key_names[i], NULL);
+        if (value) {
+            btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, key_names[i], value);
+        }
+    }
+
+    config_free(config);
     return BT_STATUS_SUCCESS;
 }
 
@@ -1738,8 +1750,8 @@
 
     bd2str(remote_bd_addr, &bdstr);
 
-	/*consider on LAP part of BDA string*/
-	bdstr[8] = '\0';
+    /*consider on LAP part of BDA string*/
+    bdstr[8] = '\0';
 
     int line_size = sizeof(linebuf);
     if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST,
@@ -1751,3 +1763,68 @@
     return FALSE;
 
 }
+
+/*******************************************************************************
+**
+** Function         btif_storage_set_dmt_support_type
+**
+** Description      Sets DMT support status for a remote device
+**
+** Returns          BT_STATUS_SUCCESS if config update is successful
+**                  BT_STATUS_FAIL otherwise
+**
+*******************************************************************************/
+
+bt_status_t btif_storage_set_dmt_support_type(const bt_bdaddr_t *remote_bd_addr,
+                                                   BOOLEAN dmt_supported)
+{
+    int ret;
+    bdstr_t bdstr = {0};
+    if(remote_bd_addr)
+    {
+        bd2str(remote_bd_addr, &bdstr);
+    }
+    else
+    {
+        BTIF_TRACE_ERROR("%s  NULL BD Address", __FUNCTION__);
+        return BT_STATUS_FAIL;
+    }
+
+   ret = btif_config_set_int("Remote", bdstr,"DMTSupported", (int)dmt_supported);
+   return ret ? BT_STATUS_SUCCESS:BT_STATUS_FAIL;
+
+}
+
+/*******************************************************************************
+**
+** Function         btif_storage_is_dmt_supported_device
+**
+** Description      checks if a device supports Dual mode topology
+**
+** Returns         TRUE if remote address is valid and supports DMT else FALSE
+**
+*******************************************************************************/
+
+BOOLEAN btif_storage_is_dmt_supported_device(const bt_bdaddr_t *remote_bd_addr)
+{
+    int    dmt_supported = 0;
+    bdstr_t bdstr = {0};
+    if(remote_bd_addr)
+        bd2str(remote_bd_addr, &bdstr);
+
+    if(remote_bd_addr)
+    {
+        bd2str(remote_bd_addr, &bdstr);
+    }
+    else
+    {
+        BTIF_TRACE_ERROR("%s  NULL BD Address", __FUNCTION__);
+        return FALSE;
+    }
+
+    btif_config_get_int("Remote", bdstr,"DMTSupported", &dmt_supported);
+
+    return dmt_supported == 1 ? TRUE:FALSE;
+}
+
+
diff --git a/btif/src/btif_util.c b/btif/src/btif_util.c
old mode 100755
new mode 100644
index 96685f2..bd376a6
--- a/btif/src/btif_util.c
+++ b/btif/src/btif_util.c
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (c) 2014 The Android Open Source Project
  *  Copyright (C) 2009-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -47,6 +48,7 @@
 #include "bta_ag_api.h"
 #include "bta_av_api.h"
 #include "bta_hh_api.h"
+#include "bta_hf_client_api.h"
 #include "avrc_defs.h"
 
 
@@ -85,7 +87,7 @@
 {
     int32_t i = 0;
     for (i = 0; i < 6; i++) {
-       addr->address[i] = (uint8_t) strtoul(str, (char **)&str, 16);
+       addr->address[i] = (uint8_t)strtoul(str, &str, 16);
        str++;
     }
     return 0;
@@ -95,10 +97,10 @@
 {
     const uint8_t *addr = bdaddr->address;
 
-    snprintf((char*)bdstr, sizeof(*bdstr), "%02x:%02x:%02x:%02x:%02x:%02x",
+    sprintf(*bdstr, "%02x:%02x:%02x:%02x:%02x:%02x",
              addr[0], addr[1], addr[2],
              addr[3], addr[4], addr[5]);
-    return (char *)bdstr;
+    return *bdstr;
 }
 
 UINT32 devclass2uint(DEV_CLASS dev_class)
@@ -280,6 +282,7 @@
         CASE_RETURN_STR(BTA_DM_BLE_AUTH_CMPL_EVT)
         CASE_RETURN_STR(BTA_DM_DEV_UNPAIRED_EVT)
         CASE_RETURN_STR(BTA_DM_HW_ERROR_EVT)
+        CASE_RETURN_STR(BTA_DM_ENER_INFO_READ)
 
         default:
             return "UNKNOWN DM EVENT";
@@ -301,7 +304,9 @@
         CASE_RETURN_STR(BTA_AG_MIC_EVT)
         CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT)
         CASE_RETURN_STR(BTA_AG_DISABLE_EVT)
-
+#if (BTM_WBS_INCLUDED == TRUE )
+        CASE_RETURN_STR(BTA_AG_WBS_EVT)
+#endif
         CASE_RETURN_STR(BTA_AG_AT_A_EVT)
         CASE_RETURN_STR(BTA_AG_AT_D_EVT)
         CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT)
@@ -326,6 +331,38 @@
      }
 }
 
+const char* dump_hf_client_event(UINT16 event)
+{
+    switch(event)
+    {
+        CASE_RETURN_STR(BTA_HF_CLIENT_ENABLE_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_REGISTER_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_OPEN_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CLOSE_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CONN_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_OPEN_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_AUDIO_CLOSE_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_SPK_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_MIC_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_DISABLE_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_IND_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_VOICE_REC_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_OPERATOR_NAME_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CLIP_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CCWA_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_AT_RESULT_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CLCC_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_CNUM_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_BTRH_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_BSIR_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_BINP_EVT)
+        CASE_RETURN_STR(BTA_HF_CLIENT_RING_INDICATION)
+        default:
+            return "UNKNOWN MSG ID";
+     }
+}
+
 const char* dump_hh_event(UINT16 event)
 {
     switch(event)
diff --git a/conf/bt_did.conf b/conf/bt_did.conf
index b08a938..ea89c06 100644
--- a/conf/bt_did.conf
+++ b/conf/bt_did.conf
@@ -1,8 +1,5 @@
 # Device ID (DID) configuration
-[DID]
-
-# Record Number: 1, 2 or 3 - maximum of 3 records
-recordNumber = 1
+[DID1]
 
 # Primary Record - true or false (default)
 # There can be only one primary record
@@ -31,10 +28,7 @@
 
 #=================================================================================================#
 # Device ID (DID) configuration
-[DID]
-
-# Record number: 1, 2 or 3 - maximum of 3 records
-#recordNumber = 2
+[DID2]
 
 # Primary Record - true or false (default)
 # There can be only one primary record
@@ -63,10 +57,7 @@
 
 #=================================================================================================#
 # Device ID (DID) configuration
-[DID]
-
-# Record number: 1, 2 or 3 - maximum of 3 records
-#recordNumber = 3
+[DID3]
 
 # Primary Record - true or false (default)
 # There can be only one primary record
diff --git a/conf/bt_stack.conf b/conf/bt_stack.conf
index 2ca20ea..711fe51 100644
--- a/conf/bt_stack.conf
+++ b/conf/bt_stack.conf
@@ -5,6 +5,9 @@
 # BtSnoop log output file
 BtSnoopFileName=/sdcard/btsnoop_hci.log
 
+# Preserve existing BtSnoop log before overwriting
+BtSnoopSaveLog=false
+
 # Enable trace level reconfiguration function
 # Must be present before any TRC_ trace level settings
 TraceConf=true
diff --git a/doc/btsnoop_net.md b/doc/btsnoop_net.md
new file mode 100644
index 0000000..efd1071
--- /dev/null
+++ b/doc/btsnoop_net.md
@@ -0,0 +1,15 @@
+btsnoop_net
+====
+btsnoop_net exposes Bluetooth snoop logs over a local TCP socket which enables
+real-time debugging of HCI data with hcidump.
+
+This feature is enabled by  setting `BtSnoopLogOutput=true` in `bt_stack.conf`.
+Once it has been enabled and the stack restarted, bluedroid will listen for
+incoming TCP connections on port 8872.
+
+To use this feature with hcidump on a Linux host, you can run:
+
+```
+  $ adb forward tcp:8872 tcp:8872
+  $ nc localhost 8872 | hcidump -r /dev/stdin
+```
diff --git a/doc/properties.md b/doc/properties.md
new file mode 100644
index 0000000..b279b01
--- /dev/null
+++ b/doc/properties.md
@@ -0,0 +1,15 @@
+Properties
+===
+This document describes all of the Android properties used by bluedroid.
+
+Please keep the following list in alphabetical order.
+
+### TODO (Broadcom): write descriptions of what each property means and how
+it's used.
+
+* ``` debug.sys.noschedgroups ```
+* ``` persist.service.bdroid.bdaddr ```
+* ``` ro.bluetooth.hfp.ver ```
+* ``` ro.bt.bdaddr_path ```
+* ``` ro.product.model ```
+* ``` service.brcm.bt.oob ```
diff --git a/embdrv/Android.mk b/embdrv/Android.mk
new file mode 100755
index 0000000..6e92be4
--- /dev/null
+++ b/embdrv/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
diff --git a/embdrv/sbc/Android.mk b/embdrv/sbc/Android.mk
new file mode 100755
index 0000000..6e92be4
--- /dev/null
+++ b/embdrv/sbc/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
+
+# Cleanup our locals
+#bdroid_C_INCLUDES :=
+#bdroid_CFLaGS :=
diff --git a/embdrv/sbc/decoder/Android.mk b/embdrv/sbc/decoder/Android.mk
new file mode 100755
index 0000000..68fd143
--- /dev/null
+++ b/embdrv/sbc/decoder/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# sbc decoder
+LOCAL_SRC_FILES+= \
+        ./srce/alloc.c \
+        ./srce/bitalloc.c \
+        ./srce/bitalloc-sbc.c \
+        ./srce/bitstream-decode.c \
+        ./srce/decoder-oina.c \
+        ./srce/decoder-private.c \
+        ./srce/decoder-sbc.c \
+        ./srce/dequant.c \
+        ./srce/framing.c \
+        ./srce/framing-sbc.c \
+        ./srce/oi_codec_version.c \
+        ./srce/synthesis-sbc.c \
+        ./srce/synthesis-dct8.c \
+        ./srce/synthesis-8-generated.c \
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/srce
+
+LOCAL_MODULE:= libbt-qcom_sbc_decoder
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/embdrv/sbc/decoder/include/oi_assert.h b/embdrv/sbc/decoder/include/oi_assert.h
new file mode 100644
index 0000000..35d86cf
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_assert.h
@@ -0,0 +1,86 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_ASSERT_H
+#define _OI_ASSERT_H
+/** @file
+  This file provides macros and functions for compile-time and run-time assertions.
+
+  When the OI_DEBUG preprocessor value is defined, the macro OI_ASSERT is compiled into
+  the program, providing for a runtime assertion failure check.
+  C_ASSERT is a macro that can be used to perform compile time checks.
+*/
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Debugging Debugging APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef OI_DEBUG
+
+/** The macro OI_ASSERT takes a condition argument. If the asserted condition
+    does not evaluate to true, the OI_ASSERT macro calls the host-dependent function,
+    OI_AssertFail(), which reports the failure and generates a runtime error.
+*/
+void OI_AssertFail(char* file, int line, char* reason);
+
+
+#define OI_ASSERT(condition) \
+    { if (!(condition)) OI_AssertFail(__FILE__, __LINE__, #condition); }
+
+#define OI_ASSERT_FAIL(msg) \
+    { OI_AssertFail(__FILE__, __LINE__, msg); }
+
+#else
+
+
+#define OI_ASSERT(condition)
+#define OI_ASSERT_FAIL(msg)
+
+#endif
+
+
+/**
+   C_ASSERT() can be used to perform many compile-time assertions: type sizes, field offsets, etc.
+   An assertion failure results in compile time error C2118: negative subscript.
+   Unfortunately, this elegant macro doesn't work with GCC, so it's all commented out
+   for now. Perhaps later.....
+*/
+
+#ifndef C_ASSERT
+// #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
+// #define C_ASSERT(e)
+#endif
+
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_ASSERT_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_bitstream.h b/embdrv/sbc/decoder/include/oi_bitstream.h
new file mode 100644
index 0000000..df0c10f
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_bitstream.h
@@ -0,0 +1,123 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_BITSTREAM_H
+#define _OI_BITSTREAM_H
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+
+/**
+@file
+Function prototypes and macro definitions for manipulating input and output
+bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_stddefs.h"
+
+INLINE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs, const OI_BYTE *buffer);
+
+INLINE void OI_BITSTREAM_WriteInit(OI_BITSTREAM *bs, OI_BYTE *buffer);
+
+INLINE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs);
+
+INLINE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs);
+
+INLINE void OI_BITSTREAM_WriteUINT(OI_BITSTREAM *bs,
+                                   OI_UINT16 value,
+                                   OI_UINT bits);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write of a byte
+ */
+PRIVATE void OI_BITSTREAM_WriteUINT8Aligned(OI_BITSTREAM *bs,
+                                            OI_UINT8 datum);
+
+/*
+ * Use knowledge that the bitstream is aligned to optimize the write pair of nibbles
+ */
+PRIVATE void OI_BITSTREAM_Write2xUINT4Aligned(OI_BITSTREAM *bs,
+                                              OI_UINT8 datum1,
+                                              OI_UINT8 datum2);
+
+/** Internally the bitstream looks ahead in the stream. When
+ * OI_SBC_ReadScalefactors() goes to temporarily break the abstraction, it will
+ * need to know where the "logical" pointer is in the stream.
+ */
+#define OI_BITSTREAM_GetWritePtr(bs) ((bs)->ptr.w - 3)
+#define OI_BITSTREAM_GetReadPtr(bs) ((bs)->ptr.r - 3)
+
+/** This is declared here as a macro because decoder.c breaks the bitsream
+ * encapsulation for efficiency reasons.
+ */
+#define OI_BITSTREAM_READUINT(result, bits, ptr, value, bitPtr) \
+do { \
+    OI_ASSERT((bits) <= 16); \
+    OI_ASSERT((bitPtr) < 16); \
+    OI_ASSERT((bitPtr) >= 8); \
+    \
+    result = (value) << (bitPtr); \
+    result >>= 32 - (bits); \
+    \
+    bitPtr += (bits); \
+    while (bitPtr >= 16) { \
+        value = ((value) << 8) | *ptr++; \
+        bitPtr -= 8; \
+    } \
+    OI_ASSERT((bits == 0) || (result < (1u << (bits)))); \
+} while (0)
+
+
+#define OI_BITSTREAM_WRITEUINT(ptr, value, bitPtr, datum, bits) \
+do {\
+    bitPtr -= bits;\
+    value |= datum << bitPtr;\
+    \
+    while (bitPtr <= 16) {\
+        bitPtr += 8;\
+        *ptr++ = (OI_UINT8)(value >> 24);\
+        value <<= 8;\
+    }\
+} while (0)
+
+#define OI_BITSTREAM_WRITEFLUSH(ptr, value, bitPtr) \
+do {\
+    while (bitPtr < 32) {\
+        bitPtr += 8;\
+        *ptr++ = (OI_UINT8)(value >> 24);\
+        value <<= 8;\
+    }\
+} while (0)
+
+/**
+@}
+*/
+
+#endif /* _OI_BITSTREAM_H */
diff --git a/embdrv/sbc/decoder/include/oi_bt_spec.h b/embdrv/sbc/decoder/include/oi_bt_spec.h
new file mode 100644
index 0000000..b98a582
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_bt_spec.h
@@ -0,0 +1,229 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_BT_SPEC_H
+#define _OI_BT_SPEC_H
+/**
+ * @file
+ *
+ * This file contains common definitions from the Bluetooth specification.
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** The maximum number of active slaves in a piconet. */
+#define OI_BT_MAX_ACTIVE_SLAVES 7
+
+/** the number of bytes in a Bluetooth device address (BD_ADDR) */
+#define OI_BD_ADDR_BYTE_SIZE   6
+
+/**
+ * 48-bit Bluetooth device address
+ *
+ * Because 48-bit integers may not be supported on all platforms, the
+ * address is defined as an array of bytes. This array is big-endian,
+ * meaning that
+ *  - array[0] contains bits 47-40,
+ *  - array[1] contains bits 39-32,
+ *  - array[2] contains bits 31-24,
+ *  - array[3] contains bits 23-16,
+ *  - array[4] contains bits 15-8, and
+ *  - array[5] contains bits 7-0.
+ */
+typedef struct  {
+    OI_UINT8    addr[OI_BD_ADDR_BYTE_SIZE] ;   /**< Bluetooth device address represented as an array of 8-bit values */
+} OI_BD_ADDR ;
+
+/**
+ * @name Data types for working with UUIDs
+ * UUIDs are 16 bytes (128 bits).
+ *
+ * To avoid having to pass around 128-bit values all the time, 32-bit and 16-bit
+ * UUIDs are defined, along with a mapping from the shorter versions to the full
+ * version.
+ *
+ * @{
+ */
+
+/**
+ * 16-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT16 OI_UUID16;
+
+/**
+ * 32-bit representation of a 128-bit UUID
+ */
+typedef OI_UINT32 OI_UUID32;
+
+/**
+ * number of bytes in a 128 bit UUID
+ */
+#define OI_BT_UUID128_SIZE  16
+
+/**
+ * number of bytes in IPv6 style addresses
+ */
+#define OI_BT_IPV6ADDR_SIZE  16
+
+/**
+ * type definition for a 128-bit UUID
+ *
+ * To simplify conversion between 128-bit UUIDs and 16-bit and 32-bit UUIDs,
+ * the most significant 32 bits are stored with the same endian-ness as is
+ * native on the target (local) device. The remainder of the 128-bit UUID is
+ * stored as bytes in big-endian order.
+ */
+typedef struct {
+    OI_UINT32 ms32bits;                                    /**< most significant 32 bits of 128-bit UUID */
+    OI_UINT8 base[OI_BT_UUID128_SIZE - sizeof(OI_UINT32)]; /**< remainder of 128-bit UUID, array of 8-bit values */
+} OI_UUID128;
+
+/** @} */
+
+/** number of bytes in a link key */
+#define OI_BT_LINK_KEY_SIZE    16
+
+/**
+ * type definition for a baseband link key
+ *
+ * Because 128-bit integers may not be supported on all platforms, we define
+ * link keys as an array of bytes. Unlike the Bluetooth device address,
+ * the link key is stored in little-endian order, meaning that
+ *  - array[0]  contains bits 0  - 7,
+ *  - array[1]  contains bits 8  - 15,
+ *  - array[2]  contains bits 16 - 23,
+ *  - array[3]  contains bits 24 - 31,
+ *  - array[4]  contains bits 32 - 39,
+ *  - array[5]  contains bits 40 - 47,
+ *  - array[6]  contains bits 48 - 55,
+ *  - array[7]  contains bits 56 - 63,
+ *  - array[8]  contains bits 64 - 71,
+ *  - array[9]  contains bits 72 - 79,
+ *  - array[10] contains bits 80 - 87,
+ *  - array[11] contains bits 88 - 95,
+ *  - array[12] contains bits 96 - 103,
+ *  - array[13] contains bits 104- 111,
+ *  - array[14] contains bits 112- 119, and
+ *  - array[15] contains bits 120- 127.
+ */
+typedef struct {
+    OI_UINT8    key[OI_BT_LINK_KEY_SIZE] ;   /**< link key represented as an array of 8-bit values */
+} OI_LINK_KEY ;
+
+
+/** Out-of-band data size - C and R values are 16-bytes each */
+#define OI_BT_OOB_NUM_BYTES     16
+
+typedef struct {
+    OI_UINT8    value[OI_BT_OOB_NUM_BYTES] ;   /**< same struct used for C and R values */
+} OI_OOB_DATA ;
+
+
+/**
+ * link key types
+ */
+typedef enum  {
+    OI_LINK_KEY_TYPE_COMBO              = 0,    /**< combination key */
+    OI_LINK_KEY_TYPE_LOCAL_UNIT         = 1,    /**< local unit key */
+    OI_LINK_KEY_TYPE_REMOTE_UNIT        = 2,    /**< remote unit key */
+    OI_LINK_KEY_TYPE_DEBUG_COMBO        = 3,    /**< debug combination key */
+    OI_LINK_KEY_TYPE_UNAUTHENTICATED    = 4,    /**< Unauthenticated */
+    OI_LINK_KEY_TYPE_AUTHENTICATED      = 5,    /**< Authenticated */
+    OI_LINK_KEY_TYPE_CHANGED_COMBO      = 6     /**< Changed */
+
+} OI_BT_LINK_KEY_TYPE ;
+
+
+/** amount of space allocated for a PIN (personal indentification number) in bytes */
+#define OI_BT_PIN_CODE_SIZE    16
+
+/** data type for a PIN (PINs are treated as strings, so endianness does not apply.) */
+typedef struct  {
+    OI_UINT8    pin[OI_BT_PIN_CODE_SIZE] ; /**< PIN represented as an array of 8-bit values */
+} OI_PIN_CODE ;
+
+/** maximum number of SCO connections per device, which is 3 as of version 2.0+EDR
+    of the Bluetooth specification (see sec 4.3 of vol 2 part B) */
+#define OI_BT_MAX_SCO_CONNECTIONS  3
+
+/** data type for clock offset */
+typedef OI_UINT16   OI_BT_CLOCK_OFFSET ;
+
+/** data type for a LM handle */
+typedef OI_UINT16 OI_HCI_LM_HANDLE;
+
+/** opaque data type for a SCO or ACL connection handle */
+typedef struct _OI_HCI_CONNECTION *OI_HCI_CONNECTION_HANDLE;
+
+/** data type for HCI Error Code, as defined in oi_hcispec.h */
+typedef OI_UINT8    OI_HCI_ERROR_CODE ;
+
+/**
+ * The Bluetooth device type is indicated by a 24-bit bitfield, represented as a
+ * 32-bit number in the stack. The bit layout and values for device class are specified
+ * in the file oi_bt_assigned_nos.h and in the Bluetooth "Assigned Numbers" specification
+ * at http://www.bluetooth.org/assigned-numbers/.
+ */
+typedef OI_UINT32   OI_BT_DEVICE_CLASS ;
+
+#define OI_BT_DEV_CLASS_FORMAT_MASK        0x000003    /**< Bits 0-1 contain format type. */
+#define OI_BT_DEV_CLASS_MINOR_DEVICE_MASK  0x0000FC    /**< Bits 2-7 contain minor device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_DEVICE_MASK  0x001F00    /**< Bits 8-12 contain major device class value. */
+#define OI_BT_DEV_CLASS_MAJOR_SERVICE_MASK 0xFFE000    /**< Bits 13-23 contain major service class value. */
+
+/** There is currently only one device class format defined, type 00. */
+#define OI_BT_DEV_CLASS_FORMAT_TYPE        00
+
+/** Bit 13 in device class indicates limited discoverability mode (GAP v2.0+EDR, section 4.1.2.2) */
+#define OI_BT_DEV_CLASS_LIMITED_DISCO_BIT  BIT13
+
+/** macro to test validity of the Device Class Format */
+#define OI_BT_VALID_DEVICE_CLASS_FORMAT(class) (OI_BT_DEV_CLASS_FORMAT_TYPE == ((class) & OI_BT_DEV_CLASS_FORMAT_MASK))
+
+/** the time between baseband clock ticks, currently 625 microseconds (one slot) */
+#define OI_BT_TICK 625
+/** some macros to convert to/from baseband clock ticks - use no floating point! */
+#define OI_SECONDS_TO_BT_TICKS(secs)    ((secs)*1600)
+#define OI_BT_TICKS_TO_SECONDS(ticks)   ((ticks)/1600)
+#define OI_MSECS_TO_BT_TICKS(msecs)     (((msecs)*8)/5)
+#define OI_BT_TICKS_TO_MSECS(ticks)     (((ticks)*5)/8)
+
+/** EIR byte order */
+#define OI_EIR_BYTE_ORDER   OI_LITTLE_ENDIAN_BYTE_ORDER
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* _OI_BT_SPEC_H */
diff --git a/embdrv/sbc/decoder/include/oi_codec_sbc.h b/embdrv/sbc/decoder/include/oi_codec_sbc.h
new file mode 100644
index 0000000..ff5e6c1
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_codec_sbc.h
@@ -0,0 +1,484 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#ifndef _OI_CODEC_SBC_CORE_H
+#define _OI_CODEC_SBC_CORE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+@file
+Declarations of codec functions, data types, and macros.
+
+@ingroup codec_lib
+*/
+
+/**
+@addtogroup codec_lib
+@{
+*/
+
+/* Non-BM3 users of of the codec must include oi_codec_sbc_bm3defs.h prior to
+ * including this file, or else these includes will fail because the BM3 SDK is
+ * not in the include path */
+#ifndef _OI_CODEC_SBC_BM3DEFS_H
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#endif
+
+#include <stdint.h>
+
+#define SBC_MAX_CHANNELS 2
+#define SBC_MAX_BANDS 8
+#define SBC_MAX_BLOCKS 16
+#define SBC_MIN_BITPOOL 2   /**< Minimum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_BITPOOL 250 /**< Maximum size of the bit allocation pool used to encode the stream */
+#define SBC_MAX_ONE_CHANNEL_BPS 320000
+#define SBC_MAX_TWO_CHANNEL_BPS 512000
+
+
+#define SBC_WBS_BITRATE 62000
+#define SBC_WBS_BITPOOL 27
+#define SBC_WBS_NROF_BLOCKS 16
+#define SBC_WBS_FRAME_LEN 62
+#define SBC_WBS_SAMPLES_PER_FRAME 128
+
+
+#define SBC_HEADER_LEN 4
+#define SBC_MAX_FRAME_LEN (SBC_HEADER_LEN + \
+                             ((SBC_MAX_BANDS * SBC_MAX_CHANNELS / 2) + \
+                              (SBC_MAX_BANDS + SBC_MAX_BLOCKS * SBC_MAX_BITPOOL + 7)/8))
+#define SBC_MAX_SAMPLES_PER_FRAME   (SBC_MAX_BANDS * SBC_MAX_BLOCKS)
+
+#define SBC_MAX_SCALEFACTOR_BYTES ((4*(SBC_MAX_CHANNELS * SBC_MAX_BANDS) + 7)/8)
+
+#define OI_SBC_SYNCWORD 0x9c
+#define OI_SBC_ENHANCED_SYNCWORD 0x9d
+
+/**@name Sampling frequencies */
+/**@{*/
+#define SBC_FREQ_16000 0 /**< The sampling frequency is 16 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_32000 1 /**< The sampling frequency is 32 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_44100 2 /**< The sampling frequency is 44.1 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_FREQ_48000 3 /**< The sampling frequency is 48 kHz. One possible value for the @a frequency parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Channel modes */
+/**@{*/
+#define SBC_MONO 0         /**< The mode of the encoded channel is mono. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_DUAL_CHANNEL 1 /**< The mode of the encoded channel is dual-channel. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_STEREO 2       /**< The mode of the encoded channel is stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_JOINT_STEREO 3 /**< The mode of the encoded channel is joint stereo. One possible value for the @a mode parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Subbands */
+/**@{*/
+#define SBC_SUBBANDS_4  0 /**< The encoded stream has 4 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure()*/
+#define SBC_SUBBANDS_8  1 /**< The encoded stream has 8 subbands. One possible value for the @a subbands parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Block lengths */
+/**@{*/
+#define SBC_BLOCKS_4    0 /**< A block size of 4 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_8    1 /**< A block size of 8 blocks was used to encode the stream is. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_12   2 /**< A block size of 12 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_BLOCKS_16   3 /**< A block size of 16 blocks was used to encode the stream. One possible value for the @a blocks parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**@name Bit allocation methods */
+/**@{*/
+#define SBC_LOUDNESS 0    /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+#define SBC_SNR 1         /**< The bit allocation method. One possible value for the @a loudness parameter of OI_CODEC_SBC_EncoderConfigure() */
+/**@}*/
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+typedef OI_INT16 SBC_BUFFER_T;
+
+
+/** Used internally. */
+typedef struct {
+    OI_UINT16 frequency;    /**< The sampling frequency. Input parameter. */
+    OI_UINT8 freqIndex;
+
+    OI_UINT8 nrof_blocks;   /**< The block size used to encode the stream. Input parameter. */
+    OI_UINT8 blocks;
+
+
+    OI_UINT8 nrof_subbands; /**< The number of subbands of the encoded stream. Input parameter. */
+    OI_UINT8 subbands;
+
+    OI_UINT8 mode;          /**< The mode of the encoded channel. Input parameter. */
+    OI_UINT8 nrof_channels; /**< The number of channels of the encoded stream. */
+
+    OI_UINT8 alloc;         /**< The bit allocation method. Input parameter. */
+    OI_UINT8 bitpool;       /**< Size of the bit allocation pool used to encode the stream. Input parameter. */
+    OI_UINT8 crc;           /**< Parity check byte used for error detection. */
+    OI_UINT8 join;          /**< Whether joint stereo has been used. */
+    OI_UINT8 enhanced;
+    OI_UINT8 min_bitpool;   /**< This value is only used when encoding. SBC_MAX_BITPOOL if variable
+                                 bitpools are disallowed, otherwise the minimum bitpool size that will
+                                 be used by the bit allocator.  */
+
+    OI_UINT8 cachedInfo;    /**< Information about the previous frame */
+} OI_CODEC_SBC_FRAME_INFO;
+
+/** Used internally. */
+typedef struct {
+    const OI_CHAR *codecInfo;
+    OI_CODEC_SBC_FRAME_INFO frameInfo;
+    OI_INT8 scale_factor[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+    OI_UINT32 frameCount;
+    OI_INT32 *subdata;
+
+    SBC_BUFFER_T *filterBuffer[SBC_MAX_CHANNELS];
+    OI_INT32 filterBufferLen;
+    OI_UINT filterBufferOffset;
+
+    union {
+        OI_UINT8 uint8[SBC_MAX_CHANNELS*SBC_MAX_BANDS];
+        OI_UINT32 uint32[SBC_MAX_CHANNELS*SBC_MAX_BANDS/4];
+    } bits;
+    OI_UINT8 maxBitneed;    /**< Running maximum bitneed */
+    OI_BYTE formatByte;
+    OI_UINT8 pcmStride;
+    OI_UINT8 maxChannels;
+} OI_CODEC_SBC_COMMON_CONTEXT;
+
+
+/*
+ * A smaller value reduces RAM usage at the expense of increased CPU usage. Values in the range
+ * 27..50 are recommended, beyond 50 there is a diminishing return on reduced CPU usage.
+ */
+#define SBC_CODEC_MIN_FILTER_BUFFERS 16
+#define SBC_CODEC_FAST_FILTER_BUFFERS 27
+
+/* Expands to the number of OI_UINT32s needed to ensure enough memory to encode
+ * or decode streams of numChannels channels, using numBuffers buffers.
+ * Example:
+ * OI_UINT32 decoderData[CODEC_DATA_WORDS(SBC_MAX_CHANNELS, SBC_DECODER_FAST_SYNTHESIS_BUFFERS)];
+ * */
+#define CODEC_DATA_WORDS(numChannels, numBuffers) \
+    ((\
+        (sizeof(OI_INT32) * SBC_MAX_BLOCKS * numChannels * SBC_MAX_BANDS) \
+         + (sizeof(SBC_BUFFER_T) * SBC_MAX_CHANNELS * SBC_MAX_BANDS * numBuffers) \
+         + (sizeof (OI_UINT32) - 1) \
+    ) / sizeof(OI_UINT32))
+
+/** Opaque parameter to decoding functions; maintains decoder context. */
+typedef struct {
+    OI_CODEC_SBC_COMMON_CONTEXT common;
+    OI_UINT8 limitFrameFormat;              /* Boolean, set by OI_CODEC_SBC_DecoderLimit() */
+    OI_UINT8 restrictSubbands;
+    OI_UINT8 enhancedEnabled;
+    OI_UINT8 bufferedBlocks;
+} OI_CODEC_SBC_DECODER_CONTEXT;
+
+typedef struct {
+    OI_UINT32 data[CODEC_DATA_WORDS(1, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_MONO;
+
+typedef struct {
+    OI_UINT32 data[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
+} OI_CODEC_SBC_CODEC_DATA_STEREO;
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+/**
+ * This function resets the decoder. The context must be reset when
+ * changing streams, or if the following stream parameters change:
+ * number of subbands, stereo mode, or frequency.
+ *
+ * @param context   Pointer to the decoder context structure to be reset.
+ *
+ * @param enhanced  If true, enhanced SBC operation is enabled. If enabled,
+ *                  the codec will recognize the alternative syncword for
+ *                  decoding an enhanced SBC stream. Enhancements should not
+ *                  be enabled unless the stream is known to be generated
+ *                  by an enhanced encoder, or there is a small possibility
+ *                  for decoding glitches if synchronization were to be lost.
+ */
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                    OI_UINT32 *decoderData,
+                                    OI_UINT32 decoderDataBytes,
+                                    OI_UINT8 maxChannels,
+                                    OI_UINT8 pcmStride,
+                                    OI_BOOL enhanced);
+
+/**
+ * This function restricts the kind of SBC frames that the Decoder will
+ * process.  Its use is optional.  If used, it must be called after
+ * calling OI_CODEC_SBC_DecoderReset(). After it is called, any calls
+ * to OI_CODEC_SBC_DecodeFrame() with SBC frames that do not conform
+ * to the Subband and Enhanced SBC setting will be rejected with an
+ * OI_STATUS_INVALID_PARAMETERS return.
+ *
+ * @param context   Pointer to the decoder context structure to be limited.
+ *
+ * @param enhanced  If true, all frames passed to the decoder must be
+ *                  Enhanced SBC frames. If false, all frames must be
+ *                  standard SBC frames.
+ *
+ * @param subbands  May be set to SBC_SUBBANDS_4 or SBC_SUBBANDS_8. All
+ *                  frames passed to the decoder must be encoded with
+ *                  the requested number of subbands.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                    OI_BOOL enhanced,
+                                    OI_UINT8 subbands);
+
+/**
+ * This function sets the decoder parameters for a raw decode where the decoder parameters are not
+ * available in the sbc data stream. OI_CODEC_SBC_DecoderReset must be called
+ * prior to calling this function.
+ *
+ * @param context        Decoder context structure. This must be the context must be
+ *                       used each time a frame is decoded.
+ *
+ * @param enhanced       Set to TRUE to enable Qualcomm proprietary
+ *                       quality enhancements.
+ *
+ * @param frequency      One of SBC_FREQ_16000, SBC_FREQ_32000, SBC_FREQ_44100,
+ *                       SBC_FREQ_48000
+ *
+ * @param mode           One of SBC_MONO, SBC_DUAL_CHANNEL, SBC_STEREO,
+ *                       SBC_JOINT_STEREO
+ *
+ * @param subbands       One of SBC_SUBBANDS_4, SBC_SUBBANDS_8
+ *
+ * @param blocks         One of SBC_BLOCKS_4, SBC_BLOCKS_8, SBC_BLOCKS_12,
+ *                       SBC_BLOCKS_16
+ *
+ * @param alloc          One of SBC_LOUDNESS, SBC_SNR
+ *
+ * @param maxBitpool     The maximum bitpool size for this context
+ */
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                           OI_BOOL enhanced,
+                                           OI_UINT8 frequency,
+                                           OI_UINT8 mode,
+                                           OI_UINT8 subbands,
+                                           OI_UINT8 blocks,
+                                           OI_UINT8 alloc,
+                                           OI_UINT8 maxBitpool);
+
+/**
+ * Decode one SBC frame. The frame has no header bytes. The context must have been previously
+ * initialized by calling  OI_CODEC_SBC_DecoderConfigureRaw().
+ *
+ * @param context       Pointer to a decoder context structure. The same context
+ *                      must be used each time when decoding from the same stream.
+ *
+ * @param bitpool       The actual bitpool size for this frame. Must be <= the maxbitpool specified
+ *                      in the call to OI_CODEC_SBC_DecoderConfigureRaw(),
+ *
+ * @param frameData     Address of a pointer to the SBC data to decode. This
+ *                      value will be updated to point to the next frame after
+ *                      successful decoding.
+ *
+ * @param frameBytes    Pointer to a UINT32 containing the number of available
+ *                      bytes of frame data. This value will be updated to reflect
+ *                      the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData       Address of an array of OI_INT16 pairs, which will be
+ *                      populated with the decoded audio data. This address
+ *                      is not updated.
+ *
+ * @param pcmBytes      Pointer to a UINT32 in/out parameter. On input, it
+ *                      should contain the number of bytes available for pcm
+ *                      data. On output, it will contain the number of bytes
+ *                      written. Note that this differs from the semantics of
+ *                      frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                 OI_UINT8 bitpool,
+                                 const OI_BYTE **frameData,
+                                 OI_UINT32 *frameBytes,
+                                 OI_INT16 *pcmData,
+                                 OI_UINT32 *pcmBytes);
+
+/**
+ * Decode one SBC frame.
+ *
+ * @param context       Pointer to a decoder context structure. The same context
+ *                      must be used each time when decoding from the same stream.
+ *
+ * @param frameData     Address of a pointer to the SBC data to decode. This
+ *                      value will be updated to point to the next frame after
+ *                      successful decoding.
+ *
+ * @param frameBytes    Pointer to a UINT32 containing the number of available
+ *                      bytes of frame data. This value will be updated to reflect
+ *                      the number of bytes remaining after a decoding operation.
+ *
+ * @param pcmData       Address of an array of OI_INT16 pairs, which will be
+ *                      populated with the decoded audio data. This address
+ *                      is not updated.
+ *
+ * @param pcmBytes      Pointer to a UINT32 in/out parameter. On input, it
+ *                      should contain the number of bytes available for pcm
+ *                      data. On output, it will contain the number of bytes
+ *                      written. Note that this differs from the semantics of
+ *                      frameBytes.
+ */
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                   const OI_BYTE **frameData,
+                                   OI_UINT32 *frameBytes,
+                                   OI_INT16 *pcmData,
+                                   OI_UINT32 *pcmBytes);
+
+/**
+ * Calculate the number of SBC frames but don't decode. CRC's are not checked,
+ * but the Sync word is found prior to count calculation.
+ *
+ * @param frameData     Pointer to the SBC data.
+ *
+ * @param frameBytes    Number of bytes avaiable in the frameData buffer
+ *
+ */
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE  *frameData,
+                                 OI_UINT32 frameBytes);
+
+/**
+ * Analyze an SBC frame but don't do the decode.
+ *
+ * @param context       Pointer to a decoder context structure. The same context
+ *                      must be used each time when decoding from the same stream.
+ *
+ * @param frameData     Address of a pointer to the SBC data to decode. This
+ *                      value will be updated to point to the next frame after
+ *                      successful decoding.
+ *
+ * @param frameBytes    Pointer to a UINT32 containing the number of available
+ *                      bytes of frame data. This value will be updated to reflect
+ *                      the number of bytes remaining after a decoding operation.
+ *
+ */
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                 const OI_BYTE **frameData,
+                                 OI_UINT32 *frameBytes);
+
+/* Common functions */
+
+/**
+  Calculate the frame length.
+
+  @param frame The frame whose length to calculate
+
+  @return the length of an individual encoded frame in
+  bytes
+  */
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+
+/**
+ * Calculate the maximum bitpool size that fits within a given frame length.
+ *
+ * @param frame     The frame to calculate the bitpool size for
+ * @param frameLen  The frame length to fit the bitpool to
+ *
+ * @return the maximum bitpool that will fit in the specified frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+                                        OI_UINT16 frameLen);
+
+/**
+  Calculate the bit rate.
+
+  @param frame The frame whose bit rate to calculate
+
+  @return the approximate bit rate in bits per second,
+  assuming that stream parameters are constant
+  */
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+/**
+  Calculate decoded audio data length for one frame.
+
+  @param frame The frame whose audio data length to calculate
+
+  @return length of decoded audio data for a
+  single frame, in bytes
+  */
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+/**
+ * Get the codec version text.
+ *
+ * @return  pointer to text string containing codec version text
+ *
+ */
+OI_CHAR *OI_CODEC_Version(void);
+
+
+/**
+@}
+
+@addtogroup codec_internal
+@{
+*/
+
+extern const OI_CHAR* const OI_CODEC_SBC_FreqText[];
+extern const OI_CHAR* const OI_CODEC_SBC_ModeText[];
+extern const OI_CHAR* const OI_CODEC_SBC_SubbandsText[];
+extern const OI_CHAR* const OI_CODEC_SBC_BlocksText[];
+extern const OI_CHAR* const OI_CODEC_SBC_AllocText[];
+
+/**
+@}
+
+@addtogroup codec_lib
+@{
+*/
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo);
+#else
+#define OI_CODEC_SBC_DumpConfig(f)
+#endif
+
+/**
+@}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _OI_CODEC_SBC_CORE_H */
+
+
diff --git a/embdrv/sbc/decoder/include/oi_codec_sbc_private.h b/embdrv/sbc/decoder/include/oi_codec_sbc_private.h
new file mode 100644
index 0000000..d7489e7
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_codec_sbc_private.h
@@ -0,0 +1,229 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_CODEC_SBC_PRIVATE_H
+#define _OI_CODEC_SBC_PRIVATE_H
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Function prototypes and macro definitions used internally by the codec.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#ifdef USE_RESTRICT_KEYWORD
+#define RESTRICT restrict
+#else
+#define RESTRICT
+#endif
+
+#ifdef CODEC_DEBUG
+#include <stdio.h>
+#define ERROR(x) do { printf x; printf("\n"); } while (0)
+#else
+#define ERROR(x)
+#endif
+
+#ifdef TRACE_EXECUTION
+#define TRACE(x) do { printf x; printf("\n"); } while (0)
+#else
+#define TRACE(x)
+#endif
+
+#ifndef PRIVATE
+#define PRIVATE
+#endif
+
+#ifndef INLINE
+#define INLINE
+#endif
+
+#include "oi_assert.h"
+#include "oi_codec_sbc.h"
+
+#ifndef OI_SBC_SYNCWORD
+#define OI_SBC_SYNCWORD 0x9c
+#endif
+
+#ifndef DIVIDE
+#define DIVIDE(a, b) ((a) / (b))
+#endif
+
+typedef union {
+    OI_UINT8 uint8[SBC_MAX_BANDS];
+    OI_UINT32 uint32[SBC_MAX_BANDS / 4];
+} BITNEED_UNION1;
+
+typedef union {
+    OI_UINT8 uint8[2 * SBC_MAX_BANDS];
+    OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4];
+} BITNEED_UNION2;
+
+static const OI_UINT16 freq_values[] =    { 16000, 32000, 44100, 48000 };
+static const OI_UINT8 block_values[] =    { 4, 8, 12, 16 };
+static const OI_UINT8 channel_values[] =  { 1, 2, 2, 2 };
+static const OI_UINT8 band_values[] =     { 4, 8 };
+
+
+#define TEST_MODE_SENTINEL "OINA"
+#define TEST_MODE_SENTINEL_LENGTH 4
+
+/** Used internally. */
+typedef struct {
+    union {
+        const OI_UINT8 *r;
+        OI_UINT8 *w;
+    } ptr;
+    OI_UINT32 value;
+    OI_UINT bitPtr;
+} OI_BITSTREAM;
+
+
+#define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX))
+#define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX))
+
+#define DCTII_8_SHIFT_IN 0
+#define DCTII_8_SHIFT_OUT 16-DCTII_8_SHIFT_IN
+
+#define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT)
+#define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT-1)
+#define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT-2)
+
+#define DCT_SHIFT 15
+
+#define DCTIII_4_SHIFT_IN 2
+#define DCTIII_4_SHIFT_OUT 15
+
+#define DCTIII_8_SHIFT_IN 3
+#define DCTIII_8_SHIFT_OUT 14
+
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                              OI_UINT8 *bitneeds,
+                              OI_UINT ch,
+                              OI_UINT *preferredBitpool);
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                                    BITNEED_UNION1 *bitneeds,
+                                    OI_UINT ch,
+                                    OI_UINT bitcount);
+
+
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+                                 OI_UINT32 *bitneeds,
+                                 const OI_UINT subbands,
+                                 OI_UINT bitcount,
+                                 OI_UINT *excess);
+
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+                                OI_INT bits,
+                                OI_INT excess);
+
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+                              OI_INT excess);
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common);
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                     OI_UINT8 bitpool,
+                                     const OI_BYTE **frameData,
+                                     OI_UINT32 *frameBytes,
+                                     OI_INT16 *pcmData,
+                                     OI_UINT32 *pcmBytes);
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                       OI_UINT32 *decoderData,
+                                       OI_UINT32 decoderDataBytes,
+                                       OI_BYTE maxChannels,
+                                       OI_BYTE pcmStride,
+                                       OI_BOOL enhanced);
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_);
+
+PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame);
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame);
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data);
+
+/* Transform functions */
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount);
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift);
+
+INLINE void dct3_4(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40],
+                                OI_INT16 *pcm,
+                                OI_UINT strideShift,
+                                OI_INT32 subband[4]);
+
+INLINE void dct3_8(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
+
+PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80],
+                                OI_INT16 *pcm,
+                                OI_UINT strideShift,
+                                OI_INT32 subband[8]);
+
+#ifdef SBC_ENHANCED
+PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112],
+                                         OI_INT16 *pcm,
+                                         OI_UINT strideShift,
+                                         OI_INT32 subband[8]);
+#endif
+
+/* Decoder functions */
+
+INLINE  void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data);
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs);
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob);
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs);
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks);
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits);
+PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len);
+PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount);
+
+PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame);
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                                     OI_UINT32 *codecDataAligned,
+                                     OI_UINT32 codecDataBytes,
+                                     OI_UINT8 maxChannels,
+                                     OI_UINT8 pcmStride);
+/**
+@}
+*/
+
+#endif /* _OI_CODEC_SBC_PRIVATE_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_common.h b/embdrv/sbc/decoder/include/oi_common.h
new file mode 100644
index 0000000..c4169f9
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_common.h
@@ -0,0 +1,43 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_COMMON_H
+#define _OI_COMMON_H
+/**
+ * @file
+ *
+ * This file is used to group commonly used BLUEmagic 3.0 software
+ * header files.
+ *
+ * This file should be included in application source code along with the header
+ * files for the specific modules of the protocol stack being used.
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_bt_spec.h"
+#include "oi_stddefs.h"
+#include "oi_status.h"
+#include "oi_time.h"
+#include "oi_osinterface.h"
+
+
+/*****************************************************************************/
+#endif /* _OI_COMMON_H */
diff --git a/embdrv/sbc/decoder/include/oi_cpu_dep.h b/embdrv/sbc/decoder/include/oi_cpu_dep.h
new file mode 100644
index 0000000..da7473a
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_cpu_dep.h
@@ -0,0 +1,505 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_CPU_DEP_H
+#define _OI_CPU_DEP_H
+/**
+ * @file
+ * This file contains definitions for characteristics of the target CPU and
+ * compiler, including primitive data types and endianness.
+ *
+ * This file defines the byte order and primitive data types for various
+ * CPU families. The preprocessor symbol 'CPU' must be defined to be an
+ * appropriate value or this header will generate a compile-time error.
+ *
+ * @note The documentation for this header file uses the x86 family of processors
+ * as an illustrative example for CPU/compiler-dependent data type definitions.
+ * Go to the source code of this header file to see the details of primitive type
+ * definitions for each platform.
+ *
+ * Additional information is available in the @ref data_types_docpage section.
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+/** @name Definitions indicating family of target OI_CPU_TYPE
+ *  @{
+ */
+
+#define OI_CPU_X86         1 /**< x86 processor family */
+#define OI_CPU_ARM         2 /**< ARM processor family.
+                                  @deprecated Use #OI_CPU_ARM7_LEND or
+                                  #OI_CPU_ARM7_BEND. */
+#define OI_CPU_ARC         3 /**< ARC processor family.
+                                  @deprecated Use #OI_CPU_ARC_LEND or
+                                  #OI_CPU_ARC_BEND. */
+#define OI_CPU_SH3         4 /**< Hitachi SH-3 processor family */
+#define OI_CPU_H8          5 /**< Hitachi H8 processor family */
+#define OI_CPU_MIPS        6 /**< MIPS processor family */
+#define OI_CPU_SPARC       7 /**< SPARC processor family */
+#define OI_CPU_M68000      8 /**< Motorola M68000 processor family */
+#define OI_CPU_PPC         9 /**< PowerPC (PPC) processor family */
+#define OI_CPU_SH4_7750   10 /**< Hitachi SH7750 series in SH-4 processor family */
+#define OI_CPU_SH2        11 /**< Hitachi SH-2 processor family */
+#define OI_CPU_ARM7_LEND  12 /**< ARM7, little-endian */
+#define OI_CPU_ARM7_BEND  13 /**< ARM7, big-endian */
+#define OI_CPU_GDM1202    14 /**< GCT GDM1202 */
+#define OI_CPU_ARC_LEND   15 /**< ARC processor family, little-endian */
+#define OI_CPU_ARC_BEND   16 /**< ARC processor family, big-endian */
+#define OI_CPU_M30833F    17 /**< Mitsubishi M308 processor family */
+#define OI_CPU_CR16C      18 /**< National Semiconductor 16 bit processor family */
+#define OI_CPU_M64111     19 /**< Renesas M64111 processor (M32R family) */
+#define OI_CPU_ARMV5_LEND 20 //*< ARM5, little-endian */
+
+#define OI_CPU_TYPE 12
+
+#ifndef OI_CPU_TYPE
+    #error "OI_CPU_TYPE type not defined"
+#endif
+
+/**@}*/
+
+
+/** @name Definitions indicating byte-wise endianness of target CPU
+ *  @{
+ */
+
+#define OI_BIG_ENDIAN_BYTE_ORDER    0  /**< Multiple-byte values are stored in memory beginning with the most significant byte at the lowest address.  */
+#define OI_LITTLE_ENDIAN_BYTE_ORDER 1  /**< Multiple-byte values are stored in memory beginning with the least significant byte at the lowest address. */
+
+/**@}*/
+
+
+/** @name  CPU/compiler-independent primitive data type definitions
+ *  @{
+ */
+
+typedef int             OI_BOOL;  /**< Boolean values use native integer data type for target CPU. */
+typedef int             OI_INT;   /**< Integer values use native integer data type for target CPU. */
+typedef unsigned int    OI_UINT;  /**< Unsigned integer values use native unsigned integer data type for target CPU. */
+typedef unsigned char   OI_BYTE;  /**< Raw bytes type uses native character data type for target CPU. */
+
+/**@}*/
+
+
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_X86
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER  /**< x86 platform byte ordering is little-endian */
+
+/** @name CPU/compiler-dependent primitive data type definitions for x86 processor family
+ *  @{
+ */
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for x86 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for x86 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for x86 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for x86 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for x86 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for x86 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARM7_LEND or OI_CPU_ARM7_BEND for
+   little-endian or big-endian configurations of the ARM7, respectively. */
+#error OI_CPU_ARM is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC
+/* This CPU type is deprecated (removed from use). Instead, use OI_CPU_ARC_LEND or OI_CPU_ARC_BEND for
+   little-endian or big-endian configurations of the ARC, respectively. */
+#error OI_CPU_ARC is deprecated
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH3
+/* The Hitachi SH C compiler defines _LIT or _BIG, depending on the endianness
+    specified to the compiler on the command line. */
+#if defined(_LIT)
+    #define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER  /**< If _LIT is defined, SH-3 platform byte ordering is little-endian. */
+#elif defined(_BIG)
+    #define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER     /**< If _BIG is defined, SH-3 platform byte ordering is big-endian. */
+#else
+    #error SH compiler endianness undefined
+#endif
+
+/** @name CPU/compiler-dependent primitive data type definitions for SH-3 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for SH-3 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for SH-3 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for SH-3 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for SH-3 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-3 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-3 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH2
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER /**< SH-2 platform byte ordering is big-endian. */
+
+/** @name  CPU/compiler-dependent primitive data type definitions for SH-2 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for SH-2 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for SH-2 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for SH-2 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for SH-2 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH-2 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH-2 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_H8
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_MIPS
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+/** @name  CPU/compiler-dependent primitive data type definitions for MIPS processor family
+ *  @{
+ */
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SPARC
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+#error basic types not defined
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M68000
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER  /**< M68000 platform byte ordering is big-endian. */
+
+/** @name  CPU/compiler-dependent primitive data type definitions for M68000 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for M68000 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for M68000 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for M68000 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for M68000 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M68000 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M68000 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_PPC
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+
+/** @name  CPU/compiler-dependent primitive data type definitions for PPC 8XX processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for PPC8XX processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for PPC8XX processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for PPC8XX processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for PPC8XX processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for PPC8XX processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for PPC8XX processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_SH4_7750
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER  /**< SH7750 platform byte ordering is big-endian. */
+
+/** @name   CPU/compiler-dependent primitive data type definitions for SH7750 processor series of the SH-4 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for SH7750 SH-4 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for SH7750 SH-4 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for SH7750 SH-4 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for SH7750 SH-4 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for SH7750 SH-4 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for SH7750 SH-4 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name   little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARM7_BEND
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+/** @name   big-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ *  @{
+ */
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef void * OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_GDM1202
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_LEND
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARC_BEND
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for ARC processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARC processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARC processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARC processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARC processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARC processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARC processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M30833F
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Mitsubishi M308 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for M308 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for M308 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for M308 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for M308 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M308 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M308 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_CR16C
+
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for National Semicnductor processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for CR16C processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for CR16C processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for CR16C processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for CR16C processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for CR16C processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for CR16C processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_M64111
+
+#define OI_CPU_BYTE_ORDER OI_BIG_ENDIAN_BYTE_ORDER
+
+/** @name CPU/compiler-dependent primitive data type definitions for Renesas M32R processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for M64111 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for M64111 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for M64111 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for M64111 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for M64111 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for M64111 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+#endif
+
+/*********************************************************************************/
+
+#if OI_CPU_TYPE==OI_CPU_ARMV5_LEND
+#define OI_CPU_BYTE_ORDER OI_LITTLE_ENDIAN_BYTE_ORDER
+
+/** @name   little-endian CPU/compiler-dependent primitive data type definitions for the ARM7 processor family
+ *  @{
+ */
+
+typedef signed char     OI_INT8;   /**< 8-bit signed integer values use native signed character data type for ARM7 processor. */
+typedef signed short    OI_INT16;  /**< 16-bit signed integer values use native signed short integer data type for ARM7 processor. */
+typedef signed long     OI_INT32;  /**< 32-bit signed integer values use native signed long integer data type for ARM7 processor. */
+typedef unsigned char   OI_UINT8;  /**< 8-bit unsigned integer values use native unsigned character data type for ARM7 processor. */
+typedef unsigned short  OI_UINT16; /**< 16-bit unsigned integer values use native unsigned short integer data type for ARM7 processor. */
+typedef unsigned long   OI_UINT32; /**< 32-bit unsigned integer values use native unsigned long integer data type for ARM7 processor. */
+
+typedef OI_UINT32 OI_ELEMENT_UNION; /**< Type for first element of a union to support all data types up to pointer width. */
+
+/**@}*/
+
+#endif
+
+/*********************************************************************************/
+
+
+#ifndef OI_CPU_BYTE_ORDER
+    #error "Byte order (endian-ness) not defined"
+#endif
+
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+/*********************************************************************************/
+#endif /* _OI_CPU_DEP_H */
diff --git a/embdrv/sbc/decoder/include/oi_modules.h b/embdrv/sbc/decoder/include/oi_modules.h
new file mode 100644
index 0000000..a0b68dd
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_modules.h
@@ -0,0 +1,171 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_MODULES_H
+#define _OI_MODULES_H
+/**
+ * @file
+ *
+ * Enumeration type defining the inidivual stack components.
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * This enumeration lists constants for referencing the components of
+ * the BLUEmagic 3.0 protocol stack, profiles, and other functionalities.
+ *
+ * In order to distinguish types of modules, items are grouped with markers to
+ * delineate start and end of the groups
+ *
+ * The module type is used for various purposes:
+ *      identification in debug print statements
+ *      access to initialization flags
+ *      access to the configuration table
+ */
+
+typedef enum {
+    /* profiles and protocols  --> Updates to oi_debug.c and oi_config_table.c */
+
+                                /*   XX --> Keep Enum values up-to-date! */
+    OI_MODULE_AT,               /**< 00 AT command processing */
+    OI_MODULE_A2DP,             /**< 01 Advanced Audio Distribution Profile */
+    OI_MODULE_AVCTP,            /**< 02 Audio-Visual Control Transport Profile */
+    OI_MODULE_AVDTP,            /**< 03 Audio-Visual Distribution Protocol */
+    OI_MODULE_AVRCP,            /**< 04 Audio-Visual Remote Control Profile */
+    OI_MODULE_BIP_CLI,          /**< 05 Basic Imaging Profile protocol client */
+    OI_MODULE_BIP_SRV,          /**< 06 Basic Imaging Profile protocol server */
+    OI_MODULE_BNEP,             /**< 07 Bluetooth Network Encapsulation Protocol */
+    OI_MODULE_BPP_SENDER,       /**< 08 Basic Printing Profile */
+    OI_MODULE_BPP_PRINTER,      /**< 09 Basic Printing Profile */
+    OI_MODULE_CTP,              /**< 10 Cordless Telephony Profile */
+    OI_MODULE_DUN,              /**< 11 Dial-Up Networking Profile */
+    OI_MODULE_FAX,              /**< 12 Fax Profile */
+    OI_MODULE_FTP_CLI,          /**< 13 File Transfer Profile protocol client */
+    OI_MODULE_FTP_SRV,          /**< 14 File Transfer Profile protocol server */
+    OI_MODULE_HANDSFREE,        /**< 15 Hands-Free Profile */
+    OI_MODULE_HANDSFREE_AG,     /**< 16 Hands-Free Profile */
+    OI_MODULE_HCRP_CLI,         /**< 17 Hardcopy Cable Replacement Profile */
+    OI_MODULE_HCRP_SRV,         /**< 18 Hardcopy Cable Replacement Profile */
+    OI_MODULE_HEADSET,          /**< 19 Headset Profile */
+    OI_MODULE_HEADSET_AG,       /**< 20 Headset Profile */
+    OI_MODULE_HID,              /**< 21 Human Interface Device profile */
+    OI_MODULE_INTERCOM,         /**< 22 Intercom Profile */
+    OI_MODULE_OBEX_CLI,         /**< 23 OBEX protocol client, Generic Object Exchange Profile */
+    OI_MODULE_OBEX_SRV,         /**< 24 OBEX protocol server, Generic Object Exchange Profile */
+    OI_MODULE_OPP_CLI,          /**< 25 Object Push Profile protocol client */
+    OI_MODULE_OPP_SRV,          /**< 26 Object Push Profile protocol server */
+    OI_MODULE_PAN,              /**< 27 PAN profile */
+    OI_MODULE_PBAP_CLI,         /**< 28 Phonebook Access Profile client */
+    OI_MODULE_PBAP_SRV,         /**< 29 Phonebook Access Profile server */
+    OI_MODULE_SAP_CLI,          /**< 30 SIM Access Profile */
+    OI_MODULE_SAP_SRV,          /**< 31 SIM Access Profile */
+    OI_MODULE_SPP,              /**< 32 Serial Port Profile */
+    OI_MODULE_SYNC_CLI,         /**< 33 Synchronization Profile */
+    OI_MODULE_SYNC_SRV,         /**< 34 Synchronization Profile */
+    OI_MODULE_SYNC_CMD_CLI,     /**< 35 Synchronization Profile */
+    OI_MODULE_SYNC_CMD_SRV,     /**< 36 Synchronization Profile */
+    OI_MODULE_SYNCML,           /**< 37 SyncML Profile */
+    OI_MODULE_TCS,              /**< 38 TCS Binary */
+    OI_MODULE_VDP,              /**< 39 Video Distribution Profile */
+
+    /* corestack components   --> Updates to oi_debug.c and oi_config_table.c */
+
+    OI_MODULE_COMMON_CONFIG,    /**< 40 Common configuration, module has no meaning other than for config struct */
+    OI_MODULE_CMDCHAIN,         /**< 41 Command chaining utility */
+    OI_MODULE_DISPATCH,         /**< 42 Dispatcher */
+    OI_MODULE_DATAELEM,         /**< 43 Data Elements, marshaller */
+    OI_MODULE_DEVMGR,           /**< 44 Device Manager */
+    OI_MODULE_DEVMGR_MODES,     /**< 45 Device Manager connectability/discoverability modes */
+    OI_MODULE_HCI,              /**< 46 Host Controller Interface command layer */
+    OI_MODULE_L2CAP,            /**< 47 L2CAP */
+    OI_MODULE_MEMMGR,           /**< 48 modules that do memory management */
+    OI_MODULE_POLICYMGR,        /**< 49 Policy Manager */
+    OI_MODULE_RFCOMM,           /**< 50 RFCOMM */
+    OI_MODULE_RFCOMM_SD,        /**< 51 RFCOMM Service discovery */
+    OI_MODULE_SDP_CLI,          /**< 52 Service Discovery Protocol client */
+    OI_MODULE_SDP_SRV,          /**< 53 Service Discovery Protocol server */
+    OI_MODULE_SDPDB,            /**< 54 Service Discovery Protocol database */
+    OI_MODULE_SECMGR,           /**< 55 Security Manager */
+    OI_MODULE_SNIFFLOG,         /**< 56 sniff log */
+    OI_MODULE_SUPPORT,          /**< 57 support functions, including CThru Dispatcher, time functions, and stack initialization */
+    OI_MODULE_TRANSPORT,        /**< 58 transport layer between HCI command layer and driver */
+    OI_MODULE_TEST,             /**< 59 used to debug output from internal test programs */
+    OI_MODULE_XML,              /**< 60 XML/CSS parser */
+
+    OI_MODULE_DI,               /**< 61 Device Identification Profile */
+
+    // bhapi components  --> Updates to oi_debug.c
+
+    OI_MODULE_BHAPI,            /**< 62 BLUEmagic Host API generic */
+    OI_MODULE_BHCLI,            /**< 63 BLUEmagic Host API client side */
+    OI_MODULE_BHSRV,            /**< 64 BLUEmagic Host API server side */
+    OI_MODULE_MSGQ,             /**< 65 module that handles message queuing */
+    OI_MODULE_BHAPI_TRANSPORT,  /**< 66 module that handles message queuing */
+    OI_MODULE_BLST_SRV,         /**< 67 module that provides server side BHAPI Lightweight Serial Transport */
+    OI_MODULE_BLST_CLI,         /**< 68 module that provides client side BHAPI Lightweight Serial Transport */
+
+    // OEM files --> Updates to oi_debug.c
+    OI_MODULE_OEM,              /**< 69 Application Memory allocation */
+
+    // Application glue --> Updates to oi_debug.c
+    OI_MODULE_APP,              /**< 70 Application Memory allocation */
+
+    /* various pieces of code depend on these last 2 elements occuring in a specific order:
+       OI_MODULE_ALL must be the 2nd to last element
+       OI_MODULE_UNKNOWN must be the last element
+       */
+    OI_MODULE_ALL,              /**< 71 special value identifying all modules - used for control of debug print statements */
+    OI_MODULE_UNKNOWN           /**< 72 special value - used for debug print statements */
+} OI_MODULE;
+
+/**
+ * This constant is the number of actual modules in the list.  ALL and UNKNOWN are
+ * special values that are not actually modules.
+ * Used for debug print and memmgr profiling
+ */
+#define OI_NUM_MODULES  OI_MODULE_ALL
+
+
+/**
+ * This constant is the number of profile and core components.  It is used to size
+ * the initialization and configuration tables.
+ */
+#define OI_NUM_STACK_MODULES    OI_MODULE_BHAPI
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_MODULES_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_osinterface.h b/embdrv/sbc/decoder/include/oi_osinterface.h
new file mode 100644
index 0000000..7868041
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_osinterface.h
@@ -0,0 +1,197 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_OSINTERFACE_H
+#define _OI_OSINTERFACE_H
+/**
+ @file
+ * This file provides the platform-independent interface for functions for which
+ * implementation is platform-specific.
+ *
+ * The functions in this header file define the operating system or hardware
+ * services needed by the BLUEmagic 3.0 protocol stack. The
+ * actual implementation of these services is platform-dependent.
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_time.h"
+#include "oi_status.h"
+#include "oi_modules.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Terminates execution.
+ *
+ * @param reason  Reason for termination
+ */
+void OI_FatalError(OI_STATUS reason);
+
+/**
+ * This function logs an error.
+ *
+ * When built for release mode, BLUEmagic 3 errors are logged to
+ * this function. (in debug mode, errors are logged via
+ * OI_Print()).
+ *
+ * @param module Module in which the error was detected (see
+ *                oi_modules.h)
+ * @param lineno Line number of the C file OI_SLOG_ERROR called
+ * @param status Status code associated with the error event
+ */
+void OI_LogError(OI_MODULE module, OI_INT lineno, OI_STATUS status);
+
+/**
+ * This function initializes the debug code handling.
+ *
+ * When built for debug mode, this function performs platform
+ * dependent initialization to handle message codes passed in
+ * via OI_SetMsgCode().
+ */
+void OI_InitDebugCodeHandler(void);
+
+
+/**
+ * This function reads the time from the real time clock.
+ *
+ * All timing in BM3 is relative, typically a granularity
+ * of 5 or 10 msecs is adequate.
+ *
+ * @param[out] now  Pointer to the buffer to which the current
+ *       time will be returned
+ */
+void OI_Time_Now(OI_TIME *now);
+
+/**
+ * This function causes the current thread to sleep for the
+ * specified amount of time. This function must be called
+ * without the stack access token.
+ *
+ * @note BM3 corestack and profiles never suspend and never call
+ * OI_Sleep. The use of OI_Sleep is limited to applications and
+ * platform-specific code.
+ *
+ * If your port and applications never use OI_Sleep, this function can be left unimplemented.
+ *
+ * @param milliseconds  Number of milliseconds to sleep
+ */
+void OI_Sleep(OI_UINT32 milliseconds);
+
+
+/**
+ * Defines for message type codes.
+ */
+#define OI_MSG_CODE_APPLICATION               0   /**< Application output */
+#define OI_MSG_CODE_ERROR                     1   /**< Error message output */
+#define OI_MSG_CODE_WARNING                   2   /**< Warning message output */
+#define OI_MSG_CODE_TRACE                     3   /**< User API function trace output */
+#define OI_MSG_CODE_PRINT1                    4   /**< Catagory 1 debug print output */
+#define OI_MSG_CODE_PRINT2                    5   /**< Catagory 2 debug print output */
+#define OI_MSG_CODE_HEADER                    6   /**< Error/Debug output header */
+
+/**
+ * This function is used to indicate the type of text being output with
+ * OI_Print(). For the Linux and Win32 platforms, it will set
+ * the color of the text. Other possible uses could be to insert
+ * HTML style tags, add some other message type indication, or
+ * be completely ignored altogether.
+ *
+ * @param code  OI_MSG_CODE_* indicating setting the message type.
+ */
+void OI_SetMsgCode(OI_UINT8 code);
+
+/**
+ * All output from OI_Printf() and all debug output is sent to OI_Print.
+ * Typically, if the platform has a console, OI_Print() is sent to stdout.
+ * Embedded platforms typically send OI_Print() output to a serial port.
+ *
+ * @param str  String to print
+ */
+void OI_Print(OI_CHAR const *str);
+
+/**
+ *  In cases where OI_Print() is sending output to a logfile in addition to console,
+ *  it is desirable to also put console input into the logfile.
+ *  This function can be called by the console input process.
+ *
+ *  @note This is an optional API which is strictly
+ *  between the platform-specific stack_console and osinterface
+ *  modules. This API need only be implemented on those
+ *  platforms where is serves a useful purpose, e.g., win32.
+ *
+ * @param str  Console input string
+ */
+
+void OI_Print_ConsoleInput(OI_CHAR const *str);
+
+/**
+ *  This function computes the CRC16 of the program image.
+ */
+OI_UINT16  OI_ProgramImageCRC16(void);
+
+/**
+ * Writes an integer to stdout in hex. This macro is intended
+ * for selective use when debugging in small memory
+ * configurations or other times when it is not possible to use
+ * OI_DBGPRINT.
+ *
+ * @param n  the integer to print
+ */
+
+#define OI_Print_Int(n) \
+{ \
+    static const OI_CHAR _digits[] = "0123456789ABCDEF"; \
+    OI_CHAR _buf[9]; \
+    OI_CHAR *_str = &_buf[8]; \
+    OI_UINT32 _i = n; \
+    *_str = 0; \
+    do { *(--_str) = _digits[(_i & 0xF)]; _i >>= 4; } while (_i); \
+    OI_Print(_str); \
+}
+
+/**
+ *  Application Dynamic Memory allocation.
+ *
+ *  These APIs are provided for application use on those
+ *  platforms which have no dynamic memory support. Memory is
+ *  allocated from the pool-based heap managed by the stack's
+ *  internal memory manager.
+ */
+void *OI_APP_Malloc(OI_INT32 size);
+void OI_APP_Free(void *ptr);
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_OSINTERFACE_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_status.h b/embdrv/sbc/decoder/include/oi_status.h
new file mode 100644
index 0000000..868d8dc
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_status.h
@@ -0,0 +1,579 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_STATUS_H
+#define _OI_STATUS_H
+/**
+ * @file
+ * This file contains status codes for BLUEmagic 3.0 software.
+ */
+
+#include "oi_stddefs.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+   /** test it **/
+
+/**
+ * OI_STATUS must fit in 16 bits, so status codes can range from 0 to 66535, inclusive.
+ */
+
+typedef enum {
+    OI_STATUS_SUCCESS                      = 0,   /**< function call succeeded alias for #OI_OK */
+    OI_OK                                  = 0,   /**< function call succeeded alias for #OI_STATUS_SUCCESS */
+    OI_STATUS_INVALID_PARAMETERS           = 101, /**< invalid function input parameters */
+    OI_STATUS_NOT_IMPLEMENTED              = 102, /**< attempt to use an unimplemented function */
+    OI_STATUS_NOT_INITIALIZED              = 103, /**< data not initialized */
+    OI_STATUS_NO_RESOURCES                 = 104, /**< generic resource allocation failure status */
+    OI_STATUS_INTERNAL_ERROR               = 105, /**< internal inconsistency */
+    OI_STATUS_OUT_OF_MEMORY                = 106, /**< generally, OI_Malloc failed */
+    OI_ILLEGAL_REENTRANT_CALL              = 107, /**< violation of non-reentrant module policy */
+    OI_STATUS_INITIALIZATION_FAILED        = 108, /**< module initialization failed */
+    OI_STATUS_INITIALIZATION_PENDING       = 109, /**< inititialization not yet complete */
+    OI_STATUS_NO_SCO_SUPPORT               = 110, /**< SCO operation rejected; system not configured for SCO */
+    OI_STATUS_OUT_OF_STATIC_MEMORY         = 111, /**< static malloc failed */
+    OI_TIMEOUT                             = 112, /**< generic timeout */
+    OI_OS_ERROR                            = 113, /**< some operating system error */
+    OI_FAIL                                = 114, /**< generic failure */
+    OI_STRING_FORMAT_ERROR                 = 115, /**< error in VarString formatting string */
+    OI_STATUS_PENDING                      = 116, /**< The operation is pending. */
+    OI_STATUS_INVALID_COMMAND              = 117, /**< The command was invalid. */
+    OI_BUSY_FAIL                           = 118, /**< command rejected due to busy */
+    OI_STATUS_ALREADY_REGISTERED           = 119, /**< The registration has already been performed. */
+    OI_STATUS_NOT_FOUND                    = 120, /**< The referenced resource was not found. */
+    OI_STATUS_NOT_REGISTERED               = 121, /**< not registered */
+    OI_STATUS_NOT_CONNECTED                = 122, /**< not connected */
+    OI_CALLBACK_FUNCTION_REQUIRED          = 123, /**< A callback function parameter was required. */
+    OI_STATUS_MBUF_OVERFLOW                = 124, /**< There is no room to add another buffer to an mbuf. */
+    OI_STATUS_MBUF_UNDERFLOW               = 125, /**< There was an attempt to pull too many bytes from an mbuf. */
+    OI_STATUS_CONNECTION_EXISTS            = 126, /**< connection exists */
+    OI_STATUS_NOT_CONFIGURED               = 127, /**< module not configured */
+    OI_LOWER_STACK_ERROR                   = 128, /**< An error was reported by lower stack API. This is used for embedded platforms. */
+    OI_STATUS_RESET_IN_PROGRESS            = 129, /**< Request failed/rejected because we're busy resetting. */
+    OI_STATUS_ACCESS_DENIED                = 130, /**< Generic access denied error. */
+    OI_STATUS_DATA_ERROR                   = 131, /**< Generic data error. */
+    OI_STATUS_INVALID_ROLE                 = 132, /**< The requested role was invalid. */
+    OI_STATUS_ALREADY_CONNECTED            = 133, /**< The requested connection is already established. */
+    OI_STATUS_PARSE_ERROR                  = 134, /**< Parse error */
+    OI_STATUS_END_OF_FILE                  = 135, /**< End of file */
+    OI_STATUS_READ_ERROR                   = 136, /**< Generic read error */
+    OI_STATUS_WRITE_ERROR                  = 137, /**< Generic write error */
+    OI_STATUS_NEGOTIATION_FAILURE          = 138, /**< Error in negotiation */
+    OI_STATUS_READ_IN_PROGRESS             = 139, /**< A read is already in progress */
+    OI_STATUS_ALREADY_INITIALIZED          = 140, /**< Initialization has already been done */
+    OI_STATUS_STILL_CONNECTED              = 141, /**< The service cannot be shutdown because there are still active connections. */
+    OI_STATUS_MTU_EXCEEDED                 = 142, /**< The packet is too big */
+    OI_STATUS_LINK_TERMINATED              = 143, /**< The link was terminated */
+    OI_STATUS_PIN_CODE_TOO_LONG            = 144, /**< Application gave us a pin code that is too long */
+    OI_STATUS_STILL_REGISTERED             = 145, /**< The service cannot be shutdown because there are still active registrations. */
+    OI_STATUS_SPEC_VIOLATION               = 146, /**< Some application behavior contrary to BT specifications */
+
+
+    OI_STATUS_PSM_ALREADY_REGISTERED       = 402, /**< L2CAP: The specified PSM has already been registered. */
+    OI_STATUS_INVALID_CID                  = 403, /**< L2CAP: CID is invalid or no longer valid (connection terminated) */
+    OI_STATUS_CID_NOT_FOUND                = 404, /**< L2CAP: CID does not represent a current connection */
+    OI_STATUS_CHANNEL_NOT_FOUND            = 406, /**< L2CAP: CID does not represent a current connection */
+    OI_STATUS_PSM_NOT_FOUND                = 407, /**< L2CAP: PSM not found */
+    OI_STATUS_INVALID_STATE                = 408, /**< L2CAP: invalid state */
+    OI_STATUS_WRITE_IN_PROGRESS            = 410, /**< L2CAP: write in progress */
+    OI_STATUS_INVALID_PACKET               = 411, /**< L2CAP: invalid packet */
+    OI_STATUS_SEND_COMPLETE                = 412, /**< L2CAP: send is complete */
+    OI_STATUS_INVALID_HANDLE               = 414, /**< L2CAP: handle is invalid */
+    OI_STATUS_GROUP_FULL                   = 418, /**< L2CAP: No more members can be added to the specified group. */
+    OI_STATUS_DEVICE_ALREADY_IN_GROUP      = 423, /**< L2CAP: The device already exists in the group. */
+    OI_STATUS_DUPLICATE_GROUP              = 425, /**< L2CAP: attempt to add more than one group */
+    OI_STATUS_EMPTY_GROUP                  = 426, /**< L2CAP: group is empty */
+    OI_STATUS_PACKET_NOT_FOUND             = 427, /**< L2CAP: packet not found */
+    OI_STATUS_BUFFER_TOO_SMALL             = 428, /**< L2CAP: The buffer size is too small. */
+    OI_STATUS_IDENTIFIER_NOT_FOUND         = 429, /**< L2CAP: identifier not found */
+
+    OI_L2CAP_DISCONNECT_LOWER_LAYER        = 430, /**< L2CAP: The lower level forced a disconnect. */
+    OI_L2CAP_DISCONNECT_REMOTE_REQUEST     = 431, /**< L2CAP: The remote device requested a disconnect. */
+    OI_L2CAP_GROUP_ADD_CONNECT_FAIL        = 433, /**< L2CAP: Group add connect faiL */
+    OI_L2CAP_GROUP_REMOVE_FAILURE          = 434, /**< L2CAP: Group remove failure */
+    OI_L2CAP_DATA_WRITE_ERROR_LINK_TERM    = 435, /**< L2CAP: Data write error LINK_TERM */
+    OI_L2CAP_DISCONNECT_LOCAL_REQUEST      = 436, /**< L2CAP: Disconnect local request */
+
+    OI_L2CAP_CONNECT_TIMEOUT               = 437, /**< L2CAP: Connect timeout */
+    OI_L2CAP_DISCONNECT_TIMEOUT            = 439, /**< L2CAP: Disconnect timeout */
+    OI_L2CAP_PING_TIMEOUT                  = 440, /**< L2CAP: Ping timeout */
+    OI_L2CAP_GET_INFO_TIMEOUT              = 441, /**< L2CAP: Get info timeout */
+    OI_L2CAP_INVALID_ADDRESS               = 444, /**< L2CAP: Invalid address */
+    OI_L2CAP_CMD_REJECT_RCVD               = 445, /**< L2CAP: remote sent us 'command reject' response */
+
+    OI_L2CAP_CONNECT_BASE                  = 450, /**< L2CAP: Connect base */
+    OI_L2CAP_CONNECT_PENDING               = 451, /**< L2CAP: Connect pending */
+    OI_L2CAP_CONNECT_REFUSED_INVALID_PSM   = 452, /**< L2CAP: Connect refused invalid PSM */
+    OI_L2CAP_CONNECT_REFUSED_SECURITY      = 453, /**< L2CAP: Connect refused security */
+    OI_L2CAP_CONNECT_REFUSED_NO_RESOURCES  = 454, /**< L2CAP: Connect refused no resources */
+
+    OI_L2CAP_CONFIG_BASE                   = 460, /**< L2CAP: Config base */
+    OI_L2CAP_CONFIG_FAIL_INVALID_PARAMETERS= 461, /**< L2CAP: Config fail invalid parameters */
+    OI_L2CAP_CONFIG_FAIL_NO_REASON         = 462, /**< L2CAP: Config fail no reason */
+    OI_L2CAP_CONFIG_FAIL_UNKNOWN_OPTIONS   = 463, /**< L2CAP: Config fail unknown options */
+
+    OI_L2CAP_GET_INFO_BASE                 = 470, /**< L2CAP: Get info base */
+    OI_L2CAP_GET_INFO_NOT_SUPPORTED        = 471, /**< L2CAP: Get info not supported */
+    OI_L2CAP_MTU_EXCEEDED                  = 472, /**< L2CAP: The MTU of the channel was exceeded */
+    OI_L2CAP_INVALID_PSM                   = 482, /**< L2CAP: Invalid PSM */
+    OI_L2CAP_INVALID_MTU                   = 483, /**< L2CAP: Invalid MTU */
+    OI_L2CAP_INVALID_FLUSHTO               = 484, /**< L2CAP: Invalid flush timeout */
+
+    OI_HCI_NO_SUCH_CONNECTION               = 601, /**< HCI: caller specified a non-existent connection handle */
+    OI_HCI_CB_LIST_FULL                     = 603, /**< HCI: callback list is full, cannot attempt to send command */
+    OI_HCI_EVENT_UNDERRUN                   = 605, /**< HCI: parsing event packet, premature end-of-parameters */
+    OI_HCI_UNKNOWN_EVENT_CODE               = 607, /**< HCI: event received - event code is unknown */
+    OI_HCI_BAD_EVENT_PARM_LEN               = 608, /**< HCI: event - parameter length is incorrect */
+    OI_HCI_CMD_QUEUE_FULL                   = 611, /**< HCI: command queue is full */
+    OI_HCI_SHORT_EVENT                      = 612, /**< HCI: event received, missing event code and/or parm len */
+    OI_HCI_TRANSMIT_NOT_READY               = 613, /**< HCI: ACL/SCO transmit request failed - busy or no buffers available */
+    OI_HCI_ORPHAN_SENT_EVENT                = 614, /**< HCI: got spurious 'sent' event from transport layer */
+    OI_HCI_CMD_TABLE_ERROR                  = 615, /**< HCI: inconsistency in the internal command table */
+    OI_HCI_UNKNOWN_CMD_ID                   = 616, /**< HCI: HciApi Command - unknown command id */
+    OI_HCI_UNEXPECTED_EVENT                 = 619, /**< HCI: event received which only occurs in response to our cmd */
+    OI_HCI_EVENT_TABLE_ERROR                = 620, /**< HCI: inconsistency in the internal event table */
+    OI_HCI_EXPECTED_EVENT_TIMOUT            = 621, /**< HCI: timed out waiting for an expected event */
+    OI_HCI_NO_CMD_DESC_FOR_OPCODE           = 622, /**< HCI: event opcode is not known */
+    OI_HCI_INVALID_OPCODE_ERROR             = 623, /**< HCI: command opcode is invalid */
+    OI_HCI_FLOW_CONTROL_DISABLED            = 624, /**< HCI: can not use host flow control APIs if disabled in configuration */
+    OI_HCI_TX_COMPLETE                      = 625, /**< HCI: packet delivery to Host Controler complete */
+    OI_HCI_TX_ERROR                         = 626, /**< HCI: failed to deliver packet to Host Controler */
+    OI_HCI_DEVICE_NOT_INITIALIZED           = 627, /**< HCI: commands from upper layers disallowed until device is up and running */
+    OI_HCI_UNSUPPORTED_COMMAND              = 628, /**< HCI: command requested is not supported by local device */
+    OI_HCI_PASSTHROUGH_ERROR                = 629, /**< HCI: Error processing passthrough command */
+    OI_HCI_PASSTHROUGH_ALREADY_SET          = 630, /**< HCI: Passthrough mode already enabled */
+    OI_HCI_RESET_FAILURE                    = 631, /**< HCI: failed to reset the device/baseband */
+    OI_HCI_TRANSPORT_RESET                  = 632, /**< HCI: some operation failed because of a reset in the transport */
+    OI_HCIERR_HCIIFC_INIT_FAILURE           = 633, /**< HCI: failed to initialize transport layer interface */
+
+    OI_HCIERR_FIRST_ERROR_VALUE                = 701, /**< marker for first HCI protocol error */
+    OI_HCIERR_UNKNOWN_HCI_COMMAND              = 701, /**< HCI: protocol error 0x01 */
+    OI_HCIERR_NO_CONNECTION                    = 702, /**< HCI: protocol error 0x02 */
+    OI_HCIERR_HARDWARE_FAILURE                 = 703, /**< HCI: protocol error 0x03 */
+    OI_HCIERR_PAGE_TIMEOUT                     = 704, /**< HCI: protocol error 0x04 */
+    OI_HCIERR_AUTHENTICATION_FAILURE           = 705, /**< HCI: protocol error 0x05 */
+    OI_HCIERR_KEY_MISSING                      = 706, /**< HCI: protocol error 0x06 */
+    OI_HCIERR_MEMORY_FULL                      = 707, /**< HCI: protocol error 0x07 */
+    OI_HCIERR_CONNECTION_TIMEOUT               = 708, /**< HCI: protocol error 0x08 */
+    OI_HCIERR_MAX_NUM_OF_CONNECTIONS           = 709, /**< HCI: protocol error 0x09 */
+    OI_HCIERR_MAX_NUM_OF_SCO_CONNECTIONS       = 710, /**< HCI: protocol error 0x0A */
+    OI_HCIERR_ACL_CONNECTION_ALREADY_EXISTS    = 711, /**< HCI: protocol error 0x0B */
+    OI_HCIERR_COMMAND_DISALLOWED               = 712, /**< HCI: protocol error 0x0C */
+    OI_HCIERR_HOST_REJECTED_RESOURCES          = 713, /**< HCI: protocol error 0x0D */
+    OI_HCIERR_HOST_REJECTED_SECURITY           = 714, /**< HCI: protocol error 0x0E */
+    OI_HCIERR_HOST_REJECTED_PERSONAL_DEVICE    = 715, /**< HCI: protocol error 0x0F */
+    OI_HCIERR_HOST_TIMEOUT                     = 716, /**< HCI: protocol error 0x10 */
+    OI_HCIERR_UNSUPPORTED                      = 717, /**< HCI: protocol error 0x11 */
+    OI_HCIERR_INVALID_PARAMETERS               = 718, /**< HCI: protocol error 0x12 */
+    OI_HCIERR_OTHER_END_USER_DISCONNECT        = 719, /**< HCI: protocol error 0x13 */
+    OI_HCIERR_OTHER_END_LOW_RESOURCES          = 720, /**< HCI: protocol error 0x14 */
+    OI_HCIERR_OTHER_END_POWERING_OFF           = 721, /**< HCI: protocol error 0x15 */
+    OI_HCIERR_CONNECTION_TERMINATED_LOCALLY    = 722, /**< HCI: protocol error 0x16 */
+    OI_HCIERR_REPEATED_ATTEMPTS                = 723, /**< HCI: protocol error 0x17 */
+    OI_HCIERR_PAIRING_NOT_ALLOWED              = 724, /**< HCI: protocol error 0x18 */
+    OI_HCIERR_UNKNOWN_LMP_PDU                  = 725, /**< HCI: protocol error 0x19 */
+    OI_HCIERR_UNSUPPORTED_REMOTE_FEATURE       = 726, /**< HCI: protocol error 0x1A */
+    OI_HCIERR_SCO_OFFSET_REJECTED              = 727, /**< HCI: protocol error 0x1B */
+    OI_HCIERR_SCO_INTERVAL_REJECTED            = 728, /**< HCI: protocol error 0x1C */
+    OI_HCIERR_SCO_AIR_MODE_REJECTED            = 729, /**< HCI: protocol error 0x1D */
+    OI_HCIERR_INVALID_LMP_PARMS                = 730, /**< HCI: protocol error 0x1E */
+    OI_HCIERR_UNSPECIFIED_ERROR                = 731, /**< HCI: protocol error 0x1F */
+    OI_HCIERR_UNSUPPORTED_LMP_PARAMETERS       = 732, /**< HCI: protocol error 0x20 */
+    OI_HCIERR_ROLE_CHANGE_NOT_ALLOWED          = 733, /**< HCI: protocol error 0x21 */
+    OI_HCIERR_LMP_RESPONSE_TIMEOUT             = 734, /**< HCI: protocol error 0x22 */
+    OI_HCIERR_LMP_ERROR_TRANS_COLLISION        = 735, /**< HCI: protocol error 0x23 */
+    OI_HCIERR_LMP_PDU_NOT_ALLOWED              = 736, /**< HCI: protocol error 0x24 */
+    OI_HCIERR_ENCRYPTION_MODE_NOT_ACCEPTABLE   = 737, /**< HCI: protocol error 0x25 */
+    OI_HCIERR_UNIT_KEY_USED                    = 738, /**< HCI: protocol error 0x26 */
+    OI_HCIERR_QOS_NOT_SUPPORTED                = 739, /**< HCI: protocol error 0x27 */
+    OI_HCIERR_INSTANT_PASSED                   = 740, /**< HCI: protocol error 0x28 */
+    OI_HCIERR_UNIT_KEY_PAIRING_UNSUPPORTED     = 741, /**< HCI: protocol error 0x29 */
+    OI_HCIERR_DIFFERENT_TRANS_COLLISION        = 742, /**< HCI: protocol error 0x2A */
+    OI_HCIERR_RESERVED_2B                      = 743, /**< HCI: protocol error 0x2B */
+    OI_HCIERR_QOS_UNACCEPTABLE_PARAMETER       = 744, /**< HCI: protocol error 0x2C */
+    OI_HCIERR_QOS_REJECTED                     = 745, /**< HCI: protocol error 0x2D */
+    OI_HCIERR_CHANNEL_CLASSIFICATION_NS        = 746, /**< HCI: protocol error 0x2E */
+    OI_HCIERR_INSUFFICIENT_SECURITY            = 747, /**< HCI: protocol error 0x2F */
+    OI_HCIERR_PARM_OUT_OF_MANDATORY_RANGE      = 748, /**< HCI: protocol error 0x30 */
+    OI_HCIERR_RESERVED_31                      = 749, /**< HCI: protocol error 0x31 */
+    OI_HCIERR_ROLE_SWITCH_PENDING              = 750, /**< HCI: protocol error 0x32 */
+    OI_HCIERR_RESERVED_33                      = 751, /**< HCI: protocol error 0x33 */
+    OI_HCIERR_RESERVED_SLOT_VIOLATION          = 752, /**< HCI: protocol error 0x34 */
+    OI_HCIERR_ROLE_SWITCH_FAILED               = 753, /**< HCI: protocol error 0x35 */
+    OI_HCIERR_EIR_TOO_LARGE                    = 754, /**< HCI: protocol error 0x36 */
+    OI_HCIERR_SSP_NOT_SUPPORTED_BY_HOST        = 755, /**< HCI: protocol error 0x37 */
+    OI_HCIERR_HOST_BUSY_PAIRING                = 756, /**< HCI: protocol error 0x38 */
+
+    OI_HCIERR_UNKNOWN_ERROR                    = 757, /**< HCI: unknown error code */
+    OI_HCIERR_LAST_ERROR_VALUE                 = 757, /**< marker for last HCI protocol error */
+
+    OI_SDP_SPEC_ERROR                    = 800, /**< SDP: Base error status for mapping OI_STATUS codes to SDP errors */
+    OI_SDP_INVALID_SERVICE_RECORD_HANDLE = (OI_SDP_SPEC_ERROR + 2), /**< SDP: protocol error Invalid Service Record Handle */
+    OI_SDP_INVALID_REQUEST_SYNTAX        = (OI_SDP_SPEC_ERROR + 3), /**< SDP: protocol error Invalid Request Syntax */
+    OI_SDP_INVALID_PDU_SIZE              = (OI_SDP_SPEC_ERROR + 4), /**< SDP: protocol error Invalid PDU Size */
+    OI_SDP_INVALID_CONTINUATION_STATE    = (OI_SDP_SPEC_ERROR + 5), /**< SDP: protocol error Invalid Continuation State */
+    OI_SDP_INSUFFICIENT_RESOURCES        = (OI_SDP_SPEC_ERROR + 6), /**< SDP: protocol error Insufficient Resources */
+    OI_SDP_ERROR                         = 807, /**< SDP: server returned an error code */
+    OI_SDP_CORRUPT_DATA_ELEMENT          = 808, /**< SDP: Invalid or corrupt data element representation */
+    OI_SDP_SERVER_NOT_CONNECTED          = 810, /**< SDP: Attempt to disconnect from an unconnected server */
+    OI_SDP_ACCESS_DENIED                 = 811, /**< SDP: Server denied access to server */
+    OI_SDP_ATTRIBUTES_OUT_OF_ORDER       = 812, /**< SDP: Attributes in attribute list not in ascending order */
+    OI_SDP_DEVICE_DOES_NOT_SUPPORT_SDP   = 813, /**< SDP: Tried to connect to a device that does not support SDP */
+    OI_SDP_NO_MORE_DATA                  = 815, /**< SDP: Server does not have more continuation data */
+    OI_SDP_REQUEST_PARAMS_TOO_LONG       = 816, /**< SDP: Parameters for a request exceed the L2CAP buffer size */
+    OI_SDP_REQUEST_PENDING               = 817, /**< SDP: Cannot make a request when another request is being processed */
+    OI_SDP_SERVER_CONNECT_FAILED         = 819, /**< SDP: Failed attempt to connect to an SDP server */
+    OI_SDP_SERVER_TOO_MANY_CONNECTIONS   = 821, /**< SDP: Exceeded maximum number of simultaneous server connections */
+    OI_SDP_NO_MATCHING_SERVICE_RECORD    = 823, /**< SDP: No service record matched the UUID list */
+    OI_SDP_PARTIAL_RESPONSE              = 824, /**< SDP: Internal use only */
+    OI_SDP_ILLEGAL_ARGUMENT              = 825, /**< SDP: Illegal argument passed to an SDP function */
+    OI_SDP_ATTRIBUTE_NOT_FOUND           = 826, /**< SDP: A requested attribute was not found in a service record */
+    OI_SDP_DATABASE_OUT_OF_RESOURCES     = 827, /**< SDP: server database is out of memory */
+    OI_SDP_SHORT_PDU                     = 829, /**< SDP: Not enough bytes in the packet */
+    OI_SDP_TRANSACTION_ID_MISMATCH       = 830, /**< SDP: Transaction Id was not as expected */
+    OI_SDP_UNEXPECTED_RESPONSE_PDU_ID    = 831, /**< SDP: Did not expect this response PDU */
+    OI_SDP_REQUEST_TIMEOUT               = 832, /**< SDP: Did not get a response within the timeout period */
+    OI_SDP_INVALID_RESPONSE_SYNTAX       = 833, /**< SDP: Response is not correctly formatted */
+    OI_SDP_CONNECTION_TIMEOUT            = 834, /**< SDP: Connection attempt timed out at a lower layer */
+    OI_SDP_RESPONSE_DATA_ERROR           = 835, /**< SDP: Response to a service request appears to be corrupt */
+    OI_SDP_TOO_MANY_ATTRIBUTE_BYTES      = 836, /**< SDP: Response contained more bytes than requested. */
+    OI_SDP_TOO_MANY_SERVICE_RECORDS      = 837, /**< SDP: Response contained more service records than requested. */
+    OI_SDP_INVALID_CONNECTION_ID         = 838, /**< SDP: Invalid connection ID in an SDP request */
+    OI_SDP_CANNOT_SET_ATTRIBUTE          = 839, /**< SDP: Attempt to set a dynamic attribute value failed */
+    OI_SDP_BADLY_FORMED_ATTRIBUTE_VALUE  = 840, /**< SDP: An attribute value has the wrong type or structure */
+    OI_SDP_NO_ATTRIBUTE_LIST_TO_REMOVE   = 841, /**< SDP: Attempt to remove a non-existent attribute list from a service record */
+    OI_SDP_ATTRIBUTE_LIST_ALREADY_ADDED  = 842, /**< SDP: An attribute list has already been added to the service record */
+    OI_SDP_DATA_ELEMENT_TRUNCATED        = 843, /**< SDP: Data element truncated (too few bytes) */
+
+    OI_RFCOMM_WRITE_IN_PROGRESS          = 901, /**< RFCOMM: Write in progress */
+    OI_RFCOMM_INVALID_BAUDRATE           = 903, /**< RFCOMM: Invalid baudrate */
+    OI_RFCOMM_INVALID_DATABIT            = 904, /**< RFCOMM: Invalid databit */
+    OI_RFCOMM_INVALID_STOPBIT            = 905, /**< RFCOMM: Invalid stopbit */
+    OI_RFCOMM_INVALID_PARITY             = 906, /**< RFCOMM: Invalid parity */
+    OI_RFCOMM_INVALID_PARITYTYPE         = 907, /**< RFCOMM: Invalid paritytype */
+    OI_RFCOMM_INVALID_FLOWCONTROL        = 908, /**< RFCOMM: Invalid flowcontrol */
+    OI_RFCOMM_SESSION_EXISTS             = 909, /**< RFCOMM: Session exists */
+    OI_RFCOMM_INVALID_CHANNEL            = 910, /**< RFCOMM: Invalid channel */
+    OI_RFCOMM_DLCI_EXISTS                = 911, /**< RFCOMM: DLCI exists */
+    OI_RFCOMM_LINK_NOT_FOUND             = 912, /**< RFCOMM: Link not found */
+    OI_RFCOMM_REMOTE_REJECT              = 913, /**< RFCOMM: Remote reject */
+    OI_RFCOMM_TEST_IN_PROGRESS           = 915, /**< RFCOMM: Test in progress */
+    OI_RFCOMM_SESSION_NOT_FOUND          = 916, /**< RFCOMM: Session not found */
+    OI_RFCOMM_INVALID_PACKET             = 917, /**< RFCOMM: Invalid packet */
+    OI_RFCOMM_FRAMESIZE_EXCEEDED         = 918, /**< RFCOMM: Framesize exceeded */
+    OI_RFCOMM_INVALID_DLCI               = 920, /**< RFCOMM: Invalid dlci */
+    OI_RFCOMM_SERVER_NOT_REGISTERED      = 921, /**< RFCOMM: Server not registered */
+    OI_RFCOMM_CREDIT_ERROR               = 922, /**< RFCOMM: Credit error */
+    OI_RFCOMM_NO_CHANNEL_NUMBER          = 923, /**< RFCOMM: No channel number */
+    OI_RFCOMM_QUERY_IN_PROGRESS          = 924, /**< RFCOMM: Query in progress */
+    OI_RFCOMM_SESSION_SHUTDOWN           = 925, /**< RFCOMM: Session shutdown */
+    OI_RFCOMM_LOCAL_DEVICE_DISCONNECTED  = 926, /**< RFCOMM: Local device disconnected */
+    OI_RFCOMM_REMOTE_DEVICE_DISCONNECTED = 927, /**< RFCOMM: Remote device disconnected */
+    OI_RFCOMM_OUT_OF_SERVER_CHANNELS     = 928, /**< RFCOMM: Out of server channels */
+
+    OI_DISPATCH_INVALID_CB_HANDLE        = 1001, /**< Dispatcher was handed an invalid callback handle */
+    OI_DISPATCH_TABLE_OVERFLOW           = 1002, /**< Dispatcher table is full */
+
+    OI_TEST_UNKNOWN_TEST                 = 1101, /**< TEST: Unknown test */
+    OI_TEST_FAIL                         = 1102, /**< TEST: Fail */
+
+    OI_HCITRANS_CANNOT_CONNECT_TO_DEVICE   = 1201, /**< TRANSPORT: Cannot connect to device */
+    OI_HCITRANS_BUFFER_TOO_SMALL           = 1203, /**< TRANSPORT: Buffer too small */
+    OI_HCITRANS_NULL_DEVICE_HANDLE         = 1204, /**< TRANSPORT: Null device handle */
+    OI_HCITRANS_IO_ERROR                   = 1205, /**< TRANSPORT: IO error */
+    OI_HCITRANS_DEVICE_NOT_READY           = 1206, /**< TRANSPORT: Device not ready */
+    OI_HCITRANS_FUNCTION_NOT_SUPPORTED     = 1207, /**< TRANSPORT: Function not supporteD */
+    OI_HCITRANS_ACCESS_DENIED              = 1209, /**< TRANSPORT: win32 */
+    OI_HCITRANS_ACL_DATA_ERROR             = 1210, /**< TRANSPORT: ACL data error */
+    OI_HCITRANS_SCO_DATA_ERROR             = 1211, /**< TRANSPORT: SCO data error */
+    OI_HCITRANS_EVENT_DATA_ERROR           = 1212, /**< TRANSPORT: HCI event data error */
+    OI_HCITRANS_INTERNAL_ERROR             = 1214, /**< TRANSPORT: Internal error in the transport */
+    OI_HCITRANS_LINK_NOT_ACTIVE            = 1215, /**< TRANSPORT: Link to the device is not currently active */
+    OI_HCITRANS_INITIALIZING               = 1216, /**< TRANSPORT: Transport is initializing */
+
+    OI_DEVMGR_NO_CONNECTION                = 1301, /**< DEVMGR: No connection */
+    OI_DEVMGR_HARDWARE_ERROR               = 1305, /**< DEVMGR: error reported by HCI */
+    OI_DEVMGR_PENDING_CONNECT_LIST_FULL    = 1307, /**< DEVMGR: Pending connect list full */
+    OI_DEVMGR_CONNECTION_LIST_FULL         = 1309, /**< DEVMGR: Connection list full */
+    OI_DEVMGR_NO_SUCH_CONNECTION           = 1310, /**< DEVMGR: No such connection */
+    OI_DEVMGR_INQUIRY_IN_PROGRESS          = 1311, /**< DEVMGR: Inquiry in progress */
+    OI_DEVMGR_PERIODIC_INQUIRY_ACTIVE      = 1312, /**< DEVMGR: Periodic inquiry active */
+    OI_DEVMGR_NO_INQUIRIES_ACTIVE          = 1313, /**< DEVMGR: can not cancel/exit if not active */
+    OI_DEVMGR_DUPLICATE_CONNECTION         = 1314, /**< DEVMGR: internal error */
+    OI_DEVMGR_DUPLICATE_EVENT_CALLBACK     = 1316, /**< DEVMGR: attempt to register same callback twice */
+    OI_DEVMGR_EVENT_CALLBACK_LIST_FULL     = 1317, /**< DEVMGR: can not register event callback, list is full */
+    OI_DEVMGR_EVENT_CALLBACK_NOT_FOUND     = 1318, /**< DEVMGR: attempt to unregister callback failed */
+    OI_DEVMGR_BUSY                         = 1319, /**< DEVMGR: some operations can only execute one at a time */
+    OI_DEVMGR_ENUM_UNEXPECTED_INQ_COMPLETE = 1320, /**< DEVMGR: inquiry complete event in inappropriate enumeration state */
+    OI_DEVMGR_ENUM_UNEXPECTED_INQ_RESULT   = 1321, /**< DEVMGR: inquiry result event in inappropriate enumeration state */
+    OI_DEVMGR_ENUM_DATABASE_FULL           = 1322, /**< DEVMGR: device enumeration, database is full, couldn't add a new device */
+    OI_DEVMGR_ENUM_INQUIRIES_OVERLAP       = 1323, /**< DEVMGR: device enumeration, periodic inquiries occurring too close together */
+    OI_DEVMGR_UNKNOWN_LINK_TYPE            = 1324, /**< DEVMGR: HCI connect request with unkown link type */
+    OI_DEVMGR_PARAM_IO_ACTIVE              = 1325, /**< DEVMGR: request for parameter read/write while param read/write active */
+    OI_DEVMGR_UNKNOWN_IAC_LAP              = 1326, /**< DEVMGR: unrecognized IAC LAP */
+    OI_DEVMGR_SCO_ALREADY_REGISTERED       = 1327, /**< DEVMGR: only one application can use SCO */
+    OI_DEVMGR_SCO_NOT_REGISTERED           = 1328, /**< DEVMGR: SCO applications must register before using the API */
+    OI_DEVMGR_SCO_WITHOUT_ACL              = 1329, /**< DEVMGR: Got SCO connection but there is no underlying ACL connection */
+    OI_DEVMGR_NO_SUPPORT                   = 1330, /**< DEVMGR: Request is not supported by the device */
+    OI_DEVMGR_WRITE_POLICY_FAILED          = 1331, /**< DEVMGR: connection attempt failed - unable to write link policy */
+    OI_DEVMGR_NOT_IN_MASTER_MODE           = 1332, /**< DEVMGR: OI_DEVMGR EndMasterMode without prior OI_DEVMGR_BeginMasterMode */
+    OI_DEVMGR_POLICY_VIOLATION             = 1333, /**< DEVMGR: low-power request is rejected - link policy does not allow it */
+    OI_DEVMGR_BUSY_TIMEOUT                 = 1334, /**< DEVMGR: queued operation timed out while in the queue; \n
+        timeout configurable via @ref OI_CONFIG_DEVMGR::connectQueueTimeoutSecs "connectQueueTimeoutSecs" */
+    OI_DEVMGR_REENCRYPT_FAILED             = 1335, /**< DEVMGR: failed to re-encrypt link after role switch */
+    OI_DEVMGR_ROLE_POLICY_CONFLICT         = 1336, /**< DEVMGR: requested role conflicts with current policy */
+    OI_DEVMGR_BAD_INTERVAL                 = 1337, /**< DEVMGR: current linkTO outside range of requested min/max interval */
+    OI_DEVMGR_INVALID_SCO_HANDLE           = 1338, /**< DEVMGR: HCI SCO event, invalid handle */
+    OI_DEVMGR_CONNECTION_OVERLAP           = 1339, /**< DEVMGR: Connection failed due to race condition with remote side */
+    OI_DEVMGR_ORPHAN_SUBRATE_COMPLETE      = 1340, /**< DEVMGR: sniff subrate complete, but no callback */
+    OI_DEVMGR_EIR_RESPONSE_2_LARGE         = 1341, /**< DEVMGR: eir builder, response length would exceed spec max */
+
+    OI_SECMGR_NO_POLICY                    = 1401, /**< SECMGR: no security policy has been established */
+    OI_SECMGR_INTERNAL_ERROR               = 1402, /**< SECMGR: internal inconsistency */
+    OI_SECMGR_ORPHANED_CALLBACK            = 1403, /**< SECMGR: we've been called back, but CB context is gone */
+    OI_SECMGR_BUSY                         = 1404, /**< SECMGR: configure and access request cannot be concurrent */
+    OI_SECMGR_DEVICE_NOT_TRUSTED           = 1405, /**< SECMGR: l2cap access denied - device is not trusted */
+    OI_SECMGR_DEVICE_ENCRYPT_FAIL          = 1407, /**< SECMGR: l2cap access denied - failed to start encryption */
+    OI_SECMGR_DISCONNECTED_FAIL            = 1408, /**< SECMGR: l2cap access denied - disconnected */
+    OI_SECMGR_ACCESS_PENDING               = 1409, /**< SECMGR: l2cap access request is still pending  */
+    OI_SECMGR_PIN_CODE_TOO_SHORT           = 1410, /**< SECMGR: Higher-layer process gave us a pin code that is too short */
+    OI_SECMGR_UNKNOWN_ENCRYPT_VALUE        = 1411, /**< SECMGR: got EncryptionChange event, unknown encryption enable value */
+    OI_SECMGR_INVALID_POLICY               = 1412, /**< SECMGR: the specified security policy is not valid for security mode */
+    OI_SECMGR_AUTHORIZATION_FAILED         = 1413, /**< SECMGR: device authorization failed */
+    OI_SECMGR_ENCRYPTION_FAILED            = 1414, /**< SECMGR: device encryption failed */
+    OI_SECMGR_UNIT_KEY_UNSUPPORTED         = 1415, /**< SECMGR: authentication failed due to non-support of unit keys */
+    OI_SECMGR_NOT_REGISTERED               = 1416, /**< SECMGR: required registrations have not yet occurred */
+    OI_SECMGR_ILLEGAL_WRITE_SSP_MODE       = 1417, /**< SECMGR: 2.1 HCI spec does not allow SSP mode to be disabled */
+    OI_SECMGR_INVALID_SEC_LEVEL            = 1418, /**< SECMGR: security level for a service is not a valid value */
+    OI_SECMGR_INSUFFICIENT_LINK_KEY        = 1419, /**< SECMGR: link key type is not sufficient to meet service requirements */
+    OI_SECMGR_INVALID_KEY_TYPE             = 1420, /**< SECMGR: link key type is not a valid value */
+    OI_SECMGR_SSP_NOT_ENCRYPTED            = 1421, /**< SECMGR: ssp required encryption on incoming link */
+    OI_SECMGR_ORPHAN_EVENT                 = 1422, /**< SECMGR: some HCI security event unrelated to current processes */
+    OI_SECMGR_NOT_BONDABLE                 = 1423, /**< SECMGR: not in bondable mode */
+
+    OI_TCS_INVALID_ELEMENT_TYPE            = 1602, /**< TCS: element type is invalid */
+    OI_TCS_INVALID_PACKET                  = 1603, /**< TCS: packet is invalide */
+    OI_TCS_CALL_IN_PROGRESS                = 1604, /**< TCS: call is in progress */
+    OI_TCS_NO_CALL_IN_PROGRESS             = 1605, /**< TCS: no call in progress */
+
+    OI_OBEX_CONTINUE                       = 1701, /**< OBEX: Continue processing OBEX request */
+    OI_OBEX_COMMAND_ERROR                  = 1702, /**< OBEX: An unrecognized OBEX command opcode */
+    OI_OBEX_CONNECTION_TIMEOUT             = 1703, /**< OBEX: Timeout waiting for a response to a request */
+    OI_OBEX_CONNECT_FAILED                 = 1704, /**< OBEX: An OBEX connection request did not succeed */
+    OI_OBEX_DISCONNECT_FAILED              = 1705, /**< OBEX: A disconnect failed probably because the connection did not exist */
+    OI_OBEX_ERROR                          = 1706, /**< OBEX: Unspecified OBEX error */
+    OI_OBEX_INCOMPLETE_PACKET              = 1707, /**< OBEX: Packet too short or corrupt */
+    OI_OBEX_LENGTH_REQUIRED                = 1708, /**< OBEX: Length header required in OBEX command */
+    OI_OBEX_NOT_CONNECTED                  = 1709, /**< OBEX: No connection to OBEX server */
+    OI_OBEX_NO_MORE_CONNECTIONS            = 1710, /**< OBEX: Reached max connections limit */
+    OI_OBEX_OPERATION_IN_PROGRESS          = 1711, /**< OBEX: Another operation is still in progress on a connection */
+    OI_OBEX_PUT_RESPONSE_ERROR             = 1712, /**< OBEX: An error in the response to a PUT command */
+    OI_OBEX_GET_RESPONSE_ERROR             = 1713, /**< OBEX: An error in the response to a GET command */
+    OI_OBEX_REQUIRED_HEADER_NOT_FOUND      = 1714, /**< OBEX: packet was missing a required header */
+    OI_OBEX_SERVICE_UNAVAILABLE            = 1715, /**< OBEX: Unown OBEX target or required service */
+    OI_OBEX_TOO_MANY_HEADER_BYTES          = 1716, /**< OBEX: Headers will not fit in single OBEX packet */
+    OI_OBEX_UNKNOWN_COMMAND                = 1717, /**< OBEX: Unrecognized OBEX command */
+    OI_OBEX_UNSUPPORTED_VERSION            = 1718, /**< OBEX: Version mismatch */
+    OI_OBEX_CLIENT_ABORTED_COMMAND         = 1719, /**< OBEX: server received abort command */
+    OI_OBEX_BAD_PACKET                     = 1720, /**< OBEX: Any malformed OBEX packet */
+    OI_OBEX_BAD_REQUEST                    = 1721, /**< OBEX: Maps to OBEX response of the same name */
+    OI_OBEX_OBJECT_OVERFLOW                = 1723, /**< OBEX: Too many bytes received. */
+    OI_OBEX_NOT_FOUND                      = 1724, /**< OBEX: Maps to obex response of same name */
+    OI_OBEX_ACCESS_DENIED                  = 1735, /**< OBEX: Object could not be read or written. */
+    OI_OBEX_VALUE_NOT_ACCEPTABLE           = 1736, /**< OBEX: Value in a command was not in the acceptable range. */
+    OI_OBEX_PACKET_OVERFLOW                = 1737, /**< OBEX: Buffer will not fit in a single OBEX packet. */
+    OI_OBEX_NO_SUCH_FOLDER                 = 1738, /**< OBEX: Error returned by a setpath operation. */
+    OI_OBEX_NAME_REQUIRED                  = 1739, /**< OBEX: Name must be non-null and non-empty. */
+    OI_OBEX_PASSWORD_TOO_LONG              = 1740, /**< OBEX: Password exceeds implementation imposed length limit. */
+    OI_OBEX_PRECONDITION_FAILED            = 1741, /**< OBEX: response Precondition Failed */
+    OI_OBEX_UNAUTHORIZED                   = 1742, /**< OBEX: authentication was not successful. */
+    OI_OBEX_NOT_IMPLEMENTED                = 1743, /**< OBEX: Unimplemented feature. */
+    OI_OBEX_INVALID_AUTH_DIGEST            = 1744, /**< OBEX: An authentication digest was bad. */
+    OI_OBEX_INVALID_OPERATION              = 1745, /**< OBEX: Operation not allowed at this time. */
+    OI_OBEX_DATABASE_FULL                  = 1746, /**< OBEX: Sync database full. */
+    OI_OBEX_DATABASE_LOCKED                = 1747, /**< OBEX: Sync database locked. */
+    OI_OBEX_INTERNAL_SERVER_ERROR          = 1748, /**< OBEX: response Internal Server Error */
+    OI_OBEX_UNSUPPORTED_MEDIA_TYPE         = 1749, /**< OBEX: response Unsupported Media Type */
+    OI_OBEX_PARTIAL_CONTENT                = 1750, /**< OBEX: response Partial Content */
+    OI_OBEX_METHOD_NOT_ALLOWED             = 1751, /**< OBEX: response Method Not Allowed */
+    OI_OBEXSRV_INCOMPLETE_GET              = 1752, /**< OBEX: Indicates to a GET handler that the request phase is still in progress */
+    OI_OBEX_FOLDER_BROWSING_NOT_ALLOWED    = 1753, /**< OBEX: Indicates that an FTP server does not allow folder browsing */
+    OI_OBEX_SERVER_FORCED_DISCONNECT       = 1754, /**< OBEX: connection was forcibly terminated by the server */
+    OI_OBEX_OFS_ERROR                      = 1755, /**< OBEX: OPP object file system error occurred */
+    OI_OBEX_FILEOP_ERROR                   = 1756, /**< OBEX: FTP/PBAP file operation system error occurred */
+    OI_OBEX_USERID_TOO_LONG                = 1757, /**< OBEX: User Id exceeds spec limited length limit. */
+
+    OI_HANDSFREE_EVENT_REPORTING_DISABLED  = 1801, /**< HANDSFREE: Event reporting disabled */
+    OI_HANDSFREE_NOT_CONNECTED             = 1802, /**< HANDSFREE: Not connected */
+    OI_HANDSFREE_SERVICE_NOT_STARTED       = 1803, /**< HANDSFREE: Cannot connect to handsfree AG if handsfree service not started */
+    OI_HANDSFREE_AG_SERVICE_NOT_STARTED    = 1804, /**< HANDSFREE: Cannot connect to handsfree device if handsfree AG service not started */
+    OI_HANDSFREE_COMMAND_IN_PROGRESS       = 1805, /**< HANDSFREE: Cannot accept a command at this time */
+    OI_HANDSFREE_AUDIO_ALREADY_CONNECTED   = 1806, /**< HANDSFREE: Audio is already connected */
+    OI_HANDSFREE_AUDIO_NOT_CONNECTED       = 1807, /**< HANDSFREE: Audio is not connected */
+    OI_HANDSFREE_FEATURE_NOT_SUPPORTED     = 1808, /**< HANDSFREE: Local or remote feature not supported for requested command */
+
+    OI_HEADSET_SERVICE_NOT_STARTED         = 1901, /**< HEADSET: Cannot connect to headset AG if headset service not started */
+    OI_HEADSET_AG_SERVICE_NOT_STARTED      = 1902, /**< HEADSET: Cannot connect to headset device if headset AG service not started */
+    OI_HEADSET_COMMAND_IN_PROGRESS         = 1903, /**< HEADSET: Cannot accept a command at this time */
+
+    OI_BNEP_INVALID_MTU                             = 2001, /**< BNEP: The remote device cannot support the minimum BNEP MTU */
+    OI_BNEP_SETUP_TIMEOUT                           = 2002, /**< BNEP: The setup request timed out. */
+    OI_BNEP_SERVICE_NOT_REGISTERED                  = 2003, /**< BNEP: The requested service was not found. */
+    OI_BNEP_INVALID_HANDLE                          = 2004, /**< BNEP: The specified connection handle is not valid. */
+    OI_BNEP_RESPONSE_TIMEOUT                        = 2005, /**< BNEP: The timer for receiving a response has expired. */
+    OI_BNEP_INVALID_CONNECTION                      = 2006, /**< BNEP: Invalid connection */
+    OI_BNEP_INVALID_FILTER                          = 2007, /**< BNEP: The supplied filter was invalid. */
+    OI_BNEP_CONNECTION_EXISTS                       = 2008, /**< BNEP: An attempt was made to create a duplicate connection. */
+    OI_BNEP_NOT_INITIALIZED                         = 2009, /**< BNEP: Init has not been called */
+    OI_BNEP_CONNECT_BASE                            = 2010, /**< BNEP: connection response codes */
+    OI_BNEP_CONNECT_FAILED_INVALID_DEST_UUID        = 2011, /**< BNEP: connect response code Invalid Dest UUID */
+    OI_BNEP_CONNECT_FAILED_INVALID_SOURCE_UUID      = 2012, /**< BNEP: connect response code Invalid Source UUID */
+    OI_BNEP_CONNECT_FAILED_INVALID_UUID_SIZE        = 2013, /**< BNEP: connect response code Invalid UUID Size */
+    OI_BNEP_CONNECT_FAILED_NOT_ALLOWED              = 2014, /**< BNEP: connect response code Not Allowed */
+    OI_BNEP_FILTER_NET_BASE                         = 2020, /**< BNEP: filter response codes */
+    OI_BNEP_FILTER_NET_UNSUPPORTED_REQUEST          = 2021, /**< BNEP: filter response code Unsupported Request */
+    OI_BNEP_FILTER_NET_FAILED_INVALID_PROTOCOL_TYPE = 2022, /**< BNEP: filter response code Invalid Protocol Type */
+    OI_BNEP_FILTER_NET_FAILED_MAX_LIMIT_REACHED     = 2023, /**< BNEP: filter response code Max Limit Reached */
+    OI_BNEP_FILTER_NET_FAILED_SECURITY              = 2024, /**< BNEP: filter response code Security */
+    OI_BNEP_FILTER_MULTI_BASE                       = 2030, /**< BNEP: multicast response codes */
+    OI_BNEP_FILTER_MULTI_UNSUPPORTED_REQUEST        = 2031, /**< BNEP: multicast response code Unsupported Request */
+    OI_BNEP_FILTER_MULTI_FAILED_INVALID_ADDRESS     = 2032, /**< BNEP: multicast response code Invalid Address */
+    OI_BNEP_FILTER_MULTI_FAILED_MAX_LIMIT_REACHED   = 2033, /**< BNEP: multicast response code Max Limit Reached */
+    OI_BNEP_FILTER_MULTI_FAILED_SECURITY            = 2034, /**< BNEP: multicast response code Security */
+    OI_BNEP_LOCAL_DEVICE_MUST_BE_MASTER             = 2040, /**< BNEP: Device must be master of the piconet for this function */
+    OI_BNEP_PACKET_FILTERED_OUT                     = 2041, /**< BNEP: Packet did not pass current filters */
+
+    OI_NETIFC_UP_FAILED                    = 2101, /**< NETIFC: Could not bring up network interface */
+    OI_NETIFC_COULD_NOT_CREATE_THREAD      = 2102, /**< NETIFC: Network interface could not create a read thread */
+    OI_NETIFC_INITIALIZATION_FAILED        = 2103, /**< NETIFC: Error in network interface initialization */
+    OI_NETIFC_INTERFACE_ALREADY_UP         = 2104, /**< NETIFC: Network interface is already up */
+    OI_NETIFC_INTERFACE_NOT_UP             = 2105, /**< NETIFC: Network interface is not up */
+    OI_NETIFC_PACKET_TOO_BIG               = 2106, /**< NETIFC: The packet is too big */
+
+    OI_PAN_ROLE_ALREADY_REGISTERED         = 2201, /**< PAN: This PAN role was already registered */
+    OI_PAN_ROLE_NOT_ALLOWED                = 2202, /**< PAN: The PAN role is not currently allowed */
+    OI_PAN_INCOMPATIBLE_ROLES              = 2203, /**< PAN: Only certain local and remote role combinations are permitted */
+    OI_PAN_INVALID_ROLE                    = 2204, /**< PAN: Role specified is not one the defined PAN roles */
+    OI_PAN_CONNECTION_IN_PROGRESS          = 2205, /**< PAN: A PAN connection is currently being established */
+    OI_PAN_USER_ALREADY_CONNECTED          = 2206, /**< PAN: PAN user role only allows a single connection */
+    OI_PAN_DEVICE_CONNECTED                = 2207, /**< PAN: A PAN connection already exists to specified device */
+
+    OI_CODEC_SBC_NO_SYNCWORD               = 2301, /**< CODEC: Couldn't find an SBC SYNCWORD */
+    OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA    = 2302, /**< CODEC: Not enough data provided to decode an SBC header */
+    OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA      = 2303, /**< CODEC: Decoded the header, but not enough data to contain the rest of the frame */
+    OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA     = 2304, /**< CODEC: Not enough audio data for this frame */
+    OI_CODEC_SBC_CHECKSUM_MISMATCH         = 2305, /**< CODEC: The frame header didn't match the checksum */
+    OI_CODEC_SBC_PARTIAL_DECODE            = 2306, /**< CODEC: Decoding was successful, but frame data still remains. Next call will provide audio without consuming input data. */
+
+    OI_FIFOQ_QUEUE_NOT_ALIGNED             = 2401, /**< FIFOQ: queue must be 32-bit aligned */
+    OI_FIFOQ_INVALID_Q                     = 2402, /**< FIFOQ: queue parameter is not a valid queue */
+    OI_FIFOQ_BUF_TOO_LARGE                 = 2403, /**< FIFOQ: attempt to queue a buffer which is too large */
+    OI_FIFOQ_FULL                          = 2404, /**< FIFOQ: enqueue() failed, queue is full */
+    OI_FIFOQ_NOT_ALLOCATED                 = 2405, /**< FIFOQ: Enqueue QBuf() failed, buffer not allocated */
+    OI_FIFOQ_INVALID_DATA_PTR              = 2406, /**< FIFOQ: Enqueue QBuf() failed, data pointer does not match */
+
+    OI_HID_HOST_SERVICE_NOT_STARTED        = 2601, /**< HID: Cannot connect to a HID device unless HID host is started */
+    OI_HID_DEVICE_SERVICE_NOT_STARTED      = 2602, /**< HID: Cannot connect to a HID host unless HID device is started */
+
+    OI_AT_ERROR                            = 2701, /**< AT: ERROR response */
+    OI_AT_NO_CARRIER                       = 2702, /**< AT: NO CARRIER response */
+    OI_AT_BUSY                             = 2703, /**< AT: BUSY response */
+    OI_AT_NO_ANSWER                        = 2704, /**< AT: NO ANSWER response */
+    OI_AT_DELAYED                          = 2705, /**< AT: DELAYED response */
+    OI_AT_BLACKLISTED                      = 2706, /**< AT: BLACKLISTED response */
+    OI_AT_CME_ERROR                        = 2707, /**< AT: +CME ERROR response */
+    OI_AT_CMS_ERROR                        = 2708, /**< AT: +CMS ERROR response */
+
+    OI_BLST_CHARACTER_TIMEOUT              = 2801, /**< BLST: Timeout expired while waiting for a character from the client. */
+    OI_BLST_ACKNOWLDGE_TIMEOUT             = 2802, /**< BLST: Timeout expired while waiting for event acknowledgment from the client */
+    OI_BLST_TX_NOT_READY                   = 2803, /**< BLST: BLST is not ready to send a BHAPI message to the client. */
+    OI_BLST_TX_BUSY                        = 2804, /**< BLST: BLST transmit buffer is in use. */
+
+    OI_AVDTP_CONNECTION_SEQ_ERROR          = 2901, /**< AVDTP: sequencing of signalling/media channel connections broken. */
+    OI_AVDTP_OUT_OF_RESOURCES              = 2902, /**< AVDTP: Tried to allocate too many endpoints or signalling channels. */
+
+    OI_PBAP_REPOSITORY_NOT_SET             = 3001, /**< PBAP: Phonebook repository must be set for operation to complete. */
+    OI_PBAP_PHONEBOOK_NOT_SET              = 3002, /**< PBAP: Phonebook be set for operation to complete. */
+
+    OI_AADP_BAD_ENDPOINT                   = 3101, /**< AADP: Invalid local endpoint specified */
+    OI_AADP_BAD_STATE                      = 3102, /**< AADP: AADP State is not correct for this operation. */
+
+    OI_UNICODE_INVALID_SOURCE              = 3200, /**< Unicode Conversion: Source string has invalid character encoding. */
+    OI_UNICODE_SOURCE_EXHAUSTED            = 3201, /**< Unicode Conversion: Incomplete Unicode character at end of source buffer. */
+    OI_UNICODE_DESTINATION_EXHAUSTED       = 3202, /**< Unicode Conversion: Destination buffer not large enough to hold resulting Unicode string. */
+
+    OI_AVRCP_TOO_MANY_CONNECTIONS          = 3300, /**< AVRCP: Exceeded maximum number of simultaneous AVCTP connections. */
+    OI_AVRCP_NOT_IMPLEMENTED               = 3301, /**< AVRCP: The target does not implement the command specified by the opcode and operand. */
+    OI_AVRCP_REJECTED                      = 3302, /**< AVRCP: The target cannot respond because of invalid operands in command packet. */
+    OI_AVRCP_INVALID_RESPONSE              = 3303, /**< AVRCP: The controller received the response with invalid parameters */
+    OI_AVRCP_RESPONSE_PACKET_OVERFLOW      = 3304, /**< AVRCP: The response message does not fir in one AVRCP packet (512 bytes), has to be fragmented. */
+    OI_AVRCP_RESPONSE_INVALID_PDU          = 3305, /**< AVRCP: Command rejected: target received a PDU that it did not understand. */
+    OI_AVRCP_RESPONSE_INVALID_PARAMETER    = 3306, /**< AVRCP: Command rejected: target received a PDU with a parameter ID that it did not understand. */
+    OI_AVRCP_RESPONSE_PARAMETER_NOT_FOUND  = 3307, /**< AVRCP: Command rejected: specified parameter not found, sent if the parameter ID is understood, but content is wrong or corrupted.*/
+    OI_AVRCP_RESPONSE_INTERNAL_ERROR       = 3308, /**< AVRCP: Command rejected: target detected other error conditions. */
+    OI_MAX_BM3_STATUS_VAL,       /* Maximum BM3 status code */
+
+    /* Status code values reserved for BM3 SDK platform-specific implementations */
+    OI_STATUS_RESERVED_FOR_BCOT = 9000,
+
+    /* Status code values reserved for BHAPI products */
+    OI_STATUS_RESERVED_FOR_BHAPI = 9200,
+
+    /* Status code values reserved for Soundabout products */
+    OI_STATUS_RESERVED_FOR_SOUNDABOUT= 9400,
+
+    /*
+     * Status code values greater than or equal to this value are reserved for use by applications.
+     * However, because of differences between compilers, and differences between 16-bit and 32-bit
+     * platforms custom status codes should be in the 16-bit range, so status codes can range from 0
+     * to 65534, inclusive (65535 is reserved)
+     */
+    OI_STATUS_RESERVED_FOR_APPS = 10000,
+
+
+
+    OI_STATUS_NONE = 0xffff     /**< Special status code to indicate that there is no status. (Only to be used for special cases involving OI_SLOG_ERROR() and OI_SLOG_WARNING().) */
+
+} OI_STATUS;
+
+
+/* Remeber to update the #define below when new reserved blocks are added to
+ * the list above. */
+#define OI_NUM_RESERVED_STATUS_BLOCKS 4 /**< Number of status code blocks reserved, including user apps */
+
+
+/**
+ * Test for success
+ */
+#define OI_SUCCESS(x)    ((x) == OI_OK)
+
+/*****************************************************************************/
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_STATUS_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_stddefs.h b/embdrv/sbc/decoder/include/oi_stddefs.h
new file mode 100644
index 0000000..ec8c453
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_stddefs.h
@@ -0,0 +1,232 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 OI_STDDEFS_H
+#define OI_STDDEFS_H
+/**
+ * @file
+ * This file contains BM3 standard type definitions.
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef FALSE
+#define FALSE 0         /**< This define statement sets FALSE as a preprocessor alias for 0. */
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)  /**< This define statement sets TRUE as a preprocessor alias for !FALSE. */
+#endif
+
+#ifdef HEW_TOOLCHAIN
+    #ifdef NULL
+        #undef NULL         /**< Override HEW toolchain NULL definition */
+    #endif
+    #define NULL 0          /**< HEW toolchain does not allow us to compare (void*) type to function pointer */
+#else
+    #ifndef NULL
+        #define NULL ((void*)0) /**< This define statement sets NULL as a preprocessor alias for (void*)0 */
+    #endif
+#endif
+
+/**
+ * @name  Maximum and minimum values for basic types
+ * @{
+ */
+#define OI_INT8_MIN   ((OI_INT8)0x80)          /**< decimal value: -128 */
+#define OI_INT8_MAX   ((OI_INT8)0x7F)          /**< decimal value: 127 */
+#define OI_INT16_MIN  ((OI_INT16)0x8000)       /**< decimal value: -32768 */
+#define OI_INT16_MAX  ((OI_INT16)0x7FFF)       /**< decimal value: 32767 */
+#define OI_INT32_MIN  ((OI_INT32)0x80000000)   /**< decimal value: -2,147,483,648 */
+#define OI_INT32_MAX  ((OI_INT32)0x7FFFFFFF)   /**< decimal value: 2,147,483,647 */
+#define OI_UINT8_MIN  ((OI_UINT8)0)            /**< decimal value: 0 */
+#define OI_UINT8_MAX  ((OI_UINT8)0xFF)         /**< decimal value: 255 */
+#define OI_UINT16_MIN ((OI_UINT16)0)           /**< decimal value: 0 */
+#define OI_UINT16_MAX ((OI_UINT16)0xFFFF)      /**< decimal value: 65535 */
+#define OI_UINT32_MIN ((OI_UINT32)0)           /**< decimal value: 0 */
+#define OI_UINT32_MAX ((OI_UINT32)0xFFFFFFFF)  /**< decimal value: 4,294,967,295 */
+
+/**
+ * @}
+ */
+
+/**
+ * @name  Integer types required by the Service Discovery Protocol
+ * @{
+ */
+
+/** unsigned 64-bit integer as a structure of two unsigned 32-bit integers */
+typedef struct {
+    OI_UINT32 I1; /**< most significant 32 bits */
+    OI_UINT32 I2; /**< least significant 32 bits */
+} OI_UINT64;
+
+#define OI_UINT64_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT64_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 64-bit integer as a structure of one unsigned 32-bit integer and one signed 32-bit integer */
+typedef struct {
+    OI_INT32  I1; /**< most significant 32 bits  as a signed integer */
+    OI_UINT32 I2; /**< least significant 32 bits as an unsigned integer */
+} OI_INT64;
+
+#define OI_INT64_MIN { (OI_INT32)0x80000000, (OI_UINT32)0x00000000 }
+#define OI_INT64_MAX { (OI_INT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** unsigned 128-bit integer as a structure of four unsigned 32-bit integers */
+typedef struct {
+    OI_UINT32 I1; /**< most significant 32 bits */
+    OI_UINT32 I2; /**< second-most significant 32 bits */
+    OI_UINT32 I3; /**< third-most significant 32 bits */
+    OI_UINT32 I4; /**< least significant 32 bits */
+} OI_UINT128;
+
+#define OI_UINT128_MIN { (OI_UINT32)0x00000000, (OI_UINT32)0x00000000,  (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_UINT128_MAX { (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF,  (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/** signed 128-bit integer as a structure of three unsigned 32-bit integers and one signed 32-bit integer */
+typedef struct {
+    OI_INT32  I1;  /**< most significant 32 bits as a signed integer */
+    OI_UINT32 I2;  /**< second-most significant 32 bits as an unsigned integer */
+    OI_UINT32 I3;  /**< third-most significant 32 bits as an unsigned integer */
+    OI_UINT32 I4;  /**< least significant 32 bits as an unsigned integer */
+} OI_INT128;
+
+#define OI_INT128_MIN { (OI_UINT32)0x80000000, (OI_UINT32)0x00000000,  (OI_UINT32)0x00000000, (OI_UINT32)0x00000000 }
+#define OI_INT128_MAX { (OI_UINT32)0X7FFFFFFF, (OI_UINT32)0XFFFFFFFF,  (OI_UINT32)0XFFFFFFFF, (OI_UINT32)0XFFFFFFFF }
+
+/**
+ * @}
+ */
+
+
+/**
+ * type for ASCII character data items
+ */
+typedef char OI_CHAR;
+
+/**
+ * type for double-byte character data items
+ */
+typedef OI_UINT16 OI_CHAR16;
+
+/**
+ * types for UTF encoded strings.
+ */
+typedef OI_UINT8  OI_UTF8;
+typedef OI_UINT16 OI_UTF16;
+typedef OI_UINT32 OI_UTF32;
+
+
+/**
+ * @name Single-bit operation macros
+ * @{
+ * In these macros, x is the data item for which a bit is to be tested or set and y specifies which bit
+ * is to be tested or set.
+ */
+
+/** This macro's value is TRUE if the bit specified by y is set in data item x. */
+#define OI_BIT_TEST(x,y)   ((x) & (y))
+
+/** This macro's value is TRUE if the bit specified by y is not set in data item x. */
+#define OI_BIT_CLEAR_TEST(x,y)  (((x) & (y)) == 0)
+
+/** This macro sets the bit specified by y in data item x. */
+#define OI_BIT_SET(x,y)    ((x) |= (y))
+
+/** This macro clears the bit specified by y in data item x. */
+#define OI_BIT_CLEAR(x,y)  ((x) &= ~(y))
+
+/** @} */
+
+/**
+ * The OI_ARRAYSIZE macro is set to the number of elements in an array
+ * (instead of the number of bytes, which is returned by sizeof()).
+ */
+
+#ifndef OI_ARRAYSIZE
+#define OI_ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
+#endif
+
+/**
+ * @name Preprocessor aliases for individual bit positions
+ *      Bits are defined here only if they are not already defined.
+ * @{
+ */
+
+#ifndef BIT0
+
+#define BIT0   0x00000001  /**< preprocessor alias for 32-bit value with bit 0 set, used to specify this single bit */
+#define BIT1   0x00000002  /**< preprocessor alias for 32-bit value with bit 1 set, used to specify this single bit */
+#define BIT2   0x00000004  /**< preprocessor alias for 32-bit value with bit 2 set, used to specify this single bit */
+#define BIT3   0x00000008  /**< preprocessor alias for 32-bit value with bit 3 set, used to specify this single bit */
+#define BIT4   0x00000010  /**< preprocessor alias for 32-bit value with bit 4 set, used to specify this single bit */
+#define BIT5   0x00000020  /**< preprocessor alias for 32-bit value with bit 5 set, used to specify this single bit */
+#define BIT6   0x00000040  /**< preprocessor alias for 32-bit value with bit 6 set, used to specify this single bit */
+#define BIT7   0x00000080  /**< preprocessor alias for 32-bit value with bit 7 set, used to specify this single bit */
+#define BIT8   0x00000100  /**< preprocessor alias for 32-bit value with bit 8 set, used to specify this single bit */
+#define BIT9   0x00000200  /**< preprocessor alias for 32-bit value with bit 9 set, used to specify this single bit */
+#define BIT10  0x00000400  /**< preprocessor alias for 32-bit value with bit 10 set, used to specify this single bit */
+#define BIT11  0x00000800  /**< preprocessor alias for 32-bit value with bit 11 set, used to specify this single bit */
+#define BIT12  0x00001000  /**< preprocessor alias for 32-bit value with bit 12 set, used to specify this single bit */
+#define BIT13  0x00002000  /**< preprocessor alias for 32-bit value with bit 13 set, used to specify this single bit */
+#define BIT14  0x00004000  /**< preprocessor alias for 32-bit value with bit 14 set, used to specify this single bit */
+#define BIT15  0x00008000  /**< preprocessor alias for 32-bit value with bit 15 set, used to specify this single bit */
+#define BIT16  0x00010000  /**< preprocessor alias for 32-bit value with bit 16 set, used to specify this single bit */
+#define BIT17  0x00020000  /**< preprocessor alias for 32-bit value with bit 17 set, used to specify this single bit */
+#define BIT18  0x00040000  /**< preprocessor alias for 32-bit value with bit 18 set, used to specify this single bit */
+#define BIT19  0x00080000  /**< preprocessor alias for 32-bit value with bit 19 set, used to specify this single bit */
+#define BIT20  0x00100000  /**< preprocessor alias for 32-bit value with bit 20 set, used to specify this single bit */
+#define BIT21  0x00200000  /**< preprocessor alias for 32-bit value with bit 21 set, used to specify this single bit */
+#define BIT22  0x00400000  /**< preprocessor alias for 32-bit value with bit 22 set, used to specify this single bit */
+#define BIT23  0x00800000  /**< preprocessor alias for 32-bit value with bit 23 set, used to specify this single bit */
+#define BIT24  0x01000000  /**< preprocessor alias for 32-bit value with bit 24 set, used to specify this single bit */
+#define BIT25  0x02000000  /**< preprocessor alias for 32-bit value with bit 25 set, used to specify this single bit */
+#define BIT26  0x04000000  /**< preprocessor alias for 32-bit value with bit 26 set, used to specify this single bit */
+#define BIT27  0x08000000  /**< preprocessor alias for 32-bit value with bit 27 set, used to specify this single bit */
+#define BIT28  0x10000000  /**< preprocessor alias for 32-bit value with bit 28 set, used to specify this single bit */
+#define BIT29  0x20000000  /**< preprocessor alias for 32-bit value with bit 29 set, used to specify this single bit */
+#define BIT30  0x40000000  /**< preprocessor alias for 32-bit value with bit 30 set, used to specify this single bit */
+#define BIT31  0x80000000  /**< preprocessor alias for 32-bit value with bit 31 set, used to specify this single bit */
+
+#endif  /* BIT0 et al */
+
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/*****************************************************************************/
+#endif /* OI_STDDEFS_H */
diff --git a/embdrv/sbc/decoder/include/oi_string.h b/embdrv/sbc/decoder/include/oi_string.h
new file mode 100644
index 0000000..1b12b5a
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_string.h
@@ -0,0 +1,208 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 OI_STRING_H
+#define OI_STRING_H
+/**
+ * @file
+ * This file contains BM3 supplied portable string.h functions
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_cpu_dep.h"
+#include "oi_stddefs.h"
+
+#if defined(USE_NATIVE_MEMCPY) || defined(USE_NATIVE_MALLOC)
+#include <string.h>
+#endif
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * If we are using Native malloc(), we must also use
+ * native Ansi string.h functions for memory manipulation.
+ */
+#ifdef USE_NATIVE_MALLOC
+#ifndef USE_NATIVE_MEMCPY
+#define USE_NATIVE_MEMCPY
+#endif
+#endif
+
+#ifdef USE_NATIVE_MEMCPY
+
+#define OI_MemCopy(to, from, size)    memcpy((to), (from), (size))
+#define OI_MemSet(block, val, size)   memset((block), (val), (size))
+#define OI_MemZero(block, size)       memset((block), 0, (size))
+#define OI_MemCmp(s1, s2, n)          memcmp((s1), (s2), (n))
+#define OI_Strcpy(dest, src)          strcpy((dest),(src))
+#define OI_Strcat(dest, src)          strcat((dest),(src))
+#define OI_StrLen(str)                strlen((str))
+#define OI_Strcmp(s1, s2)             strcmp((s1), (s2))
+#define OI_Strncmp(s1, s2, n)         strncmp((s1), (s2), (n))
+
+#else
+
+/*
+ * OI_MemCopy
+ *
+ * Copy an arbitrary number of bytes from one memory address to another.
+ * The underlying implementation is the ANSI memmove() or equivalant, so
+ * overlapping memory copies will work correctly.
+ */
+void OI_MemCopy(void *To, void const *From, OI_UINT32 Size);
+
+
+/*
+ * OI_MemSet
+ *
+ * Sets all bytes in a block of memory to the same value
+ */
+void OI_MemSet(void *Block, OI_UINT8 Val, OI_UINT32 Size);
+
+
+/*
+ * OI_MemZero
+ *
+ * Sets all bytes in a block of memory to zero
+ */
+void OI_MemZero(void *Block, OI_UINT32 Size);
+
+
+/*
+ * OI_MemCmp
+ *
+ * Compare two blocks of memory
+ *
+ * Returns:
+ *        0, if s1 == s2
+ *      < 0, if s1 < s2
+ *      > 0, if s2 > s2
+ */
+OI_INT OI_MemCmp(void const *s1, void const *s2, OI_UINT32 n);
+
+/*
+ * OI_Strcpy
+ *
+ * Copies the Null terminated string from pStr to pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcpy(OI_CHAR *pDest,
+                   OI_CHAR const *pStr);
+
+/*
+ * OI_Strcat
+ *
+ * Concatonates the pStr string to the end of pDest, and
+ * returns pDest.
+ */
+
+OI_CHAR* OI_Strcat(OI_CHAR *pDest,
+                   OI_CHAR const *pStr) ;
+
+/*
+ * OI_StrLen
+ *
+ * Calculates the number of OI_CHARs in pStr (not including
+ * the Null terminator) and returns the value.
+ */
+OI_UINT OI_StrLen(OI_CHAR const *pStr) ;
+
+/*
+ * OI_Strcmp
+ *
+ * Compares two Null terminated strings
+ *
+ * Returns:
+ *        0, if s1 == s2
+ *      < 0, if s1 < s2
+ *      > 0, if s2 > s2
+ */
+OI_INT OI_Strcmp(OI_CHAR const *s1,
+                 OI_CHAR const *s2);
+
+/*
+ * OI_Strncmp
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2.
+ *
+ * Returns:
+ *        0, if s1 == s2
+ *      < 0, if s1 < s2
+ *      > 0, if s2 > s2
+ */
+OI_INT OI_Strncmp(OI_CHAR const *s1,
+                  OI_CHAR const *s2,
+                  OI_UINT32      len);
+
+
+#endif /* USE_NATIVE_MEMCPY */
+
+/*
+ * OI_StrcmpInsensitive
+ *
+ * Compares two Null terminated strings, treating
+ * the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ * Returns:
+ *        0, if s1 == s2
+ *      < 0, if s1 < s2
+ *      > 0, if s2 > s2
+ */
+OI_INT OI_StrcmpInsensitive(OI_CHAR const *s1,
+                            OI_CHAR const *s2);
+
+/*
+ * OI_StrncmpInsensitive
+ *
+ * Compares the first "len" OI_CHARs of strings s1 and s2,
+ * treating the Upper and Lower case of 'A' through 'Z' as
+ * equivilent.
+ *
+ *
+ * Returns:
+ *        0, if s1 == s2
+ *      < 0, if s1 < s2
+ *      > 0, if s2 > s2
+ */
+OI_INT OI_StrncmpInsensitive(OI_CHAR const *s1,
+                             OI_CHAR const *s2,
+                             OI_UINT        len);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+/*****************************************************************************/
+#endif /* OI_STRING_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_time.h b/embdrv/sbc/decoder/include/oi_time.h
new file mode 100644
index 0000000..40b8dfc
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_time.h
@@ -0,0 +1,200 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_TIME_H
+#define _OI_TIME_H
+/** @file
+ *
+ * This file provides time type definitions and interfaces to time-related functions.
+ *
+ * The stack maintains a 64-bit real-time millisecond clock. The choice of
+ * milliseconds is for convenience, not accuracy.
+ *
+ * Timeouts are specified as tenths of seconds in a 32-bit value. Timeout values
+ * specified by the Bluetooth specification are usually muliple seconds, so
+ * accuracy to a tenth of a second is more than adequate.
+ *
+ * This file also contains macros to convert between seconds and the Link
+ * Manager's 1.28-second units.
+ *
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/**
+ * Within the core stack timeouts are specified in intervals of tenths of seconds
+ */
+
+typedef OI_UINT16 OI_INTERVAL;
+#define OI_INTERVALS_PER_SECOND     10
+#define MSECS_PER_OI_INTERVAL       (1000 / OI_INTERVALS_PER_SECOND)
+
+/** maximum interval (54 min 36.7 sec) */
+#define OI_MAX_INTERVAL   0x7fff
+
+
+/**
+ * Macro to convert seconds to OI_INTERVAL time units
+ */
+
+#define OI_SECONDS(n)    ((OI_INTERVAL) ((n) * OI_INTERVALS_PER_SECOND))
+
+/**
+ * Macro to convert milliseconds to OI_INTERVAL time units (Rounded Up)
+ */
+
+#define OI_MSECONDS(n)   ((OI_INTERVAL) ((n + MSECS_PER_OI_INTERVAL - 1) / MSECS_PER_OI_INTERVAL))
+
+/**
+ * Macro to convert minutes to OI_INTERVAL time units
+ */
+
+#define OI_MINUTES(n)    ((OI_INTERVAL) ((n) * OI_SECONDS(60)))
+
+/** Convert an OI_INTERVAL to milliseconds. */
+#define OI_INTERVAL_TO_MILLISECONDS(i) ((i) * MSECS_PER_OI_INTERVAL)
+
+/**
+ * The stack depends on relative not absolute time. Any mapping between the
+ * stack's real-time clock and absolute time and date is implementation-dependent.
+ */
+
+typedef struct {
+    OI_INT32 seconds;
+    OI_INT16 mseconds;
+} OI_TIME;
+
+/**
+ * Convert an OI_TIME to milliseconds.
+ *
+ * @param t  the time to convert
+ *
+ * @return the time in milliseconds
+ */
+OI_UINT32 OI_Time_ToMS(OI_TIME *t);
+
+
+/**
+ * This function compares two time values.
+ *
+ * @param T1 first time to compare.
+ *
+ * @param T2 second time to compare.
+ *
+ * @return
+ @verbatim
+     -1 if t1 < t2
+      0 if t1 = t2
+     +1 if t1 > t2
+ @endverbatim
+ */
+
+OI_INT16 OI_Time_Compare(OI_TIME *T1,
+                         OI_TIME *T2);
+
+
+/**
+ * This function returns the interval between two times to a granularity of 0.1 seconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_INTERVAL value so this function only works for time intervals
+ * that are less than about 71 minutes.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_INTERVAL OI_Time_Interval(OI_TIME *Sooner,
+                             OI_TIME *Later);
+
+
+
+/**
+ * This function returns the interval between two times to a granularity of milliseconds.
+ *
+ * @param Sooner a time value more recent that Later
+ *
+ * @param Later a time value later than Sooner
+ *
+ * @note The result is an OI_UINT32 value so this function only works for time intervals
+ * that are less than about 50 days.
+ *
+ * @return the time interval between the two times = (Later - Sooner)
+ */
+
+OI_UINT32 OI_Time_IntervalMsecs(OI_TIME *Sooner,
+                                OI_TIME *Later);
+
+
+
+/**
+ * This function answers the question, Have we reached or gone past the target time?
+ *
+ * @param pTargetTime   target time
+ *
+ * @return  TRUE means time now is at or past target time
+ *          FALSE means target time is still some time in the future
+ */
+
+OI_BOOL  OI_Time_NowReachedTime(OI_TIME *pTargetTime);
+
+/**
+ *  Convert seconds to the Link Manager 1.28-second units
+ *  Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_SECONDS_TO_LM_TIME_UNITS(lmUnits) ((lmUnits)<4?(lmUnits):(lmUnits)-((lmUnits)>>2))
+
+
+/**
+ *  Convert Link Manager 1.28-second units to seconds.
+ *  Approximate by using 1.25 conversion factor.
+ */
+
+#define OI_LM_TIME_UNITS_TO_SECONDS(lmUnits) ((lmUnits) + ((lmUnits)>>2))
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+/* Include for OI_Time_Now() prototype
+ * Must be included at end to obtain OI_TIME typedef
+ */
+#include "oi_osinterface.h"
+
+/*****************************************************************************/
+#endif /* _OI_TIME_H */
+
diff --git a/embdrv/sbc/decoder/include/oi_utils.h b/embdrv/sbc/decoder/include/oi_utils.h
new file mode 100644
index 0000000..5272259
--- /dev/null
+++ b/embdrv/sbc/decoder/include/oi_utils.h
@@ -0,0 +1,377 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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 _OI_UTILS_H
+#define _OI_UTILS_H
+/**
+ * @file
+ *
+ * This file provides the interface for utility functions.
+ * Among the utilities are strlen (string length), strcmp (string compare), and
+ * other string manipulation functions. These are provided for those plaforms
+ * where this functionality is not available in stdlib.
+ */
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include <stdarg.h>
+#include "oi_common.h"
+#include "oi_string.h"
+#include "oi_bt_spec.h"
+
+/** \addtogroup Misc Miscellaneous APIs */
+/**@{*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Opaque type for a callback function handle. See OI_ScheduleCallbackFunction()
+ */
+typedef OI_UINT32 OI_CALLBACK_HANDLE;
+
+
+/**
+ * Function prototype for a timed procedure callback.
+ *
+ * @param arg                 Value that was passed into the OI_ScheduleCallback() function
+ *
+ */
+typedef void (*OI_SCHEDULED_CALLBACK)(void *arg);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This API uses BLUEmagic's internal
+ * function dispatch mechanism, so applications that make extensive use of this facility may need to
+ * increase the value of DispatchTableSize in the configuration block for the dispatcher (see
+ * oi_bt_stack_config.h).
+ *
+ * @param callbackFunction    The function that will be called when the timeout expires
+ *
+ * @param arg                 Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout             A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ *                            zero in which case the callback function will be called as soon as
+ *                            possible.
+ *
+ * @param handle              NULL or a pointer receive the callback handle.
+ *
+ * @return                    OI_OK if the function was reqistered, or an error status.
+ */
+OI_STATUS OI_ScheduleCallbackFunction(OI_SCHEDULED_CALLBACK callbackFunction,
+                                      void                 *arg,
+                                      OI_INTERVAL           timeout,
+                                      OI_CALLBACK_HANDLE   *handle);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallbackFunction() before its timer expires.
+ *
+ * @param handle              handle returned by  OI_ScheduleCallbackFunction().
+ *
+ * @return                    OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallbackFunction(OI_CALLBACK_HANDLE handle);
+
+
+/**
+ * Registers a function to be called when a timeout expires. This version does not return a handle
+ * so can only be canceled by calling OI_CancelCallback().
+ *
+ * @param callbackFunction    The function that will be called when the timeout expires
+ *
+ * @param arg                 Value that will be returned as the parameter to the callback function.
+ *
+ * @param timeout             A timeout expressed in OI_INTERVALs (tenths of seconds). This can be
+ *                            zero in which case the callback function will be called as soon as
+ *                            possible.
+ *
+ * @return                    OI_OK if the function was reqistered, or an error status.
+ */
+#define OI_ScheduleCallback(f, a, t)  OI_ScheduleCallbackFunction(f, a, t, NULL);
+
+
+/**
+ * Cancels a function registered with OI_ScheduleCallback() before its timer expires. This
+ * function will cancel the first entry matches the indicated callback function pointer.
+ *
+ * @param callbackFunction    The function that was originally registered
+ *
+ * @return                    OI_OK if the function was cancelled, or an error status.
+ */
+OI_STATUS OI_CancelCallback(OI_SCHEDULED_CALLBACK callbackFunction);
+
+
+/**
+ * Parse a Bluetooth device address from the specified string.
+ *
+ * @param str   the string to parse
+ * @param addr  the parsed address, if successful
+ *
+ * @return TRUE if an address was successfully parsed, FALSE otherwise
+ */
+
+OI_BOOL OI_ParseBdAddr(const OI_CHAR *str,
+                       OI_BD_ADDR    *addr) ;
+
+/**
+ * Printf function for platforms which have no stdio or printf available.
+ * OI_Printf supports the basic formatting types, with the exception of
+ * floating point types. Additionally, OI_Printf supports several formats
+ * specific to BLUEmagic 3.0 software:
+ *
+ * \%!   prints the string for an #OI_STATUS value.
+ *       @code OI_Printf("There was an error %!", status); @endcode
+ *
+ * \%@   prints a hex dump of a buffer.
+ *       Requires a pointer to the buffer and a signed integer length
+ *       (0 for default length). If the buffer is large, only an excerpt will
+ *       be printed.
+ *       @code OI_Printf("Contents of buffer %@", buffer, sizeof(buffer)); @endcode
+ *
+ * \%:   prints a Bluetooth address in the form "HH:HH:HH:HH:HH:HH".
+ *       Requires a pointer to an #OI_BD_ADDR.
+ *       @code OI_Printf("Bluetooth address %:", &bdaddr); @endcode
+ *
+ * \%^   decodes and prints a data element as formatted XML.
+ *       Requires a pointer to an #OI_DATAELEM.
+ *       @code OI_Printf("Service attribute list is:\n%^", &attributes); @endcode
+ *
+ * \%/   prints the base file name of a path, that is, the final substring
+ *       following a '/' or '\\' character. Requires a pointer to a null
+ *       terminated string.
+ *       @code OI_Printf("File %/", "c:\\dir1\\dir2\\file.txt"); @endcode
+ *
+ * \%~   prints a string, escaping characters as needed to display it in
+ *       ASCII. Requires a pointer to an #OI_PSTR and an #OI_UNICODE_ENCODING
+ *       parameter.
+ *       @code OI_Printf("Identifier %~", &id, OI_UNICODE_UTF16_BE); @endcode
+ *
+ * \%[   inserts an ANSI color escape sequence. Requires a single character
+ *       identifying the color to select. Colors are red (r/R), green (g/G),
+ *       blue (b/B), yellow (y/Y), cyan (c/C), magenta (m/M), white (W),
+ *       light-gray (l/L), dark-gray (d/D), and black (0). The lower case is
+ *       dim, the upper case is bright (except in the case of light-gray and
+ *       dark-gray, where bright and dim are identical). Any other value will
+ *       select the default color.
+ *       @code OI_Printf("%[red text %[black %[normal\n", 'r', '0', 0); @endcode
+ *
+ * \%a   same as \%s, except '\\r' and '\\n' are output as "<cr>" and "<lf>".
+ *       \%?a is valid, but \%la is not.
+ *
+ * \%b   prints an integer in base 2.
+ *       @code OI_Printf("Bits are %b", I); @endcode
+ *
+ * \%lb  prints a long integer in base 2.
+ *
+ * \%?b  prints the least significant N bits of an integer (or long integer)
+ *       in base 2. Requires the integer and a length N.
+ *       @code OI_Printf("Bottom 4 bits are: %?b", I, 4); @endcode
+ *
+ * \%B   prints an integer as boolean text, "TRUE" or "FALSE".
+ *       @code OI_Printf("The value 0 is %B, the value 1 is %B", 0, 1); @endcode
+ *
+ * \%?s  prints a substring up to a specified maximum length.
+ *       Requires a pointer to a string and a length parameter.
+ *       @code OI_Printf("String prefix is %?s", str, 3); @endcode
+ *
+ * \%ls  same as \%S.
+ *
+ * \%S   prints a UTF16 string as UTF8 (plain ASCII, plus 8-bit char sequences
+ *       where needed). Requires a pointer to #OI_CHAR16. \%?S is valid. The
+ *       length parameter is in OI_CHAR16 characters.
+ *
+ * \%T   prints time, formatted as "secs.msecs".
+ *       Requires pointer to #OI_TIME struct, NULL pointer prints current time.
+ *       @code OI_Printf("The time now is %T", NULL); @endcode
+ *
+ *  @param format   The format string
+ *
+ */
+void OI_Printf(const OI_CHAR *format, ...);
+
+
+/**
+ * Var-args version OI_Printf
+ *
+ * @param format   Same as for OI_Printf.
+ *
+ * @param argp     Var-args list.
+ */
+void OI_VPrintf(const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Writes a formatted string to a buffer. This function supports the same format specifiers as
+ * OI_Printf().
+ *
+ * @param buffer   Destination buffer for the formatted string.
+ *
+ * @param bufLen   The length of the destination buffer.
+ *
+ * @param format   The format string
+ *
+ * @return   Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_SNPrintf(OI_CHAR *buffer,
+                    OI_UINT16 bufLen,
+                    const OI_CHAR* format, ...);
+
+
+/**
+ * Var-args version OI_SNPrintf
+ *
+ * @param buffer   Destination buffer for the formatted string.
+ *
+ * @param bufLen   The length of the destination buffer.
+ *
+ * @param format   The format string
+ *
+ * @param argp     Var-args list.
+ *
+ * @return   Number of characters written or -1 in the case of an error.
+ */
+OI_INT32 OI_VSNPrintf(OI_CHAR *buffer,
+                     OI_UINT16 bufLen,
+                     const OI_CHAR *format, va_list argp);
+
+
+/**
+ * Convert a string to an integer.
+ *
+ * @param str  the string to parse
+ *
+ * @return the integer value of the string or 0 if the string could not be parsed
+ */
+OI_INT OI_atoi(const OI_CHAR *str);
+
+
+/**
+ * Parse a signed integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str    String to parse.
+ *
+ * @param val    Pointer to receive the parsed integer value.
+ *
+ * @return       A pointer to the first character following the integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanInt(const OI_CHAR *str,
+                          OI_INT32 *val);
+
+
+/**
+ * Parse an unsigned integer in a string.
+ *
+ * Skips leading whitespace (space and tabs only) and parses a decimal or hex string. Hex string
+ * must be prefixed by "0x". Returns pointer to first character following the integer. Returns the
+ * pointer passed in if the string does not describe an integer.
+ *
+ * @param str    String to parse.
+ *
+ * @param val    Pointer to receive the parsed unsigned integer value.
+ *
+ * @return       A pointer to the first character following the unsigned integer or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanUInt(const OI_CHAR *str,
+                           OI_UINT32 *val);
+
+/**
+ * Parse a whitespace delimited substring out of a string.
+ *
+ * @param str     Input string to parse.
+ * @param outStr  Buffer to return the substring
+ * @param len     Length of outStr
+ *
+ *
+ * @return       A pointer to the first character following the substring or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanStr(const OI_CHAR *str,
+                          OI_CHAR *outStr,
+                          OI_UINT16 len);
+
+
+/**
+ * Parse a string for one of a set of alternative value. Skips leading whitespace (space and tabs
+ * only) and parses text matching one of the alternative strings. Returns pointer to first character
+ * following the matched text.
+ *
+ * @param str    String to parse.
+ *
+ * @param alts   Alternative matching strings separated by '|'
+ *
+ * @param index  Pointer to receive the index of the matching alternative, return value is -1 if
+ *               there is no match.
+ *
+ * @return       A pointer to the first character following the matched value or the pointer passed in
+ *               if there was no matching text.
+ */
+const OI_CHAR* OI_ScanAlt(const OI_CHAR *str,
+                          const OI_CHAR *alts,
+                          OI_INT *index);
+
+/**
+ * Parse a string for a BD Addr. Skips leading whitespace (space and tabs only) and parses a
+ * Bluetooth device address with nibbles optionally separated by colons. Return pointet to first
+ * character following the BD Addr.
+ *
+ * @param str    String to parse.
+ *
+ * @param addr   Pointer to receive the Bluetooth device address
+ *
+ * @return       A pointer to the first character following the BD Addr or the pointer passed in.
+ */
+const OI_CHAR* OI_ScanBdAddr(const OI_CHAR *str,
+                             OI_BD_ADDR *addr);
+
+
+/** Get a character from a digit integer value (0 - 9). */
+#define OI_DigitToChar(d) ((d) + '0')
+
+/**
+ * Determine Maximum and Minimum between two arguments.
+ *
+ * @param a  1st value
+ * @param b  2nd value
+ *
+ * @return the max or min value between a & b
+ */
+#define OI_MAX(a, b) (((a) < (b)) ? (b) : (a) )
+#define OI_MIN(a, b) (((a) > (b)) ? (b) : (a) )
+
+/**
+ * Compare two BD_ADDRs
+ * SAME_BD_ADDR - Boolean: TRUE if they are the same address
+ */
+
+#define SAME_BD_ADDR(x, y)      (0 == OI_MemCmp((x),(y),OI_BD_ADDR_BYTE_SIZE) )
+
+#ifdef __cplusplus
+}
+#endif
+
+/**@}*/
+
+#endif /* _OI_UTILS_H */
+
diff --git a/embdrv/sbc/decoder/srce/alloc.c b/embdrv/sbc/decoder/srce/alloc.c
new file mode 100644
index 0000000..f8723f2
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/alloc.c
@@ -0,0 +1,78 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <oi_codec_sbc_private.h>
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                                     OI_UINT32 *codecDataAligned,
+                                     OI_UINT32 codecDataBytes,
+                                     OI_UINT8 maxChannels,
+                                     OI_UINT8 pcmStride)
+{
+    int i;
+    size_t filterBufferCount;
+    size_t subdataSize;
+    OI_BYTE *codecData = (OI_BYTE*)codecDataAligned;
+
+    if (maxChannels < 1 || maxChannels > 2) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (pcmStride < 1 || pcmStride > maxChannels) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    common->maxChannels = maxChannels;
+    common->pcmStride = pcmStride;
+
+    /* Compute sizes needed for the memory regions, and bail if we don't have
+     * enough memory for them. */
+    subdataSize = maxChannels * sizeof(common->subdata[0]) * SBC_MAX_BANDS * SBC_MAX_BLOCKS;
+    if (subdataSize > codecDataBytes) {
+        return OI_STATUS_OUT_OF_MEMORY;
+    }
+
+    filterBufferCount = (codecDataBytes - subdataSize) / (sizeof(common->filterBuffer[0][0]) * SBC_MAX_BANDS * maxChannels);
+    if (filterBufferCount < SBC_CODEC_MIN_FILTER_BUFFERS) {
+        return OI_STATUS_OUT_OF_MEMORY;
+    }
+    common->filterBufferLen = filterBufferCount * SBC_MAX_BANDS;
+
+    /* Allocate memory for the subband data */
+    common->subdata = (OI_INT32*)codecData;
+    codecData += subdataSize;
+    OI_ASSERT(codecDataBytes >= subdataSize);
+    codecDataBytes -= subdataSize;
+
+    /* Allocate memory for the synthesis buffers */
+    for (i = 0; i < maxChannels; ++i) {
+        size_t allocSize = common->filterBufferLen * sizeof(common->filterBuffer[0][0]);
+        common->filterBuffer[i] = (SBC_BUFFER_T*)codecData;
+        OI_ASSERT(codecDataBytes >= allocSize);
+        codecData += allocSize;
+        codecDataBytes -= allocSize;
+    }
+
+    return OI_OK;
+}
diff --git a/embdrv/sbc/decoder/srce/bitalloc-sbc.c b/embdrv/sbc/decoder/srce/bitalloc-sbc.c
new file mode 100644
index 0000000..8120298
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitalloc-sbc.c
@@ -0,0 +1,165 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include <oi_codec_sbc_private.h>
+
+static void dualBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    OI_UINT bitcountL;
+    OI_UINT bitcountR;
+    OI_UINT bitpoolPreferenceL = 0;
+    OI_UINT bitpoolPreferenceR = 0;
+    BITNEED_UNION1 bitneedsL;
+    BITNEED_UNION1 bitneedsR;
+
+    bitcountL = computeBitneed(common, bitneedsL.uint8, 0, &bitpoolPreferenceL);
+    bitcountR = computeBitneed(common, bitneedsR.uint8, 1, &bitpoolPreferenceR);
+
+    oneChannelBitAllocation(common, &bitneedsL, 0, bitcountL);
+    oneChannelBitAllocation(common, &bitneedsR, 1, bitcountR);
+}
+
+static void stereoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+    BITNEED_UNION2 bitneeds;
+    OI_UINT excess;
+    OI_INT bitadjust;
+    OI_UINT bitcount;
+    OI_UINT sbL;
+    OI_UINT sbR;
+    OI_UINT bitpoolPreference = 0;
+
+    bitcount = computeBitneed(common, &bitneeds.uint8[0], 0, &bitpoolPreference);
+    bitcount += computeBitneed(common, &bitneeds.uint8[nrof_subbands], 1, &bitpoolPreference);
+
+    {
+        OI_UINT ex;
+        bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds.uint32, 2 * nrof_subbands, bitcount, &ex);
+        /* We want the compiler to put excess into a register */
+        excess = ex;
+    }
+    sbL = 0;
+    sbR = nrof_subbands;
+    while (sbL < nrof_subbands) {
+        excess = allocAdjustedBits(&common->bits.uint8[sbL], bitneeds.uint8[sbL] + bitadjust, excess);
+        ++sbL;
+        excess = allocAdjustedBits(&common->bits.uint8[sbR], bitneeds.uint8[sbR] + bitadjust, excess);
+        ++sbR;
+    }
+    sbL = 0;
+    sbR = nrof_subbands;
+    while (excess) {
+        excess = allocExcessBits(&common->bits.uint8[sbL], excess);
+        ++sbL;
+        if (!excess) {
+            break;
+        }
+        excess = allocExcessBits(&common->bits.uint8[sbR], excess);
+        ++sbR;
+    }
+
+}
+
+static const BIT_ALLOC balloc[] = {
+    monoBitAllocation,    /* SBC_MONO */
+    dualBitAllocation,    /* SBC_DUAL_CHANNEL */
+    stereoBitAllocation,  /* SBC_STEREO */
+    stereoBitAllocation   /* SBC_JOINT_STEREO */
+};
+
+
+PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    OI_ASSERT(common->frameInfo.bitpool <= OI_SBC_MaxBitpool(&common->frameInfo));
+    OI_ASSERT(common->frameInfo.mode < OI_ARRAYSIZE(balloc));
+
+    /*
+     * Using an array of function pointers prevents the compiler from creating a suboptimal
+     * monolithic inlined bit allocation function.
+     */
+    balloc[common->frameInfo.mode](common);
+}
+
+OI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    return internal_CalculateBitrate(frame);
+}
+
+/*
+ * Return the current maximum bitneed and clear it.
+ */
+OI_UINT8 OI_CODEC_SBC_GetMaxBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    OI_UINT8 max = common->maxBitneed;
+
+    common->maxBitneed = 0;
+    return max;
+}
+
+/*
+ * Calculates the bitpool size for a given frame length
+ */
+OI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
+                                        OI_UINT16 frameLen)
+{
+    OI_UINT16 nrof_subbands = frame->nrof_subbands;
+    OI_UINT16 nrof_blocks = frame->nrof_blocks;
+    OI_UINT16 hdr;
+    OI_UINT16 bits;
+
+    if (frame->mode == SBC_JOINT_STEREO) {
+        hdr = 9 * nrof_subbands;
+    } else {
+        if (frame->mode == SBC_MONO) {
+            hdr = 4 * nrof_subbands;
+        } else {
+            hdr = 8 * nrof_subbands;
+        }
+        if (frame->mode == SBC_DUAL_CHANNEL) {
+            nrof_blocks *= 2;
+        }
+    }
+    bits = 8 * (frameLen - SBC_HEADER_LEN) - hdr;
+    return DIVIDE(bits, nrof_blocks);
+}
+
+OI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    return sizeof(OI_INT16) * common->pcmStride * common->frameInfo.nrof_subbands * common->frameInfo.nrof_blocks;
+}
+
+
+OI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    return internal_CalculateFramelen(frame);
+}
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/bitalloc.c b/embdrv/sbc/decoder/srce/bitalloc.c
new file mode 100644
index 0000000..544c470
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitalloc.c
@@ -0,0 +1,392 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+
+The functions in this file relate to the allocation of available bits to
+subbands within the SBC/eSBC frame, along with support functions for computing
+frame length and bitrate.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_utils.h"
+#include <oi_codec_sbc_private.h>
+
+OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    switch (frame->mode) {
+        case SBC_MONO:
+        case SBC_DUAL_CHANNEL:
+            return 16 * frame->nrof_subbands;
+        case SBC_STEREO:
+        case SBC_JOINT_STEREO:
+            return 32 * frame->nrof_subbands;
+    }
+
+    ERROR(("Invalid frame mode %d", frame->mode));
+    OI_ASSERT(FALSE);
+    return 0; /* Should never be reached */
+}
+
+
+PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    OI_UINT16 nbits = frame->nrof_blocks * frame->bitpool;
+    OI_UINT16 nrof_subbands = frame->nrof_subbands;
+    OI_UINT16 result = nbits;
+
+    if (frame->mode == SBC_JOINT_STEREO) {
+        result += nrof_subbands + (8 * nrof_subbands);
+    } else {
+        if (frame->mode == SBC_DUAL_CHANNEL) { result += nbits; }
+        if (frame->mode == SBC_MONO) { result += 4*nrof_subbands; } else { result += 8*nrof_subbands; }
+    }
+    return SBC_HEADER_LEN + (result + 7) / 8;
+}
+
+
+PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    OI_UINT blocksbands;
+    blocksbands = frame->nrof_subbands * frame->nrof_blocks;
+
+    return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency, blocksbands);
+}
+
+
+INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_)
+{
+    OI_UINT headerLen = SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels/2;
+
+    if (frame->mode == SBC_JOINT_STEREO) { headerLen++; }
+
+    *headerLen_ = headerLen;
+    return internal_CalculateFramelen(frame);
+}
+
+
+#define MIN(x, y)  ((x) < (y) ? (x) : (y))
+
+
+/*
+ * Computes the bit need for each sample and as also returns a counts of bit needs that are greater
+ * than one. This count is used in the first phase of bit allocation.
+ *
+ * We also compute a preferred bitpool value that this is the minimum bitpool needed to guarantee
+ * lossless representation of the audio data. The preferred bitpool may be larger than the bits
+ * actually required but the only input we have are the scale factors. For example, it takes 2 bits
+ * to represent values in the range -1 .. +1 but the scale factor is 0. To guarantee lossless
+ * representation we add 2 to each scale factor and sum them to come up with the preferred bitpool.
+ * This is not ideal because 0 requires 0 bits but we currently have no way of knowing this.
+ *
+ * @param bitneed       Array to return bitneeds for each subband
+ *
+ * @param ch            Channel 0 or 1
+ *
+ * @param preferredBitpool  Returns the number of reserved bits
+ *
+ * @return              The SBC bit need
+ *
+ */
+OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                              OI_UINT8 *bitneeds,
+                              OI_UINT ch,
+                              OI_UINT *preferredBitpool)
+{
+    static const OI_INT8 offset4[4][4] = {
+        { -1, 0, 0, 0 },
+        { -2, 0, 0, 1 },
+        { -2, 0, 0, 1 },
+        { -2, 0, 0, 1 }
+    };
+
+    static const OI_INT8 offset8[4][8] = {
+        { -2, 0, 0, 0, 0, 0, 0, 1 },
+        { -3, 0, 0, 0, 0, 0, 1, 2 },
+        { -4, 0, 0, 0, 0, 0, 1, 2 },
+        { -4, 0, 0, 0, 0, 0, 1, 2 }
+    };
+
+    const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+    OI_UINT sb;
+    OI_INT8 *scale_factor = &common->scale_factor[ch ? nrof_subbands : 0];
+    OI_UINT bitcount = 0;
+    OI_UINT8 maxBits = 0;
+    OI_UINT8 prefBits = 0;
+
+    if (common->frameInfo.alloc == SBC_SNR) {
+        for (sb = 0; sb < nrof_subbands; sb++) {
+            OI_INT bits = scale_factor[sb];
+            if (bits > maxBits) {
+                maxBits = bits;
+            }
+            if ((bitneeds[sb] = bits) > 1) {
+                bitcount += bits;
+            }
+            prefBits += 2 + bits;
+        }
+    } else {
+        const OI_INT8 *offset;
+        if (nrof_subbands == 4) {
+            offset = offset4[common->frameInfo.freqIndex];
+        } else {
+            offset = offset8[common->frameInfo.freqIndex];
+        }
+        for (sb = 0; sb < nrof_subbands; sb++) {
+            OI_INT bits = scale_factor[sb];
+            if (bits > maxBits) {
+                maxBits = bits;
+            }
+            prefBits += 2 + bits;
+            if (bits) {
+                bits -= offset[sb];
+                if (bits > 0) {
+                    bits /= 2;
+                }
+                bits += 5;
+            }
+            if ((bitneeds[sb] = bits) > 1) {
+                bitcount += bits;
+            }
+        }
+    }
+    common->maxBitneed = OI_MAX(maxBits, common->maxBitneed);
+    *preferredBitpool += prefBits;
+    return bitcount;
+}
+
+
+/*
+ * Explanation of the adjustToFitBitpool inner loop.
+ *
+ * The inner loop computes the effect of adjusting the bit allocation up or
+ * down. Allocations must be 0 or in the range 2..16. This is accomplished by
+ * the following code:
+ *
+ *           for (s = bands - 1; s >= 0; --s) {
+ *              OI_INT bits = bitadjust + bitneeds[s];
+ *              bits = bits < 2 ? 0 : bits;
+ *              bits = bits > 16 ? 16 : bits;
+ *              count += bits;
+ *          }
+ *
+ * This loop can be optimized to perform 4 operations at a time as follows:
+ *
+ * Adjustment is computed as a 7 bit signed value and added to the bitneed.
+ *
+ * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the
+ * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80
+ * for -ve values and 0x7F for +ve values.
+ *
+ * n &= 0x7F + (n & 0x40) >> 6)
+ *
+ * Allocations greater than 16 are truncated to 16. Adjusted allocations are in
+ * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit
+ * to create a mask that zeroes bits 0 .. 3 if bit 4 is set.
+ *
+ * n &= (15 + (n >> 4))
+ *
+ * Allocations of 1 are disallowed. Add and shift creates a mask that
+ * eliminates the illegal value
+ *
+ * n &= ((n + 14) >> 4) | 0x1E
+ *
+ * These operations can be performed in 8 bits without overflowing so we can
+ * operate on 4 values at once.
+ */
+
+
+/*
+ * Encoder/Decoder
+ *
+ * Computes adjustment +/- of bitneeds to fill bitpool and returns overall
+ * adjustment and excess bits.
+ *
+ * @param bitpool   The bitpool we have to work within
+ *
+ * @param bitneeds  An array of bit needs (more acturately allocation prioritities) for each
+ *                  subband across all blocks in the SBC frame
+ *
+ * @param subbands  The number of subbands over which the adkustment is calculated. For mono and
+ *                  dual mode this is 4 or 8, for stereo or joint stereo this is 8 or 16.
+ *
+ * @param bitcount  A starting point for the adjustment
+ *
+ * @param excess    Returns the excess bits after the adjustment
+ *
+ * @return   The adjustment.
+ */
+OI_INT adjustToFitBitpool(const OI_UINT bitpool,
+                                 OI_UINT32 *bitneeds,
+                                 const OI_UINT subbands,
+                                 OI_UINT bitcount,
+                                 OI_UINT *excess)
+{
+    OI_INT maxBitadjust = 0;
+    OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8;
+    OI_INT chop = 8;
+
+    /*
+     * This is essentially a binary search for the optimal adjustment value.
+     */
+    while ((bitcount != bitpool) && chop) {
+        OI_UINT32 total = 0;
+        OI_UINT count;
+        OI_UINT32 adjust4;
+        OI_INT i;
+
+        adjust4 = bitadjust & 0x7F;
+        adjust4 |= (adjust4 << 8);
+        adjust4 |= (adjust4 << 16);
+
+        for (i = (subbands / 4 - 1); i >= 0; --i) {
+            OI_UINT32 mask;
+            OI_UINT32 n = bitneeds[i] + adjust4;
+            mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6);
+            n &= mask;
+            mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4);
+            n &= mask;
+            mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E);
+            n &= mask;
+            total += n;
+        }
+
+        count = (total & 0xFFFF) + (total >> 16);
+        count = (count & 0xFF) + (count >> 8);
+
+        chop >>= 1;
+        if (count > bitpool) {
+            bitadjust -= chop;
+        } else {
+            maxBitadjust = bitadjust;
+            bitcount = count;
+            bitadjust += chop;
+        }
+    }
+
+    *excess = bitpool - bitcount;
+
+    return maxBitadjust;
+}
+
+
+/*
+ * The bit allocator trys to avoid single bit allocations except as a last resort. So in the case
+ * where a bitneed of 1 was passed over during the adsjustment phase 2 bits are now allocated.
+ */
+INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
+                                OI_INT bits,
+                                OI_INT excess)
+{
+    if (bits < 16) {
+        if (bits > 1) {
+            if (excess) {
+                ++bits;
+                --excess;
+            }
+        } else if ((bits == 1) && (excess > 1)) {
+            bits = 2;
+            excess -= 2;
+        } else {
+            bits  = 0;
+        }
+    } else {
+        bits = 16;
+    }
+    *dest = (OI_UINT8)bits;
+    return excess;
+}
+
+
+/*
+ * Excess bits not allocated by allocaAdjustedBits are allocated round-robin.
+ */
+INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
+                              OI_INT excess)
+{
+    if (*dest < 16) {
+        *dest += 1;
+        return excess - 1;
+    } else {
+        return excess;
+    }
+}
+
+void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                                    BITNEED_UNION1 *bitneeds,
+                                    OI_UINT ch,
+                                    OI_UINT bitcount)
+{
+    const OI_UINT8 nrof_subbands = common->frameInfo.nrof_subbands;
+    OI_UINT excess;
+    OI_UINT sb;
+    OI_INT bitadjust;
+    OI_UINT8 RESTRICT *allocBits;
+
+
+    {
+        OI_UINT ex;
+        bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32, nrof_subbands, bitcount, &ex);
+        /* We want the compiler to put excess into a register */
+        excess = ex;
+    }
+
+    /*
+     * Allocate adjusted bits
+     */
+    allocBits = &common->bits.uint8[ch ? nrof_subbands : 0];
+
+    sb = 0;
+    while (sb < nrof_subbands) {
+        excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust, excess);
+        ++sb;
+    }
+    sb = 0;
+    while (excess) {
+        excess = allocExcessBits(&allocBits[sb], excess);
+        ++sb;
+    }
+}
+
+
+void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
+{
+    BITNEED_UNION1 bitneeds;
+    OI_UINT bitcount;
+    OI_UINT bitpoolPreference = 0;
+
+    bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference);
+
+    oneChannelBitAllocation(common, &bitneeds, 0, bitcount);
+}
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/bitstream-decode.c b/embdrv/sbc/decoder/srce/bitstream-decode.c
new file mode 100644
index 0000000..7eb2a90
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/bitstream-decode.c
@@ -0,0 +1,92 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Functions for manipulating input bitstreams.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_stddefs.h"
+#include "oi_bitstream.h"
+#include "oi_assert.h"
+
+PRIVATE void OI_BITSTREAM_ReadInit(OI_BITSTREAM *bs,
+                                   const OI_BYTE *buffer)
+{
+    bs->value = ((OI_INT32)buffer[0] << 16) | ((OI_INT32)buffer[1] << 8) | (buffer[2]);
+    bs->ptr.r = buffer + 3;
+    bs->bitPtr = 8;
+}
+
+PRIVATE OI_UINT32 OI_BITSTREAM_ReadUINT(OI_BITSTREAM *bs, OI_UINT bits)
+{
+    OI_UINT32 result;
+
+    OI_BITSTREAM_READUINT(result, bits, bs->ptr.r, bs->value, bs->bitPtr);
+
+    return result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT4Aligned(OI_BITSTREAM *bs)
+{
+    OI_UINT32 result;
+
+    OI_ASSERT(bs->bitPtr < 16);
+    OI_ASSERT(bs->bitPtr % 4 == 0);
+
+    if (bs->bitPtr == 8) {
+        result = bs->value << 8;
+        bs->bitPtr = 12;
+    } else {
+        result = bs->value << 12;
+        bs->value = (bs->value << 8) | *bs->ptr.r++;
+        bs->bitPtr = 8;
+    }
+    result >>= 28;
+    OI_ASSERT(result < (1u << 4));
+    return (OI_UINT8)result;
+}
+
+PRIVATE OI_UINT8 OI_BITSTREAM_ReadUINT8Aligned(OI_BITSTREAM *bs)
+{
+    OI_UINT32 result;
+    OI_ASSERT(bs->bitPtr == 8);
+
+    result = bs->value >> 16;
+    bs->value = (bs->value << 8) | *bs->ptr.r++;
+
+    return (OI_UINT8)result;
+}
+
+/**
+@}
+*/
+
+
diff --git a/embdrv/sbc/decoder/srce/decoder-oina.c b/embdrv/sbc/decoder/srce/decoder-oina.c
new file mode 100644
index 0000000..93d05ea
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-oina.c
@@ -0,0 +1,140 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file exposes OINA-specific interfaces to decoder functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+
+#include <oi_codec_sbc_private.h>
+
+OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                           OI_BOOL enhanced,
+                                           OI_UINT8 frequency,
+                                           OI_UINT8 mode,
+                                           OI_UINT8 subbands,
+                                           OI_UINT8 blocks,
+                                           OI_UINT8 alloc,
+                                           OI_UINT8 maxBitpool)
+{
+    if (frequency > SBC_FREQ_48000) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (enhanced) {
+#ifdef SBC_ENHANCED
+        if (subbands != SBC_SUBBANDS_8) {
+            return OI_STATUS_INVALID_PARAMETERS;
+        }
+#else
+        return OI_STATUS_INVALID_PARAMETERS;
+#endif
+    }
+
+    if (mode > SBC_JOINT_STEREO) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (subbands > SBC_SUBBANDS_8) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (blocks > SBC_BLOCKS_16) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (alloc > SBC_SNR) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+#ifdef SBC_ENHANCED
+    context->common.frameInfo.enhanced = enhanced;
+#else
+    context->common.frameInfo.enhanced = FALSE;
+#endif
+    context->common.frameInfo.freqIndex = frequency;
+    context->common.frameInfo.mode = mode;
+    context->common.frameInfo.subbands = subbands;
+    context->common.frameInfo.blocks = blocks;
+    context->common.frameInfo.alloc = alloc;
+    context->common.frameInfo.bitpool = maxBitpool;
+
+    OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+    if (context->common.frameInfo.nrof_channels >= context->common.pcmStride) {
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    return OI_OK;
+}
+
+
+
+OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                 OI_UINT8 bitpool,
+                                 const OI_BYTE **frameData,
+                                 OI_UINT32 *frameBytes,
+                                 OI_INT16 *pcmData,
+                                 OI_UINT32 *pcmBytes)
+{
+    return internal_DecodeRaw(context,
+                              bitpool,
+                              frameData,
+                              frameBytes,
+                              pcmData,
+                              pcmBytes);
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                    OI_BOOL                       enhanced,
+                                    OI_UINT8                      subbands)
+{
+	if (enhanced)
+	{
+#ifdef SBC_ENHANCED
+        context->enhancedEnabled = TRUE;
+#else
+        context->enhancedEnabled = FALSE;
+#endif
+	}
+	else
+	{
+        context->enhancedEnabled = FALSE;
+	}
+    context->restrictSubbands = subbands;
+    context->limitFrameFormat = TRUE;
+    return OI_OK;
+}
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/decoder-private.c b/embdrv/sbc/decoder/srce/decoder-private.c
new file mode 100644
index 0000000..faccbf0
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-private.c
@@ -0,0 +1,227 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+ ***********************************************************************************/
+
+/**
+@file
+This file drives SBC decoding.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+#include <stdio.h>
+
+OI_CHAR * const OI_Codec_Copyright = "Copyright 2002-2007 Open Interface North America, Inc. All rights reserved";
+
+INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                       OI_UINT32 *decoderData,
+                                       OI_UINT32 decoderDataBytes,
+                                       OI_BYTE maxChannels,
+                                       OI_BYTE pcmStride,
+                                       OI_BOOL enhanced)
+{
+    OI_UINT i;
+    OI_STATUS status;
+
+    for (i = 0; i < sizeof(*context); i++) {
+        ((char *)context)[i] = 0;
+    }
+
+#ifdef SBC_ENHANCED
+    context->enhancedEnabled = enhanced ? TRUE : FALSE;
+#else
+    context->enhancedEnabled = FALSE;
+    if (enhanced){
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+#endif
+
+    status = OI_CODEC_SBC_Alloc(&context->common, decoderData, decoderDataBytes, maxChannels, pcmStride);
+
+    if (!OI_SUCCESS(status)) {
+        return status;
+    }
+
+    context->common.codecInfo = OI_Codec_Copyright;
+    context->common.maxBitneed = 0;
+    context->limitFrameFormat = FALSE;
+    OI_SBC_ExpandFrameFields(&context->common.frameInfo);
+
+    /*PLATFORM_DECODER_RESET(context);*/
+
+    return OI_OK;
+}
+
+
+
+
+/**
+ * Read the SBC header up to but not including the joint stereo mask.  The syncword has already been
+ * examined, and the enhanced mode flag set, by FindSyncword.
+ */
+INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data)
+{
+    OI_CODEC_SBC_FRAME_INFO *frame = &common->frameInfo;
+    OI_UINT8 d1;
+
+
+    OI_ASSERT(data[0] == OI_SBC_SYNCWORD || data[0] == OI_SBC_ENHANCED_SYNCWORD);
+
+    /* Avoid filling out all these strucutures if we already remember the values
+     * from last time. Just in case we get a stream corresponding to data[1] ==
+     * 0, DecoderReset is responsible for ensuring the lookup table entries have
+     * already been populated
+     */
+    d1 = data[1];
+    if (d1 != frame->cachedInfo) {
+
+        frame->freqIndex = (d1 & (BIT7 | BIT6)) >> 6;
+        frame->frequency = freq_values[frame->freqIndex];
+
+        frame->blocks = (d1 & (BIT5 | BIT4)) >> 4;
+        frame->nrof_blocks = block_values[frame->blocks];
+
+        frame->mode = (d1 & (BIT3 | BIT2)) >> 2;
+        frame->nrof_channels = channel_values[frame->mode];
+
+        frame->alloc = (d1 & BIT1) >> 1;
+
+        frame->subbands = (d1 & BIT0);
+        frame->nrof_subbands = band_values[frame->subbands];
+
+        frame->cachedInfo = d1;
+    }
+    /*
+     * For decode, the bit allocator needs to know the bitpool value
+     */
+    frame->bitpool = data[2];
+    frame->crc = data[3];
+}
+
+
+#define LOW(x)  ((x)& 0xf)
+#define HIGH(x) ((x) >> 4)
+
+/*
+ * Read scalefactor values and prepare the bitstream for OI_SBC_ReadSamples
+ */
+PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common,
+                             const OI_BYTE *b,
+                             OI_BITSTREAM *bs)
+{
+    OI_UINT i = common->frameInfo.nrof_subbands * common->frameInfo.nrof_channels;
+    OI_INT8 *scale_factor = common->scale_factor;
+    OI_UINT f;
+
+    if (common->frameInfo.nrof_subbands == 8 || common->frameInfo.mode != SBC_JOINT_STEREO) {
+        if (common->frameInfo.mode == SBC_JOINT_STEREO) {
+            common->frameInfo.join = *b++;
+        } else {
+            common->frameInfo.join = 0;
+        }
+        i /= 2;
+        do {
+            *scale_factor++ = HIGH(f = *b++);
+            *scale_factor++ = LOW(f);
+        } while (--i);
+        /*
+         * In this case we know that the scale factors end on a byte boundary so all we need to do
+         * is initialize the bitstream.
+         */
+        OI_BITSTREAM_ReadInit(bs, b);
+    } else {
+        OI_ASSERT(common->frameInfo.nrof_subbands == 4 && common->frameInfo.mode == SBC_JOINT_STEREO);
+        common->frameInfo.join = HIGH(f = *b++);
+        i = (i - 1) / 2;
+        do {
+            *scale_factor++ = LOW(f);
+            *scale_factor++ = HIGH(f = *b++);
+        } while (--i);
+        *scale_factor++ = LOW(f);
+        /*
+         * In 4-subband joint stereo mode, the joint stereo information ends on a half-byte
+         * boundary, so it's necessary to use the bitstream abstraction to read it, since
+         * OI_SBC_ReadSamples will need to pick up in mid-byte.
+         */
+        OI_BITSTREAM_ReadInit(bs, b);
+        *scale_factor++ = OI_BITSTREAM_ReadUINT4Aligned(bs);
+    }
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+    OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+    OI_UINT nrof_blocks = common->frameInfo.nrof_blocks;
+    OI_INT32 * RESTRICT s = common->subdata;
+    OI_UINT8 *ptr = global_bs->ptr.w;
+    OI_UINT32 value = global_bs->value;
+    OI_UINT bitPtr = global_bs->bitPtr;
+
+    const OI_UINT iter_count = common->frameInfo.nrof_channels * common->frameInfo.nrof_subbands / 4;
+    do {
+        OI_UINT i;
+        for (i = 0; i < iter_count; ++i) {
+            OI_UINT32 sf_by4 = ((OI_UINT32*)common->scale_factor)[i];
+            OI_UINT32 bits_by4 = common->bits.uint32[i];
+            OI_UINT n;
+            for (n = 0; n < 4; ++n) {
+                OI_INT32 dequant;
+                OI_UINT bits;
+                OI_INT sf;
+
+                if (OI_CPU_BYTE_ORDER == OI_LITTLE_ENDIAN_BYTE_ORDER) {
+                    bits = bits_by4 & 0xFF;
+                    bits_by4 >>= 8;
+                    sf = sf_by4 & 0xFF;
+                    sf_by4 >>= 8;
+                } else {
+                    bits = (bits_by4 >> 24) & 0xFF;
+                    bits_by4 <<= 8;
+                    sf = (sf_by4 >> 24) & 0xFF;
+                    sf_by4 <<= 8;
+                }
+                if (bits) {
+                    OI_UINT32 raw;
+                    OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+                    dequant = OI_SBC_Dequant(raw, sf, bits);
+                } else {
+                    dequant = 0;
+                }
+                *s++ = dequant;
+            }
+        }
+    } while (--nrof_blocks);
+}
+
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/decoder-sbc.c b/embdrv/sbc/decoder/srce/decoder-sbc.c
new file mode 100644
index 0000000..2c3a98d
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/decoder-sbc.c
@@ -0,0 +1,465 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2006 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+ ***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addtogroup codec_internal */
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_bitstream.h"
+
+#define SPECIALIZE_READ_SAMPLES_JOINT
+
+/**
+ * Scans through a buffer looking for a codec syncword. If the decoder has been
+ * set for enhanced operation using OI_CODEC_SBC_DecoderReset(), it will search
+ * for both a standard and an enhanced syncword.
+ */
+PRIVATE OI_STATUS FindSyncword(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                               const OI_BYTE **frameData,
+                               OI_UINT32 *frameBytes)
+{
+#ifdef SBC_ENHANCED
+    OI_BYTE search1 = OI_SBC_SYNCWORD;
+    OI_BYTE search2 = OI_SBC_ENHANCED_SYNCWORD;
+#endif // SBC_ENHANCED
+
+    if (*frameBytes == 0) {
+        return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+    }
+
+#ifdef SBC_ENHANCED
+    if (context->limitFrameFormat && context->enhancedEnabled){
+        /* If the context is restricted, only search for specified SYNCWORD */
+        search1 = search2;
+    } else if (context->enhancedEnabled == FALSE) {
+        /* If enhanced is not enabled, only search for classic SBC SYNCWORD*/
+        search2 = search1;
+    }
+    while (*frameBytes && (**frameData != search1) && (**frameData != search2)) {
+        (*frameBytes)--;
+        (*frameData)++;
+    }
+    if (*frameBytes) {
+        /* Syncword found, *frameData points to it, and *frameBytes correctly
+         * reflects the number of bytes available to read, including the
+         * syncword. */
+        context->common.frameInfo.enhanced = (**frameData == OI_SBC_ENHANCED_SYNCWORD);
+        return OI_OK;
+    } else {
+        /* No syncword was found anywhere in the provided input data.
+         * *frameData points past the end of the original input, and
+         * *frameBytes is 0. */
+        return OI_CODEC_SBC_NO_SYNCWORD;
+    }
+#else  // SBC_ENHANCED
+    while (*frameBytes && (**frameData != OI_SBC_SYNCWORD)) {
+        (*frameBytes)--;
+        (*frameData)++;
+    }
+    if (*frameBytes) {
+        /* Syncword found, *frameData points to it, and *frameBytes correctly
+         * reflects the number of bytes available to read, including the
+         * syncword. */
+        context->common.frameInfo.enhanced = FALSE;
+        return OI_OK;
+    } else {
+        /* No syncword was found anywhere in the provided input data.
+         * *frameData points past the end of the original input, and
+         * *frameBytes is 0. */
+        return OI_CODEC_SBC_NO_SYNCWORD;
+    }
+#endif // SBC_ENHANCED
+}
+
+static OI_STATUS DecodeBody(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                            const OI_BYTE *bodyData,
+                            OI_INT16 *pcmData,
+                            OI_UINT32 *pcmBytes,
+                            OI_BOOL allowPartial)
+{
+    OI_BITSTREAM bs;
+    OI_UINT frameSamples = context->common.frameInfo.nrof_blocks * context->common.frameInfo.nrof_subbands;
+    OI_UINT decode_block_count;
+
+    /*
+     * Based on the header data, make sure that there is enough room to write the output samples.
+     */
+    if (*pcmBytes < (sizeof(OI_INT16) * frameSamples * context->common.pcmStride) && !allowPartial) {
+        /* If we're not allowing partial decodes, we need room for the entire
+         * codec frame */
+        TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA"));
+        return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+    } else if (*pcmBytes < sizeof (OI_INT16) * context->common.frameInfo.nrof_subbands * context->common.pcmStride) {
+        /* Even if we're allowing partials, we can still only decode on a frame
+         * boundary */
+        return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA;
+    }
+
+    if (context->bufferedBlocks == 0) {
+        TRACE(("Reading scalefactors"));
+        OI_SBC_ReadScalefactors(&context->common, bodyData, &bs);
+
+        TRACE(("Computing bit allocation"));
+        OI_SBC_ComputeBitAllocation(&context->common);
+
+        TRACE(("Reading samples"));
+        if (context->common.frameInfo.mode == SBC_JOINT_STEREO) {
+            OI_SBC_ReadSamplesJoint(context, &bs);
+        } else {
+            OI_SBC_ReadSamples(context, &bs);
+        }
+
+        context->bufferedBlocks = context->common.frameInfo.nrof_blocks;
+    }
+
+    if (allowPartial) {
+        decode_block_count = *pcmBytes / sizeof(OI_INT16) / context->common.pcmStride / context->common.frameInfo.nrof_subbands;
+
+        if (decode_block_count > context->bufferedBlocks) {
+            decode_block_count = context->bufferedBlocks;
+        }
+
+    } else {
+        decode_block_count = context->common.frameInfo.nrof_blocks;
+    }
+
+    TRACE(("Synthesizing frame"));
+    {
+        OI_UINT start_block = context->common.frameInfo.nrof_blocks - context->bufferedBlocks;
+        OI_SBC_SynthFrame(context, pcmData, start_block, decode_block_count);
+    }
+
+    OI_ASSERT(context->bufferedBlocks >= decode_block_count);
+    context->bufferedBlocks -= decode_block_count;
+
+    frameSamples = decode_block_count * context->common.frameInfo.nrof_subbands;
+
+    /*
+     * When decoding mono into a stride-2 array, copy pcm data to second channel
+     */
+    if (context->common.frameInfo.nrof_channels == 1 && context->common.pcmStride == 2) {
+        OI_UINT i;
+        for (i = 0; i < frameSamples; ++i) {
+            pcmData[2*i+1] = pcmData[2*i];
+        }
+    }
+
+    /*
+     * Return number of pcm bytes generated by the decode operation.
+     */
+    *pcmBytes = frameSamples * sizeof(OI_INT16) * context->common.pcmStride;
+    if (context->bufferedBlocks > 0) {
+        return OI_CODEC_SBC_PARTIAL_DECODE;
+    } else {
+        return OI_OK;
+    }
+}
+
+PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                     OI_UINT8 bitpool,
+                                     const OI_BYTE **frameData,
+                                     OI_UINT32 *frameBytes,
+                                     OI_INT16 *pcmData,
+                                     OI_UINT32 *pcmBytes)
+{
+    OI_STATUS status;
+    OI_UINT bodyLen;
+
+    TRACE(("+OI_CODEC_SBC_DecodeRaw"));
+
+    if (context->bufferedBlocks == 0) {
+        /*
+         * The bitallocator needs to know the bitpool value.
+         */
+        context->common.frameInfo.bitpool = bitpool;
+        /*
+         * Compute the frame length and check we have enough frame data to proceed
+         */
+        bodyLen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo) - SBC_HEADER_LEN;
+        if (*frameBytes < bodyLen) {
+            TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+            return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+        }
+    } else {
+        bodyLen = 0;
+    }
+    /*
+     * Decode the SBC data. Pass TRUE to DecodeBody to allow partial decoding of
+     * tones.
+     */
+    status = DecodeBody(context, *frameData, pcmData, pcmBytes, TRUE);
+    if (OI_SUCCESS(status) || status == OI_CODEC_SBC_PARTIAL_DECODE) {
+        *frameData += bodyLen;
+        *frameBytes -= bodyLen;
+    }
+    TRACE(("-OI_CODEC_SBC_DecodeRaw: %d", status));
+    return status;
+}
+
+OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                    OI_UINT32 *decoderData,
+                                    OI_UINT32 decoderDataBytes,
+                                    OI_UINT8 maxChannels,
+                                    OI_UINT8 pcmStride,
+                                    OI_BOOL enhanced)
+{
+    return internal_DecoderReset(context, decoderData, decoderDataBytes, maxChannels, pcmStride, enhanced);
+}
+
+OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                   const OI_BYTE **frameData,
+                                   OI_UINT32 *frameBytes,
+                                   OI_INT16 *pcmData,
+                                   OI_UINT32 *pcmBytes)
+{
+    OI_STATUS status;
+    OI_UINT framelen;
+    OI_UINT8 crc;
+
+    TRACE(("+OI_CODEC_SBC_DecodeFrame"));
+
+    TRACE(("Finding syncword"));
+    status = FindSyncword(context, frameData, frameBytes);
+    if (!OI_SUCCESS(status)) {
+        return status;
+    }
+
+    /* Make sure enough data remains to read the header. */
+    if (*frameBytes < SBC_HEADER_LEN) {
+        TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA"));
+        return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+    }
+
+    TRACE(("Reading Header"));
+    OI_SBC_ReadHeader(&context->common, *frameData);
+
+    /*
+     * Some implementations load the decoder into RAM and use overlays for 4 vs 8 subbands. We need
+     * to ensure that the SBC parameters for this frame are compatible with the restrictions imposed
+     * by the loaded overlays.
+     */
+    if (context->limitFrameFormat && (context->common.frameInfo.subbands != context->restrictSubbands)) {
+        ERROR(("SBC parameters incompatible with loaded overlay"));
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (context->common.frameInfo.nrof_channels > context->common.maxChannels) {
+        ERROR(("SBC parameters incompatible with number of channels specified during reset"));
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    if (context->common.pcmStride < 1 || context->common.pcmStride > 2) {
+        ERROR(("PCM stride not set correctly during reset"));
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+
+    /*
+     * At this point a header has been read. However, it's possible that we found a false syncword,
+     * so the header data might be invalid. Make sure we have enough bytes to read in the
+     * CRC-protected header, but don't require we have the whole frame. That way, if it turns out
+     * that we're acting on bogus header data, we don't stall the decoding process by waiting for
+     * data that we don't actually need.
+     */
+    framelen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo);
+    if (*frameBytes < framelen) {
+        TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA"));
+        return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+    }
+
+    TRACE(("Calculating checksum"));
+
+    crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+    if (crc != context->common.frameInfo.crc) {
+        TRACE(("CRC Mismatch:  calc=%02x read=%02x\n", crc, context->common.frameInfo.crc));
+        TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_CHECKSUM_MISMATCH"));
+        return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+    }
+
+#ifdef OI_DEBUG
+    /*
+     * Make sure the bitpool values are sane.
+     */
+    if ((context->common.frameInfo.bitpool < SBC_MIN_BITPOOL) && !context->common.frameInfo.enhanced) {
+        ERROR(("Bitpool too small: %d (must be >= 2)", context->common.frameInfo.bitpool));
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+    if (context->common.frameInfo.bitpool > OI_SBC_MaxBitpool(&context->common.frameInfo)) {
+        ERROR(("Bitpool too large: %d (must be <= %ld)", context->common.frameInfo.bitpool, OI_SBC_MaxBitpool(&context->common.frameInfo)));
+        return OI_STATUS_INVALID_PARAMETERS;
+    }
+#endif
+
+    /*
+     * Now decode the SBC data. Partial decode is not yet implemented for an SBC
+     * stream, so pass FALSE to decode body to have it enforce the old rule that
+     * you have to decode a whole packet at a time.
+     */
+    status = DecodeBody(context, *frameData + SBC_HEADER_LEN, pcmData, pcmBytes, FALSE);
+    if (OI_SUCCESS(status)) {
+        *frameData += framelen;
+        *frameBytes -= framelen;
+    }
+    TRACE(("-OI_CODEC_SBC_DecodeFrame: %d", status));
+
+    return status;
+}
+
+OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
+                                 const OI_BYTE **frameData,
+                                 OI_UINT32 *frameBytes)
+{
+    OI_STATUS status;
+    OI_UINT framelen;
+    OI_UINT headerlen;
+    OI_UINT8 crc;
+
+    status = FindSyncword(context, frameData, frameBytes);
+    if (!OI_SUCCESS(status)) {
+        return status;
+    }
+    if (*frameBytes < SBC_HEADER_LEN) {
+        return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+    }
+    OI_SBC_ReadHeader(&context->common, *frameData);
+    framelen = OI_SBC_CalculateFrameAndHeaderlen(&context->common.frameInfo, &headerlen);
+    if (*frameBytes < headerlen) {
+        return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA;
+    }
+    crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData);
+    if (crc != context->common.frameInfo.crc) {
+        return OI_CODEC_SBC_CHECKSUM_MISMATCH;
+    }
+    if (*frameBytes < framelen) {
+        return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA;
+    }
+    context->bufferedBlocks = 0;
+    *frameData += framelen;
+    *frameBytes -= framelen;
+    return OI_OK;
+}
+
+OI_UINT8 OI_CODEC_SBC_FrameCount(OI_BYTE  *frameData,
+                                 OI_UINT32 frameBytes)
+{
+    OI_UINT8 mode;
+    OI_UINT8 blocks;
+    OI_UINT8 subbands;
+    OI_UINT8 frameCount = 0;
+    OI_UINT  frameLen;
+
+    while (frameBytes){
+        while (frameBytes && ((frameData[0] & 0xFE) != 0x9C)){
+            frameData++;
+            frameBytes--;
+        }
+
+        if (frameBytes < SBC_HEADER_LEN) {
+            return frameCount;
+        }
+
+        /* Extract and translate required fields from Header */
+        subbands = mode = blocks = frameData[1];;
+        mode = (mode & (BIT3 | BIT2)) >> 2;
+        blocks = block_values[(blocks & (BIT5 | BIT4)) >> 4];
+        subbands = band_values[(subbands & BIT0)];
+
+        /* Inline logic to avoid corrupting context */
+        frameLen = blocks * frameData[2];
+        switch (mode){
+            case SBC_JOINT_STEREO:
+                frameLen += subbands + (8 * subbands);
+                break;
+
+            case SBC_DUAL_CHANNEL:
+                frameLen *= 2;
+                /* fall through */
+
+            default:
+                if (mode == SBC_MONO){
+                    frameLen += 4*subbands;
+                } else {
+                    frameLen += 8*subbands;
+                }
+        }
+
+        frameCount++;
+        frameLen = SBC_HEADER_LEN + (frameLen + 7) / 8;
+        if (frameBytes > frameLen){
+            frameBytes -= frameLen;
+            frameData += frameLen;
+        } else {
+            frameBytes = 0;
+        }
+    }
+    return frameCount;
+}
+
+/** Read quantized subband samples from the input bitstream and expand them. */
+
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+
+PRIVATE void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 4
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+PRIVATE void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+#define NROF_SUBBANDS 8
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+}
+
+typedef void (*READ_SAMPLES)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs);
+
+static const READ_SAMPLES SpecializedReadSamples[] = {
+    OI_SBC_ReadSamplesJoint4,
+    OI_SBC_ReadSamplesJoint8
+};
+
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+
+
+PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_BITSTREAM *global_bs)
+{
+    OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+    OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+#ifdef SPECIALIZE_READ_SAMPLES_JOINT
+    OI_ASSERT((nrof_subbands >> 3u) <= 1u);
+    SpecializedReadSamples[nrof_subbands >> 3](context, global_bs);
+#else
+
+#define NROF_SUBBANDS nrof_subbands
+#include "readsamplesjoint.inc"
+#undef NROF_SUBBANDS
+#endif /* SPECIALIZE_READ_SAMPLES_JOINT */
+}
+
+/**@}*/
+
diff --git a/embdrv/sbc/decoder/srce/dequant.c b/embdrv/sbc/decoder/srce/dequant.c
new file mode 100644
index 0000000..e06069c
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/dequant.c
@@ -0,0 +1,210 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/**
+ @file
+
+ Dequantizer for SBC decoder; reconstructs quantized representation of subband samples.
+
+ @ingroup codec_internal
+ */
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**
+ This function is a fixed-point approximation of a modification of the following
+ dequantization operation defined in the spec, as inferred from section 12.6.4:
+
+ @code
+ dequant = 2^(scale_factor+1) * ((raw * 2.0 + 1.0) / ((2^bits) - 1) - 1)
+
+ 2 <= bits <= 16
+ 0 <= raw < (2^bits)-1   (the -1 is because quantized values with all 1's are forbidden)
+
+ -65535 < dequant < 65535
+ @endcode
+
+ The code below computes the dequantized value divided by a scaling constant
+ equal to about 1.38. This constant is chosen to ensure that the entry in the
+ dequant_long_scaled table for 16 bits is as accurate as possible, since it has
+ the least relative precision available to it due to its small magnitude.
+
+ This routine outputs in Q16.15 format.
+
+ The helper array dequant_long is defined as follows:
+
+ @code
+ dequant_long_long[bits] = round(2^31 * 1/((2^bits - 1) / 1.38...)  for 2 <= bits <= 16
+ @endcode
+
+
+ Additionally, the table entries have the following property:
+
+ @code
+ dequant_long_scaled[bits] <= 2^31 / ((2^bits - 1))  for 2 <= bits <= 16
+ @endcode
+
+ Therefore
+
+ @code
+ d = 2 * raw + 1              1 <= d <= 2^bits - 2
+
+ d' = d * dequant_long[bits]
+
+                  d * dequant_long_scaled[bits] <= (2^bits - 2) * (2^31 / (2^bits - 1))
+                  d * dequant_long_scaled[bits] <= 2^31 * (2^bits - 2)/(2^bits - 1) < 2^31
+ @endcode
+
+ Therefore, d' doesn't overflow a signed 32-bit value.
+
+ @code
+
+ d' =~ 2^31 * (raw * 2.0 + 1.0) / (2^bits - 1) / 1.38...
+
+ result = d' - 2^31/1.38... =~ 2^31 * ((raw * 2.0 + 1.0) / (2^bits - 1) - 1) / 1.38...
+
+ result is therefore a scaled approximation to dequant. It remains only to
+ turn 2^31 into 2^(scale_factor+1). Since we're aiming for Q16.15 format,
+ this is achieved by shifting right by (15-scale_factor):
+
+  (2^31 * x) >> (15-scale_factor) =~ 2^(31-15+scale_factor) * x = 2^15 * 2^(1+scale_factor) * x
+ @endcode
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef SBC_DEQUANT_LONG_SCALED_OFFSET
+#define SBC_DEQUANT_LONG_SCALED_OFFSET 1555931970
+#endif
+
+#ifndef SBC_DEQUANT_LONG_UNSCALED_OFFSET
+#define SBC_DEQUANT_LONG_UNSCALED_OFFSET 2147483648
+#endif
+
+#ifndef SBC_DEQUANT_SCALING_FACTOR
+#define SBC_DEQUANT_SCALING_FACTOR 1.38019122262781f
+#endif
+
+const OI_UINT32 dequant_long_scaled[17];
+const OI_UINT32 dequant_long_unscaled[17];
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifdef DEBUG_DEQUANTIZATION
+
+#include <math.h>
+
+INLINE float dequant_float(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+    float result = (1 << (scale_factor+1)) * ((raw * 2.0f + 1.0f) / ((1 << bits) - 1.0f) - 1.0f);
+
+    result /= SBC_DEQUANT_SCALING_FACTOR;
+
+    /* Unless the encoder screwed up, all correct dequantized values should
+     * satisfy this inequality. Non-compliant encoders which generate quantized
+     * values with all 1-bits set can, theoretically, trigger this assert. This
+     * is unlikely, however, and only an issue in debug mode.
+     */
+    OI_ASSERT(fabs(result) < 32768 * 1.6);
+
+    return result;
+}
+
+#endif
+
+
+INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+    OI_UINT32 d;
+    OI_INT32 result;
+
+    OI_ASSERT(scale_factor <= 15);
+    OI_ASSERT(bits <= 16);
+
+    if (bits <= 1) {
+        return 0;
+    }
+
+    d = (raw * 2) + 1;
+    d *= dequant_long_scaled[bits];
+    result = d - SBC_DEQUANT_LONG_SCALED_OFFSET;
+
+#ifdef DEBUG_DEQUANTIZATION
+    {
+        OI_INT32 integerized_float_result;
+        float float_result;
+
+        float_result = dequant_float(raw, scale_factor, bits);
+        integerized_float_result = (OI_INT32)floor(0.5f+float_result * (1 << 15));
+
+        /* This detects overflow */
+        OI_ASSERT(((result >= 0) && (integerized_float_result >= 0)) ||
+                  ((result <= 0) && (integerized_float_result <= 0)));
+    }
+#endif
+    return result >> (15 - scale_factor);
+}
+
+/* This version of Dequant does not incorporate the scaling factor of 1.38. It
+ * is intended for use with implementations of the filterbank which are
+ * hard-coded into a DSP. Output is Q16.4 format, so that after joint stereo
+ * processing (which leaves the most significant bit equal to the sign bit if
+ * the encoder is conformant) the result will fit a 24 bit fixed point signed
+ * value.*/
+
+INLINE OI_INT32 OI_SBC_Dequant_Unscaled(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits)
+{
+    OI_UINT32 d;
+    OI_INT32 result;
+
+    OI_ASSERT(scale_factor <= 15);
+    OI_ASSERT(bits <= 16);
+
+
+    if (bits <= 1) {
+        return 0;
+    }
+    if (bits == 16) {
+        result = (raw << 16) + raw - 0x7fff7fff;
+        return SCALE(result, 24 - scale_factor);
+    }
+
+
+    d = (raw * 2) + 1;
+    d *= dequant_long_unscaled[bits];
+    result = d - 0x80000000;
+
+    return SCALE(result, 24 - scale_factor);
+}
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/framing-sbc.c b/embdrv/sbc/decoder/srce/framing-sbc.c
new file mode 100644
index 0000000..88cb2e2
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/framing-sbc.c
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_CHAR* const OI_CODEC_SBC_FreqText[] =     { "SBC_FREQ_16000", "SBC_FREQ_32000", "SBC_FREQ_44100", "SBC_FREQ_48000" };
+const OI_CHAR* const OI_CODEC_SBC_ModeText[] =     { "SBC_MONO", "SBC_DUAL_CHANNEL", "SBC_STEREO", "SBC_JOINT_STEREO" };
+const OI_CHAR* const OI_CODEC_SBC_SubbandsText[] = { "SBC_SUBBANDS_4", "SBC_SUBBANDS_8" };
+const OI_CHAR* const OI_CODEC_SBC_BlocksText[] =   { "SBC_BLOCKS_4", "SBC_BLOCKS_8", "SBC_BLOCKS_12", "SBC_BLOCKS_16" };
+const OI_CHAR* const OI_CODEC_SBC_AllocText[] =    { "SBC_LOUDNESS", "SBC_SNR" };
+
+#ifdef OI_DEBUG
+void OI_CODEC_SBC_DumpConfig(OI_CODEC_SBC_FRAME_INFO *frameInfo)
+{
+    printf("SBC configuration\n");
+    printf("  enhanced:  %s\n", frameInfo->enhanced ? "TRUE" : "FALSE");
+    printf("  frequency: %d\n", frameInfo->frequency);
+    printf("  subbands:  %d\n", frameInfo->nrof_subbands);
+    printf("  blocks:    %d\n", frameInfo->nrof_blocks);
+    printf("  channels:  %d\n", frameInfo->nrof_channels);
+    printf("  mode:      %s\n", OI_CODEC_SBC_ModeText[frameInfo->mode]);
+    printf("  alloc:     %s\n", OI_CODEC_SBC_AllocText[frameInfo->alloc]);
+    printf("  bitpool:   %d\n", frameInfo->bitpool);
+}
+#endif /* OI_DEBUG */
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/framing.c b/embdrv/sbc/decoder/srce/framing.c
new file mode 100644
index 0000000..c94ec90
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/framing.c
@@ -0,0 +1,249 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/**
+@file
+Checksum and header-related functions.
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+#include "oi_assert.h"
+
+
+/* asdasd */
+
+#define USE_NIBBLEWISE_CRC
+
+/* #define PRINT_SAMPLES */
+/* #define PRINT_SCALEFACTORS */
+/* #define DEBUG_CRC */
+
+/*
+ * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup
+ */
+#ifdef USE_WIDE_CRC
+/* Save space if a char is 16 bits, such as on the C54x */
+const OI_BYTE crc8_wide[128] = {
+    0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4,
+};
+#elif defined(USE_NIBBLEWISE_CRC)
+const OI_BYTE crc8_narrow[16] = {
+    0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb
+};
+#else
+const OI_BYTE crc8_narrow[256] = {
+    0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4
+};
+#endif
+const OI_UINT32 dequant_long_scaled[17] = {
+    0,
+    0,
+    0x1ee9e116,  /* bits=2  0.24151243  1/3      * (1/1.38019122262781) (0x00000008)*/
+    0x0d3fa99c,  /* bits=3  0.10350533  1/7      * (1/1.38019122262781) (0x00000013)*/
+    0x062ec69e,  /* bits=4  0.04830249  1/15     * (1/1.38019122262781) (0x00000029)*/
+    0x02fddbfa,  /* bits=5  0.02337217  1/31     * (1/1.38019122262781) (0x00000055)*/
+    0x0178d9f5,  /* bits=6  0.01150059  1/63     * (1/1.38019122262781) (0x000000ad)*/
+    0x00baf129,  /* bits=7  0.00570502  1/127    * (1/1.38019122262781) (0x0000015e)*/
+    0x005d1abe,  /* bits=8  0.00284132  1/255    * (1/1.38019122262781) (0x000002bf)*/
+    0x002e760d,  /* bits=9  0.00141788  1/511    * (1/1.38019122262781) (0x00000582)*/
+    0x00173536,  /* bits=10 0.00070825  1/1023   * (1/1.38019122262781) (0x00000b07)*/
+    0x000b9928,  /* bits=11 0.00035395  1/2047   * (1/1.38019122262781) (0x00001612)*/
+    0x0005cc37,  /* bits=12 0.00017693  1/4095   * (1/1.38019122262781) (0x00002c27)*/
+    0x0002e604,  /* bits=13 0.00008846  1/8191   * (1/1.38019122262781) (0x00005852)*/
+    0x000172fc,  /* bits=14 0.00004422  1/16383  * (1/1.38019122262781) (0x0000b0a7)*/
+    0x0000b97d,  /* bits=15 0.00002211  1/32767  * (1/1.38019122262781) (0x00016150)*/
+    0x00005cbe,  /* bits=16 0.00001106  1/65535  * (1/1.38019122262781) (0x0002c2a5)*/
+};
+
+
+const OI_UINT32 dequant_long_unscaled[17] = {
+    0,
+    0,
+    0x2aaaaaab,  /* bits=2  0.33333333  1/3      (0x00000005)*/
+    0x12492492,  /* bits=3  0.14285714  1/7      (0x0000000e)*/
+    0x08888889,  /* bits=4  0.06666667  1/15     (0x0000001d)*/
+    0x04210842,  /* bits=5  0.03225806  1/31     (0x0000003e)*/
+    0x02082082,  /* bits=6  0.01587302  1/63     (0x0000007e)*/
+    0x01020408,  /* bits=7  0.00787402  1/127    (0x000000fe)*/
+    0x00808081,  /* bits=8  0.00392157  1/255    (0x000001fd)*/
+    0x00402010,  /* bits=9  0.00195695  1/511    (0x000003fe)*/
+    0x00200802,  /* bits=10 0.00097752  1/1023   (0x000007fe)*/
+    0x00100200,  /* bits=11 0.00048852  1/2047   (0x00000ffe)*/
+    0x00080080,  /* bits=12 0.00024420  1/4095   (0x00001ffe)*/
+    0x00040020,  /* bits=13 0.00012209  1/8191   (0x00003ffe)*/
+    0x00020008,  /* bits=14 0.00006104  1/16383  (0x00007ffe)*/
+    0x00010002,  /* bits=15 0.00003052  1/32767  (0x0000fffe)*/
+    0x00008001,  /* bits=16 0.00001526  1/65535  (0x0001fffc)*/
+};
+
+#if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS)
+#include <stdio.h>
+#endif
+
+#ifdef USE_WIDE_CRC
+INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+    OI_UINT crc;
+    OI_UINT idx;
+    idx = oldcrc^next;
+    crc = crc8_wide[idx >> 1];
+    if (idx%2) {
+        crc &= 0xff;
+    } else {
+        crc >>= 8;
+    }
+
+    return crc;
+}
+
+INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+    OI_UINT crc;
+    OI_UINT idx;
+    idx = (oldcrc ^ next) >> 4;
+    crc = crc8_wide[idx>>1];
+    if (idx%2) {
+        crc &= 0xff;
+    } else {
+        crc >>= 8;
+    }
+
+    return (oldcrc << 4) ^ crc;
+}
+
+#else // USE_WIDE_CRC
+
+INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
+{
+    return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4];
+}
+
+#ifdef USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+    crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4];
+    crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf];
+
+    return crc;
+}
+
+#else   // USE_NIBBLEWISE_CRC
+INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
+{
+  return crc8_narrow[crc^next];
+}
+
+#endif  // USE_NIBBLEWISE_CRC
+
+#endif // USE_WIDE_CRC
+
+
+PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data)
+{
+    OI_UINT i;
+    OI_UINT8 crc = 0x0f;
+    /* Count is the number of whole bytes subject to CRC. Actually, it's one
+     * more than this number, because data[3] is the CRC field itself, which is
+     * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper
+     * spacewise to include the check in the loop. This shouldn't be much of a
+     * bottleneck routine in the first place. */
+    OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4;
+
+    if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) {
+        count++;
+    }
+
+    for (i = 1; i < count; i++) {
+        if (i != 3) {
+            crc = crc_iterate(crc,data[i]);
+        }
+    }
+
+    if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) {
+        crc = crc_iterate_top4(crc, data[i]);
+    }
+
+    return crc;
+}
+
+void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame)
+{
+    frame->nrof_blocks = block_values[frame->blocks];
+    frame->nrof_subbands = band_values[frame->subbands];
+
+    frame->frequency = freq_values[frame->freqIndex];
+    frame->nrof_channels = channel_values[frame->mode];
+}
+
+/**
+ * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory
+ */
+#define COPY4WORDS_BACK(_dest, _src)            \
+    do {                                        \
+            OI_INT32 _a, _b, _c, _d;            \
+            _a = *--_src;                       \
+            _b = *--_src;                       \
+            _c = *--_src;                       \
+            _d = *--_src;                       \
+            *--_dest = _a;                      \
+            *--_dest = _b;                      \
+            *--_dest = _c;                      \
+            *--_dest = _d;                      \
+    } while (0)
+
+
+#if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY)
+#include <string.h>
+#endif
+PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount)
+{
+#ifdef USE_PLATFORM_MEMMOVE
+    memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#elif defined(USE_PLATFORM_MEMCPY)
+    OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest));
+    memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T));
+#else
+    OI_UINT n;
+    OI_INT32 *d;
+    OI_INT32 *s;
+    n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest));
+    OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount);
+
+    d = (void*)(dest + wordCount);
+    s = (void*)(src + wordCount);
+
+    do {
+        COPY4WORDS_BACK(d, s);
+    } while (--n);
+#endif
+}
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/oi_codec_version.c b/embdrv/sbc/decoder/srce/oi_codec_version.c
new file mode 100644
index 0000000..25dc162
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/oi_codec_version.c
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**
+@file
+This file contains a single function, which returns a string indicating the
+version number of the eSBC codec
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+#include "oi_stddefs.h"
+#include "oi_codec_sbc_private.h"
+
+/** Version string for the BLUEmagic 3.0 protocol stack and profiles */
+PRIVATE OI_CHAR * const codecVersion = "v1.5"
+#ifdef OI_SBC_EVAL
+" (Evaluation version)"
+#endif
+;
+
+/** This function returns the version string for the BLUEmagic 3.0 protocol stack
+    and profiles */
+OI_CHAR *OI_CODEC_Version(void) {
+    return codecVersion;
+}
+
+/**********************************************************************************/
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/decoder/srce/readsamplesjoint.inc b/embdrv/sbc/decoder/srce/readsamplesjoint.inc
new file mode 100644
index 0000000..875a394
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/readsamplesjoint.inc
@@ -0,0 +1,111 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/*******************************************************************************
+ * @file readsamplesjoint.inc
+ *
+ * This is the body of the generic version of OI_SBC_ReadSamplesJoint().
+ * It is designed to be \#included into a function as follows:
+    \code
+    void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+    {
+        #define NROF_SUBBANDS 4
+        #include "readsamplesjoint.inc"
+        #undef NROF_SUBBANDS
+    }
+
+    void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+    {
+        #define NROF_SUBBANDS 8
+        #include "readsamplesjoint.inc"
+        #undef NROF_SUBBANDS
+    }
+    \endcode
+ * Or to make a generic version:
+    \code
+    void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
+    {
+        OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
+
+        #define NROF_SUBBANDS nrof_subbands
+        #include "readsamplesjoint.inc"
+        #undef NROF_SUBBANDS
+    }
+    \endcode
+ * @ingroup codec_internal
+ *******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+{
+    OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
+    OI_UINT bl = common->frameInfo.nrof_blocks;
+    OI_INT32 * RESTRICT s = common->subdata;
+    OI_UINT8 *ptr = global_bs->ptr.w;
+    OI_UINT32 value = global_bs->value;
+    OI_UINT bitPtr = global_bs->bitPtr;
+    OI_UINT8 jmask = common->frameInfo.join << (8 - NROF_SUBBANDS);
+
+    do {
+        OI_INT8 *sf_array = &common->scale_factor[0];
+        OI_UINT8 *bits_array = &common->bits.uint8[0];
+        OI_UINT8 joint = jmask;
+        OI_UINT sb;
+        /*
+         * Left channel
+         */
+        sb = NROF_SUBBANDS;
+        do {
+            OI_UINT32 raw;
+            OI_INT32 dequant;
+            OI_UINT8 bits = *bits_array++;
+            OI_INT sf = *sf_array++;
+
+            OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+            dequant = OI_SBC_Dequant(raw, sf, bits);
+            *s++ = dequant;
+        } while (--sb);
+        /*
+         * Right channel
+         */
+        sb = NROF_SUBBANDS;
+        do {
+            OI_UINT32 raw;
+            OI_INT32 dequant;
+            OI_UINT8 bits = *bits_array++;
+            OI_INT sf = *sf_array++;
+
+            OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
+            dequant = OI_SBC_Dequant(raw, sf, bits);
+            /*
+             * Check if we need to do mid/side
+             */
+            if (joint & 0x80) {
+                OI_INT32 mid = *(s - NROF_SUBBANDS);
+                OI_INT32 side = dequant;
+                *(s - NROF_SUBBANDS) = mid + side;
+                dequant = mid - side;
+            }
+            joint <<= 1;
+            *s++ = dequant;
+        } while (--sb);
+    } while (--bl);
+}
diff --git a/embdrv/sbc/decoder/srce/synthesis-8-generated.c b/embdrv/sbc/decoder/srce/synthesis-8-generated.c
new file mode 100644
index 0000000..c33498e
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-8-generated.c
@@ -0,0 +1,135 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**
+ @file
+
+ DO NOT EDIT THIS FILE DIRECTLY
+
+ This file is automatically generated by the "synthesis-gen.pl" script.
+ Any changes to this generated file will be lost when the script is re-run.
+
+ These functions are called by functions in synthesis.c to perform the synthesis
+ filterbank computations for the SBC decoder.
+
+
+ */
+
+#include <oi_codec_sbc_private.h>
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+#define MUL_16S_16S(_x, _y) ((_x) * (_y))
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift)
+{
+    OI_INT32 pcm_a, pcm_b;
+    /* 1 - stage 0 */ pcm_b = 0;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 12]))>> 3;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-23167, buffer[ 20]))>> 3;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 28]))>> 2;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(-17397, buffer[ 36]))<< 1;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(9399, buffer[ 44]))<< 3;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(17397, buffer[ 52]))<< 1;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(26479, buffer[ 60]))>> 2;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(23167, buffer[ 68]))>> 3;
+    /* 1 - stage 0 */ pcm_b +=(MUL_16S_16S(8235, buffer[ 76]))>> 3;
+    /* 1 - stage 0 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[0<<strideShift] = (OI_INT16)pcm_b;
+    /* 1 - stage 1 */ pcm_a = 0;
+    /* 1 - stage 1 */ pcm_b = 0;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-3263, buffer[  5]))>> 5;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(9293, buffer[  5]))>> 3;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(29293, buffer[ 11]))>> 5;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-6087, buffer[ 11]))>> 2;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-5229, buffer[ 21]));
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1247, buffer[ 21]))<< 3;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(30835, buffer[ 27]))>> 3;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(-2893, buffer[ 27]))<< 3;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(-27021, buffer[ 37]))<< 1;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(23671, buffer[ 37]))<< 2;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(31633, buffer[ 43]))<< 1;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(18055, buffer[ 43]))<< 1;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(17319, buffer[ 53]))<< 1;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(11537, buffer[ 53]))>> 1;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(26663, buffer[ 59]))>> 2;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(1747, buffer[ 59]))<< 1;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(4555, buffer[ 69]))>> 1;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(685, buffer[ 69]))<< 1;
+    /* 1 - stage 1 */ pcm_a +=(MUL_16S_16S(12419, buffer[ 75]))>> 4;
+    /* 1 - stage 1 */ pcm_b +=(MUL_16S_16S(8721, buffer[ 75]))>> 7;
+    /* 1 - stage 1 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[1<<strideShift] = (OI_INT16)pcm_a;
+    /* 1 - stage 1 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[7<<strideShift] = (OI_INT16)pcm_b;
+    /* 1 - stage 2 */ pcm_a = 0;
+    /* 1 - stage 2 */ pcm_b = 0;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-10385, buffer[  6]))>> 6;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(11167, buffer[  6]))>> 4;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(24995, buffer[ 10]))>> 5;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-10337, buffer[ 10]))>> 4;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-309, buffer[ 22]))<< 4;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(1917, buffer[ 22]))<< 2;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9161, buffer[ 26]))>> 3;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(-30605, buffer[ 26]))>> 1;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(-23063, buffer[ 38]))<< 1;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8317, buffer[ 38]))<< 3;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(27561, buffer[ 42]))<< 1;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(9553, buffer[ 42]))<< 2;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(2309, buffer[ 54]))<< 3;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(22117, buffer[ 54]))>> 4;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(12705, buffer[ 58]))>> 1;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(16383, buffer[ 58]))>> 2;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(6239, buffer[ 70]))>> 3;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(7543, buffer[ 70]))>> 3;
+    /* 1 - stage 2 */ pcm_a +=(MUL_16S_16S(9251, buffer[ 74]))>> 4;
+    /* 1 - stage 2 */ pcm_b +=(MUL_16S_16S(8603, buffer[ 74]))>> 6;
+    /* 1 - stage 2 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[2<<strideShift] = (OI_INT16)pcm_a;
+    /* 1 - stage 2 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[6<<strideShift] = (OI_INT16)pcm_b;
+    /* 1 - stage 3 */ pcm_a = 0;
+    /* 1 - stage 3 */ pcm_b = 0;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-16457, buffer[  7]))>> 6;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(16913, buffer[  7]))>> 5;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(19083, buffer[  9]))>> 5;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-8443, buffer[  9]))>> 7;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-23641, buffer[ 23]))>> 2;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(3687, buffer[ 23]))<< 1;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-29015, buffer[ 25]))>> 4;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-301, buffer[ 25]))<< 5;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(-12889, buffer[ 39]))<< 2;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(15447, buffer[ 39]))<< 2;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(6145, buffer[ 41]))<< 3;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(10255, buffer[ 41]))<< 2;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(24211, buffer[ 55]))>> 1;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(-18233, buffer[ 55]))>> 3;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(23469, buffer[ 57]))>> 2;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(9405, buffer[ 57]))>> 1;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(21223, buffer[ 71]))>> 8;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(1499, buffer[ 71]))>> 1;
+    /* 1 - stage 3 */ pcm_a +=(MUL_16S_16S(26913, buffer[ 73]))>> 6;
+    /* 1 - stage 3 */ pcm_b +=(MUL_16S_16S(26189, buffer[ 73]))>> 7;
+    /* 1 - stage 3 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[3<<strideShift] = (OI_INT16)pcm_a;
+    /* 1 - stage 3 */ pcm_b /= 32768; CLIP_INT16(pcm_b); pcm[5<<strideShift] = (OI_INT16)pcm_b;
+    /* 1 - stage 4 */ pcm_a = 0;
+    /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10445, buffer[  8]))>> 4;
+    /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(-5297, buffer[ 24]))<< 1;
+    /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(22299, buffer[ 40]))<< 2;
+    /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(10603, buffer[ 56]));
+    /* 1 - stage 4 */ pcm_a +=(MUL_16S_16S(9539, buffer[ 72]))>> 4;
+    /* 1 - stage 4 */ pcm_a /= 32768; CLIP_INT16(pcm_a); pcm[4<<strideShift] = (OI_INT16)pcm_a;
+}
diff --git a/embdrv/sbc/decoder/srce/synthesis-dct8.c b/embdrv/sbc/decoder/srce/synthesis-dct8.c
new file mode 100644
index 0000000..4280758
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-dct8.c
@@ -0,0 +1,305 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+@ingroup codec_internal
+*/
+
+/**@addgroup codec_internal*/
+/**@{*/
+
+/*
+ * Performs an 8-point Type-II scaled DCT using the Arai-Agui-Nakajima
+ * factorization. The scaling factors are folded into the windowing
+ * constants. 29 adds and 5 16x32 multiplies per 8 samples.
+ */
+
+#include "oi_codec_sbc_private.h"
+
+#define AAN_C4_FIX (759250125)/* S1.30  759250125   0.707107*/
+
+#define AAN_C6_FIX (410903207)/* S1.30  410903207   0.382683*/
+
+#define AAN_Q0_FIX (581104888)/* S1.30  581104888   0.541196*/
+
+#define AAN_Q1_FIX (1402911301)/* S1.30 1402911301   1.306563*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+/**
+ * Default C language implementation of a 32x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 32-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return  A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 64-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_32s_32s_hi(OI_INT32 u, OI_INT32 v)
+{
+    OI_UINT32 u0, v0;
+    OI_INT32 u1, v1, w1, w2, t;
+
+    u0 = u & 0xFFFF; u1 = u >> 16;
+    v0 = v & 0xFFFF; v1 = v >> 16;
+    t = u0*v0;
+    t = u1*v0 + ((OI_UINT32)t >> 16);
+    w1 = t & 0xFFFF;
+    w2 = t >> 16;
+    w1 = u0*v1 + w1;
+    return u1*v1 + w2 + (w1 >> 16);
+}
+
+#define MUL_32S_32S_HI(_x, _y) default_mul_32s_32s_hi(_x, _y)
+
+
+#ifdef DEBUG_DCT
+PRIVATE void float_dct2_8(float * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define FIX(x,bits) (((int)floor(0.5f+((x)*((float)(1<<bits)))))/((float)(1<<bits)))
+#define FLOAT_BUTTERFLY(x,y) x += y; y = x - (y*2); OI_ASSERT(VALID_INT32(x)); OI_ASSERT(VALID_INT32(y));
+#define FLOAT_MULT_DCT(K, sample) (FIX(K,20) * sample)
+#define FLOAT_SCALE(x, y) (((x) / (double)(1 << (y))))
+
+    double L00,L01,L02,L03,L04,L05,L06,L07;
+    double L25;
+
+    double in0,in1,in2,in3;
+    double in4,in5,in6,in7;
+
+    in0 = FLOAT_SCALE(in[0], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in0));
+    in1 = FLOAT_SCALE(in[1], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in1));
+    in2 = FLOAT_SCALE(in[2], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in2));
+    in3 = FLOAT_SCALE(in[3], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in3));
+    in4 = FLOAT_SCALE(in[4], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in4));
+    in5 = FLOAT_SCALE(in[5], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in5));
+    in6 = FLOAT_SCALE(in[6], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in6));
+    in7 = FLOAT_SCALE(in[7], DCTII_8_SHIFT_IN); OI_ASSERT(VALID_INT32(in7));
+
+    L00 = (in0 + in7); OI_ASSERT(VALID_INT32(L00));
+    L01 = (in1 + in6); OI_ASSERT(VALID_INT32(L01));
+    L02 = (in2 + in5); OI_ASSERT(VALID_INT32(L02));
+    L03 = (in3 + in4); OI_ASSERT(VALID_INT32(L03));
+
+    L04 = (in3 - in4); OI_ASSERT(VALID_INT32(L04));
+    L05 = (in2 - in5); OI_ASSERT(VALID_INT32(L05));
+    L06 = (in1 - in6); OI_ASSERT(VALID_INT32(L06));
+    L07 = (in0 - in7); OI_ASSERT(VALID_INT32(L07));
+
+    FLOAT_BUTTERFLY(L00, L03);
+    FLOAT_BUTTERFLY(L01, L02);
+
+    L02 += L03; OI_ASSERT(VALID_INT32(L02));
+
+    L02 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L02); OI_ASSERT(VALID_INT32(L02));
+
+    FLOAT_BUTTERFLY(L00, L01);
+
+    out[0] = (float)FLOAT_SCALE(L00, DCTII_8_SHIFT_0); OI_ASSERT(VALID_INT16(out[0]));
+    out[4] = (float)FLOAT_SCALE(L01, DCTII_8_SHIFT_4); OI_ASSERT(VALID_INT16(out[4]));
+
+    FLOAT_BUTTERFLY(L03, L02);
+    out[6] = (float)FLOAT_SCALE(L02, DCTII_8_SHIFT_6); OI_ASSERT(VALID_INT16(out[6]));
+    out[2] = (float)FLOAT_SCALE(L03, DCTII_8_SHIFT_2); OI_ASSERT(VALID_INT16(out[2]));
+
+    L04 += L05; OI_ASSERT(VALID_INT32(L04));
+    L05 += L06; OI_ASSERT(VALID_INT32(L05));
+    L06 += L07; OI_ASSERT(VALID_INT32(L06));
+
+    L04/=2;
+    L05/=2;
+    L06/=2;
+    L07/=2;
+
+    L05 = FLOAT_MULT_DCT(AAN_C4_FLOAT, L05); OI_ASSERT(VALID_INT32(L05));
+
+    L25 = L06 - L04; OI_ASSERT(VALID_INT32(L25));
+    L25 = FLOAT_MULT_DCT(AAN_C6_FLOAT, L25); OI_ASSERT(VALID_INT32(L25));
+
+    L04 = FLOAT_MULT_DCT(AAN_Q0_FLOAT, L04); OI_ASSERT(VALID_INT32(L04));
+    L04 -= L25; OI_ASSERT(VALID_INT32(L04));
+
+    L06 = FLOAT_MULT_DCT(AAN_Q1_FLOAT, L06); OI_ASSERT(VALID_INT32(L06));
+    L06 -= L25; OI_ASSERT(VALID_INT32(L25));
+
+    FLOAT_BUTTERFLY(L07, L05);
+
+    FLOAT_BUTTERFLY(L05, L04);
+    out[3] = (float)(FLOAT_SCALE(L04, DCTII_8_SHIFT_3-1)); OI_ASSERT(VALID_INT16(out[3]));
+    out[5] = (float)(FLOAT_SCALE(L05, DCTII_8_SHIFT_5-1)); OI_ASSERT(VALID_INT16(out[5]));
+
+    FLOAT_BUTTERFLY(L07, L06);
+    out[7] = (float)(FLOAT_SCALE(L06, DCTII_8_SHIFT_7-1)); OI_ASSERT(VALID_INT16(out[7]));
+    out[1] = (float)(FLOAT_SCALE(L07, DCTII_8_SHIFT_1-1)); OI_ASSERT(VALID_INT16(out[1]));
+}
+#undef BUTTERFLY
+#endif
+
+
+/*
+ * This function calculates the AAN DCT. Its inputs are in S16.15 format, as
+ * returned by OI_SBC_Dequant. In practice, abs(in[x]) < 52429.0 / 1.38
+ * (1244918057 integer). The function it computes is an approximation to the array defined
+ * by:
+ *
+ * diag(aan_s) * AAN= C2
+ *
+ *   or
+ *
+ * AAN = diag(1/aan_s) * C2
+ *
+ * where C2 is as it is defined in the comment at the head of this file, and
+ *
+ * aan_s[i] = aan_s = 1/(2*cos(i*pi/16)) with i = 1..7, aan_s[0] = 1;
+ *
+ * aan_s[i] = [ 1.000  0.510  0.541  0.601  0.707  0.900  1.307  2.563 ]
+ *
+ * The output ranges are shown as follows:
+ *
+ * Let Y[0..7] = AAN * X[0..7]
+ *
+ * Without loss of generality, assume the input vector X consists of elements
+ * between -1 and 1. The maximum possible value of a given output element occurs
+ * with some particular combination of input vector elements each of which is -1
+ * or 1. Consider the computation of Y[i]. Y[i] = sum t=0..7 of AAN[t,i]*X[i]. Y is
+ * maximized if the sign of X[i] matches the sign of AAN[t,i], ensuring a
+ * positive contribution to the sum. Equivalently, one may simply sum
+ * abs(AAN)[t,i] over t to get the maximum possible value of Y[i].
+ *
+ * This yields approximately [8.00  10.05   9.66   8.52   8.00   5.70   4.00   2.00]
+ *
+ * Given the maximum magnitude sensible input value of +/-37992, this yields the
+ * following vector of maximum output magnitudes:
+ *
+ * [ 303936  381820  367003  323692  303936  216555  151968   75984 ]
+ *
+ * Ultimately, these values must fit into 16 bit signed integers, so they must
+ * be scaled. A non-uniform scaling helps maximize the kept precision. The
+ * relative number of extra bits of precision maintainable with respect to the
+ * largest value is given here:
+ *
+ * [ 0  0  0  0  0  0  1  2 ]
+ *
+ */
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const *RESTRICT in)
+{
+#define BUTTERFLY(x,y) x += y; y = x - (y<<1);
+#define FIX_MULT_DCT(K, x) (MUL_32S_32S_HI(K,x)<<2)
+
+    OI_INT32 L00,L01,L02,L03,L04,L05,L06,L07;
+    OI_INT32 L25;
+
+    OI_INT32 in0,in1,in2,in3;
+    OI_INT32 in4,in5,in6,in7;
+
+#if DCTII_8_SHIFT_IN != 0
+    in0 = SCALE(in[0], DCTII_8_SHIFT_IN);
+    in1 = SCALE(in[1], DCTII_8_SHIFT_IN);
+    in2 = SCALE(in[2], DCTII_8_SHIFT_IN);
+    in3 = SCALE(in[3], DCTII_8_SHIFT_IN);
+    in4 = SCALE(in[4], DCTII_8_SHIFT_IN);
+    in5 = SCALE(in[5], DCTII_8_SHIFT_IN);
+    in6 = SCALE(in[6], DCTII_8_SHIFT_IN);
+    in7 = SCALE(in[7], DCTII_8_SHIFT_IN);
+#else
+    in0 = in[0];
+    in1 = in[1];
+    in2 = in[2];
+    in3 = in[3];
+    in4 = in[4];
+    in5 = in[5];
+    in6 = in[6];
+    in7 = in[7];
+#endif
+
+    L00 = in0 + in7;
+    L01 = in1 + in6;
+    L02 = in2 + in5;
+    L03 = in3 + in4;
+
+    L04 = in3 - in4;
+    L05 = in2 - in5;
+    L06 = in1 - in6;
+    L07 = in0 - in7;
+
+    BUTTERFLY(L00, L03);
+    BUTTERFLY(L01, L02);
+
+    L02 += L03;
+
+    L02 = FIX_MULT_DCT(AAN_C4_FIX, L02);
+
+    BUTTERFLY(L00, L01);
+
+    out[0] = (OI_INT16)SCALE(L00, DCTII_8_SHIFT_0);
+    out[4] = (OI_INT16)SCALE(L01, DCTII_8_SHIFT_4);
+
+    BUTTERFLY(L03, L02);
+    out[6] = (OI_INT16)SCALE(L02, DCTII_8_SHIFT_6);
+    out[2] = (OI_INT16)SCALE(L03, DCTII_8_SHIFT_2);
+
+    L04 += L05;
+    L05 += L06;
+    L06 += L07;
+
+    L04/=2;
+    L05/=2;
+    L06/=2;
+    L07/=2;
+
+    L05 = FIX_MULT_DCT(AAN_C4_FIX, L05);
+
+    L25 = L06 - L04;
+    L25 = FIX_MULT_DCT(AAN_C6_FIX, L25);
+
+    L04 = FIX_MULT_DCT(AAN_Q0_FIX, L04);
+    L04 -= L25;
+
+    L06 = FIX_MULT_DCT(AAN_Q1_FIX, L06);
+    L06 -= L25;
+
+    BUTTERFLY(L07, L05);
+
+    BUTTERFLY(L05, L04);
+    out[3] = (OI_INT16)SCALE(L04, DCTII_8_SHIFT_3-1);
+    out[5] = (OI_INT16)SCALE(L05, DCTII_8_SHIFT_5-1);
+
+    BUTTERFLY(L07, L06);
+    out[7] = (OI_INT16)SCALE(L06, DCTII_8_SHIFT_7-1);
+    out[1] = (OI_INT16)SCALE(L07, DCTII_8_SHIFT_1-1);
+#undef BUTTERFLY
+
+#ifdef DEBUG_DCT
+    {
+        float float_out[8];
+        float_dct2_8(float_out, in);
+    }
+#endif
+}
+
+/**@}*/
diff --git a/embdrv/sbc/decoder/srce/synthesis-sbc.c b/embdrv/sbc/decoder/srce/synthesis-sbc.c
new file mode 100644
index 0000000..38c6f17
--- /dev/null
+++ b/embdrv/sbc/decoder/srce/synthesis-sbc.c
@@ -0,0 +1,510 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 The Android Open Source Project
+ *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/**********************************************************************************
+  $Revision: #1 $
+***********************************************************************************/
+
+/** @file
+
+This file, along with synthesis-generated.c, contains the synthesis
+filterbank routines. The operations performed correspond to the
+operations described in A2DP Appendix B, Figure 12.3. Several
+mathematical optimizations are performed, particularly for the
+8-subband case.
+
+One important optimization is to note that the "matrixing" operation
+can be decomposed into the product of a type II discrete cosine kernel
+and another, sparse matrix.
+
+According to Fig 12.3, in the 8-subband case,
+@code
+    N[k][i] = cos((i+0.5)*(k+4)*pi/8), k = 0..15 and i = 0..7
+@endcode
+
+N can be factored as R * C2, where C2 is an 8-point type II discrete
+cosine kernel given by
+@code
+    C2[k][i] = cos((i+0.5)*k*pi/8)), k = 0..7 and i = 0..7
+@endcode
+
+R turns out to be a sparse 16x8 matrix with the following non-zero
+entries:
+@code
+    R[k][k+4]        =  1,   k = 0..3
+    R[k][abs(12-k)]  = -1,   k = 5..15
+@endcode
+
+The spec describes computing V[0..15] as N * R.
+@code
+    V[0..15] = N * R = (R * C2) * R = R * (C2 * R)
+@endcode
+
+C2 * R corresponds to computing the discrete cosine transform of R, so
+V[0..15] can be computed by taking the DCT of R followed by assignment
+and selective negation of the DCT result into V.
+
+        Although this was derived empirically using GNU Octave, it is
+        formally demonstrated in, e.g., Liu, Chi-Min and Lee,
+        Wen-Chieh. "A Unified Fast Algorithm for Cosine Modulated
+        Filter Banks in Current Audio Coding Standards." Journal of
+        the AES 47 (December 1999): 1061.
+
+Given the shift operation performed prior to computing V[0..15], it is
+clear that V[0..159] represents a rolling history of the 10 most
+recent groups of blocks input to the synthesis operation. Interpreting
+the matrix N in light of its factorization into C2 and R, R's
+sparseness has implications for interpreting the values in V. In
+particular, there is considerable redundancy in the values stored in
+V. Furthermore, since R[4][0..7] are all zeros, one out of every 16
+values in V will be zero regardless of the input data. Within each
+block of 16 values in V, fully half of them are redundant or
+irrelevant:
+
+@code
+    V[ 0] =  DCT[4]
+    V[ 1] =  DCT[5]
+    V[ 2] =  DCT[6]
+    V[ 3] =  DCT[7]
+    V[ 4] = 0
+    V[ 5] = -DCT[7] = -V[3] (redundant)
+    V[ 6] = -DCT[6] = -V[2] (redundant)
+    V[ 7] = -DCT[5] = -V[1] (redundant)
+    V[ 8] = -DCT[4] = -V[0] (redundant)
+    V[ 9] = -DCT[3]
+    V[10] = -DCT[2]
+    V[11] = -DCT[1]
+    V[12] = -DCT[0]
+    V[13] = -DCT[1] = V[11] (redundant)
+    V[14] = -DCT[2] = V[10] (redundant)
+    V[15] = -DCT[3] = V[ 9] (redundant)
+@endcode
+
+Since the elements of V beyond 15 were originally computed the same
+way during a previous run, what holds true for V[x] also holds true
+for V[x+16]. Thus, so long as care is taken to maintain the mapping,
+we need only actually store the unique values, which correspond to the
+output of the DCT, in some cases inverted. In fact, instead of storing
+V[0..159], we could store DCT[0..79] which would contain a history of
+DCT results. More on this in a bit.
+
+Going back to figure 12.3 in the spec, it should be clear that the
+vector U need not actually be explicitly constructed, but that with
+suitable indexing into V during the window operation, the same end can
+be accomplished. In the same spirit of the pseudocode shown in the
+figure, the following is the construction of W without using U:
+
+@code
+    for i=0 to 79 do
+        W[i] = D[i]*VSIGN(i)*V[remap_V(i)] where remap_V(i) = 32*(int(i/16)) + (i % 16) + (i % 16 >= 8 ? 16 : 0)
+                                             and VSIGN(i) maps i%16 into {1, 1, 1, 1, 0, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1 }
+                                             These values correspond to the
+                                             signs of the redundant values as
+                                             shown in the explanation three
+                                             paragraphs above.
+@endcode
+
+We saw above how V[4..8,13..15] (and by extension
+V[(4..8,13..15)+16*n]) can be defined in terms of other elements
+within the subblock of V. V[0..3,9..12] correspond to DCT elements.
+
+@code
+    for i=0 to 79 do
+        W[i] = D[i]*DSIGN(i)*DCT[remap_DCT(i)]
+@endcode
+
+The DCT is calculated using the Arai-Agui-Nakajima factorization,
+which saves some computation by producing output that needs to be
+multiplied by scaling factors before being used.
+
+@code
+    for i=0 to 79 do
+        W[i] = D[i]*SCALE[i%8]*AAN_DCT[remap_DCT(i)]
+@endcode
+
+D can be premultiplied with the DCT scaling factors to yield
+
+@code
+    for i=0 to 79 do
+        W[i] = DSCALED[i]*AAN_DCT[remap_DCT(i)] where DSCALED[i] = D[i]*SCALE[i%8]
+@endcode
+
+The output samples X[0..7] are defined as sums of W:
+
+@code
+        X[j] = sum{i=0..9}(W[j+8*i])
+@endcode
+
+@ingroup codec_internal
+*/
+
+/**
+@addtogroup codec_internal
+@{
+*/
+
+#include "oi_codec_sbc_private.h"
+
+const OI_INT32 dec_window_4[21] = {
+           0,        /* +0.00000000E+00 */
+          97,        /* +5.36548976E-04 */
+         270,        /* +1.49188357E-03 */
+         495,        /* +2.73370904E-03 */
+         694,        /* +3.83720193E-03 */
+         704,        /* +3.89205149E-03 */
+         338,        /* +1.86581691E-03 */
+        -554,        /* -3.06012286E-03 */
+        1974,        /* +1.09137620E-02 */
+        3697,        /* +2.04385087E-02 */
+        5224,        /* +2.88757392E-02 */
+        5824,        /* +3.21939290E-02 */
+        4681,        /* +2.58767811E-02 */
+        1109,        /* +6.13245186E-03 */
+       -5214,        /* -2.88217274E-02 */
+      -14047,        /* -7.76463494E-02 */
+       24529,        /* +1.35593274E-01 */
+       35274,        /* +1.94987841E-01 */
+       44618,        /* +2.46636662E-01 */
+       50984,        /* +2.81828203E-01 */
+       53243,        /* +2.94315332E-01 */
+};
+
+#define DCTII_4_K06_FIX ( 11585)/* S1.14      11585   0.707107*/
+
+#define DCTII_4_K08_FIX ( 21407)/* S1.14      21407   1.306563*/
+
+#define DCTII_4_K09_FIX (-15137)/* S1.14     -15137  -0.923880*/
+
+#define DCTII_4_K10_FIX ( -8867)/* S1.14      -8867  -0.541196*/
+
+/** Scales x by y bits to the right, adding a rounding factor.
+ */
+#ifndef SCALE
+#define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y))
+#endif
+
+#ifndef CLIP_INT16
+#define CLIP_INT16(x) do { if (x > OI_INT16_MAX) { x = OI_INT16_MAX; } else if (x < OI_INT16_MIN) { x = OI_INT16_MIN; } } while (0)
+#endif
+
+/**
+ * Default C language implementation of a 16x32->32 multiply. This function may
+ * be replaced by a platform-specific version for speed.
+ *
+ * @param u A signed 16-bit multiplicand
+ * @param v A signed 32-bit multiplier
+
+ * @return  A signed 32-bit value corresponding to the 32 most significant bits
+ * of the 48-bit product of u and v.
+ */
+INLINE OI_INT32 default_mul_16s_32s_hi(OI_INT16 u, OI_INT32 v)
+{
+    OI_UINT16 v0;
+    OI_INT16 v1;
+
+    OI_INT32 w,x;
+
+    v0 = (OI_UINT16)(v & 0xffff);
+    v1 = (OI_INT16) (v >> 16);
+
+    w = v1 * u;
+    x = u * v0;
+
+    return w + (x >> 16);
+}
+
+#define MUL_16S_32S_HI(_x, _y) default_mul_16s_32s_hi(_x, _y)
+
+#define LONG_MULT_DCT(K, sample) (MUL_16S_32S_HI(K, sample)<<2)
+
+PRIVATE void SynthWindow80_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void SynthWindow112_generated(OI_INT16 *pcm, SBC_BUFFER_T const * RESTRICT buffer, OI_UINT strideShift);
+PRIVATE void dct2_8(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT x);
+
+typedef void (*SYNTH_FRAME)(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount);
+
+#ifndef COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS
+#define COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(dest, src) do { shift_buffer(dest, src, 72); } while (0)
+#endif
+
+#ifndef DCT2_8
+#define DCT2_8(dst, src) dct2_8(dst, src)
+#endif
+
+#ifndef SYNTH80
+#define SYNTH80 SynthWindow80_generated
+#endif
+
+#ifndef SYNTH112
+#define SYNTH112 SynthWindow112_generated
+#endif
+
+PRIVATE void OI_SBC_SynthFrame_80(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+    OI_UINT blk;
+    OI_UINT ch;
+    OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+    OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+    OI_UINT offset = context->common.filterBufferOffset;
+    OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+    OI_UINT blkstop = blkstart + blkcount;
+
+    for (blk = blkstart; blk < blkstop; blk++) {
+        if (offset == 0) {
+            COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72, context->common.filterBuffer[0]);
+            if (nrof_channels == 2) {
+                COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72, context->common.filterBuffer[1]);
+            }
+            offset = context->common.filterBufferLen - 80;
+        } else {
+            offset -= 1*8;
+        }
+
+        for (ch = 0; ch < nrof_channels; ch++) {
+            DCT2_8(context->common.filterBuffer[ch] + offset, s);
+            SYNTH80(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+            s += 8;
+        }
+        pcm += (8 << pcmStrideShift);
+    }
+    context->common.filterBufferOffset = offset;
+}
+
+PRIVATE void OI_SBC_SynthFrame_4SB(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+    OI_UINT blk;
+    OI_UINT ch;
+    OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+    OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+    OI_UINT offset = context->common.filterBufferOffset;
+    OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+    OI_UINT blkstop = blkstart + blkcount;
+
+    for (blk = blkstart; blk < blkstop; blk++) {
+        if (offset == 0) {
+            COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[0] + context->common.filterBufferLen - 72,context->common.filterBuffer[0]);
+            if (nrof_channels == 2) {
+                COPY_BACKWARD_32BIT_ALIGNED_72_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 72,context->common.filterBuffer[1]);
+            }
+            offset =context->common.filterBufferLen - 80;
+        } else {
+            offset -= 8;
+        }
+        for (ch = 0; ch < nrof_channels; ch++) {
+            cosineModulateSynth4(context->common.filterBuffer[ch] + offset, s);
+            SynthWindow40_int32_int32_symmetry_with_sum(pcm + ch,
+                                                        context->common.filterBuffer[ch] + offset,
+                                                        pcmStrideShift);
+            s += 4;
+        }
+        pcm += (4 << pcmStrideShift);
+    }
+    context->common.filterBufferOffset = offset;
+}
+
+#ifdef SBC_ENHANCED
+
+PRIVATE void OI_SBC_SynthFrame_Enhanced(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT blkstart, OI_UINT blkcount)
+{
+    OI_UINT blk;
+    OI_UINT ch;
+    OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+    OI_UINT pcmStrideShift = context->common.pcmStride == 1 ? 0 : 1;
+    OI_UINT offset = context->common.filterBufferOffset;
+    OI_INT32 *s = context->common.subdata + 8 * nrof_channels * blkstart;
+    OI_UINT blkstop = blkstart + blkcount;
+
+    for (blk = blkstart; blk < blkstop; blk++) {
+        if (offset == 0) {
+            COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[0] +context->common.filterBufferLen - 104, context->common.filterBuffer[0]);
+            if (nrof_channels == 2) {
+                COPY_BACKWARD_32BIT_ALIGNED_104_HALFWORDS(context->common.filterBuffer[1] + context->common.filterBufferLen - 104, context->common.filterBuffer[1]);
+            }
+            offset = context->common.filterBufferLen - 112;
+        } else {
+            offset -= 8;
+        }
+        for (ch = 0; ch < nrof_channels; ++ch) {
+            DCT2_8(context->common.filterBuffer[ch] + offset, s);
+            SYNTH112(pcm + ch, context->common.filterBuffer[ch] + offset, pcmStrideShift);
+            s += 8;
+        }
+        pcm += (8 << pcmStrideShift);
+    }
+    context->common.filterBufferOffset = offset;
+}
+
+static const SYNTH_FRAME SynthFrameEnhanced[] = {
+    NULL,                       /* invalid */
+    OI_SBC_SynthFrame_Enhanced, /* mono */
+    OI_SBC_SynthFrame_Enhanced  /* stereo */
+};
+
+#endif
+
+static const SYNTH_FRAME SynthFrame8SB[] = {
+    NULL,             /* invalid */
+    OI_SBC_SynthFrame_80, /* mono */
+    OI_SBC_SynthFrame_80  /* stereo */
+};
+
+
+static const SYNTH_FRAME SynthFrame4SB[] = {
+    NULL,                  /* invalid */
+    OI_SBC_SynthFrame_4SB, /* mono */
+    OI_SBC_SynthFrame_4SB  /* stereo */
+};
+
+PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks)
+{
+    OI_UINT nrof_subbands = context->common.frameInfo.nrof_subbands;
+    OI_UINT nrof_channels = context->common.frameInfo.nrof_channels;
+
+    OI_ASSERT(nrof_subbands == 4 || nrof_subbands == 8);
+    if (nrof_subbands == 4) {
+        SynthFrame4SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+#ifdef SBC_ENHANCED
+    } else if (context->common.frameInfo.enhanced) {
+        SynthFrameEnhanced[nrof_channels](context, pcm, start_block, nrof_blocks);
+#endif /* SBC_ENHANCED */
+        } else {
+        SynthFrame8SB[nrof_channels](context, pcm, start_block, nrof_blocks);
+    }
+}
+
+
+void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift)
+{
+    OI_INT32 pa;
+    OI_INT32 pb;
+
+    /* These values should be zero, since out[2] of the 4-band cosine modulation
+     * is always zero. */
+    OI_ASSERT(buffer[ 2] == 0);
+    OI_ASSERT(buffer[10] == 0);
+    OI_ASSERT(buffer[18] == 0);
+    OI_ASSERT(buffer[26] == 0);
+    OI_ASSERT(buffer[34] == 0);
+    OI_ASSERT(buffer[42] == 0);
+    OI_ASSERT(buffer[50] == 0);
+    OI_ASSERT(buffer[58] == 0);
+    OI_ASSERT(buffer[66] == 0);
+    OI_ASSERT(buffer[74] == 0);
+
+
+    pa  = dec_window_4[ 4] * (buffer[12] + buffer[76]);
+    pa += dec_window_4[ 8] * (buffer[16] - buffer[64]);
+    pa += dec_window_4[12] * (buffer[28] + buffer[60]);
+    pa += dec_window_4[16] * (buffer[32] - buffer[48]);
+    pa += dec_window_4[20] *  buffer[44];
+    pa = SCALE(-pa, 15);
+    CLIP_INT16(pa);
+    pcm[0 << strideShift] = (OI_INT16)pa;
+
+
+    pa  = dec_window_4[ 1] * buffer[ 1]; pb  = dec_window_4[ 1] * buffer[79];
+    pb += dec_window_4[ 3] * buffer[ 3]; pa += dec_window_4[ 3] * buffer[77];
+    pa += dec_window_4[ 5] * buffer[13]; pb += dec_window_4[ 5] * buffer[67];
+    pb += dec_window_4[ 7] * buffer[15]; pa += dec_window_4[ 7] * buffer[65];
+    pa += dec_window_4[ 9] * buffer[17]; pb += dec_window_4[ 9] * buffer[63];
+    pb += dec_window_4[11] * buffer[19]; pa += dec_window_4[11] * buffer[61];
+    pa += dec_window_4[13] * buffer[29]; pb += dec_window_4[13] * buffer[51];
+    pb += dec_window_4[15] * buffer[31]; pa += dec_window_4[15] * buffer[49];
+    pa += dec_window_4[17] * buffer[33]; pb += dec_window_4[17] * buffer[47];
+    pb += dec_window_4[19] * buffer[35]; pa += dec_window_4[19] * buffer[45];
+    pa = SCALE(-pa, 15);
+    CLIP_INT16(pa);
+    pcm[1 << strideShift] = (OI_INT16)(pa);
+    pb = SCALE(-pb, 15);
+    CLIP_INT16(pb);
+    pcm[3 << strideShift] = (OI_INT16)(pb);
+
+
+    pa  = dec_window_4[2] * (/*buffer[ 2] + */ buffer[78]);  /* buffer[ 2] is always zero */
+    pa += dec_window_4[6] * (buffer[14] /* + buffer[66]*/);  /* buffer[66] is always zero */
+    pa += dec_window_4[10] * (/*buffer[18] + */ buffer[62]);  /* buffer[18] is always zero */
+    pa += dec_window_4[14] * (buffer[30] /* + buffer[50]*/);  /* buffer[50] is always zero */
+    pa += dec_window_4[18] * (/*buffer[34] + */ buffer[46]);  /* buffer[34] is always zero */
+    pa = SCALE(-pa, 15);
+    CLIP_INT16(pa);
+    pcm[2 << strideShift] = (OI_INT16)(pa);
+}
+
+
+/**
+  This routine implements the cosine modulation matrix for 4-subband
+  synthesis. This is called "matrixing" in the SBC specification. This
+  matrix, M4,  can be factored into an 8-point Type II Discrete Cosine
+  Transform, DCTII_4 and a matrix S4, given here:
+
+  @code
+        __               __
+       |   0   0   1   0   |
+       |   0   0   0   1   |
+       |   0   0   0   0   |
+       |   0   0   0  -1   |
+  S4 = |   0   0  -1   0   |
+       |   0  -1   0   0   |
+       |  -1   0   0   0   |
+       |__ 0  -1   0   0 __|
+
+  M4 * in = S4 * (DCTII_4 * in)
+  @endcode
+
+  (DCTII_4 * in) is computed using a Fast Cosine Transform. The algorithm
+  here is based on an implementation computed by the SPIRAL computer
+  algebra system, manually converted to fixed-point arithmetic. S4 can be
+  implemented using only assignment and negation.
+  */
+PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in)
+{
+    OI_INT32 f0, f1, f2, f3, f4, f7, f8, f9, f10;
+    OI_INT32 y0, y1, y2, y3;
+
+    f0 = (in[0] - in[3]);
+    f1 = (in[0] + in[3]);
+    f2 = (in[1] - in[2]);
+    f3 = (in[1] + in[2]);
+
+    f4 = f1 - f3;
+
+    y0 = -SCALE(f1 + f3, DCT_SHIFT);
+    y2 = -SCALE(LONG_MULT_DCT(DCTII_4_K06_FIX, f4), DCT_SHIFT);
+    f7 = f0 + f2;
+    f8 = LONG_MULT_DCT(DCTII_4_K08_FIX, f0);
+    f9 = LONG_MULT_DCT(DCTII_4_K09_FIX, f7);
+    f10 = LONG_MULT_DCT(DCTII_4_K10_FIX, f2);
+    y3 = -SCALE(f8 + f9, DCT_SHIFT);
+    y1 = -SCALE(f10 - f9, DCT_SHIFT);
+
+    out[0] = (OI_INT16)-y2;
+    out[1] = (OI_INT16)-y3;
+    out[2] = (OI_INT16)0;
+    out[3] = (OI_INT16)y3;
+    out[4] = (OI_INT16)y2;
+    out[5] = (OI_INT16)y1;
+    out[6] = (OI_INT16)y0;
+    out[7] = (OI_INT16)y1;
+}
+
+
+
+/**
+@}
+*/
diff --git a/embdrv/sbc/encoder/srce/sbc_encoder.c b/embdrv/sbc/encoder/srce/sbc_encoder.c
index f111ed0..c58f3fc 100644
--- a/embdrv/sbc/encoder/srce/sbc_encoder.c
+++ b/embdrv/sbc/encoder/srce/sbc_encoder.c
@@ -391,7 +391,7 @@
             EncMaxShiftCounter=((ENC_VX_BUFFER_SIZE-8*10*2)>>4)<<3;
     }
 
-    APPL_TRACE_EVENT2("SBC_Encoder_Init : bitrate %d, bitpool %d",
+    APPL_TRACE_EVENT("SBC_Encoder_Init : bitrate %d, bitpool %d",
             pstrEncParams->u16BitRate, pstrEncParams->s16BitPool);
 
     SbcAnalysisInit();
diff --git a/gki/Android.mk b/gki/Android.mk
index ed9f904..b85e344 100644
--- a/gki/Android.mk
+++ b/gki/Android.mk
@@ -1,35 +1,32 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
 LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
 
-LOCAL_C_INCLUDES:= $(LOCAL_PATH)/common \
-                   $(LOCAL_PATH)/ulinux \
-                   $(LOCAL_PATH)/../include \
-                   $(LOCAL_PATH)/../stack/include \
-                   $(LOCAL_PATH)/../utils/include \
-                   $(bdroid_C_INCLUDES) \
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/common \
+	$(LOCAL_PATH)/ulinux \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../stack/include \
+	$(LOCAL_PATH)/../utils/include \
+	$(bdroid_C_INCLUDES)
 
-LOCAL_CFLAGS += -Werror -Wno-error=unused-parameter $(bdroid_CFLAGS)
+LOCAL_CFLAGS += -Wno-error=unused-parameter $(bdroid_CFLAGS) -std=c99
 
 ifeq ($(BOARD_HAVE_BLUETOOTH_BCM),true)
 LOCAL_CFLAGS += \
 	-DBOARD_HAVE_BLUETOOTH_BCM
 endif
 
-LOCAL_PRELINK_MODULE:=false
-LOCAL_SRC_FILES:= \
-    ./ulinux/gki_ulinux.c \
-    ./common/gki_debug.c \
-    ./common/gki_time.c \
-    ./common/gki_buffer.c
+LOCAL_PRELINK_MODULE := false
+LOCAL_SRC_FILES := \
+	./common/gki_buffer.c \
+	./common/gki_debug.c \
+	./common/gki_time.c \
+	./ulinux/gki_ulinux.c
 
 LOCAL_MODULE := libbt-brcm_gki
 LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := libcutils libc
 LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+LOCAL_MULTILIB := 32
 
 include $(BUILD_STATIC_LIBRARY)
-
-endif  # TARGET_SIMULATOR != true
diff --git a/gki/common/gki.h b/gki/common/gki.h
index 5180dcd..8bbcd10 100644
--- a/gki/common/gki.h
+++ b/gki/common/gki.h
@@ -19,16 +19,7 @@
 #define GKI_H
 
 
-/* Include platform-specific over-rides */
-#if (defined(NFC_STANDALONE) && (NFC_STANDALONE == TRUE))
-    #include "gki_target.h"
-#else
-    /* For non-nfc_standalone, include Bluetooth definitions */
-    #include "bt_target.h"
-#endif
-
-
-
+#include "bt_target.h"
 #include "bt_types.h"
 
 /* Error codes */
@@ -85,236 +76,12 @@
 
 #define EVENT_MASK(evt)       ((UINT16)(0x0001 << (evt)))
 
-/************************************************************************
-**  Max Time Queue
-**/
-#ifndef GKI_MAX_TIMER_QUEUES
-#define GKI_MAX_TIMER_QUEUES    3
-#endif
-
-/************************************************************************
-**  Macro to determine the pool buffer size based on the GKI POOL ID at compile time.
-**  Pool IDs index from 0 to GKI_NUM_FIXED_BUF_POOLS - 1
-*/
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 1)
-
-#ifndef GKI_POOL_ID_0
-#define GKI_POOL_ID_0                0
-#endif /* ifndef GKI_POOL_ID_0 */
-
-#ifndef GKI_BUF0_SIZE
-#define GKI_BUF0_SIZE                0
-#endif /* ifndef GKI_BUF0_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 1 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 2)
-
-#ifndef GKI_POOL_ID_1
-#define GKI_POOL_ID_1                0
-#endif /* ifndef GKI_POOL_ID_1 */
-
-#ifndef GKI_BUF1_SIZE
-#define GKI_BUF1_SIZE                0
-#endif /* ifndef GKI_BUF1_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 2 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 3)
-
-#ifndef GKI_POOL_ID_2
-#define GKI_POOL_ID_2                0
-#endif /* ifndef GKI_POOL_ID_2 */
-
-#ifndef GKI_BUF2_SIZE
-#define GKI_BUF2_SIZE                0
-#endif /* ifndef GKI_BUF2_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 3 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 4)
-
-#ifndef GKI_POOL_ID_3
-#define GKI_POOL_ID_3                0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF3_SIZE
-#define GKI_BUF3_SIZE                0
-#endif /* ifndef GKI_BUF3_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 4 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 5)
-
-#ifndef GKI_POOL_ID_4
-#define GKI_POOL_ID_4                0
-#endif /* ifndef GKI_POOL_ID_4 */
-
-#ifndef GKI_BUF4_SIZE
-#define GKI_BUF4_SIZE                0
-#endif /* ifndef GKI_BUF4_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 5 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 6)
-
-#ifndef GKI_POOL_ID_5
-#define GKI_POOL_ID_5                0
-#endif /* ifndef GKI_POOL_ID_5 */
-
-#ifndef GKI_BUF5_SIZE
-#define GKI_BUF5_SIZE                0
-#endif /* ifndef GKI_BUF5_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 6 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 7)
-
-#ifndef GKI_POOL_ID_6
-#define GKI_POOL_ID_6                0
-#endif /* ifndef GKI_POOL_ID_6 */
-
-#ifndef GKI_BUF6_SIZE
-#define GKI_BUF6_SIZE                0
-#endif /* ifndef GKI_BUF6_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 7 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 8)
-
-#ifndef GKI_POOL_ID_7
-#define GKI_POOL_ID_7                0
-#endif /* ifndef GKI_POOL_ID_7 */
-
-#ifndef GKI_BUF7_SIZE
-#define GKI_BUF7_SIZE                0
-#endif /* ifndef GKI_BUF7_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 8 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 9)
-
-#ifndef GKI_POOL_ID_8
-#define GKI_POOL_ID_8                0
-#endif /* ifndef GKI_POOL_ID_8 */
-
-#ifndef GKI_BUF8_SIZE
-#define GKI_BUF8_SIZE                0
-#endif /* ifndef GKI_BUF8_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 9 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 10)
-
-#ifndef GKI_POOL_ID_9
-#define GKI_POOL_ID_9                0
-#endif /* ifndef GKI_POOL_ID_9 */
-
-#ifndef GKI_BUF9_SIZE
-#define GKI_BUF9_SIZE                0
-#endif /* ifndef GKI_BUF9_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 10 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 11)
-
-#ifndef GKI_POOL_ID_10
-#define GKI_POOL_ID_10                0
-#endif /* ifndef GKI_POOL_ID_10 */
-
-#ifndef GKI_BUF10_SIZE
-#define GKI_BUF10_SIZE                0
-#endif /* ifndef GKI_BUF10_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 11 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 12)
-
-#ifndef GKI_POOL_ID_11
-#define GKI_POOL_ID_11                0
-#endif /* ifndef GKI_POOL_ID_11 */
-
-#ifndef GKI_BUF11_SIZE
-#define GKI_BUF11_SIZE                0
-#endif /* ifndef GKI_BUF11_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 12 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 13)
-
-#ifndef GKI_POOL_ID_12
-#define GKI_POOL_ID_12                0
-#endif /* ifndef GKI_POOL_ID_12 */
-
-#ifndef GKI_BUF12_SIZE
-#define GKI_BUF12_SIZE                0
-#endif /* ifndef GKI_BUF12_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 13 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 14)
-
-#ifndef GKI_POOL_ID_13
-#define GKI_POOL_ID_13                0
-#endif /* ifndef GKI_POOL_ID_13 */
-
-#ifndef GKI_BUF13_SIZE
-#define GKI_BUF13_SIZE                0
-#endif /* ifndef GKI_BUF13_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 14 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 15)
-
-#ifndef GKI_POOL_ID_14
-#define GKI_POOL_ID_14                0
-#endif /* ifndef GKI_POOL_ID_14 */
-
-#ifndef GKI_BUF14_SIZE
-#define GKI_BUF14_SIZE                0
-#endif /* ifndef GKI_BUF14_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 15 */
-
-
-#if (GKI_NUM_FIXED_BUF_POOLS < 16)
-
-#ifndef GKI_POOL_ID_15
-#define GKI_POOL_ID_15                0
-#endif /* ifndef GKI_POOL_ID_15 */
-
-#ifndef GKI_BUF15_SIZE
-#define GKI_BUF15_SIZE                0
-#endif /* ifndef GKI_BUF15_SIZE */
-
-#endif /* GKI_NUM_FIXED_BUF_POOLS < 16 */
-
-
 /* Timer list entry callback type
 */
 typedef void (TIMER_CBACK)(void *p_tle);
 #ifndef TIMER_PARAM_TYPE
-#ifdef  WIN2000
-#define TIMER_PARAM_TYPE    void *
-#else
 #define TIMER_PARAM_TYPE    UINT32
 #endif
-#endif
 /* Define a timer list entry
 */
 typedef struct _tle
@@ -323,7 +90,9 @@
     struct _tle  *p_prev;
     TIMER_CBACK  *p_cback;
     INT32         ticks;
+    INT32         ticks_initial;
     TIMER_PARAM_TYPE   param;
+    TIMER_PARAM_TYPE   data;
     UINT16        event;
     UINT8         in_use;
 } TIMER_LIST_ENT;
@@ -334,7 +103,6 @@
 {
     TIMER_LIST_ENT   *p_first;
     TIMER_LIST_ENT   *p_last;
-    INT32             last_ticks;
 } TIMER_LIST_Q;
 
 
@@ -378,22 +146,11 @@
 GKI_API extern void    GKI_init(void);
 GKI_API extern void    GKI_shutdown(void);
 GKI_API extern INT8   *GKI_map_taskname(UINT8);
-GKI_API extern UINT8   GKI_resume_task(UINT8);
-GKI_API extern void    GKI_run(void *);
-GKI_API extern void    GKI_freeze(void);
+GKI_API extern void    GKI_run(void);
 GKI_API extern void    GKI_stop(void);
-GKI_API extern UINT8   GKI_suspend_task(UINT8);
-GKI_API extern UINT8   GKI_is_task_running(UINT8);
-
-/* memory management
-*/
-GKI_API extern void GKI_shiftdown (UINT8 *p_mem, UINT32 len, UINT32 shift_amount);
-GKI_API extern void GKI_shiftup (UINT8 *p_dest, UINT8 *p_src, UINT32 len);
 
 /* To send buffers and events between tasks
 */
-GKI_API extern UINT8   GKI_isend_event (UINT8, UINT16);
-GKI_API extern void    GKI_isend_msg (UINT8, UINT8, void *);
 GKI_API extern void   *GKI_read_mbox  (UINT8);
 GKI_API extern void    GKI_send_msg   (UINT8, UINT8, void *);
 GKI_API extern UINT8   GKI_send_event (UINT8, UINT16);
@@ -401,10 +158,6 @@
 
 /* To get and release buffers, change owner and get size
 */
-GKI_API extern void    GKI_change_buf_owner (void *, UINT8);
-GKI_API extern UINT8   GKI_create_pool (UINT16, UINT16, UINT8, void *);
-GKI_API extern void    GKI_delete_pool (UINT8);
-GKI_API extern void   *GKI_find_buf_start (void *);
 GKI_API extern void    GKI_freebuf (void *);
 GKI_API extern void   *GKI_getbuf (UINT16);
 GKI_API extern UINT16  GKI_get_buf_size (void *);
@@ -412,8 +165,6 @@
 GKI_API extern UINT16  GKI_poolcount (UINT8);
 GKI_API extern UINT16  GKI_poolfreecount (UINT8);
 GKI_API extern UINT16  GKI_poolutilization (UINT8);
-GKI_API extern void    GKI_register_mempool (void *p_mem);
-GKI_API extern UINT8   GKI_set_pool_permission(UINT8, UINT8);
 
 
 /* User buffer queue management
@@ -434,35 +185,23 @@
 GKI_API extern void    GKI_add_to_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
 GKI_API extern void    GKI_delay(UINT32);
 GKI_API extern UINT32  GKI_get_tick_count(void);
-GKI_API extern INT8   *GKI_get_time_stamp(INT8 *);
 GKI_API extern void    GKI_init_timer_list (TIMER_LIST_Q *);
-GKI_API extern void    GKI_init_timer_list_entry (TIMER_LIST_ENT  *);
 GKI_API extern INT32   GKI_ready_to_sleep (void);
-GKI_API extern void    GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
+GKI_API extern BOOLEAN GKI_remove_from_timer_list (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
 GKI_API extern void    GKI_start_timer(UINT8, INT32, BOOLEAN);
 GKI_API extern void    GKI_stop_timer (UINT8);
 GKI_API extern void    GKI_timer_update(INT32);
 GKI_API extern UINT16  GKI_update_timer_list (TIMER_LIST_Q *, INT32);
 GKI_API extern UINT32  GKI_get_remaining_ticks (TIMER_LIST_Q *, TIMER_LIST_ENT  *);
 GKI_API extern UINT16  GKI_wait(UINT16, UINT32);
-
-/* Start and Stop system time tick callback
- * true for start system tick if time queue is not empty
- * false to stop system tick if time queue is empty
-*/
-typedef void (SYSTEM_TICK_CBACK)(BOOLEAN);
-
-/* Time queue management for system ticks
-*/
-GKI_API extern BOOLEAN GKI_timer_queue_empty (void);
-GKI_API extern void    GKI_timer_queue_register_callback(SYSTEM_TICK_CBACK *);
+GKI_API extern BOOLEAN GKI_timer_queue_is_empty(const TIMER_LIST_Q *timer_q);
+GKI_API extern TIMER_LIST_ENT *GKI_timer_getfirst(const TIMER_LIST_Q *timer_q);
+GKI_API extern INT32 GKI_timer_ticks_getinitial(const TIMER_LIST_ENT *tle);
 
 /* Disable Interrupts, Enable Interrupts
 */
 GKI_API extern void    GKI_enable(void);
 GKI_API extern void    GKI_disable(void);
-GKI_API extern void    GKI_sched_lock(void);
-GKI_API extern void    GKI_sched_unlock(void);
 
 /* Allocate (Free) memory from an OS
 */
@@ -491,4 +230,3 @@
 
 
 #endif
-
diff --git a/gki/common/gki_buffer.c b/gki/common/gki_buffer.c
index bcf6f06..03b330c 100644
--- a/gki/common/gki_buffer.c
+++ b/gki/common/gki_buffer.c
@@ -401,8 +401,11 @@
         /* Only look at PUBLIC buffer pools (bypass RESTRICTED pools) */
         if (((UINT16)1 << p_cb->pool_list[i]) & p_cb->pool_access_mask)
             continue;
+        if ( size <= p_cb->freeq[p_cb->pool_list[i]].size )
+             Q = &p_cb->freeq[p_cb->pool_list[i]];
+        else
+             continue;
 
-        Q = &p_cb->freeq[p_cb->pool_list[i]];
         if(Q->cur_cnt < Q->total)
         {
 // btla-specific ++
@@ -1015,81 +1018,6 @@
 
 /*******************************************************************************
 **
-** Function         GKI_find_buf_start
-**
-** Description      This function is called with an address inside a buffer,
-**                  and returns the start address ofthe buffer.
-**
-**                  The buffer should be one allocated from one of GKI's pools.
-**
-** Parameters:      p_user_area - (input) address of anywhere in a GKI buffer.
-**
-** Returns          void * - Address of the beginning of the specified buffer if successful,
-**                          otherwise NULL if unsuccessful
-**
-*******************************************************************************/
-void *GKI_find_buf_start (void *p_user_area)
-{
-    UINT16       xx, size;
-    UINT32       yy;
-    tGKI_COM_CB *p_cb = &gki_cb.com;
-    UINT8       *p_ua = (UINT8 *)p_user_area;
-
-    for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++)
-    {
-        if ((p_ua > p_cb->pool_start[xx]) && (p_ua < p_cb->pool_end[xx]))
-        {
-            yy = (UINT32)(p_ua - p_cb->pool_start[xx]);
-
-            size = p_cb->pool_size[xx];
-
-            yy = (yy / size) * size;
-
-            return ((void *) (p_cb->pool_start[xx] + yy + sizeof(BUFFER_HDR_T)) );
-        }
-    }
-
-    /* If here, invalid address - not in one of our buffers */
-    GKI_exception (GKI_ERROR_BUF_SIZE_ZERO, "GKI_get_buf_start:: bad addr");
-
-    return (NULL);
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_set_pool_permission
-**
-** Description      This function is called to set or change the permissions for
-**                  the specified pool ID.
-**
-** Parameters       pool_id -       (input) pool ID to be set or changed
-**                  permission -    (input) GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL
-**
-** Returns          GKI_SUCCESS if successful
-**                  GKI_INVALID_POOL if unsuccessful
-**
-*******************************************************************************/
-UINT8 GKI_set_pool_permission(UINT8 pool_id, UINT8 permission)
-{
-    tGKI_COM_CB *p_cb = &gki_cb.com;
-
-    if (pool_id < GKI_NUM_TOTAL_BUF_POOLS)
-    {
-        if (permission == GKI_RESTRICTED_POOL)
-            p_cb->pool_access_mask = (UINT16)(p_cb->pool_access_mask | (1 << pool_id));
-
-        else    /* mark the pool as public */
-            p_cb->pool_access_mask = (UINT16)(p_cb->pool_access_mask & ~(1 << pool_id));
-
-        return (GKI_SUCCESS);
-    }
-    else
-        return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
 ** Function         gki_add_to_pool_list
 **
 ** Description      Adds pool to the pool list which is arranged in the
@@ -1243,202 +1171,6 @@
 
 /*******************************************************************************
 **
-** Function         GKI_change_buf_owner
-**
-** Description      Called to change the task ownership of a buffer.
-**
-** Parameters:      p_buf   - (input) pointer to the buffer
-**                  task_id - (input) task id to change ownership to
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_change_buf_owner (void *p_buf, UINT8 task_id)
-{
-    BUFFER_HDR_T    *p_hdr = (BUFFER_HDR_T *) ((UINT8 *) p_buf - BUFFER_HDR_SIZE);
-
-    p_hdr->task_id = task_id;
-
-    return;
-}
-
-#if (defined(GKI_SEND_MSG_FROM_ISR) &&  GKI_SEND_MSG_FROM_ISR == TRUE)
-/*******************************************************************************
-**
-** Function         GKI_isend_msg
-**
-** Description      Called from interrupt context to send a buffer to a task
-**
-** Returns          Nothing
-**
-*******************************************************************************/
-void GKI_isend_msg (UINT8 task_id, UINT8 mbox, void *msg)
-{
-    BUFFER_HDR_T    *p_hdr;
-    tGKI_COM_CB *p_cb = &gki_cb.com;
-
-    /* If task non-existant or not started, drop buffer */
-    if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) || (p_cb->OSRdyTbl[task_id] == TASK_DEAD))
-    {
-        GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
-        GKI_freebuf (msg);
-        return;
-    }
-
-#if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
-    if (gki_chk_buf_damage(msg))
-    {
-        GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
-        return;
-    }
-#endif
-
-#if (GKI_ENABLE_OWNER_CHECK == TRUE)
-    if (gki_chk_buf_owner(msg))
-    {
-        GKI_exception(GKI_ERROR_NOT_BUF_OWNER, "Send by non-owner");
-        return;
-    }
-#endif
-
-    p_hdr = (BUFFER_HDR_T *) ((UINT8 *) msg - BUFFER_HDR_SIZE);
-
-    if (p_hdr->status != BUF_STATUS_UNLINKED)
-    {
-        GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
-        return;
-    }
-
-    if (p_cb->OSTaskQFirst[task_id][mbox])
-        p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
-    else
-        p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
-
-    p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
-
-    p_hdr->p_next = NULL;
-    p_hdr->status = BUF_STATUS_QUEUED;
-    p_hdr->task_id = task_id;
-
-    GKI_isend_event(task_id, (UINT16)EVENT_MASK(mbox));
-
-    return;
-}
-#endif
-
-/*******************************************************************************
-**
-** Function         GKI_create_pool
-**
-** Description      Called by applications to create a buffer pool.
-**
-** Parameters:      size        - (input) length (in bytes) of each buffer in the pool
-**                  count       - (input) number of buffers to allocate for the pool
-**                  permission  - (input) restricted or public access?
-**                                        (GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL)
-**                  p_mem_pool  - (input) pointer to an OS memory pool, NULL if not provided
-**
-** Returns          the buffer pool ID, which should be used in calls to
-**                  GKI_getpoolbuf(). If a pool could not be created, this
-**                  function returns 0xff.
-**
-*******************************************************************************/
-UINT8 GKI_create_pool (UINT16 size, UINT16 count, UINT8 permission, void *p_mem_pool)
-{
-    UINT8        xx;
-    UINT32       mem_needed;
-    INT32        tempsize = size;
-    tGKI_COM_CB *p_cb = &gki_cb.com;
-
-    /* First make sure the size of each pool has a valid size with room for the header info */
-    if (size > MAX_USER_BUF_SIZE)
-        return (GKI_INVALID_POOL);
-
-    /* First, look for an unused pool */
-    for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++)
-    {
-        if (!p_cb->pool_start[xx])
-            break;
-    }
-
-    if (xx == GKI_NUM_TOTAL_BUF_POOLS)
-        return (GKI_INVALID_POOL);
-
-    /* Ensure an even number of longwords */
-    tempsize = (INT32)ALIGN_POOL(size);
-
-    mem_needed = (tempsize + BUFFER_PADDING_SIZE) * count;
-
-    if (!p_mem_pool)
-        p_mem_pool = GKI_os_malloc(mem_needed);
-
-    if (p_mem_pool)
-    {
-        /* Initialize the new pool */
-        gki_init_free_queue (xx, size, count, p_mem_pool);
-        gki_add_to_pool_list(xx);
-        (void) GKI_set_pool_permission (xx, permission);
-        p_cb->curr_total_no_of_pools++;
-
-        return (xx);
-    }
-    else
-        return (GKI_INVALID_POOL);
-}
-
-/*******************************************************************************
-**
-** Function         GKI_delete_pool
-**
-** Description      Called by applications to delete a buffer pool.  The function
-**                  calls the operating specific function to free the actual memory.
-**                  An exception is generated if an error is detected.
-**
-** Parameters:      pool_id - (input) Id of the poll being deleted.
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_delete_pool (UINT8 pool_id)
-{
-    FREE_QUEUE_T    *Q;
-    tGKI_COM_CB     *p_cb = &gki_cb.com;
-
-    if ((pool_id >= GKI_NUM_TOTAL_BUF_POOLS) || (!p_cb->pool_start[pool_id]))
-        return;
-
-    GKI_disable();
-    Q  = &p_cb->freeq[pool_id];
-
-    if (!Q->cur_cnt)
-    {
-        Q->size      = 0;
-        Q->total     = 0;
-        Q->cur_cnt   = 0;
-        Q->max_cnt   = 0;
-        Q->p_first   = NULL;
-        Q->p_last    = NULL;
-
-        GKI_os_free (p_cb->pool_start[pool_id]);
-
-        p_cb->pool_start[pool_id] = NULL;
-        p_cb->pool_end[pool_id]   = NULL;
-        p_cb->pool_size[pool_id]  = 0;
-
-        gki_remove_from_pool_list(pool_id);
-        p_cb->curr_total_no_of_pools--;
-    }
-    else
-        GKI_exception(GKI_ERROR_DELETE_POOL_BAD_QID, "Deleting bad pool");
-
-    GKI_enable();
-
-    return;
-}
-
-
-/*******************************************************************************
-**
 ** Function         GKI_get_pool_bufsize
 **
 ** Description      Called by an application to get the size of buffers in a pool
diff --git a/gki/common/gki_common.h b/gki/common/gki_common.h
index ff5a675..042024e1 100644
--- a/gki/common/gki_common.h
+++ b/gki/common/gki_common.h
@@ -45,15 +45,13 @@
 #define GKI_ERROR_ADDR_NOT_IN_BUF       0xFFF5
 #define GKI_ERROR_OUT_OF_BUFFERS        0xFFF4
 #define GKI_ERROR_GETPOOLBUF_BAD_QID    0xFFF3
+#define GKI_ERROR_TIMER_LIST_CORRUPTED  0xFFF2
 
 
 /********************************************************************
 **  Misc constants
 *********************************************************************/
 
-#define GKI_MAX_INT32           (0x7fffffffL)
-#define GKI_MAX_TIMESTAMP       (0xffffffffL)
-
 /********************************************************************
 **  Buffer Management Data Structures
 *********************************************************************/
@@ -63,14 +61,14 @@
     struct _buffer_hdr *p_next;   /* next buffer in the queue */
 	UINT8   q_id;                 /* id of the queue */
 	UINT8   task_id;              /* task which allocated the buffer*/
-    UINT8   status;               /* FREE, UNLINKED or QUEUED */
+	UINT8   status;               /* FREE, UNLINKED or QUEUED */
 	UINT8   Type;
 } BUFFER_HDR_T;
 
 typedef struct _free_queue
 {
 	BUFFER_HDR_T *p_first;      /* first buffer in the queue */
-    BUFFER_HDR_T *p_last;       /* last buffer in the queue */
+	BUFFER_HDR_T *p_last;       /* last buffer in the queue */
 	UINT16		 size;          /* size of the buffers in the pool */
 	UINT16		 total;         /* toatal number of buffers */
 	UINT16		 cur_cnt;       /* number of  buffers currently allocated */
@@ -269,9 +267,6 @@
     /* Timer related variables
     */
     INT32   OSTicksTilExp;      /* Number of ticks till next timer expires */
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-    UINT32  OSTicksTilStop;     /* inactivity delay timer; OS Ticks till stopping system tick */
-#endif
     INT32   OSNumOrigTicks;     /* Number of ticks between last timer expiration to the next one */
 
     INT32   OSWaitTmr   [GKI_MAX_TASKS];  /* ticks the task has to wait, for specific events */
@@ -326,12 +321,6 @@
 
     BOOLEAN     timer_nesting;                      /* flag to prevent timer interrupt nesting */
 
-    /* Time queue arrays */
-    TIMER_LIST_Q *timer_queues[GKI_MAX_TIMER_QUEUES];
-    /* System tick callback */
-    SYSTEM_TICK_CBACK *p_tick_cb;
-    BOOLEAN     system_tick_running;                /* TRUE if system tick is running. Valid only if p_tick_cb is not NULL */
-
 #if (GKI_DEBUG == TRUE)
     UINT16      ExceptionCnt;                       /* number of GKI exceptions that have happened */
     EXCEPTION_T Exception[GKI_MAX_EXCEPTION];
@@ -356,13 +345,6 @@
 extern void      gki_dealloc_free_queue(void);
 #endif
 
-extern void    OSStartRdy(void);
-extern void	   OSCtxSw(void);
-extern void	   OSIntCtxSw(void);
-extern void    OSSched(void);
-extern void    OSIntEnter(void);
-extern void    OSIntExit(void);
-
 
 /* Debug aids
 */
diff --git a/gki/common/gki_debug.c b/gki/common/gki_debug.c
index 46d7e38..adb9c46 100644
--- a/gki/common/gki_debug.c
+++ b/gki/common/gki_debug.c
@@ -50,22 +50,22 @@
     UINT8   num = gki_cb.com.curr_total_no_of_pools;
     UINT16   cur[GKI_NUM_TOTAL_BUF_POOLS];
 
-    GKI_TRACE_0("");
-    GKI_TRACE_0("--- GKI Buffer Pool Summary (R - restricted, P - public) ---");
+    GKI_TRACE("");
+    GKI_TRACE("--- GKI Buffer Pool Summary (R - restricted, P - public) ---");
 
-    GKI_TRACE_0("POOL     SIZE  USED  MAXU  TOTAL");
-    GKI_TRACE_0("------------------------------");
+    GKI_TRACE("POOL     SIZE  USED  MAXU  TOTAL");
+    GKI_TRACE("------------------------------");
     for (i = 0; i < gki_cb.com.curr_total_no_of_pools; i++)
     {
         p = &gki_cb.com.freeq[i];
         if ((1 << i) & gki_cb.com.pool_access_mask)
         {
-            GKI_TRACE_5("%02d: (R), %4d, %3d, %3d, %3d",
+            GKI_TRACE("%02d: (R), %4d, %3d, %3d, %3d",
                         i, p->size, p->cur_cnt, p->max_cnt, p->total);
         }
         else
         {
-            GKI_TRACE_5("%02d: (P), %4d, %3d, %3d, %3d",
+            GKI_TRACE("%02d: (P), %4d, %3d, %3d, %3d",
                         i, p->size, p->cur_cnt, p->max_cnt, p->total);
         }
         cur[i] = p->cur_cnt;
@@ -90,7 +90,7 @@
     UINT16 i;
     for(i=0; i<GKI_NUM_TOTAL_BUF_POOLS; i++)
 	{
-		GKI_TRACE_5("pool:%4u free %4u cur %3u max %3u  total%3u", i, gki_cb.com.freeq[i].size,
+		GKI_TRACE("pool:%4u free %4u cur %3u max %3u  total%3u", i, gki_cb.com.freeq[i].size,
                     gki_cb.com.freeq[i].cur_cnt, gki_cb.com.freeq[i].max_cnt, gki_cb.com.freeq[i].total);
     }
 }
@@ -136,16 +136,16 @@
 void GKI_print_task(void)
 {
 #ifdef _BT_WIN32
-	GKI_TRACE_0("Service not available under insight");
+	GKI_TRACE("Service not available under insight");
 #else
     UINT8 TaskId;
 
-	GKI_TRACE_0("TID TASKNAME STATE FREE_STACK  STACK");
+	GKI_TRACE("TID TASKNAME STATE FREE_STACK  STACK");
 	for(TaskId=0; TaskId < GKI_MAX_TASKS; TaskId++)
 	{
 		if (gki_cb.com.OSRdyTbl[TaskId] != TASK_DEAD)
 		{
-			GKI_TRACE_5("%2u   %-8s %-5s  0x%04X     0x%04X Bytes",
+			GKI_TRACE("%2u   %-8s %-5s  0x%04X     0x%04X Bytes",
 				(UINT16)TaskId,  gki_cb.com.OSTName[TaskId],
 				OSTaskStates[gki_cb.com.OSRdyTbl[TaskId]],
                 gki_calc_stack(TaskId), gki_cb.com.OSStackSize[TaskId]);
diff --git a/gki/common/gki_inet.h b/gki/common/gki_inet.h
deleted file mode 100644
index 6640931..0000000
--- a/gki/common/gki_inet.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2002-2012 Broadcom Corporation
- *
- *  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 GKI_INET_H
-#define GKI_INET_H
-
-#include "data_types.h"
-
-#define htons	ntohs
-#define htonl	ntohl
-
-#define htonets	nettohs
-#define htonetl	nettohl
-
-#if BIG_ENDIAN == TRUE
-#define ntohs(n) (n)
-#define ntohl(n) (n)
-#define ntoh6(n) (n)
-
-#define nettohs(n) (n)
-#define nettohl(n) (n)
-#else
-extern UINT16 ntohs(UINT16 n);
-extern UINT32 ntohl(UINT32 n);
-extern UINT8 *ntoh6(UINT8 *p);
-
-#define nettohs(n) ((UINT16)((((n) << 8) & 0xff00) | (((n) >> 8) & 0x00ff)))
-#define nettohl(n) ((((n) & 0x000000ff) << 24) | (((n) << 8) & 0x00ff0000) | \
-                   (((n) >> 8) & 0x0000ff00) | (((n) >> 24) & 0x000000ff))
-#endif
-
-#endif /* GKI_INET_H */
-
diff --git a/gki/common/gki_time.c b/gki/common/gki_time.c
index a9af8fa..aa95195 100644
--- a/gki/common/gki_time.c
+++ b/gki/common/gki_time.c
@@ -16,13 +16,10 @@
  *
  ******************************************************************************/
 
-
+#include <assert.h>
+#include <utils/Log.h>
 #include "gki_int.h"
 
-#ifndef BT_ERROR_TRACE_0
-#define BT_ERROR_TRACE_0(l,m)
-#endif
-
 /* Make sure that this has been defined in target.h */
 #ifndef GKI_NUM_TIMERS
 #error  NO TIMERS: Must define at least 1 timer in the system!
@@ -30,8 +27,9 @@
 
 
 #define GKI_NO_NEW_TMRS_STARTED (0x7fffffffL)   /* Largest signed positive timer count */
-#define GKI_UNUSED_LIST_ENTRY   (0x80000000L)   /* Marks an unused timer list entry (initial value) */
-#define GKI_MAX_INT32           (0x7fffffffL)
+
+// Used for controlling alarms from AlarmService.
+extern void alarm_service_reschedule(void);
 
 /*******************************************************************************
 **
@@ -49,9 +47,6 @@
 
     gki_cb.com.OSTicksTilExp = 0;       /* Remaining time (of OSTimeCurTimeout) before next timer expires */
     gki_cb.com.OSNumOrigTicks = 0;
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-    gki_cb.com.OSTicksTilStop = 0;      /* clear inactivity delay timer */
-#endif
 
     for (tt = 0; tt < GKI_MAX_TASKS; tt++)
     {
@@ -78,14 +73,6 @@
 #endif
     }
 
-    for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
-    {
-        gki_cb.com.timer_queues[tt] = NULL;
-    }
-
-    gki_cb.com.p_tick_cb = NULL;
-    gki_cb.com.system_tick_running = FALSE;
-
     return;
 }
 
@@ -216,38 +203,16 @@
 
     GKI_disable();
 
-    if(gki_timers_is_timer_running() == FALSE)
-    {
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-        /* if inactivity delay timer is not running, start system tick */
-        if(gki_cb.com.OSTicksTilStop == 0)
-        {
-#endif
-            if(gki_cb.com.p_tick_cb)
-            {
-                /* start system tick */
-                gki_cb.com.system_tick_running = TRUE;
-                (gki_cb.com.p_tick_cb) (TRUE);
-            }
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-        }
-        else
-        {
-            /* clear inactivity delay timer */
-            gki_cb.com.OSTicksTilStop = 0;
-        }
-#endif
-    }
     /* Add the time since the last task timer update.
     ** Note that this works when no timers are active since
     ** both OSNumOrigTicks and OSTicksTilExp are 0.
     */
-    if (GKI_MAX_INT32 - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) > ticks)
+    if (INT32_MAX - (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) > ticks)
     {
         ticks += gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp;
     }
     else
-        ticks = GKI_MAX_INT32;
+        ticks = INT32_MAX;
 
     switch (tnum)
     {
@@ -340,31 +305,6 @@
             break;
 #endif
     }
-
-    GKI_disable();
-
-    if (gki_timers_is_timer_running() == FALSE)
-    {
-        if (gki_cb.com.p_tick_cb)
-        {
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-            /* if inactivity delay timer is not running */
-            if ((gki_cb.com.system_tick_running)&&(gki_cb.com.OSTicksTilStop == 0))
-            {
-                /* set inactivity delay timer */
-                /* when timer expires, system tick will be stopped */
-                gki_cb.com.OSTicksTilStop = GKI_DELAY_STOP_SYS_TICK;
-            }
-#else
-            gki_cb.com.system_tick_running = FALSE;
-            gki_cb.com.p_tick_cb(FALSE); /* stop system tick */
-#endif
-        }
-    }
-
-    GKI_enable();
-
-
 }
 
 
@@ -405,29 +345,12 @@
 
     gki_cb.com.timer_nesting = 1;
 
-#if (defined(GKI_DELAY_STOP_SYS_TICK) && (GKI_DELAY_STOP_SYS_TICK > 0))
-    /* if inactivity delay timer is set and expired */
-    if (gki_cb.com.OSTicksTilStop)
-    {
-        if( gki_cb.com.OSTicksTilStop <= (UINT32)ticks_since_last_update )
-        {
-            if(gki_cb.com.p_tick_cb)
-            {
-                gki_cb.com.system_tick_running = FALSE;
-                (gki_cb.com.p_tick_cb) (FALSE); /* stop system tick */
-            }
-            gki_cb.com.OSTicksTilStop = 0;      /* clear inactivity delay timer */
-            gki_cb.com.timer_nesting = 0;
-            return;
-        }
-        else
-            gki_cb.com.OSTicksTilStop -= ticks_since_last_update;
-    }
-#endif
-
     /* No need to update the ticks if no timeout has occurred */
     if (gki_cb.com.OSTicksTilExp > 0)
     {
+        // When using alarms from AlarmService we should
+        // always have work to be done here.
+        ALOGE("%s no work to be done when expected work", __func__);
         gki_cb.com.timer_nesting = 0;
         return;
     }
@@ -441,15 +364,12 @@
      */
     gki_cb.com.OSNumOrigTicks -= gki_cb.com.OSTicksTilExp;
 
-#if GKI_TIMER_LIST_NOPREEMPT == TRUE
     /* Protect this section because if a GKI_timer_stop happens between:
      *   - gki_cb.com.OSTaskTmr0[task_id] -= gki_cb.com.OSNumOrigTicks;
      *   - gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
      * then the timer may appear stopped while it is about to be reloaded.
-     * Note: Not needed if this function cannot be preempted (typical).
      */
     GKI_disable();
-#endif
 
     /* Check for OS Task Timers */
     for (task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
@@ -474,12 +394,7 @@
             {
                 /* Reload timer and set Timer 0 Expired event mask */
                 gki_cb.com.OSTaskTmr0[task_id] = gki_cb.com.OSTaskTmr0R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) &&  GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-                GKI_isend_event (task_id, TIMER_0_EVT_MASK);
-#else
                 GKI_send_event (task_id, TIMER_0_EVT_MASK);
-#endif
             }
         }
 
@@ -498,12 +413,7 @@
             {
                 /* Reload timer and set Timer 1 Expired event mask */
                 gki_cb.com.OSTaskTmr1[task_id] = gki_cb.com.OSTaskTmr1R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) &&  GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-                GKI_isend_event (task_id, TIMER_1_EVT_MASK);
-#else
                 GKI_send_event (task_id, TIMER_1_EVT_MASK);
-#endif
             }
         }
 
@@ -522,12 +432,7 @@
             {
                 /* Reload timer and set Timer 2 Expired event mask */
                 gki_cb.com.OSTaskTmr2[task_id] = gki_cb.com.OSTaskTmr2R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) &&  GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-                GKI_isend_event (task_id, TIMER_2_EVT_MASK);
-#else
                 GKI_send_event (task_id, TIMER_2_EVT_MASK);
-#endif
             }
         }
 
@@ -546,12 +451,7 @@
             {
                 /* Reload timer and set Timer 3 Expired event mask */
                 gki_cb.com.OSTaskTmr3[task_id] = gki_cb.com.OSTaskTmr3R[task_id];
-
-#if (defined(GKI_TIMER_UPDATES_FROM_ISR) &&  GKI_TIMER_UPDATES_FROM_ISR == TRUE)
-                GKI_isend_event (task_id, TIMER_3_EVT_MASK);
-#else
                 GKI_send_event (task_id, TIMER_3_EVT_MASK);
-#endif
             }
         }
 
@@ -561,12 +461,6 @@
 #endif
 
     }
-
-#if GKI_TIMER_LIST_NOPREEMPT == TRUE
-    /* End the critical section */
-    GKI_enable();
-#endif
-
     /* Set the next timer experation value if there is one to start */
     if (next_expiration < GKI_NO_NEW_TMRS_STARTED)
     {
@@ -577,57 +471,16 @@
         gki_cb.com.OSTicksTilExp = gki_cb.com.OSNumOrigTicks = 0;
     }
 
+    // Set alarm service for next alarm.
+    alarm_service_reschedule();
+
+    GKI_enable();
+
     gki_cb.com.timer_nesting = 0;
 
     return;
 }
 
-
-/*******************************************************************************
-**
-** Function         GKI_timer_queue_empty
-**
-** Description      This function is called by applications to see whether the timer
-**                  queue is empty
-**
-** Parameters
-**
-** Returns          BOOLEAN
-**
-*******************************************************************************/
-BOOLEAN GKI_timer_queue_empty (void)
-{
-    UINT8 tt;
-
-    for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
-    {
-        if (gki_cb.com.timer_queues[tt])
-            return FALSE;
-    }
-
-    return TRUE;
-}
-
-/*******************************************************************************
-**
-** Function         GKI_timer_queue_register_callback
-**
-** Description      This function is called by applications to register system tick
-**                  start/stop callback for time queues
-**
-**
-** Parameters       p_callback - (input) pointer to the system tick callback
-**
-** Returns          BOOLEAN
-**
-*******************************************************************************/
-void GKI_timer_queue_register_callback (SYSTEM_TICK_CBACK *p_callback)
-{
-    gki_cb.com.p_tick_cb = p_callback;
-
-    return;
-}
-
 /*******************************************************************************
 **
 ** Function         GKI_init_timer_list
@@ -640,36 +493,26 @@
 ** Returns          void
 **
 *******************************************************************************/
-void GKI_init_timer_list (TIMER_LIST_Q *p_timer_listq)
-{
-    p_timer_listq->p_first    = NULL;
-    p_timer_listq->p_last     = NULL;
-    p_timer_listq->last_ticks = 0;
-
-    return;
+void GKI_init_timer_list(TIMER_LIST_Q *timer_q) {
+    timer_q->p_first    = NULL;
+    timer_q->p_last     = NULL;
 }
 
-/*******************************************************************************
-**
-** Function         GKI_init_timer_list_entry
-**
-** Description      This function is called by the applications when they
-**                  want to initialize a timer list entry. This must be
-**                  done prior to first use of the entry.
-**
-** Parameters       p_tle           - (input) pointer to a timer list queue entry
-**
-** Returns          void
-**
-*******************************************************************************/
-void GKI_init_timer_list_entry (TIMER_LIST_ENT  *p_tle)
-{
-    p_tle->p_next  = NULL;
-    p_tle->p_prev  = NULL;
-    p_tle->ticks   = GKI_UNUSED_LIST_ENTRY;
-    p_tle->in_use  = FALSE;
+bool GKI_timer_queue_is_empty(const TIMER_LIST_Q *timer_q) {
+    assert(timer_q != NULL);
+    return (timer_q->p_first == NULL);
 }
 
+TIMER_LIST_ENT *GKI_timer_getfirst(const TIMER_LIST_Q *timer_q) {
+    assert(timer_q != NULL);
+    return timer_q->p_first;
+}
+
+/* Returns the initial number of ticks for this timer entry. */
+INT32 GKI_timer_ticks_getinitial(const TIMER_LIST_ENT *tle) {
+    assert(tle != NULL);
+    return tle->ticks_initial;
+}
 
 /*******************************************************************************
 **
@@ -729,17 +572,6 @@
         p_tle = p_tle->p_next;
     }
 
-    if (p_timer_listq->last_ticks > 0)
-    {
-        p_timer_listq->last_ticks -= num_units_since_last_update;
-
-        /* If the last timer has expired set last_ticks to 0 so that other list update
-        * functions will calculate correctly
-        */
-        if (p_timer_listq->last_ticks < 0)
-            p_timer_listq->last_ticks = 0;
-    }
-
     return (num_time_out);
 }
 
@@ -780,14 +612,9 @@
         }
         else
         {
-            BT_ERROR_TRACE_0(TRACE_LAYER_GKI, "GKI_get_remaining_ticks: No timer entry in the list");
             return(0);
         }
     }
-    else
-    {
-        BT_ERROR_TRACE_0(TRACE_LAYER_GKI, "GKI_get_remaining_ticks: timer entry is not active");
-    }
 
     return (rem_ticks);
 }
@@ -810,86 +637,49 @@
 *******************************************************************************/
 void GKI_add_to_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT  *p_tle)
 {
-    UINT32           nr_ticks_total;
-    UINT8 tt;
-    TIMER_LIST_ENT  *p_temp;
+    /* Only process valid tick values. */
+    if (p_tle->ticks < 0)
+        return;
 
-    /* Only process valid tick values */
-    if (p_tle->ticks >= 0)
+    p_tle->p_prev = NULL;
+    p_tle->p_next = NULL;
+    p_tle->in_use = true;
+
+    /* Insert at head. */
+    if (p_timer_listq->p_first == NULL)
     {
-        /* If this entry is the last in the list */
-        if (p_tle->ticks >= p_timer_listq->last_ticks)
-        {
-            /* If this entry is the only entry in the list */
-            if (p_timer_listq->p_first == NULL)
-                p_timer_listq->p_first = p_tle;
-            else
-            {
-                /* Insert the entry onto the end of the list */
-                if (p_timer_listq->p_last != NULL)
-                    p_timer_listq->p_last->p_next = p_tle;
-
-                p_tle->p_prev = p_timer_listq->p_last;
-            }
-
-            p_tle->p_next = NULL;
-            p_timer_listq->p_last = p_tle;
-            nr_ticks_total = p_tle->ticks;
-            p_tle->ticks -= p_timer_listq->last_ticks;
-
-            p_timer_listq->last_ticks = nr_ticks_total;
-        }
-        else    /* This entry needs to be inserted before the last entry */
-        {
-            /* Find the entry that the new one needs to be inserted in front of */
-            p_temp = p_timer_listq->p_first;
-            while (p_tle->ticks > p_temp->ticks)
-            {
-                /* Update the tick value if looking at an unexpired entry */
-                if (p_temp->ticks > 0)
-                    p_tle->ticks -= p_temp->ticks;
-
-                p_temp = p_temp->p_next;
-            }
-
-            /* The new entry is the first in the list */
-            if (p_temp == p_timer_listq->p_first)
-            {
-                p_tle->p_next = p_timer_listq->p_first;
-                p_timer_listq->p_first->p_prev = p_tle;
-                p_timer_listq->p_first = p_tle;
-            }
-            else
-            {
-                p_temp->p_prev->p_next = p_tle;
-                p_tle->p_prev = p_temp->p_prev;
-                p_temp->p_prev = p_tle;
-                p_tle->p_next = p_temp;
-            }
-            p_temp->ticks -= p_tle->ticks;
-        }
-
-        p_tle->in_use = TRUE;
-
-        /* if we already add this timer queue to the array */
-        for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
-        {
-             if (gki_cb.com.timer_queues[tt] == p_timer_listq)
-                 return;
-        }
-        /* add this timer queue to the array */
-        for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
-        {
-             if (gki_cb.com.timer_queues[tt] == NULL)
-                 break;
-        }
-        if (tt < GKI_MAX_TIMER_QUEUES)
-        {
-            gki_cb.com.timer_queues[tt] = p_timer_listq;
-        }
+        p_timer_listq->p_first = p_tle;
+        p_timer_listq->p_last = p_tle;
+        return;
     }
 
-    return;
+    /* Find the node before which we need to insert p_tle. */
+    TIMER_LIST_ENT *i = p_timer_listq->p_first;
+    while (i && p_tle->ticks > i->ticks)
+    {
+        if (i->ticks > 0)
+            p_tle->ticks -= i->ticks;
+        i = i->p_next;
+    }
+
+    /* Insert at tail. */
+    if (!i)
+    {
+        p_timer_listq->p_last->p_next = p_tle;
+        p_tle->p_prev = p_timer_listq->p_last;
+        p_timer_listq->p_last = p_tle;
+        return;
+    }
+
+    p_tle->p_prev = i->p_prev;
+    if (p_tle->p_prev)
+        p_tle->p_prev->p_next = p_tle;
+    p_tle->p_next = i;
+    i->p_prev = p_tle;
+    i->ticks -= p_tle->ticks;
+
+    if (p_timer_listq->p_first == i)
+        p_timer_listq->p_first = p_tle;
 }
 
 
@@ -903,18 +693,16 @@
 ** Parameters       p_timer_listq   - (input) pointer to the timer list queue object
 **                  p_tle           - (input) pointer to a timer list queue entry
 **
-** Returns          void
+** Returns          TRUE if the entry has been unlinked successfully
 **
 *******************************************************************************/
-void GKI_remove_from_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT  *p_tle)
+BOOLEAN GKI_remove_from_timer_list (TIMER_LIST_Q *p_timer_listq, TIMER_LIST_ENT  *p_tle)
 {
     UINT8 tt;
 
     /* Verify that the entry is valid */
-    if (p_tle == NULL || p_tle->in_use == FALSE || p_timer_listq->p_first == NULL)
-    {
-        return;
-    }
+    if (p_tle == NULL || p_timer_listq->p_first == NULL)
+        return FALSE;
 
     /* Add the ticks remaining in this timer (if any) to the next guy in the list.
     ** Note: Expired timers have a tick value of '0'.
@@ -923,10 +711,9 @@
     {
         p_tle->p_next->ticks += p_tle->ticks;
     }
-    else
-    {
-        p_timer_listq->last_ticks -= p_tle->ticks;
-    }
+
+    p_tle->ticks = 0;
+    p_tle->in_use = FALSE;
 
     /* Unlink timer from the list.
     */
@@ -954,39 +741,17 @@
             if (p_tle->p_next != NULL && p_tle->p_next->p_prev == p_tle)
                 p_tle->p_next->p_prev = p_tle->p_prev;
             else
-            {
-                /* Error case - chain messed up ?? */
-                return;
-            }
+                return FALSE; // Timer list broken?!
 
             if (p_tle->p_prev != NULL && p_tle->p_prev->p_next == p_tle)
                 p_tle->p_prev->p_next = p_tle->p_next;
             else
-            {
-                /* Error case - chain messed up ?? */
-                return;
-            }
+                return FALSE; // Timer list broken?!
         }
     }
 
     p_tle->p_next = p_tle->p_prev = NULL;
-    p_tle->ticks = GKI_UNUSED_LIST_ENTRY;
-    p_tle->in_use = FALSE;
-
-    /* if timer queue is empty */
-    if (p_timer_listq->p_first == NULL && p_timer_listq->p_last == NULL)
-    {
-        for (tt = 0; tt < GKI_MAX_TIMER_QUEUES; tt++)
-        {
-            if (gki_cb.com.timer_queues[tt] == p_timer_listq)
-            {
-                gki_cb.com.timer_queues[tt] = NULL;
-                break;
-            }
-        }
-    }
-
-    return;
+    return TRUE;
 }
 
 
@@ -1016,6 +781,7 @@
         {
             gki_cb.com.OSNumOrigTicks = (gki_cb.com.OSNumOrigTicks - gki_cb.com.OSTicksTilExp) + ticks;
             gki_cb.com.OSTicksTilExp = ticks;
+            alarm_service_reschedule();
         }
     }
 
diff --git a/gki/ulinux/data_types.h b/gki/ulinux/data_types.h
index 33b8bb7..14b5899 100644
--- a/gki/ulinux/data_types.h
+++ b/gki/ulinux/data_types.h
@@ -19,55 +19,38 @@
 #ifndef DATA_TYPES_H
 #define DATA_TYPES_H
 
-#ifndef NULL
-#define NULL     0
-#endif
+#include <stdint.h>
+#include <stdbool.h>
 
 #ifndef FALSE
-#define FALSE  0
+#  define FALSE  false
 #endif
 
-typedef unsigned char   UINT8;
-typedef unsigned short  UINT16;
-typedef unsigned long   UINT32;
-typedef unsigned long long      UINT64;
+#ifndef TRUE
+#  define TRUE   true
+#endif
 
-typedef signed   long   INT32;
-typedef signed   char   INT8;
-typedef signed   short  INT16;
-typedef unsigned char   BOOLEAN;
+typedef uint8_t UINT8;
+typedef uint16_t UINT16;
+typedef uint32_t UINT32;
+typedef uint64_t UINT64;
 
+typedef int8_t INT8;
+typedef int16_t INT16;
+typedef int32_t INT32;
+typedef bool BOOLEAN;
 
 typedef UINT32          TIME_STAMP;
 
-#ifndef TRUE
-#define TRUE   (!FALSE)
-#endif
-
-typedef unsigned char   UBYTE;
-
 #ifdef __arm
-#define PACKED  __packed
-#define INLINE  __inline
+#  define PACKED  __packed
+#  define INLINE  __inline
 #else
-#define PACKED
-#define INLINE
+#  define PACKED
+#  define INLINE
 #endif
 
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN FALSE
-#endif
-
-#define UINT16_LOW_BYTE(x)      ((x) & 0xff)
-#define UINT16_HI_BYTE(x)       ((x) >> 8)
-
-
-#define BCM_STRCAT_S(x1,x2,x3)      strcat((x1),(x3))
-#define BCM_STRNCAT_S(x1,x2,x3,x4)  strncat((x1),(x3),(x4))
 #define BCM_STRCPY_S(x1,x2,x3)      strcpy((x1),(x3))
 #define BCM_STRNCPY_S(x1,x2,x3,x4)  strncpy((x1),(x3),(x4))
 
-
-
 #endif
-
diff --git a/gki/ulinux/gki_int.h b/gki/ulinux/gki_int.h
index d1cc68c..ec9b1cb 100644
--- a/gki/ulinux/gki_int.h
+++ b/gki/ulinux/gki_int.h
@@ -53,21 +53,6 @@
 #define GKI_LINUX_TIMER_TICK_PRIORITY GKI_LINUX_BASE_PRIORITY+2
 #endif
 
-/* the AV timer should preferably run above the gki timer tick to ensure precise AV timing
- * If you observe AV jitter under have load you may increase this one */
-#ifndef GKI_LINUX_AV_TIMER_PRIORITY
-#define GKI_LINUX_AV_TIMER_PRIORITY GKI_LINUX_BASE_PRIORITY+3
-#endif
-
-/* defines by how much the nice value of the PROCESS should be changed. Values allowed:
- * -19 to +19. a negative value give higher priority to btld compared to the default nice value
- * of 20. in case of SCHED_NORMAL, a level of -5 should give a good btld/bt performance.
- * In case of real time scheduling, leave default value.
- */
-#ifndef GKI_LINUX_DEFAULT_NICE_INC
-#define GKI_LINUX_DEFAULT_NICE_INC -7
-#endif
-
 typedef struct
 {
     pthread_mutex_t     GKI_mutex;
@@ -76,18 +61,11 @@
     pthread_cond_t      thread_evt_cond[GKI_MAX_TASKS];
     pthread_mutex_t     thread_timeout_mutex[GKI_MAX_TASKS];
     pthread_cond_t      thread_timeout_cond[GKI_MAX_TASKS];
-    int                 no_timer_suspend;   /* 1: no suspend, 0 stop calling GKI_timer_update() */
-    pthread_mutex_t     gki_timer_mutex;
-    pthread_cond_t      gki_timer_cond;
 #if (GKI_DEBUG == TRUE)
     pthread_mutex_t     GKI_trace_mutex;
 #endif
 } tGKI_OS;
 
-/* condition to exit or continue GKI_run() timer loop */
-#define GKI_TIMER_TICK_RUN_COND 1
-#define GKI_TIMER_TICK_STOP_COND 0
-
 extern void gki_system_tick_start_stop_cback(BOOLEAN start);
 
 /* Contains common control block as well as OS specific variables */
@@ -114,4 +92,3 @@
 #endif
 
 #endif
-
diff --git a/gki/ulinux/gki_ulinux.c b/gki/ulinux/gki_ulinux.c
old mode 100755
new mode 100644
index a66a32f..0c22d23
--- a/gki/ulinux/gki_ulinux.c
+++ b/gki/ulinux/gki_ulinux.c
@@ -25,79 +25,45 @@
 **
 *****************************************************************************/
 
-#include <stdio.h>
-#include <stdarg.h>
-#include <errno.h>
+#include <assert.h>
 #include <sys/times.h>
-#include <hardware/bluetooth.h>
 
-#include <pthread.h>  /* must be 1st header defined  */
-#include <time.h>
 #include "gki_int.h"
 #include "bt_utils.h"
 
 #define LOG_TAG "GKI_LINUX"
 
 #include <utils/Log.h>
+#include <hardware/bluetooth.h>
 
 /*****************************************************************************
 **  Constants & Macros
 ******************************************************************************/
 
-#ifndef GKI_TICK_TIMER_DEBUG
-#define GKI_TICK_TIMER_DEBUG FALSE
-#endif
-
-#define GKI_INFO(fmt, ...) ALOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__)
-
-/* always log errors */
-#define GKI_ERROR_LOG(fmt, ...)  ALOGE ("##### ERROR : %s: " fmt "#####", __FUNCTION__, ## __VA_ARGS__)
-
-#if defined (GKI_TICK_TIMER_DEBUG) && (GKI_TICK_TIMER_DEBUG == TRUE)
-#define GKI_TIMER_TRACE(fmt, ...) ALOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define GKI_TIMER_TRACE(fmt, ...)
-#endif
-
-
 #define SCHED_NORMAL 0
 #define SCHED_FIFO 1
 #define SCHED_RR 2
 #define SCHED_BATCH 3
 
-#define NANOSEC_PER_MILLISEC (1000000)
-#define NSEC_PER_SEC (1000*NANOSEC_PER_MILLISEC)
+#define NANOSEC_PER_MILLISEC    1000000
+#define NSEC_PER_SEC            (1000 * NANOSEC_PER_MILLISEC)
+#define USEC_PER_SEC            1000000
+#define NSEC_PER_USEC           1000
 
-/* works only for 1ms to 1000ms heart beat ranges */
-#define LINUX_SEC (1000/TICKS_PER_SEC)
-
-#define LOCK(m)  pthread_mutex_lock(&m)
-#define UNLOCK(m) pthread_mutex_unlock(&m)
-#define INIT(m) pthread_mutex_init(&m, NULL)
-
+#define WAKE_LOCK_ID "bluedroid_timer"
 
 #if GKI_DYNAMIC_MEMORY == FALSE
 tGKI_CB   gki_cb;
 #endif
 
-#ifdef NO_GKI_RUN_RETURN
-static pthread_t            timer_thread_id = 0;
-static int                  shutdown_timer = 0;
-#endif
-
 #ifndef GKI_SHUTDOWN_EVT
 #define GKI_SHUTDOWN_EVT    APPL_EVT_7
 #endif
 
-#define  __likely(cond)    __builtin_expect(!!(cond), 1)
-#define  __unlikely(cond)  __builtin_expect(!!(cond), 0)
-
 /*****************************************************************************
 **  Local type definitions
 ******************************************************************************/
 
-#define pthread_cond_timedwait_monotonic pthread_cond_timedwait
-
 typedef struct
 {
     UINT8 task_id;          /* GKI task id */
@@ -105,48 +71,172 @@
     UINT32 params;          /* Extra params to pass to task entry function */
 } gki_pthread_info_t;
 
+// Alarm service structure used to pass up via JNI to the bluetooth
+// app in order to create a wakeable Alarm.
+typedef struct
+{
+    UINT32 ticks_scheduled;
+    UINT64 timer_started_us;
+    UINT64 timer_last_expired_us;
+    bool wakelock;
+} alarm_service_t;
 
 /*****************************************************************************
 **  Static variables
 ******************************************************************************/
 
-int g_GkiTimerWakeLockOn = 0;
 gki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS];
-bt_wakelock_callback config_wakelock_callback = NULL;
 
-/*****************************************************************************
-**  Static functions
-******************************************************************************/
+// Only a single alarm is used to wake bluedroid.
+// NOTE: Must be manipulated with the GKI_disable() lock held.
+static alarm_service_t alarm_service;
+
+static timer_t posix_timer;
+static bool timer_created;
+
+
+// If the next wakeup time is less than this threshold, we should acquire
+// a wakelock instead of setting a wake alarm so we're not bouncing in
+// and out of suspend frequently.
+static const uint32_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
 
 /*****************************************************************************
 **  Externs
 ******************************************************************************/
 
-
+extern bt_os_callouts_t *bt_os_callouts;
 
 /*****************************************************************************
 **  Functions
 ******************************************************************************/
 
-/* send a given byte into the wakelock pipe */
-static void wakelock_op_gki(unsigned char op)
+static UINT64 now_us()
 {
-    if (!config_wakelock_callback)
-        GKI_ERROR_LOG("Cannot perform wakelock operation with no callback\n");
+    struct timespec ts_now;
+    clock_gettime(CLOCK_BOOTTIME, &ts_now);
+    return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / NSEC_PER_USEC);
+}
+
+static bool set_nonwake_alarm(UINT64 delay_millis)
+{
+    if (!timer_created)
+    {
+        ALOGE("%s timer is not available, not setting timer for %llums", __func__, delay_millis);
+        return false;
+    }
+
+    const UINT64 now = now_us();
+    alarm_service.timer_started_us = now;
+
+    UINT64 prev_timer_delay = 0;
+    if (alarm_service.timer_last_expired_us)
+        prev_timer_delay = now - alarm_service.timer_last_expired_us;
+
+    UINT64 delay_micros = delay_millis * 1000;
+    if (delay_micros > prev_timer_delay)
+        delay_micros -= prev_timer_delay;
     else
-        config_wakelock_callback(op);
+        delay_micros = 1;
+
+    struct itimerspec new_value;
+    memset(&new_value, 0, sizeof(new_value));
+    new_value.it_value.tv_sec = (delay_micros / USEC_PER_SEC);
+    new_value.it_value.tv_nsec = (delay_micros % USEC_PER_SEC) * NSEC_PER_USEC;
+    if (timer_settime(posix_timer, 0, &new_value, NULL) == -1)
+    {
+        ALOGE("%s unable to set timer: %s", __func__, strerror(errno));
+        return false;
+    }
+    return true;
 }
 
-/* release a wakelock by sending a zero down the pipe */
-static void release_wake_lock_gki(void)
+/** Callback from Java thread after alarm from AlarmService fires. */
+static void bt_alarm_cb(void *data)
 {
-    wakelock_op_gki(0);
+    alarm_service.timer_last_expired_us = now_us();
+    UINT32 ticks_taken = GKI_MS_TO_TICKS((alarm_service.timer_last_expired_us
+                                        - alarm_service.timer_started_us) / 1000);
+
+    GKI_timer_update(ticks_taken > alarm_service.ticks_scheduled
+                   ? ticks_taken : alarm_service.ticks_scheduled);
 }
 
-/* acquire a wakelock by sending a one down the pipe */
-static void acquire_wake_lock_gki(void)
+/** NOTE: This is only called on init and may be called without the GKI_disable()
+  * lock held.
+  */
+static void alarm_service_init()
 {
-    wakelock_op_gki(1);
+    alarm_service.ticks_scheduled = 0;
+    alarm_service.timer_started_us = 0;
+    alarm_service.timer_last_expired_us = 0;
+    alarm_service.wakelock = FALSE;
+    raise_priority_a2dp(TASK_JAVA_ALARM);
+}
+
+/** Requests an alarm from AlarmService to fire when the next
+  * timer in the timer queue is set to expire. Only takes a wakelock
+  * if the timer tick expiration is a short interval in the future
+  * and releases the wakelock if the timer is a longer interval
+  * or if there are no more timers in the queue.
+  *
+  * NOTE: Must be called with GKI_disable() lock held.
+  */
+void alarm_service_reschedule()
+{
+    int32_t ticks_till_next_exp = GKI_ready_to_sleep();
+
+    assert(ticks_till_next_exp >= 0);
+    alarm_service.ticks_scheduled = ticks_till_next_exp;
+
+    // No more timers remaining. Release wakelock if we're holding one.
+    if (ticks_till_next_exp == 0)
+    {
+        alarm_service.timer_last_expired_us = 0;
+        alarm_service.timer_started_us = 0;
+        if (alarm_service.wakelock)
+        {
+            ALOGV("%s releasing wake lock.", __func__);
+            alarm_service.wakelock = false;
+            int rc = bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+            if (rc != BT_STATUS_SUCCESS)
+            {
+                ALOGE("%s unable to release wake lock with no timers: %d", __func__, rc);
+            }
+        }
+        ALOGV("%s no more alarms.", __func__);
+        return;
+    }
+
+    UINT64 ticks_in_millis = GKI_TICKS_TO_MS(ticks_till_next_exp);
+    if (ticks_in_millis <= TIMER_INTERVAL_FOR_WAKELOCK_IN_MS)
+    {
+        // The next deadline is close, just take a wakelock and set a regular (non-wake) timer.
+        int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
+        if (rc != BT_STATUS_SUCCESS)
+        {
+            ALOGE("%s unable to acquire wake lock: %d", __func__, rc);
+            return;
+        }
+        alarm_service.wakelock = true;
+        ALOGV("%s acquired wake lock, setting short alarm (%lldms).", __func__, ticks_in_millis);
+
+        if (!set_nonwake_alarm(ticks_in_millis))
+        {
+            ALOGE("%s unable to set short alarm.", __func__);
+        }
+    } else {
+        // The deadline is far away, set a wake alarm and release wakelock if we're holding it.
+        alarm_service.timer_started_us = now_us();
+        alarm_service.timer_last_expired_us = 0;
+        if (!bt_os_callouts->set_wake_alarm(ticks_in_millis, true, bt_alarm_cb, &alarm_service))
+        {
+            ALOGE("%s unable to set long alarm, releasing wake lock anyway.", __func__);
+        } else {
+            ALOGV("%s set long alarm (%lldms), releasing wake lock.", __func__, ticks_in_millis);
+        }
+        alarm_service.wakelock = false;
+        bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+    }
 }
 
 
@@ -159,26 +249,24 @@
 ** Returns         void
 **
 *******************************************************************************/
-
-void gki_task_entry(UINT32 params)
+static void gki_task_entry(UINT32 params)
 {
     gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params;
     gki_cb.os.thread_id[p_pthread_info->task_id] = pthread_self();
 
     prctl(PR_SET_NAME, (unsigned long)gki_cb.com.OSTName[p_pthread_info->task_id], 0, 0, 0);
 
-    GKI_INFO("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id,
+    ALOGI("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id,
                 gki_cb.com.OSTName[p_pthread_info->task_id]);
 
     /* Call the actual thread entry point */
     (p_pthread_info->task_entry)(p_pthread_info->params);
 
-    GKI_INFO("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id,
+    ALOGI("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id,
                 gki_cb.com.OSTName[p_pthread_info->task_id]);
 
     pthread_exit(0);    /* GKI tasks have no return value */
 }
-/* end android */
 
 /*******************************************************************************
 **
@@ -200,6 +288,8 @@
 
     gki_buffer_init();
     gki_timers_init();
+    alarm_service_init();
+
     gki_cb.com.OSTicks = (UINT32) times(0);
 
     pthread_mutexattr_init(&attr);
@@ -216,13 +306,17 @@
     /* pthread_mutex_init(&thread_delay_mutex, NULL); */  /* used in GKI_delay */
     /* pthread_cond_init (&thread_delay_cond, NULL); */
 
-    /* Initialiase GKI_timer_update suspend variables & mutexes to be in running state.
-     * this works too even if GKI_NO_TICK_STOP is defined in btld.txt */
-    p_os->no_timer_suspend = GKI_TIMER_TICK_RUN_COND;
-    pthread_mutex_init(&p_os->gki_timer_mutex, NULL);
-#ifndef NO_GKI_RUN_RETURN
-    pthread_cond_init(&p_os->gki_timer_cond, NULL);
-#endif
+    struct sigevent sigevent;
+    memset(&sigevent, 0, sizeof(sigevent));
+    sigevent.sigev_notify = SIGEV_THREAD;
+    sigevent.sigev_notify_function = (void (*)(union sigval))bt_alarm_cb;
+    sigevent.sigev_value.sival_ptr = NULL;
+    if (timer_create(CLOCK_REALTIME, &sigevent, &posix_timer) == -1) {
+        ALOGE("%s unable to create POSIX timer: %s", __func__, strerror(errno));
+        timer_created = false;
+    } else {
+        timer_created = true;
+    }
 }
 
 
@@ -237,8 +331,7 @@
 *******************************************************************************/
 UINT32 GKI_get_os_tick_count(void)
 {
-     /* TODO - add any OS specific code here */
-    return (gki_cb.com.OSTicks);
+    return gki_cb.com.OSTicks;
 }
 
 /*******************************************************************************
@@ -275,7 +368,7 @@
 
     if (task_id >= GKI_MAX_TASKS)
     {
-        GKI_ERROR_LOG("Error! task ID > max task allowed");
+        ALOGE("Error! task ID > max task allowed");
         return (GKI_FAILURE);
     }
 
@@ -286,8 +379,12 @@
     gki_cb.com.OSWaitEvt[task_id]   = 0;
 
     /* Initialize mutex and condition variable objects for events and timeouts */
+    pthread_condattr_t cond_attr;
+    pthread_condattr_init(&cond_attr);
+    pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC);
+
     pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL);
-    pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], NULL);
+    pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], &cond_attr);
     pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL);
     pthread_cond_init (&gki_cb.os.thread_timeout_cond[task_id], NULL);
 
@@ -314,7 +411,7 @@
 
     if (ret != 0)
     {
-         GKI_ERROR_LOG("pthread_create failed(%d), %s!\n\r", ret, taskname);
+         ALOGE("pthread_create failed(%d), %s!", ret, taskname);
          return GKI_FAILURE;
     }
 
@@ -399,11 +496,11 @@
         result = pthread_join( gki_cb.os.thread_id[task_id], NULL );
         if ( result < 0 )
         {
-            GKI_ERROR_LOG( "pthread_join() FAILED: result: %d", result );
+            ALOGE( "pthread_join() FAILED: result: %d", result );
         }
 #endif
         GKI_exit_task(task_id);
-        GKI_INFO( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]);
+        ALOGI( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]);
     }
 }
 
@@ -431,7 +528,7 @@
 
     if (task_id != my_task_id)
     {
-        GKI_ERROR_LOG("%s: Wrong context - current task %d is not the given task id %d",\
+        ALOGE("%s: Wrong context - current task %d is not the given task id %d",\
                       __FUNCTION__, my_task_id, task_id);
         return;
     }
@@ -524,7 +621,6 @@
                 ALOGE( "pthread_join() FAILED: result: %d", result );
             }
 #endif
-            // GKI_ERROR_LOG( "GKI_shutdown(): task %s dead\n", gki_cb.com.OSTName[task_id]);
             GKI_exit_task(task_id - 1);
         }
     }
@@ -542,203 +638,12 @@
     i = 0;
 #endif
 
-#ifdef NO_GKI_RUN_RETURN
-    shutdown_timer = 1;
-#endif
-    if (g_GkiTimerWakeLockOn)
-    {
-        GKI_TRACE("GKI_shutdown :  release_wake_lock_gki()");
-        release_wake_lock_gki();
-        g_GkiTimerWakeLockOn = 0;
+    if (timer_created) {
+        timer_delete(posix_timer);
+        timer_created = false;
     }
 }
 
-/*******************************************************************************
- **
- ** Function        gki_system_tick_start_stop_cback
- **
- ** Description     This function runs a task
- **
- ** Parameters:     start: TRUE start system tick (again), FALSE stop
- **
- ** Returns         void
- **
- *********************************************************************************/
-
-void gki_system_tick_start_stop_cback(BOOLEAN start)
-{
-    tGKI_OS         *p_os = &gki_cb.os;
-    int    *p_run_cond = &p_os->no_timer_suspend;
-    static int wake_lock_count;
-
-    if ( FALSE == start )
-    {
-        /* gki_system_tick_start_stop_cback() maybe called even so it was already stopped! */
-        if (GKI_TIMER_TICK_RUN_COND == *p_run_cond)
-        {
-#ifdef NO_GKI_RUN_RETURN
-            /* take free mutex to block timer thread */
-            pthread_mutex_lock(&p_os->gki_timer_mutex);
-#endif
-            /* this can lead to a race condition. however as we only read this variable in the
-             * timer loop we should be fine with this approach. otherwise uncomment below mutexes.
-             */
-            /* GKI_disable(); */
-            *p_run_cond = GKI_TIMER_TICK_STOP_COND;
-            /* GKI_enable(); */
-
-            GKI_TIMER_TRACE(">>> STOP GKI_timer_update(), wake_lock_count:%d", --wake_lock_count);
-
-            release_wake_lock_gki();
-            g_GkiTimerWakeLockOn = 0;
-        }
-    }
-    else
-    {
-        /* restart GKI_timer_update() loop */
-        acquire_wake_lock_gki();
-
-        g_GkiTimerWakeLockOn = 1;
-        *p_run_cond = GKI_TIMER_TICK_RUN_COND;
-
-#ifdef NO_GKI_RUN_RETURN
-        pthread_mutex_unlock( &p_os->gki_timer_mutex );
-#else
-        pthread_mutex_lock( &p_os->gki_timer_mutex );
-        pthread_cond_signal( &p_os->gki_timer_cond );
-        pthread_mutex_unlock( &p_os->gki_timer_mutex );
-#endif
-
-        GKI_TIMER_TRACE(">>> START GKI_timer_update(), wake_lock_count:%d", ++wake_lock_count );
-    }
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_run
-**
-** Description      This function runs a task
-****
-** Returns          void
-**
-** NOTE             This function is only needed for operating systems where
-**                  starting a task is a 2-step process. Most OS's do it in
-**                  one step, If your OS does it in one step, this function
-**                  should be empty.
-*********************************************************************************/
-#ifdef NO_GKI_RUN_RETURN
-void* timer_thread(void *arg)
-{
-    int timeout_ns=0;
-    struct timespec timeout;
-    struct timespec previous = {0,0};
-    struct timespec current;
-    int err;
-    int delta_ns;
-    int restart;
-    tGKI_OS         *p_os = &gki_cb.os;
-    int  *p_run_cond = &p_os->no_timer_suspend;
-    (void)arg;
-
-    /* Indicate that tick is just starting */
-    restart = 1;
-
-    prctl(PR_SET_NAME, (unsigned long)"gki timer", 0, 0, 0);
-
-    raise_priority_a2dp(TASK_HIGH_GKI_TIMER);
-
-    while(!shutdown_timer)
-    {
-        /* If the timer has been stopped (no SW timer running) */
-        if (*p_run_cond == GKI_TIMER_TICK_STOP_COND)
-        {
-            /*
-             * We will lock/wait on GKI_timer_mutex.
-             * This mutex will be unlocked when timer is re-started
-             */
-            GKI_TRACE("GKI_run lock mutex");
-            pthread_mutex_lock(&p_os->gki_timer_mutex);
-
-            /* We are here because the mutex has been released by timer cback */
-            /* Let's release it for future use */
-            GKI_TRACE("GKI_run unlock mutex");
-            pthread_mutex_unlock(&p_os->gki_timer_mutex);
-
-            /* Indicate that tick is just starting */
-            restart = 1;
-        }
-
-        /* Get time */
-        clock_gettime(CLOCK_MONOTONIC, &current);
-
-        /* Check if tick was just restarted, indicating to the compiler that this is
-         * unlikely to happen (to help branch prediction) */
-        if (__unlikely(restart))
-        {
-            /* Clear the restart indication */
-            restart = 0;
-
-            timeout_ns = (GKI_TICKS_TO_MS(1) * 1000000);
-        }
-        else
-        {
-            /* Compute time elapsed since last sleep start */
-            delta_ns = current.tv_nsec - previous.tv_nsec;
-            delta_ns += (current.tv_sec - previous.tv_sec) * 1000000000;
-
-            /* Compute next timeout:
-             *    timeout = (next theoretical expiration) - current time
-             *    timeout = (previous time + timeout + delay) - current time
-             *    timeout = timeout + delay - (current time - previous time)
-             *    timeout += delay - delta */
-            timeout_ns += (GKI_TICKS_TO_MS(1) * 1000000) - delta_ns;
-        }
-        /* Save the current time for next iteration */
-        previous = current;
-
-        timeout.tv_sec = 0;
-
-        /* Sleep until next theoretical tick time.  In case of excessive
-           elapsed time since last theoretical tick expiration, it is
-           possible that the timeout value is negative.  To protect
-           against this error, we set minimum sleep time to 10% of the
-           tick period.  We indicate to compiler that this is unlikely to
-           happen (to help branch prediction) */
-
-        if (__unlikely(timeout_ns < ((GKI_TICKS_TO_MS(1) * 1000000) * 0.1)))
-        {
-            timeout.tv_nsec = (GKI_TICKS_TO_MS(1) * 1000000) * 0.1;
-
-            /* Print error message if tick really got delayed
-               (more than 5 ticks) */
-            if (timeout_ns < GKI_TICKS_TO_MS(-5) * 1000000)
-            {
-                GKI_ERROR_LOG("tick delayed > 5 slots (%d,%d) -- cpu overload ? ",
-                        timeout_ns, GKI_TICKS_TO_MS(-5) * 1000000);
-            }
-        }
-        else
-        {
-            timeout.tv_nsec = timeout_ns;
-        }
-
-        do
-        {
-            /* [u]sleep can't be used because it uses SIGALRM */
-            err = nanosleep(&timeout, &timeout);
-        } while (err < 0 && errno == EINTR);
-
-        /* Increment the GKI time value by one tick and update internal timers */
-        GKI_timer_update(1);
-    }
-    GKI_TRACE("gki_ulinux: Exiting timer_thread");
-    pthread_exit(NULL);
-    return NULL;
-}
-#endif
-
-
 /*****************************************************************************
 **
 ** Function        gki_set_timer_scheduling
@@ -778,26 +683,6 @@
 
 /*****************************************************************************
 **
-** Function        GKI_freeze
-**
-** Description     Freeze GKI. Relevant only when NO_GKI_RUN_RETURN is defined
-**
-** Returns
-**
-*******************************************************************************/
-
-void GKI_freeze()
-{
-#ifdef NO_GKI_RUN_RETURN
-   shutdown_timer = 1;
-   pthread_mutex_unlock( &gki_cb.os.gki_timer_mutex );
-   /* Ensure that the timer thread exits */
-   pthread_join(timer_thread_id, NULL);
-#endif
-}
-
-/*****************************************************************************
-**
 ** Function        GKI_run
 **
 ** Description     Main GKI loop
@@ -806,78 +691,11 @@
 **
 *******************************************************************************/
 
-void GKI_run (void * p_task_id)
+void GKI_run(void)
 {
-    struct timespec delay;
-    int err;
-    volatile int * p_run_cond = &gki_cb.os.no_timer_suspend;
-    UNUSED(p_task_id);
-
-#ifndef GKI_NO_TICK_STOP
     /* adjust btld scheduling scheme now */
     gki_set_timer_scheduling();
-
-    /* register start stop function which disable timer loop in GKI_run() when no timers are
-     * in any GKI/BTA/BTU this should save power when BTLD is idle! */
-    GKI_timer_queue_register_callback( gki_system_tick_start_stop_cback );
     GKI_TRACE( "GKI_run(): Start/Stop GKI_timer_update_registered!" );
-#endif
-
-#ifdef NO_GKI_RUN_RETURN
-    pthread_attr_t timer_attr;
-
-    shutdown_timer = 0;
-
-    pthread_attr_init(&timer_attr);
-    if (pthread_create( &timer_thread_id,
-              &timer_attr,
-              timer_thread,
-              NULL) != 0 )
-    {
-        GKI_ERROR_LOG("pthread_create failed to create timer_thread!\n\r");
-        return;
-    }
-
-#else
-    GKI_TRACE("GKI_run ");
-    for (;;)
-    {
-        do
-        {
-            /* adjust hear bit tick in btld by changning TICKS_PER_SEC!!!!! this formula works only for
-             * 1-1000ms heart beat units! */
-            delay.tv_sec = LINUX_SEC / 1000;
-            delay.tv_nsec = 1000 * 1000 * (LINUX_SEC % 1000);
-
-            /* [u]sleep can't be used because it uses SIGALRM */
-            do
-            {
-                err = nanosleep(&delay, &delay);
-            } while (err < 0 && errno == EINTR);
-
-            /* the unit should be alsways 1 (1 tick). only if you vary for some reason heart beat tick
-             * e.g. power saving you may want to provide more ticks
-             */
-            GKI_timer_update( 1 );
-            /* BT_TRACE_2( TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, "update: tv_sec: %d, tv_nsec: %d", delay.tv_sec, delay.tv_nsec ); */
-        } while ( GKI_TIMER_TICK_RUN_COND == *p_run_cond );
-
-        /* currently on reason to exit above loop is no_timer_suspend == GKI_TIMER_TICK_STOP_COND
-         * block timer main thread till re-armed by  */
-
-        GKI_TIMER_TRACE(">>> SUSPENDED GKI_timer_update()" );
-
-        pthread_mutex_lock( &gki_cb.os.gki_timer_mutex );
-        pthread_cond_wait( &gki_cb.os.gki_timer_cond, &gki_cb.os.gki_timer_mutex );
-        pthread_mutex_unlock( &gki_cb.os.gki_timer_mutex );
-
-        /* potentially we need to adjust os gki_cb.com.OSTicks */
-        GKI_TIMER_TRACE(">>> RESTARTED GKI_timer_update(): run_cond: %d",
-                    *p_run_cond );
-
-    }
-#endif
-    return;
 }
 
 
@@ -964,9 +782,8 @@
             }
             abstime.tv_sec += sec;
 
-            pthread_cond_timedwait_monotonic(&gki_cb.os.thread_evt_cond[rtask],
+            pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask],
                     &gki_cb.os.thread_evt_mutex[rtask], &abstime);
-
         }
         else
         {
@@ -1080,7 +897,6 @@
 {
     GKI_TRACE("GKI_send_event %d %x", task_id, event);
 
-    /* use efficient coding to avoid pipeline stalls */
     if (task_id < GKI_MAX_TASKS)
     {
         /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
@@ -1103,33 +919,6 @@
 
 /*******************************************************************************
 **
-** Function         GKI_isend_event
-**
-** Description      This function is called from ISRs to send events to other
-**                  tasks. The only difference between this function and GKI_send_event
-**                  is that this function assumes interrupts are already disabled.
-**
-** Parameters:      task_id -  (input) The destination task Id for the event.
-**                  event   -  (input) The event flag
-**
-** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put your code here, otherwise you can delete the entire
-**                  body of the function.
-**
-*******************************************************************************/
-UINT8 GKI_isend_event (UINT8 task_id, UINT16 event)
-{
-    GKI_TRACE("GKI_isend_event %d %x", task_id, event);
-    GKI_TRACE("GKI_isend_event %d %x done", task_id, event);
-    return    GKI_send_event(task_id, event);
-}
-
-
-/*******************************************************************************
-**
 ** Function         GKI_get_taskid
 **
 ** Description      This function gets the currently running task ID.
@@ -1212,10 +1001,7 @@
 *******************************************************************************/
 void GKI_enable (void)
 {
-    //GKI_TRACE("GKI_enable");
     pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
-    //GKI_TRACE("Leaving GKI_enable");
-    return;
 }
 
 
@@ -1231,12 +1017,7 @@
 
 void GKI_disable (void)
 {
-    //GKI_TRACE("GKI_disable");
-
     pthread_mutex_lock(&gki_cb.os.GKI_mutex);
-
-    //GKI_TRACE("Leaving GKI_disable");
-    return;
 }
 
 
@@ -1259,20 +1040,20 @@
     UINT8 task_id;
     int i = 0;
 
-    GKI_ERROR_LOG( "GKI_exception(): Task State Table\n");
+    ALOGE( "GKI_exception(): Task State Table");
 
     for(task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
     {
-        GKI_ERROR_LOG( "TASK ID [%d] task name [%s] state [%d]\n",
+        ALOGE( "TASK ID [%d] task name [%s] state [%d]",
                          task_id,
                          gki_cb.com.OSTName[task_id],
                          gki_cb.com.OSRdyTbl[task_id]);
     }
 
-    GKI_ERROR_LOG("GKI_exception %d %s", code, msg);
-    GKI_ERROR_LOG( "\n********************************************************************\n");
-    GKI_ERROR_LOG( "* GKI_exception(): %d %s\n", code, msg);
-    GKI_ERROR_LOG( "********************************************************************\n");
+    ALOGE("GKI_exception %d %s", code, msg);
+    ALOGE( "********************************************************************");
+    ALOGE( "* GKI_exception(): %d %s", code, msg);
+    ALOGE( "********************************************************************");
 
 #if 0//(GKI_DEBUG == TRUE)
     GKI_disable();
@@ -1294,80 +1075,6 @@
     return;
 }
 
-
-/*******************************************************************************
-**
-** Function         GKI_get_time_stamp
-**
-** Description      This function formats the time into a user area
-**
-** Parameters:      tbuf -  (output) the address to the memory containing the
-**                  formatted time
-**
-** Returns          the address of the user area containing the formatted time
-**                  The format of the time is ????
-**
-** NOTE             This function is only called by OBEX.
-**
-*******************************************************************************/
-INT8 *GKI_get_time_stamp (INT8 *tbuf)
-{
-    UINT32 ms_time;
-    UINT32 s_time;
-    UINT32 m_time;
-    UINT32 h_time;
-    INT8   *p_out = tbuf;
-
-    gki_cb.com.OSTicks = times(0);
-    ms_time = GKI_TICKS_TO_MS(gki_cb.com.OSTicks);
-    s_time  = ms_time/100;   /* 100 Ticks per second */
-    m_time  = s_time/60;
-    h_time  = m_time/60;
-
-    ms_time -= s_time*100;
-    s_time  -= m_time*60;
-    m_time  -= h_time*60;
-
-    *p_out++ = (INT8)((h_time / 10) + '0');
-    *p_out++ = (INT8)((h_time % 10) + '0');
-    *p_out++ = ':';
-    *p_out++ = (INT8)((m_time / 10) + '0');
-    *p_out++ = (INT8)((m_time % 10) + '0');
-    *p_out++ = ':';
-    *p_out++ = (INT8)((s_time / 10) + '0');
-    *p_out++ = (INT8)((s_time % 10) + '0');
-    *p_out++ = ':';
-    *p_out++ = (INT8)((ms_time / 10) + '0');
-    *p_out++ = (INT8)((ms_time % 10) + '0');
-    *p_out++ = ':';
-    *p_out   = 0;
-
-    return (tbuf);
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_register_mempool
-**
-** Description      This function registers a specific memory pool.
-**
-** Parameters:      p_mem -  (input) pointer to the memory pool
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If your OS has different memory pools, you
-**                  can tell GKI the pool to use by calling this function.
-**
-*******************************************************************************/
-void GKI_register_mempool (void *p_mem)
-{
-    gki_cb.com.p_user_mempool = p_mem;
-
-    return;
-}
-
 /*******************************************************************************
 **
 ** Function         GKI_os_malloc
@@ -1385,7 +1092,7 @@
 *******************************************************************************/
 void *GKI_os_malloc (UINT32 size)
 {
-    return (malloc(size));
+    return malloc(size);
 }
 
 /*******************************************************************************
@@ -1405,61 +1112,7 @@
 *******************************************************************************/
 void GKI_os_free (void *p_mem)
 {
-    if(p_mem != NULL)
-        free(p_mem);
-    return;
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_suspend_task()
-**
-** Description      This function suspends the task specified in the argument.
-**
-** Parameters:      task_id  - (input) the id of the task that has to suspended
-**
-** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If you want to implement task suspension capability,
-**                  put specific code here.
-**
-*******************************************************************************/
-UINT8 GKI_suspend_task (UINT8 task_id)
-{
-    UNUSED(task_id);
-    GKI_TRACE("GKI_suspend_task %d - NOT implemented", task_id);
-
-    GKI_TRACE("GKI_suspend_task %d done", task_id);
-
-    return (GKI_SUCCESS);
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_resume_task()
-**
-** Description      This function resumes the task specified in the argument.
-**
-** Parameters:      task_id  - (input) the id of the task that has to resumed
-**
-** Returns          GKI_SUCCESS if all OK
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If you want to implement task suspension capability,
-**                  put specific code here.
-**
-*******************************************************************************/
-UINT8 GKI_resume_task (UINT8 task_id)
-{
-    UNUSED(task_id);
-    GKI_TRACE("GKI_resume_task %d - NOT implemented", task_id);
-
-    GKI_TRACE("GKI_resume_task %d done", task_id);
-
-    return (GKI_SUCCESS);
+    free(p_mem);
 }
 
 
@@ -1491,50 +1144,6 @@
 
     GKI_enable();
 
-    //GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
-
-    GKI_INFO("GKI_exit_task %d done", task_id);
+    ALOGI("GKI_exit_task %d done", task_id);
     return;
 }
-
-
-/*******************************************************************************
-**
-** Function         GKI_sched_lock
-**
-** Description      This function is called by tasks to disable scheduler
-**                  task context switching.
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put code here to tell the OS to disable context switching.
-**
-*******************************************************************************/
-void GKI_sched_lock(void)
-{
-    GKI_TRACE("GKI_sched_lock");
-    return;
-}
-
-
-/*******************************************************************************
-**
-** Function         GKI_sched_unlock
-**
-** Description      This function is called by tasks to enable scheduler switching.
-**
-** Returns          void
-**
-** NOTE             This function is NOT called by the Broadcom stack and
-**                  profiles. If you want to use it in your own implementation,
-**                  put code here to tell the OS to re-enable context switching.
-**
-*******************************************************************************/
-void GKI_sched_unlock(void)
-{
-    GKI_TRACE("GKI_sched_unlock");
-}
-
-
diff --git a/hci/Android.mk b/hci/Android.mk
index 24fec19..f93e658 100644
--- a/hci/Android.mk
+++ b/hci/Android.mk
@@ -5,41 +5,39 @@
 LOCAL_CFLAGS += $(bdroid_CFLAGS)
 
 LOCAL_SRC_FILES := \
-        src/bt_hci_bdroid.c \
-        src/lpm.c \
-        src/bt_hw.c \
-        src/btsnoop.c \
-        src/utils.c
+	src/bt_hci_bdroid.c \
+	src/btsnoop.c \
+	src/btsnoop_net.c \
+	src/lpm.c \
+	src/utils.c \
+	src/vendor.c
+
+LOCAL_CFLAGS := -Wno-unused-parameter
 
 ifeq ($(BLUETOOTH_HCI_USE_MCT),true)
 
 LOCAL_CFLAGS += -DHCI_USE_MCT
 
 LOCAL_SRC_FILES += \
-        src/hci_mct.c \
-        src/userial_mct.c
+	src/hci_mct.c \
+	src/userial_mct.c
 
 else
-
 LOCAL_SRC_FILES += \
-        src/hci_h4.c \
-        src/userial.c
-
+	src/hci_h4.c \
+	src/userial.c
 endif
 
-LOCAL_C_INCLUDES += \
-        $(LOCAL_PATH)/include \
-        $(LOCAL_PATH)/../utils/include \
-        $(bdroid_C_INCLUDES)
+LOCAL_CFLAGS += -std=c99
 
-LOCAL_SHARED_LIBRARIES := \
-        libcutils \
-        liblog \
-        libdl \
-        libbt-utils
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/include \
+	$(LOCAL_PATH)/../osi/include \
+	$(LOCAL_PATH)/../utils/include \
+        $(bdroid_C_INCLUDES)
 
 LOCAL_MODULE := libbt-hci
 LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
 
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/hci/include/bt_hci_bdroid.h b/hci/include/bt_hci_bdroid.h
index 904c698..220946b 100644
--- a/hci/include/bt_hci_bdroid.h
+++ b/hci/include/bt_hci_bdroid.h
@@ -27,8 +27,7 @@
  *
  ******************************************************************************/
 
-#ifndef BT_HCI_BDROID_H
-#define BT_HCI_BDROID_H
+#pragma once
 
 #include "bt_hci_lib.h"
 
@@ -40,57 +39,32 @@
 **  Constants & Macros
 ******************************************************************************/
 
-#ifndef FALSE
-#define FALSE  0
+#if __STDC_VERSION__ < 199901L
+#  ifndef FALSE
+#    define FALSE 0
+#  endif
+#  ifndef TRUE
+#    define TRUE (!FALSE)
+#  endif
+#else
+#  include <stdbool.h>
+#  ifndef FALSE
+#    define FALSE  false
+#  endif
+#  ifndef TRUE
+#    define TRUE   true
+#  endif
 #endif
 
-#ifndef TRUE
-#define TRUE   (!FALSE)
-#endif
-
-#ifndef BTHC_LINUX_BASE_POLICY
-#define BTHC_LINUX_BASE_POLICY SCHED_NORMAL
-#endif
-
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-#ifndef BTHC_LINUX_BASE_PRIORITY
-#define BTHC_LINUX_BASE_PRIORITY 30
-#endif
-
-#ifndef BTHC_USERIAL_READ_THREAD_PRIORITY
-#define BTHC_USERIAL_READ_THREAD_PRIORITY (BTHC_LINUX_BASE_PRIORITY)
-#endif
-
-#ifndef BTHC_MAIN_THREAD_PRIORITY
-#define BTHC_MAIN_THREAD_PRIORITY (BTHC_LINUX_BASE_PRIORITY-1)
-#endif
-#endif  // (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-
-#ifndef BTHC_USERIAL_READ_MEM_SIZE
-#define BTHC_USERIAL_READ_MEM_SIZE (1024)
-#endif
-
-#ifndef BTSNOOPDISP_INCLUDED
-#define BTSNOOPDISP_INCLUDED TRUE
-#endif
-
-/* Disable external parser for production */
-#ifndef BTSNOOP_EXT_PARSER_INCLUDED
-#define BTSNOOP_EXT_PARSER_INCLUDED FALSE
-#endif
+#define HCI_ACL_MAX_SIZE 1024
+#define HCI_MAX_FRAME_SIZE (HCI_ACL_MAX_SIZE + 4)
 
 /* Host/Controller lib internal event ID */
-#define HC_EVENT_PRELOAD               0x0001
-#define HC_EVENT_POSTLOAD              0x0002
-#define HC_EVENT_RX                    0x0004
-#define HC_EVENT_TX                    0x0008
-#define HC_EVENT_LPM_ENABLE            0x0010
-#define HC_EVENT_LPM_DISABLE           0x0020
-#define HC_EVENT_LPM_WAKE_DEVICE       0x0040
-#define HC_EVENT_LPM_ALLOW_SLEEP       0x0080
-#define HC_EVENT_LPM_IDLE_TIMEOUT      0x0100
-#define HC_EVENT_EXIT                  0x0200
-#define HC_EVENT_EPILOG                0x0400
+typedef enum {
+  HC_EVENT_LPM_IDLE_TIMEOUT,
+} bthc_event_t;
+
+#define MSG_CTRL_TO_HC_CMD             0x0100 /* evt mask used by HC_EVENT_TX_CMD */
 
 /* Message event mask across Host/Controller lib and stack */
 #define MSG_EVT_MASK                    0xFF00 /* eq. BT_EVT_MASK */
@@ -111,6 +85,13 @@
 /* Local Bluetooth Controller ID for BR/EDR */
 #define LOCAL_BR_EDR_CONTROLLER_ID      0
 
+/* Definitions of audio codec type
+ *      inherited from AG callout function "codec" parameter
+ */
+#define SCO_CODEC_NONE      0x0000 /* BTA_AG_CODEC_NONE/BTM_SCO_CODEC_NONE */
+#define SCO_CODEC_CVSD      0x0001 /* BTA_AG_CODEC_CVSD/BTM_SCO_CODEC_CVSD */
+#define SCO_CODEC_MSBC      0x0002 /* BTA_AG_CODEC_MSBC/BTM_SCO_CODEC_MSBC */
+
 /******************************************************************************
 **  Type definitions and return values
 ******************************************************************************/
@@ -121,11 +102,11 @@
     uint16_t          len;
     uint16_t          offset;
     uint16_t          layer_specific;
+    uint8_t           data[];
 } HC_BT_HDR;
 
 #define BT_HC_HDR_SIZE (sizeof(HC_BT_HDR))
 
-
 typedef struct _hc_buffer_hdr
 {
     struct _hc_buffer_hdr *p_next;   /* next buffer in the queue */
@@ -147,15 +128,8 @@
 **  Functions
 ******************************************************************************/
 
-/*******************************************************************************
-**
-** Function        bthc_signal_event
-**
-** Description     Perform context switch to bt_hc main thread
-**
-** Returns         None
-**
-*******************************************************************************/
-extern void bthc_signal_event(uint16_t event);
-
-#endif /* BT_HCI_BDROID_H */
+// Called when a buffer has been produced by the serial layer and should be
+// processed by the HCI layer.
+void bthc_rx_ready(void);
+void bthc_tx(HC_BT_HDR *buf);
+void bthc_idle_timeout(void);
diff --git a/hci/include/bt_hci_lib.h b/hci/include/bt_hci_lib.h
index 468e513..c9f8cd7 100644
--- a/hci/include/bt_hci_lib.h
+++ b/hci/include/bt_hci_lib.h
@@ -20,6 +20,7 @@
 #define BT_HCI_LIB_H
 
 #include <stdint.h>
+#include <stdbool.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
 
@@ -57,6 +58,11 @@
     BT_HC_LOGGING_ON,
 } bt_hc_logging_state_t;
 
+/* commands to be used in LSB with MSG_CTRL_TO_HC_CMD */
+typedef enum {
+    BT_HC_AUDIO_STATE = 0,
+    BT_HC_CMD_MAX
+} bt_hc_tx_cmd_t;
 /** Result of write request */
 typedef enum {
     BT_HC_TX_SUCCESS,  /* a buffer is fully processed and can be released */
@@ -115,7 +121,7 @@
 typedef char* (*alloc_mem_cb)(int size);
 
 /* datapath buffer deallocation callback (callout) */
-typedef int (*dealloc_mem_cb)(TRANSAC transac, char *p_buf);
+typedef void (*dealloc_mem_cb)(TRANSAC transac);
 
 /* transmit result callback */
 typedef int (*tx_result_cb)(TRANSAC transac, char *p_buf, bt_hc_transmit_result_t result);
@@ -181,14 +187,14 @@
     /** Transmit buffer */
     int (*transmit_buf)(TRANSAC transac, char *p_buf, int len);
 
-    /** Controls receive flow */
-    int (*set_rxflow)(bt_rx_flow_state_t state);
-
     /** Controls HCI logging on/off */
-    int (*logging)(bt_hc_logging_state_t state, char *p_path);
+    int (*logging)(bt_hc_logging_state_t state, char *p_path, bool save_existing);
 
     /** Closes the interface */
     void  (*cleanup)( void );
+
+    /** sends commands to hc layer (e.g. SCO state) */
+    int   (*tx_cmd)(TRANSAC transac, char *p_buf, int len);
 } bt_hc_interface_t;
 
 
diff --git a/hci/include/bt_vendor_lib.h b/hci/include/bt_vendor_lib.h
index f774a14..65d448b 100644
--- a/hci/include/bt_vendor_lib.h
+++ b/hci/include/bt_vendor_lib.h
@@ -143,6 +143,18 @@
     BT_VND_OP_LPM_WAKE_SET_STATE,
 
 /*  [operation]
+ *      Perform any vendor specific commands related to audio state changes.
+ *  [input param]
+ *      a pointer to bt_vendor_op_audio_state_t indicating what audio state is
+ *      set.
+ *  [return]
+ *      0 - default, don't care.
+ *  [callback]
+ *      None.
+ */
+    BT_VND_OP_SET_AUDIO_STATE,
+
+/*  [operation]
  *      The epilog call to the vendor module so that it can perform any
  *      vendor-specific processes (e.g. send a HCI_RESET to BT Controller)
  *      before the caller calls for cleanup().
@@ -193,6 +205,13 @@
     BT_VND_OP_RESULT_FAIL,
 } bt_vendor_op_result_t;
 
+/** audio (SCO) state changes triggering VS commands for configuration */
+typedef struct {
+    uint16_t    handle;
+    uint16_t    peer_codec;
+    uint16_t    state;
+} bt_vendor_op_audio_state_t;
+
 /*
  * Bluetooth Host/Controller Vendor callback structure.
  */
@@ -286,6 +305,9 @@
     /* notifies caller result of lpm enable/disable */
     cfg_result_cb  lpm_cb;
 
+    /* notifies the result of codec setting */
+    cfg_result_cb audio_state_cb;
+
     /* buffer allocation request */
     malloc_cb   alloc;
 
diff --git a/hci/include/btsnoop.h b/hci/include/btsnoop.h
new file mode 100644
index 0000000..83c8107
--- /dev/null
+++ b/hci/include/btsnoop.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <stdbool.h>
+
+#include "bt_hci_bdroid.h"
+
+void btsnoop_open(const char *p_path, const bool save_existing);
+void btsnoop_close(void);
+
+void btsnoop_capture(const HC_BT_HDR *p_buf, bool is_rcvd);
diff --git a/hci/include/userial.h b/hci/include/userial.h
index d3a5480..1988c5c 100644
--- a/hci/include/userial.h
+++ b/hci/include/userial.h
@@ -16,126 +16,56 @@
  *
  ******************************************************************************/
 
-/******************************************************************************
- *
- *  Filename:      userial.h
- *
- *  Description:   Contains definitions used for serial port controls
- *
- ******************************************************************************/
+// This module manages the serial port over which HCI commands
+// and data are sent/received.
 
-#ifndef USERIAL_H
-#define USERIAL_H
+#pragma once
 
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-/**** port IDs ****/
-#define USERIAL_PORT_1          0
-#define USERIAL_PORT_2          1
-#define USERIAL_PORT_3          2
-#define USERIAL_PORT_4          3
-#define USERIAL_PORT_5          4
-#define USERIAL_PORT_6          5
-#define USERIAL_PORT_7          6
-#define USERIAL_PORT_8          7
-#define USERIAL_PORT_9          8
-#define USERIAL_PORT_10         9
-#define USERIAL_PORT_11         10
-#define USERIAL_PORT_12         11
-#define USERIAL_PORT_13         12
-#define USERIAL_PORT_14         13
-#define USERIAL_PORT_15         14
-#define USERIAL_PORT_16         15
-#define USERIAL_PORT_17         16
-#define USERIAL_PORT_18         17
+#include <stdbool.h>
+#include <stdint.h>
 
 typedef enum {
-    USERIAL_OP_INIT,
-    USERIAL_OP_RXFLOW_ON,
-    USERIAL_OP_RXFLOW_OFF,
-} userial_ioctl_op_t;
+  USERIAL_PORT_1,
+  USERIAL_PORT_2,
+  USERIAL_PORT_3,
+  USERIAL_PORT_4,
+  USERIAL_PORT_5,
+  USERIAL_PORT_6,
+  USERIAL_PORT_7,
+  USERIAL_PORT_8,
+  USERIAL_PORT_9,
+  USERIAL_PORT_10,
+  USERIAL_PORT_11,
+  USERIAL_PORT_12,
+  USERIAL_PORT_13,
+  USERIAL_PORT_14,
+  USERIAL_PORT_15,
+  USERIAL_PORT_16,
+  USERIAL_PORT_17,
+  USERIAL_PORT_18,
+} userial_port_t;
 
-/******************************************************************************
-**  Type definitions
-******************************************************************************/
+// Initializes the userial module. This function should only ever be called once.
+// It returns true if the module could be initialized, false if there was an error.
+bool userial_init(void);
 
-/******************************************************************************
-**  Extern variables and functions
-******************************************************************************/
-
-/******************************************************************************
-**  Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function        userial_init
-**
-** Description     Initializes the userial driver
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_init(void);
-
-/*******************************************************************************
-**
-** Function        userial_open
-**
-** Description     Open Bluetooth device with the port ID
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_open(uint8_t port);
-
-/*******************************************************************************
-**
-** Function        userial_read
-**
-** Description     Read data from the userial port
-**
-** Returns         Number of bytes actually read from the userial port and
-**                 copied into p_data.  This may be less than len.
-**
-*******************************************************************************/
-uint16_t  userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len);
-
-/*******************************************************************************
-**
-** Function        userial_write
-**
-** Description     Write data to the userial port
-**
-** Returns         Number of bytes actually written to the userial port. This
-**                 may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len);
-
-/*******************************************************************************
-**
-** Function        userial_close
-**
-** Description     Close the userial port
-**
-** Returns         None
-**
-*******************************************************************************/
+// Opens the given serial port. Returns true if successful, false otherwise.
+// Once this function is called, the userial module will begin producing
+// buffers from data read off the serial port. If you wish to pause the
+// production of buffers, call |userial_pause_reading|. You can then resume
+// by calling |userial_resume_reading|. This function returns true if the
+// serial port was successfully opened and buffer production has started. It
+// returns false if there was an error.
+bool userial_open(userial_port_t port);
 void userial_close(void);
+void userial_close_reader(void);
 
-/*******************************************************************************
-**
-** Function        userial_ioctl
-**
-** Description     ioctl inteface
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data);
+// Reads a maximum of |len| bytes from the serial port into |p_buffer|.
+// This function returns the number of bytes actually read, which may be
+// less than |len|. This function will not block.
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len);
 
-#endif /* USERIAL_H */
-
+// Writes a maximum of |len| bytes from |p_data| to the serial port.
+// This function returns the number of bytes actually written, which may be
+// less than |len|. This function may block.
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len);
diff --git a/hci/include/vendor.h b/hci/include/vendor.h
new file mode 100644
index 0000000..6c13c9c
--- /dev/null
+++ b/hci/include/vendor.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 <stdbool.h>
+#include <stdint.h>
+
+#include "bt_vendor_lib.h"
+
+// Opens the vendor-specific library and sets the Bluetooth
+// address of the adapter to |local_bdaddr|.
+bool vendor_open(const uint8_t *local_bdaddr);
+
+// Closes the vendor-specific library and frees all associated resources.
+// Only |vendor_open| may be called after |vendor_close|.
+void vendor_close(void);
+
+// Sends a vendor-specific command to the library.
+int vendor_send_command(bt_vendor_opcode_t opcode, void *param);
diff --git a/hci/src/bt_hci_bdroid.c b/hci/src/bt_hci_bdroid.c
index ed98b37..74a315b 100644
--- a/hci/src/bt_hci_bdroid.c
+++ b/hci/src/bt_hci_bdroid.c
@@ -27,15 +27,19 @@
 
 #define LOG_TAG "bt_hci_bdroid"
 
+#include <assert.h>
 #include <utils/Log.h>
-#include <pthread.h>
+
+#include "btsnoop.h"
 #include "bt_hci_bdroid.h"
-#include "bt_vendor_lib.h"
-#include "utils.h"
-#include "hci.h"
-#include "userial.h"
 #include "bt_utils.h"
-#include <sys/prctl.h>
+#include "bt_vendor_lib.h"
+#include "hci.h"
+#include "osi.h"
+#include "thread.h"
+#include "userial.h"
+#include "utils.h"
+#include "vendor.h"
 
 #ifndef BTHC_DBG
 #define BTHC_DBG FALSE
@@ -48,15 +52,12 @@
 #endif
 
 /* Vendor epilog process timeout period  */
-#ifndef EPILOG_TIMEOUT_MS
-#define EPILOG_TIMEOUT_MS 3000  // 3 seconds
-#endif
+static const uint32_t EPILOG_TIMEOUT_MS = 3000;
 
 /******************************************************************************
 **  Externs
 ******************************************************************************/
 
-extern bt_vendor_interface_t *bt_vnd_if;
 extern int num_hci_cmd_pkts;
 void lpm_init(void);
 void lpm_cleanup(void);
@@ -65,17 +66,16 @@
 void lpm_allow_bt_device_sleep(void);
 void lpm_wake_assert(void);
 void init_vnd_if(unsigned char *local_bdaddr);
-void btsnoop_open(char *p_path);
-void btsnoop_close(void);
 
 /******************************************************************************
 **  Variables
 ******************************************************************************/
 
 bt_hc_callbacks_t *bt_hc_cbacks = NULL;
-BUFFER_Q tx_q;
 tHCI_IF *p_hci_if;
-volatile uint8_t fwcfg_acked;
+volatile bool fwcfg_acked;
+// Cleanup state indication.
+volatile bool has_cleaned_up = false;
 
 /******************************************************************************
 **  Local type definitions
@@ -84,10 +84,9 @@
 /* Host/Controller lib thread control block */
 typedef struct
 {
-    pthread_t       worker_thread;
-    pthread_mutex_t mutex;
-    pthread_cond_t  cond;
-    uint8_t         epilog_timer_created;
+    thread_t        *worker_thread;
+    pthread_mutex_t worker_thread_lock;
+    bool            epilog_timer_created;
     timer_t         epilog_timer_id;
 } bt_hc_cb_t;
 
@@ -96,22 +95,154 @@
 ******************************************************************************/
 
 static bt_hc_cb_t hc_cb;
-static volatile uint8_t lib_running = 0;
-static volatile uint16_t ready_events = 0;
-static volatile uint8_t tx_cmd_pkts_pending = FALSE;
+static bool tx_cmd_pkts_pending = false;
+static BUFFER_Q tx_q;
 
 /******************************************************************************
 **  Functions
 ******************************************************************************/
 
-static void *bt_hc_worker_thread(void *arg);
+static void event_preload(UNUSED_ATTR void *context) {
+  userial_open(USERIAL_PORT_1);
+  vendor_send_command(BT_VND_OP_FW_CFG, NULL);
+}
 
-void bthc_signal_event(uint16_t event)
-{
-    pthread_mutex_lock(&hc_cb.mutex);
-    ready_events |= event;
-    pthread_cond_signal(&hc_cb.cond);
-    pthread_mutex_unlock(&hc_cb.mutex);
+static void event_postload(UNUSED_ATTR void *context) {
+  /* Start from SCO related H/W configuration, if SCO configuration
+   * is required. Then, follow with reading requests of getting
+   * ACL data length for both BR/EDR and LE.
+   */
+  int result = vendor_send_command(BT_VND_OP_SCO_CFG, NULL);
+  if (result == -1)
+    p_hci_if->get_acl_max_len();
+}
+
+static void event_tx(UNUSED_ATTR void *context) {
+  /*
+   *  We will go through every packets in the tx queue.
+   *  Fine to clear tx_cmd_pkts_pending.
+   */
+  tx_cmd_pkts_pending = false;
+  HC_BT_HDR *sending_msg_que[64];
+  size_t sending_msg_count = 0;
+  int sending_hci_cmd_pkts_count = 0;
+  utils_lock();
+  HC_BT_HDR *p_next_msg = tx_q.p_first;
+  while (p_next_msg && sending_msg_count < ARRAY_SIZE(sending_msg_que))
+  {
+    if ((p_next_msg->event & MSG_EVT_MASK)==MSG_STACK_TO_HC_HCI_CMD)
+    {
+      /*
+       *  if we have used up controller's outstanding HCI command
+       *  credits (normally is 1), skip all HCI command packets in
+       *  the queue.
+       *  The pending command packets will be sent once controller
+       *  gives back us credits through CommandCompleteEvent or
+       *  CommandStatusEvent.
+       */
+      if (tx_cmd_pkts_pending ||
+          (sending_hci_cmd_pkts_count >= num_hci_cmd_pkts))
+      {
+        tx_cmd_pkts_pending = true;
+        p_next_msg = utils_getnext(p_next_msg);
+        continue;
+      }
+      sending_hci_cmd_pkts_count++;
+    }
+
+    HC_BT_HDR *p_msg = p_next_msg;
+    p_next_msg = utils_getnext(p_msg);
+    utils_remove_from_queue_unlocked(&tx_q, p_msg);
+    sending_msg_que[sending_msg_count++] = p_msg;
+  }
+  utils_unlock();
+  for(size_t i = 0; i < sending_msg_count; i++)
+    p_hci_if->send(sending_msg_que[i]);
+  if (tx_cmd_pkts_pending)
+    BTHCDBG("Used up Tx Cmd credits");
+}
+
+static void event_rx(UNUSED_ATTR void *context) {
+#ifndef HCI_USE_MCT
+  p_hci_if->rcv();
+
+  if (tx_cmd_pkts_pending && num_hci_cmd_pkts > 0) {
+    // Got HCI Cmd credits from controller. Send whatever data
+    // we have in our tx queue. We can call |event_tx| directly
+    // here since we're already on the worker thread.
+    event_tx(NULL);
+  }
+#endif
+}
+
+static void event_lpm_enable(UNUSED_ATTR void *context) {
+  lpm_enable(true);
+}
+
+static void event_lpm_disable(UNUSED_ATTR void *context) {
+  lpm_enable(false);
+}
+
+static void event_lpm_wake_device(UNUSED_ATTR void *context) {
+  lpm_wake_assert();
+}
+
+static void event_lpm_allow_sleep(UNUSED_ATTR void *context) {
+  lpm_allow_bt_device_sleep();
+}
+
+static void event_lpm_idle_timeout(UNUSED_ATTR void *context) {
+  lpm_wake_deassert();
+}
+
+static void event_epilog(UNUSED_ATTR void *context) {
+  vendor_send_command(BT_VND_OP_EPILOG, NULL);
+}
+
+static void event_tx_cmd(void *msg) {
+  HC_BT_HDR *p_msg = (HC_BT_HDR *)msg;
+
+  BTHCDBG("%s: p_msg: %p, event: 0x%x", __func__, p_msg, p_msg->event);
+
+  int event = p_msg->event & MSG_EVT_MASK;
+  int sub_event = p_msg->event & MSG_SUB_EVT_MASK;
+  if (event == MSG_CTRL_TO_HC_CMD && sub_event == BT_HC_AUDIO_STATE) {
+    vendor_send_command(BT_VND_OP_SET_AUDIO_STATE, p_msg->data);
+  } else {
+    ALOGW("%s (event: 0x%x, sub_event: 0x%x) not supported", __func__, event, sub_event);
+  }
+
+  bt_hc_cbacks->dealloc(msg);
+}
+
+void bthc_rx_ready(void) {
+  pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+  if (hc_cb.worker_thread)
+    thread_post(hc_cb.worker_thread, event_rx, NULL);
+
+  pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+}
+
+void bthc_tx(HC_BT_HDR *buf) {
+  pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+  if (hc_cb.worker_thread) {
+    if (buf)
+      utils_enqueue(&tx_q, buf);
+    thread_post(hc_cb.worker_thread, event_tx, NULL);
+  }
+
+  pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+}
+
+void bthc_idle_timeout(void) {
+  pthread_mutex_lock(&hc_cb.worker_thread_lock);
+
+  if (hc_cb.worker_thread)
+    thread_post(hc_cb.worker_thread, event_lpm_idle_timeout, NULL);
+
+  pthread_mutex_unlock(&hc_cb.worker_thread_lock);
 }
 
 /*******************************************************************************
@@ -123,11 +254,15 @@
 ** Returns         None
 **
 *******************************************************************************/
-static void epilog_wait_timeout(union sigval arg)
+static void epilog_wait_timeout(UNUSED_ATTR union sigval arg)
 {
-    UNUSED(arg);
     ALOGI("...epilog_wait_timeout...");
-    bthc_signal_event(HC_EVENT_EXIT);
+
+    thread_free(hc_cb.worker_thread);
+
+    pthread_mutex_lock(&hc_cb.worker_thread_lock);
+    hc_cb.worker_thread = NULL;
+    pthread_mutex_unlock(&hc_cb.worker_thread_lock);
 }
 
 /*******************************************************************************
@@ -155,7 +290,7 @@
 
     if (status == 0)
     {
-        hc_cb.epilog_timer_created = 1;
+        hc_cb.epilog_timer_created = true;
         ts.it_value.tv_sec = timeout_ms/1000;
         ts.it_value.tv_nsec = 1000000*(timeout_ms%1000);
         ts.it_interval.tv_sec = 0;
@@ -168,7 +303,7 @@
     else
     {
         ALOGE("Failed to create epilog watchdog timer");
-        hc_cb.epilog_timer_created = 0;
+        hc_cb.epilog_timer_created = false;
     }
 }
 
@@ -180,9 +315,7 @@
 
 static int init(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr)
 {
-    pthread_attr_t thread_attr;
-    struct sched_param param;
-    int policy, result;
+    int result;
 
     ALOGI("init");
 
@@ -192,13 +325,16 @@
         return BT_HC_STATUS_FAIL;
     }
 
-    hc_cb.epilog_timer_created = 0;
-    fwcfg_acked = FALSE;
+    hc_cb.epilog_timer_created = false;
+    fwcfg_acked = false;
+    has_cleaned_up = false;
+
+    pthread_mutex_init(&hc_cb.worker_thread_lock, NULL);
 
     /* store reference to user callbacks */
     bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb;
 
-    init_vnd_if(local_bdaddr);
+    vendor_open(local_bdaddr);
 
     utils_init();
 #ifdef HCI_USE_MCT
@@ -216,41 +352,22 @@
 
     utils_queue_init(&tx_q);
 
-    if (lib_running)
+    if (hc_cb.worker_thread)
     {
         ALOGW("init has been called repeatedly without calling cleanup ?");
     }
 
-    lib_running = 1;
-    ready_events = 0;
-    pthread_mutex_init(&hc_cb.mutex, NULL);
-    pthread_cond_init(&hc_cb.cond, NULL);
-    pthread_attr_init(&thread_attr);
+    // Set prio here and let hci worker thread inherit prio
+    // remove once new thread api (thread_set_priority() ?)
+    // can switch prio
+    raise_priority_a2dp(TASK_HIGH_HCI_WORKER);
 
-    if (pthread_create(&hc_cb.worker_thread, &thread_attr, \
-                       bt_hc_worker_thread, NULL) != 0)
-    {
-        ALOGE("pthread_create failed!");
-        lib_running = 0;
+    hc_cb.worker_thread = thread_new("bt_hc_worker");
+    if (!hc_cb.worker_thread) {
+        ALOGE("%s unable to create worker thread.", __func__);
         return BT_HC_STATUS_FAIL;
     }
 
-    if(pthread_getschedparam(hc_cb.worker_thread, &policy, &param)==0)
-    {
-        policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-        param.sched_priority = BTHC_MAIN_THREAD_PRIORITY;
-#else
-        param.sched_priority = 0;
-#endif
-        result = pthread_setschedparam(hc_cb.worker_thread, policy, &param);
-        if (result != 0)
-        {
-            ALOGW("libbt-hci init: pthread_setschedparam failed (%s)", \
-                  strerror(result));
-        }
-    }
-
     return BT_HC_STATUS_SUCCESS;
 }
 
@@ -265,146 +382,126 @@
     /* Calling vendor-specific part */
     pwr_state = (state == BT_HC_CHIP_PWR_ON) ? BT_VND_PWR_ON : BT_VND_PWR_OFF;
 
-    if (bt_vnd_if)
-        bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);
-    else
-        ALOGE("vendor lib is missing!");
+    vendor_send_command(BT_VND_OP_POWER_CTRL, &pwr_state);
 }
 
 
 /** Configure low power mode wake state */
 static int lpm(bt_hc_low_power_event_t event)
 {
-    uint8_t status = TRUE;
-
     switch (event)
     {
         case BT_HC_LPM_DISABLE:
-            bthc_signal_event(HC_EVENT_LPM_DISABLE);
+            thread_post(hc_cb.worker_thread, event_lpm_disable, NULL);
             break;
 
         case BT_HC_LPM_ENABLE:
-            bthc_signal_event(HC_EVENT_LPM_ENABLE);
+            thread_post(hc_cb.worker_thread, event_lpm_enable, NULL);
             break;
 
         case BT_HC_LPM_WAKE_ASSERT:
-            bthc_signal_event(HC_EVENT_LPM_WAKE_DEVICE);
+            thread_post(hc_cb.worker_thread, event_lpm_wake_device, NULL);
             break;
 
         case BT_HC_LPM_WAKE_DEASSERT:
-            bthc_signal_event(HC_EVENT_LPM_ALLOW_SLEEP);
+            thread_post(hc_cb.worker_thread, event_lpm_allow_sleep, NULL);
             break;
     }
-
-    return(status == TRUE) ? BT_HC_STATUS_SUCCESS : BT_HC_STATUS_FAIL;
+    return BT_HC_STATUS_SUCCESS;
 }
 
 
 /** Called prior to stack initialization */
-static void preload(TRANSAC transac)
-{
-    UNUSED(transac);
-    BTHCDBG("preload");
-    bthc_signal_event(HC_EVENT_PRELOAD);
+static void preload(UNUSED_ATTR TRANSAC transac) {
+  BTHCDBG("preload");
+  thread_post(hc_cb.worker_thread, event_preload, NULL);
 }
 
-
 /** Called post stack initialization */
-static void postload(TRANSAC transac)
-{
-    UNUSED(transac);
-    BTHCDBG("postload");
-    bthc_signal_event(HC_EVENT_POSTLOAD);
+static void postload(UNUSED_ATTR TRANSAC transac) {
+  BTHCDBG("postload");
+  thread_post(hc_cb.worker_thread, event_postload, NULL);
 }
 
-
 /** Transmit frame */
-static int transmit_buf(TRANSAC transac, char * p_buf, int len)
-{
-    UNUSED(p_buf);
-    UNUSED(len);
-    utils_enqueue(&tx_q, (void *) transac);
-
-    bthc_signal_event(HC_EVENT_TX);
-
-    return BT_HC_STATUS_SUCCESS;
+static int transmit_buf(TRANSAC transac, UNUSED_ATTR char *p_buf, UNUSED_ATTR int len) {
+  bthc_tx((HC_BT_HDR *)transac);
+  return BT_HC_STATUS_SUCCESS;
 }
 
-
-/** Controls receive flow */
-static int set_rxflow(bt_rx_flow_state_t state)
-{
-    BTHCDBG("set_rxflow %d", state);
-
-    userial_ioctl(\
-     ((state == BT_RXFLOW_ON) ? USERIAL_OP_RXFLOW_ON : USERIAL_OP_RXFLOW_OFF), \
-     NULL);
-
-    return BT_HC_STATUS_SUCCESS;
-}
-
-
 /** Controls HCI logging on/off */
-static int logging(bt_hc_logging_state_t state, char *p_path)
-{
-    BTHCDBG("logging %d", state);
+static int logging(bt_hc_logging_state_t state, char *p_path, bool save_existing) {
+  BTHCDBG("logging %d", state);
 
-    if (state == BT_HC_LOGGING_ON)
-    {
-        if (p_path != NULL)
-            btsnoop_open(p_path);
-    }
-    else
-    {
-        btsnoop_close();
-    }
+  if (state != BT_HC_LOGGING_ON)
+    btsnoop_close();
+  else if (p_path != NULL)
+    btsnoop_open(p_path, save_existing);
 
-    return BT_HC_STATUS_SUCCESS;
+  return BT_HC_STATUS_SUCCESS;
 }
 
+/** sends command HC controller to configure platform specific behaviour */
+static int tx_hc_cmd(TRANSAC transac, char *p_buf, int len) {
+  BTHCDBG("tx_hc_cmd: transac %p", transac);
 
-/** Closes the interface */
-static void cleanup( void )
+  if (!transac)
+    return BT_HC_STATUS_FAIL;
+
+  thread_post(hc_cb.worker_thread, event_tx_cmd, transac);
+  return BT_HC_STATUS_SUCCESS;
+}
+
+// Closes the interface.
+// This routine is not thread safe.
+static void cleanup(void)
 {
-    BTHCDBG("cleanup");
-
-    if (lib_running)
-    {
-        if (fwcfg_acked == TRUE)
-        {
-            epilog_wait_timer();
-            bthc_signal_event(HC_EVENT_EPILOG);
-        }
-        else
-        {
-            bthc_signal_event(HC_EVENT_EXIT);
-        }
-
-        pthread_join(hc_cb.worker_thread, NULL);
-
-        if (hc_cb.epilog_timer_created == 1)
-        {
-            timer_delete(hc_cb.epilog_timer_id);
-            hc_cb.epilog_timer_created = 0;
-        }
+    if (has_cleaned_up) {
+        ALOGW("%s Already cleaned up for this session\n", __func__);
+        return;
     }
 
-    lib_running = 0;
+    BTHCDBG("cleanup");
+
+    if (hc_cb.worker_thread)
+    {
+        if (fwcfg_acked)
+        {
+            epilog_wait_timer();
+            // Stop reading thread
+            userial_close_reader();
+
+            thread_post(hc_cb.worker_thread, event_epilog, NULL);
+        }
+        thread_free(hc_cb.worker_thread);
+
+        pthread_mutex_lock(&hc_cb.worker_thread_lock);
+        hc_cb.worker_thread = NULL;
+        pthread_mutex_unlock(&hc_cb.worker_thread_lock);
+
+        if (hc_cb.epilog_timer_created)
+        {
+            timer_delete(hc_cb.epilog_timer_id);
+            hc_cb.epilog_timer_created = false;
+        }
+    }
+    BTHCDBG("%s Finalizing cleanup\n", __func__);
 
     lpm_cleanup();
     userial_close();
     p_hci_if->cleanup();
     utils_cleanup();
 
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-        bt_vnd_if->cleanup();
+    set_power(BT_VND_PWR_OFF);
+    vendor_close();
 
-    fwcfg_acked = FALSE;
+    pthread_mutex_destroy(&hc_cb.worker_thread_lock);
+
+    fwcfg_acked = false;
     bt_hc_cbacks = NULL;
+    has_cleaned_up = true;
 }
 
-
 static const bt_hc_interface_t bluetoothHCLibInterface = {
     sizeof(bt_hc_interface_t),
     init,
@@ -413,188 +510,11 @@
     preload,
     postload,
     transmit_buf,
-    set_rxflow,
     logging,
-    cleanup
+    cleanup,
+    tx_hc_cmd,
 };
 
-
-/*******************************************************************************
-**
-** Function        bt_hc_worker_thread
-**
-** Description     Mian worker thread
-**
-** Returns         void *
-**
-*******************************************************************************/
-static void *bt_hc_worker_thread(void *arg)
-{
-    uint16_t events;
-    HC_BT_HDR *p_msg, *p_next_msg;
-    UNUSED(arg);
-
-    ALOGI("bt_hc_worker_thread started");
-    prctl(PR_SET_NAME, (unsigned long)"bt_hc_worker", 0, 0, 0);
-    tx_cmd_pkts_pending = FALSE;
-
-    raise_priority_a2dp(TASK_HIGH_HCI_WORKER);
-
-    while (lib_running)
-    {
-        pthread_mutex_lock(&hc_cb.mutex);
-        while (ready_events == 0)
-        {
-            pthread_cond_wait(&hc_cb.cond, &hc_cb.mutex);
-        }
-        events = ready_events;
-        ready_events = 0;
-        pthread_mutex_unlock(&hc_cb.mutex);
-
-#ifndef HCI_USE_MCT
-        if (events & HC_EVENT_RX)
-        {
-            p_hci_if->rcv();
-
-            if ((tx_cmd_pkts_pending == TRUE) && (num_hci_cmd_pkts > 0))
-            {
-                /* Got HCI Cmd Credits from Controller.
-                 * Prepare to send prior pending Cmd packets in the
-                 * following HC_EVENT_TX session.
-                 */
-                events |= HC_EVENT_TX;
-            }
-        }
-#endif
-
-        if (events & HC_EVENT_PRELOAD)
-        {
-            userial_open(USERIAL_PORT_1);
-
-            /* Calling vendor-specific part */
-            if (bt_vnd_if)
-            {
-                bt_vnd_if->op(BT_VND_OP_FW_CFG, NULL);
-            }
-            else
-            {
-                if (bt_hc_cbacks)
-                    bt_hc_cbacks->preload_cb(NULL, BT_HC_PRELOAD_FAIL);
-            }
-        }
-
-        if (events & HC_EVENT_POSTLOAD)
-        {
-            /* Start from SCO related H/W configuration, if SCO configuration
-             * is required. Then, follow with reading requests of getting
-             * ACL data length for both BR/EDR and LE.
-             */
-            int result = -1;
-
-            /* Calling vendor-specific part */
-            if (bt_vnd_if)
-                result = bt_vnd_if->op(BT_VND_OP_SCO_CFG, NULL);
-
-            if (result == -1)
-                p_hci_if->get_acl_max_len();
-        }
-
-        if (events & HC_EVENT_TX)
-        {
-            /*
-             *  We will go through every packets in the tx queue.
-             *  Fine to clear tx_cmd_pkts_pending.
-             */
-            tx_cmd_pkts_pending = FALSE;
-            HC_BT_HDR * sending_msg_que[64];
-            int sending_msg_count = 0;
-            int sending_hci_cmd_pkts_count = 0;
-            utils_lock();
-            p_next_msg = tx_q.p_first;
-            while (p_next_msg && sending_msg_count <
-		   (int)(sizeof(sending_msg_que)/sizeof(sending_msg_que[0])))
-            {
-                if ((p_next_msg->event & MSG_EVT_MASK)==MSG_STACK_TO_HC_HCI_CMD)
-                {
-                    /*
-                     *  if we have used up controller's outstanding HCI command
-                     *  credits (normally is 1), skip all HCI command packets in
-                     *  the queue.
-                     *  The pending command packets will be sent once controller
-                     *  gives back us credits through CommandCompleteEvent or
-                     *  CommandStatusEvent.
-                     */
-                    if ((tx_cmd_pkts_pending == TRUE) ||
-                        (sending_hci_cmd_pkts_count >= num_hci_cmd_pkts))
-                    {
-                        tx_cmd_pkts_pending = TRUE;
-                        p_next_msg = utils_getnext(p_next_msg);
-                        continue;
-                    }
-                    sending_hci_cmd_pkts_count++;
-                }
-
-                p_msg = p_next_msg;
-                p_next_msg = utils_getnext(p_msg);
-                utils_remove_from_queue_unlocked(&tx_q, p_msg);
-                sending_msg_que[sending_msg_count++] = p_msg;
-            }
-            utils_unlock();
-            int i;
-            for(i = 0; i < sending_msg_count; i++)
-                p_hci_if->send(sending_msg_que[i]);
-            if (tx_cmd_pkts_pending == TRUE)
-                BTHCDBG("Used up Tx Cmd credits");
-
-        }
-
-        if (events & HC_EVENT_LPM_ENABLE)
-        {
-            lpm_enable(TRUE);
-        }
-
-        if (events & HC_EVENT_LPM_DISABLE)
-        {
-            lpm_enable(FALSE);
-        }
-
-        if (events & HC_EVENT_LPM_IDLE_TIMEOUT)
-        {
-            lpm_wake_deassert();
-        }
-
-        if (events & HC_EVENT_LPM_ALLOW_SLEEP)
-        {
-            lpm_allow_bt_device_sleep();
-        }
-
-        if (events & HC_EVENT_LPM_WAKE_DEVICE)
-        {
-            lpm_wake_assert();
-        }
-
-        if (events & HC_EVENT_EPILOG)
-        {
-            /* Calling vendor-specific part */
-            if (bt_vnd_if)
-                bt_vnd_if->op(BT_VND_OP_EPILOG, NULL);
-            else
-                break;  // equivalent to HC_EVENT_EXIT
-        }
-
-        if (events & HC_EVENT_EXIT)
-            break;
-    }
-
-    ALOGI("bt_hc_worker_thread exiting");
-    lib_running = 0;
-
-    pthread_exit(NULL);
-
-    return NULL;    // compiler friendly
-}
-
-
 /*******************************************************************************
 **
 ** Function        bt_hc_get_interface
@@ -608,4 +528,3 @@
 {
     return &bluetoothHCLibInterface;
 }
-
diff --git a/hci/src/bt_hw.c b/hci/src/bt_hw.c
deleted file mode 100644
index 898a6ed..0000000
--- a/hci/src/bt_hw.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  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.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      bt_hw.c
- *
- *  Description:   Bluedroid libbt-vendor callback functions
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_hw"
-
-#include <dlfcn.h>
-#include <utils/Log.h>
-#include <pthread.h>
-#include "bt_vendor_lib.h"
-#include "bt_hci_bdroid.h"
-#include "hci.h"
-#include "userial.h"
-#include "bt_utils.h"
-
-/******************************************************************************
-**  Externs
-******************************************************************************/
-
-extern tHCI_IF *p_hci_if;
-extern uint8_t fwcfg_acked;
-void lpm_vnd_cback(uint8_t vnd_result);
-
-/******************************************************************************
-**  Variables
-******************************************************************************/
-
-bt_vendor_interface_t *bt_vnd_if=NULL;
-
-/******************************************************************************
-**  Functions
-******************************************************************************/
-
-/******************************************************************************
-**
-** Function         fwcfg_cb
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-**                  called when the libbt-vendor completed firmware
-**                  configuration process
-**
-** Returns          None
-**
-******************************************************************************/
-static void fwcfg_cb(bt_vendor_op_result_t result)
-{
-    bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? \
-                                     BT_HC_PRELOAD_SUCCESS : BT_HC_PRELOAD_FAIL;
-
-    fwcfg_acked = TRUE;
-
-    if (bt_hc_cbacks)
-        bt_hc_cbacks->preload_cb(NULL, status);
-}
-
-/******************************************************************************
-**
-** Function         scocfg_cb
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-**                  called when the libbt-vendor completed vendor specific SCO
-**                  configuration process
-**
-** Returns          None
-**
-******************************************************************************/
-static void scocfg_cb(bt_vendor_op_result_t result)
-{
-    UNUSED(result);
-    /* Continue rest of postload process*/
-    p_hci_if->get_acl_max_len();
-}
-
-/******************************************************************************
-**
-** Function         lpm_vnd_cb
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-**                  called back from the libbt-vendor to indicate the result of
-**                  previous LPM enable/disable request
-**
-** Returns          None
-**
-******************************************************************************/
-static void lpm_vnd_cb(bt_vendor_op_result_t result)
-{
-    uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;
-
-    lpm_vnd_cback(status);
-}
-
-/******************************************************************************
-**
-** Function         alloc
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
-**                  called from the libbt-vendor to request for data buffer
-**                  allocation
-**
-** Returns          NULL / pointer to allocated buffer
-**
-******************************************************************************/
-static void *alloc(int size)
-{
-    HC_BT_HDR *p_hdr = NULL;
-
-    if (bt_hc_cbacks)
-        p_hdr = (HC_BT_HDR *) bt_hc_cbacks->alloc(size);
-
-    return (p_hdr);
-}
-
-/******************************************************************************
-**
-** Function         dealloc
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
-**                  called from the libbt-vendor to release the data buffer
-**                  allocated through the alloc call earlier
-**
-** Returns          None
-**
-******************************************************************************/
-static void dealloc(void *p_buf)
-{
-    HC_BT_HDR *p_hdr = (HC_BT_HDR *) p_buf;
-
-    if (bt_hc_cbacks)
-        bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_hdr+1));
-}
-
-/******************************************************************************
-**
-** Function         xmit_cb
-**
-** Description      HOST/CONTROLLER VEDNOR LIB CALLOUT API - This function is
-**                  called from the libbt-vendor in order to send a prepared
-**                  HCI command packet through HCI transport TX function.
-**
-** Returns          TRUE/FALSE
-**
-******************************************************************************/
-static uint8_t xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback)
-{
-    return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)p_buf, p_cback);
-}
-
-/******************************************************************************
-**
-** Function         epilog_cb
-**
-** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
-**                  called back from the libbt-vendor to indicate the result of
-**                  previous epilog call.
-**
-** Returns          None
-**
-******************************************************************************/
-static void epilog_cb(bt_vendor_op_result_t result)
-{
-    UNUSED(result);
-    bthc_signal_event(HC_EVENT_EXIT);
-}
-
-/*****************************************************************************
-**   The libbt-vendor Callback Functions Table
-*****************************************************************************/
-static const bt_vendor_callbacks_t vnd_callbacks = {
-    sizeof(bt_vendor_callbacks_t),
-    fwcfg_cb,
-    scocfg_cb,
-    lpm_vnd_cb,
-    alloc,
-    dealloc,
-    xmit_cb,
-    epilog_cb
-};
-
-/******************************************************************************
-**
-** Function         init_vnd_if
-**
-** Description      Initialize vendor lib interface
-**
-** Returns          None
-**
-******************************************************************************/
-void init_vnd_if(unsigned char *local_bdaddr)
-{
-    void *dlhandle;
-
-    dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
-    if (!dlhandle)
-    {
-        ALOGE("!!! Failed to load libbt-vendor.so !!!");
-        return;
-    }
-
-    bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
-    if (!bt_vnd_if)
-    {
-        ALOGE("!!! Failed to get bt vendor interface !!!");
-        return;
-    }
-
-    bt_vnd_if->init(&vnd_callbacks, local_bdaddr);
-}
-
diff --git a/hci/src/btsnoop.c b/hci/src/btsnoop.c
old mode 100755
new mode 100644
index c6556d6..e31af35
--- a/hci/src/btsnoop.c
+++ b/hci/src/btsnoop.c
@@ -16,613 +16,169 @@
  *
  ******************************************************************************/
 
-/****************************************************************************
- *
- *  Name:       btsnoopdisp.c
- *
- *  Function:   this file contains functions to generate a BTSNOOP file
- *
- *
- ****************************************************************************/
-#include <stdio.h>
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <pthread.h>
-#include <sys/prctl.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <fcntl.h>
+#define LOG_TAG "btsnoop"
 
 #include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
-/* for gettimeofday */
-#include <sys/time.h>
-/* for the S_* open parameters */
-#include <sys/stat.h>
-/* for write */
-#include <unistd.h>
-/* for O_* open parameters */
-#include <fcntl.h>
-/* defines the O_* open parameters */
-#include <fcntl.h>
-
-#define LOG_TAG "BTSNOOP-DISP"
+#include <assert.h>
+#include <ctype.h>
 #include <cutils/log.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
 
 #include "bt_hci_bdroid.h"
-#include "utils.h"
 #include "bt_utils.h"
+#include "utils.h"
 
-#ifndef BTSNOOP_DBG
-#define BTSNOOP_DBG FALSE
-#endif
+typedef enum {
+  kCommandPacket = 1,
+  kAclPacket = 2,
+  kScoPacket = 3,
+  kEventPacket = 4
+} packet_type_t;
 
-#if (BTSNOOP_DBG == TRUE)
-#define SNOOPDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define SNOOPDBG(param, ...) {}
-#endif
+// Epoch in microseconds since 01/01/0000.
+static const uint64_t BTSNOOP_EPOCH_DELTA = 0x00dcddb30f2f8000ULL;
 
-#define HCIT_TYPE_COMMAND   1
-#define HCIT_TYPE_ACL_DATA  2
-#define HCIT_TYPE_SCO_DATA  3
-#define HCIT_TYPE_EVENT     4
+// File descriptor for btsnoop file.
+static int hci_btsnoop_fd = -1;
 
-/* file descriptor of the BT snoop file (by default, -1 means disabled) */
-int hci_btsnoop_fd = -1;
+void btsnoop_net_open();
+void btsnoop_net_close();
+void btsnoop_net_write(const void *data, size_t length);
 
-/* Macro to perform a multiplication of 2 unsigned 32bit values and store the result
- * in an unsigned 64 bit value (as two 32 bit variables):
- * u64 = u32In1 * u32In2
- * u32OutLow = u64[31:0]
- * u32OutHi = u64[63:32]
- * basically the algorithm:
- * (hi1*2^16 + lo1)*(hi2*2^16 + lo2) = lo1*lo2 + (hi1*hi2)*2^32 + (hi1*lo2 + hi2*lo1)*2^16
- * and the carry is propagated 16 bit by 16 bit:
- * result[15:0] = lo1*lo2 & 0xFFFF
- * result[31:16] = ((lo1*lo2) >> 16) + (hi1*lo2 + hi2*lo1)
- * and so on
- */
-#define HCIDISP_MULT_64(u32In1, u32In2, u32OutLo, u32OutHi)                             \
-do {                                                                                    \
-    uint32_t u32In1Tmp = u32In1;                                                          \
-    uint32_t u32In2Tmp = u32In2;                                                          \
-    uint32_t u32Tmp, u32Carry;                                                            \
-    u32OutLo = (u32In1Tmp & 0xFFFF) * (u32In2Tmp & 0xFFFF);              /*lo1*lo2*/    \
-    u32OutHi = ((u32In1Tmp >> 16) & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF); /*hi1*hi2*/ \
-    u32Tmp = (u32In1Tmp & 0xFFFF) * ((u32In2Tmp >> 16) & 0xFFFF);  /*lo1*hi2*/          \
-    u32Carry = (uint32_t)((u32OutLo>>16)&0xFFFF);                                         \
-    u32Carry += (u32Tmp&0xFFFF);                                                        \
-    u32OutLo += (u32Tmp << 16) ;                                                        \
-    u32OutHi += (u32Tmp >> 16);                                                         \
-    u32Tmp = ((u32In1Tmp >> 16) & 0xFFFF) * (u32In2Tmp & 0xFFFF);                       \
-    u32Carry += (u32Tmp)&0xFFFF;                                                        \
-    u32Carry>>=16;                                                                      \
-    u32OutLo += (u32Tmp << 16);                                                         \
-    u32OutHi += (u32Tmp >> 16);                                                         \
-    u32OutHi += u32Carry;                                                               \
-} while (0)
+static uint64_t btsnoop_timestamp(void) {
+  struct timeval tv;
+  gettimeofday(&tv, NULL);
 
-/* Macro to make an addition of 2 64 bit values:
- * result = (u32OutHi & u32OutLo) + (u32InHi & u32InLo)
- * u32OutHi = result[63:32]
- * u32OutLo = result[31:0]
- */
-#define HCIDISP_ADD_64(u32InLo, u32InHi, u32OutLo, u32OutHi)                            \
-do {                                                                                    \
-    (u32OutLo) += (u32InLo);                                                            \
-    if ((u32OutLo) < (u32InLo)) (u32OutHi)++;                                           \
-    (u32OutHi) += (u32InHi);                                                            \
-} while (0)
-
-/* EPOCH in microseconds since 01/01/0000 : 0x00dcddb3.0f2f8000 */
-#define BTSNOOP_EPOCH_HI 0x00dcddb3U
-#define BTSNOOP_EPOCH_LO 0x0f2f8000U
-
-
-/*******************************************************************************
- **
- ** Function         tv_to_btsnoop_ts
- **
- ** Description      This function generate a BT Snoop timestamp.
- **
- ** Returns          void
- **
- ** NOTE
- ** The return value is 64 bit as 2 32 bit variables out_lo and * out_hi.
- ** A BT Snoop timestamp is the number of microseconds since 01/01/0000.
- ** The timeval structure contains the number of microseconds since EPOCH
- ** (01/01/1970) encoded as: tv.tv_sec, number of seconds since EPOCH and
- ** tv_usec, number of microseconds in current second
- **
- ** Therefore the algorithm is:
- **  result = tv.tv_sec * 1000000
- **  result += tv.tv_usec
- **  result += EPOCH_OFFSET
- *******************************************************************************/
-static void tv_to_btsnoop_ts(uint32_t *out_lo, uint32_t *out_hi, struct timeval *tv)
-{
-    /* multiply the seconds by 1000000 */
-    HCIDISP_MULT_64(tv->tv_sec, 0xf4240, *out_lo, *out_hi);
-
-    /* add the microseconds */
-    HCIDISP_ADD_64((uint32_t)tv->tv_usec, 0, *out_lo, *out_hi);
-
-    /* add the epoch */
-    HCIDISP_ADD_64(BTSNOOP_EPOCH_LO, BTSNOOP_EPOCH_HI, *out_lo, *out_hi);
+  // Timestamp is in microseconds.
+  uint64_t timestamp = tv.tv_sec * 1000 * 1000LL;
+  timestamp += tv.tv_usec;
+  timestamp += BTSNOOP_EPOCH_DELTA;
+  return timestamp;
 }
 
-/*******************************************************************************
- **
- ** Function         l_to_be
- **
- ** Description      Function to convert a 32 bit value into big endian format
- **
- ** Returns          32 bit value in big endian format
-*******************************************************************************/
-static uint32_t l_to_be(uint32_t x)
-{
-    #if __BIG_ENDIAN != TRUE
-    x = (x >> 24) |
-        ((x >> 8) & 0xFF00) |
-        ((x << 8) & 0xFF0000) |
-        (x << 24);
-    #endif
-    return x;
+static void btsnoop_write(const void *data, size_t length) {
+  if (hci_btsnoop_fd != -1)
+    write(hci_btsnoop_fd, data, length);
+
+  btsnoop_net_write(data, length);
 }
 
-/*******************************************************************************
- **
- ** Function         btsnoop_is_open
- **
- ** Description      Function to check if BTSNOOP is open
- **
- ** Returns          1 if open otherwise 0
-*******************************************************************************/
-int btsnoop_is_open(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    SNOOPDBG("btsnoop_is_open: snoop fd = %d\n", hci_btsnoop_fd);
+static void btsnoop_write_packet(packet_type_t type, const uint8_t *packet, bool is_received) {
+  int length_he = 0;
+  int length;
+  int flags;
+  int drops = 0;
+  switch (type) {
+    case kCommandPacket:
+      length_he = packet[2] + 4;
+      flags = 2;
+      break;
+    case kAclPacket:
+      length_he = (packet[3] << 8) + packet[2] + 5;
+      flags = is_received;
+      break;
+    case kScoPacket:
+      length_he = packet[2] + 4;
+      flags = is_received;
+      break;
+    case kEventPacket:
+      length_he = packet[1] + 3;
+      flags = 3;
+      break;
+  }
 
-    if (hci_btsnoop_fd != -1)
-    {
-        return 1;
-    }
-    return 0;
-#else
-    return 2;  /* Snoop not available  */
-#endif
+  uint64_t timestamp = btsnoop_timestamp();
+  uint32_t time_hi = timestamp >> 32;
+  uint32_t time_lo = timestamp & 0xFFFFFFFF;
+
+  length = htonl(length_he);
+  flags = htonl(flags);
+  drops = htonl(drops);
+  time_hi = htonl(time_hi);
+  time_lo = htonl(time_lo);
+
+  // This function is called from different contexts.
+  utils_lock();
+
+  btsnoop_write(&length, 4);
+  btsnoop_write(&length, 4);
+  btsnoop_write(&flags, 4);
+  btsnoop_write(&drops, 4);
+  btsnoop_write(&time_hi, 4);
+  btsnoop_write(&time_lo, 4);
+  btsnoop_write(&type, 1);
+  btsnoop_write(packet, length_he - 1);
+
+  utils_unlock();
 }
 
-/*******************************************************************************
- **
- ** Function         btsnoop_log_open
- **
- ** Description      Function to open the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-static int btsnoop_log_open(char *btsnoop_logfile)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    hci_btsnoop_fd = -1;
+void btsnoop_open(const char *p_path, const bool save_existing) {
+  assert(p_path != NULL);
+  assert(*p_path != '\0');
 
-    SNOOPDBG("btsnoop_log_open: snoop log file = %s\n", btsnoop_logfile);
+  btsnoop_net_open();
 
-    /* write the BT snoop header */
-    if ((btsnoop_logfile != NULL) && (strlen(btsnoop_logfile) != 0))
-    {
-        hci_btsnoop_fd = open(btsnoop_logfile, \
-                              O_WRONLY|O_CREAT|O_TRUNC, \
-                              S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
-        if (hci_btsnoop_fd == -1)
-        {
-            perror("open");
-            SNOOPDBG("btsnoop_log_open: Unable to open snoop log file\n");
-            hci_btsnoop_fd = -1;
-            return 0;
-        }
-        write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16);
-        return 1;
-    }
-#endif
-    return 2;  /* Snoop not available  */
+  if (hci_btsnoop_fd != -1) {
+    ALOGE("%s btsnoop log file is already open.", __func__);
+    return;
+  }
+
+  if (save_existing)
+  {
+    char fname_backup[266] = {0};
+    strncat(fname_backup, p_path, 255);
+    strcat(fname_backup, ".last");
+    rename(p_path, fname_backup);
+  }
+
+  hci_btsnoop_fd = open(p_path,
+                        O_WRONLY | O_CREAT | O_TRUNC,
+                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+
+  if (hci_btsnoop_fd == -1) {
+    ALOGE("%s unable to open '%s': %s", __func__, p_path, strerror(errno));
+    return;
+  }
+
+  write(hci_btsnoop_fd, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16);
 }
 
-/*******************************************************************************
- **
- ** Function         btsnoop_log_close
- **
- ** Description      Function to close the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-static int btsnoop_log_close(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    /* write the BT snoop header */
-    if (hci_btsnoop_fd != -1)
-    {
-        SNOOPDBG("btsnoop_log_close: Closing snoop log file\n");
-        close(hci_btsnoop_fd);
-        hci_btsnoop_fd = -1;
-        return 1;
-    }
-    return 0;
-#else
-    return 2;  /* Snoop not available  */
-#endif
+void btsnoop_close(void) {
+  if (hci_btsnoop_fd != -1)
+    close(hci_btsnoop_fd);
+  hci_btsnoop_fd = -1;
+
+  btsnoop_net_close();
 }
 
-/*******************************************************************************
- ** Function          btsnoop_write
- **
- ** Description       Function used to write the actual data to the log
- **
- ** Returns           none
-*******************************************************************************/
+void btsnoop_capture(const HC_BT_HDR *p_buf, bool is_rcvd) {
+  const uint8_t *p = (const uint8_t *)(p_buf + 1) + p_buf->offset;
 
-void btsnoop_write(uint8_t *p, uint32_t flags, const uint8_t *ptype, uint32_t len)
-{
-    uint32_t value, value_hi;
-    struct timeval tv;
-    struct iovec io[3];
-    uint32_t header[6];
+  if (hci_btsnoop_fd == -1)
+    return;
 
-    /* store the length in both original and included fields */
-    header[0] = l_to_be(len + 1);
-    header[1] = header[0];
-    /* flags: data can be sent or received */
-    header[2] = l_to_be(flags);
-    /* drops: none */
-    header[3] = 0;
-    /* time */
-    gettimeofday(&tv, NULL);
-    tv_to_btsnoop_ts(&header[5], &header[4], &tv);
-    header[4] = l_to_be(header[4]);
-    header[5] = l_to_be(header[5]);
-
-    io[0].iov_base = header;
-    io[0].iov_len = sizeof(header);
-
-    io[1].iov_base = (void*)ptype;
-    io[1].iov_len = 1;
-
-    io[2].iov_base = p;
-    io[2].iov_len = len;
-
-    (void) writev(hci_btsnoop_fd, io, 3);
+  switch (p_buf->event & MSG_EVT_MASK) {
+    case MSG_HC_TO_STACK_HCI_EVT:
+      btsnoop_write_packet(kEventPacket, p, false);
+      break;
+    case MSG_HC_TO_STACK_HCI_ACL:
+    case MSG_STACK_TO_HC_HCI_ACL:
+      btsnoop_write_packet(kAclPacket, p, is_rcvd);
+      break;
+    case MSG_HC_TO_STACK_HCI_SCO:
+    case MSG_STACK_TO_HC_HCI_SCO:
+      btsnoop_write_packet(kScoPacket, p, is_rcvd);
+      break;
+    case MSG_STACK_TO_HC_HCI_CMD:
+      btsnoop_write_packet(kCommandPacket, p, true);
+      break;
+  }
 }
-
-/*******************************************************************************
- **
- ** Function         btsnoop_hci_cmd
- **
- ** Description      Function to add a command in the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-void btsnoop_hci_cmd(uint8_t *p)
-{
-    const uint8_t cmd = HCIT_TYPE_COMMAND;
-    int plen;
-    SNOOPDBG("btsnoop_hci_cmd: fd = %d", hci_btsnoop_fd);
-    plen = (int) p[2] + 3;
-    btsnoop_write(p, 2, &cmd, plen);
-}
-
-
-/*******************************************************************************
- **
- ** Function         btsnoop_hci_evt
- **
- ** Description      Function to add a event in the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-void btsnoop_hci_evt(uint8_t *p)
-{
-    const uint8_t evt = HCIT_TYPE_EVENT;
-    int plen;
-    SNOOPDBG("btsnoop_hci_evt: fd = %d", hci_btsnoop_fd);
-    plen = (int) p[1] + 2;
-
-    btsnoop_write(p, 3, &evt, plen);
-}
-
-/*******************************************************************************
- **
- ** Function         btsnoop_sco_data
- **
- ** Description      Function to add a SCO data packet in the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-void btsnoop_sco_data(uint8_t *p, uint8_t is_rcvd)
-{
-    const uint8_t sco = HCIT_TYPE_SCO_DATA;
-    int plen;
-    SNOOPDBG("btsnoop_sco_data: fd = %d", hci_btsnoop_fd);
-    plen = (int) p[2] + 3;
-
-    btsnoop_write(p, is_rcvd, &sco, plen);
-}
-
-/*******************************************************************************
- **
- ** Function         btsnoop_acl_data
- **
- ** Description      Function to add an ACL data packet in the BTSNOOP file
- **
- ** Returns          None
-*******************************************************************************/
-void btsnoop_acl_data(uint8_t *p, uint8_t is_rcvd)
-{
-    const uint8_t acl = HCIT_TYPE_ACL_DATA;
-    int plen;
-
-    SNOOPDBG("btsnoop_acl_data: fd = %d", hci_btsnoop_fd);
-
-    plen = (((int) p[3]) << 8) + ((int) p[2]) +4;
-
-    btsnoop_write(p, is_rcvd, &acl, plen);
-}
-
-/********************************************************************************
- ** API allow external realtime parsing of output using e.g hcidump
- *********************************************************************************/
-
-#define EXT_PARSER_PORT 4330
-
-static pthread_t thread_id;
-static int s_listen = -1;
-static int ext_parser_fd = -1;
-
-static void ext_parser_detached(void);
-
-static int ext_parser_accept(int port)
-{
-    socklen_t           clilen;
-    struct sockaddr_in  cliaddr, servaddr;
-    int s, srvlen;
-    int n = 1;
-    int size_n;
-    int result = 0;
-
-    ALOGD("waiting for connection on port %d", port);
-
-    s_listen = socket(AF_INET, SOCK_STREAM, 0);
-
-    if (s_listen < 0)
-    {
-        ALOGE("listener not created: listen fd %d", s_listen);
-        return -1;
-    }
-
-    bzero(&servaddr, sizeof(servaddr));
-    servaddr.sin_family      = AF_INET;
-    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-    servaddr.sin_port        = htons(port);
-
-    srvlen = sizeof(servaddr);
-
-    /* allow reuse of sock addr upon bind */
-    result = setsockopt(s_listen, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
-
-    if (result<0)
-    {
-        perror("setsockopt");
-    }
-
-    result = bind(s_listen, (struct sockaddr *) &servaddr, srvlen);
-
-    if (result < 0)
-        perror("bind");
-
-    result = listen(s_listen, 1);
-
-    if (result < 0)
-        perror("listen");
-
-    clilen = sizeof(struct sockaddr_in);
-
-    s = accept(s_listen, (struct sockaddr *) &cliaddr, &clilen);
-
-    if (s < 0)
-{
-        perror("accept");
-        return -1;
-    }
-
-    ALOGD("connected (%d)", s);
-
-    return s;
-}
-
-static int send_ext_parser(char *p, int len)
-{
-    int n;
-
-    /* check if io socket is connected */
-    if (ext_parser_fd == -1)
-        return 0;
-
-    SNOOPDBG("write %d to snoop socket\n", len);
-
-    n = write(ext_parser_fd, p, len);
-
-    if (n<=0)
-    {
-        ext_parser_detached();
-    }
-
-    return n;
-}
-
-static void ext_parser_detached(void)
-{
-    ALOGD("ext parser detached");
-
-    if (ext_parser_fd>0)
-        close(ext_parser_fd);
-
-    if (s_listen > 0)
-        close(s_listen);
-
-    ext_parser_fd = -1;
-    s_listen = -1;
-}
-
-static void interruptFn (int sig)
-{
-    UNUSED(sig);
-    ALOGD("interruptFn");
-    pthread_exit(0);
-}
-
-static void ext_parser_thread(void* param)
-{
-    int fd;
-    int sig = SIGUSR2;
-    sigset_t sigSet;
-    sigemptyset (&sigSet);
-    sigaddset (&sigSet, sig);
-    UNUSED(param);
-
-    ALOGD("ext_parser_thread");
-
-    prctl(PR_SET_NAME, (unsigned long)"BtsnoopExtParser", 0, 0, 0);
-
-    pthread_sigmask (SIG_UNBLOCK, &sigSet, NULL);
-
-    struct sigaction act;
-    act.sa_handler = interruptFn;
-    sigaction (sig, &act, NULL );
-
-    do
-    {
-        fd = ext_parser_accept(EXT_PARSER_PORT);
-
-        ext_parser_fd = fd;
-
-        ALOGD("ext parser attached on fd %d\n", ext_parser_fd);
-    } while (1);
-}
-
-void btsnoop_stop_listener(void)
-{
-    ALOGD("btsnoop_init");
-    ext_parser_detached();
-}
-
-void btsnoop_init(void)
-{
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
-    ALOGD("btsnoop_init");
-
-    /* always setup ext listener port */
-    if (pthread_create(&thread_id, NULL,
-                       (void*)ext_parser_thread,NULL)!=0)
-      perror("pthread_create");
-#endif
-}
-
-void btsnoop_open(char *p_path)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    ALOGD("btsnoop_open");
-    btsnoop_log_open(p_path);
-#endif // BTSNOOPDISP_INCLUDED
-}
-
-void btsnoop_close(void)
-{
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    ALOGD("btsnoop_close");
-    btsnoop_log_close();
-#endif
-}
-
-void btsnoop_cleanup (void)
-{
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
-    ALOGD("btsnoop_cleanup");
-    pthread_kill(thread_id, SIGUSR2);
-    pthread_join(thread_id, NULL);
-    ext_parser_detached();
-#endif
-}
-
-
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd)
-{
-    uint8_t *p = (uint8_t *)(p_buf + 1) + p_buf->offset;
-
-    SNOOPDBG("btsnoop_capture: fd = %d, type %x, rcvd %d, ext %d", \
-             hci_btsnoop_fd, p_buf->event, is_rcvd, ext_parser_fd);
-
-#if defined(BTSNOOP_EXT_PARSER_INCLUDED) && (BTSNOOP_EXT_PARSER_INCLUDED == TRUE)
-    if (ext_parser_fd > 0)
-    {
-        uint8_t tmp = *p;
-
-        /* borrow one byte for H4 packet type indicator */
-        p--;
-
-        switch (p_buf->event & MSG_EVT_MASK)
-        {
-              case MSG_HC_TO_STACK_HCI_EVT:
-                  *p = HCIT_TYPE_EVENT;
-                  break;
-              case MSG_HC_TO_STACK_HCI_ACL:
-              case MSG_STACK_TO_HC_HCI_ACL:
-                  *p = HCIT_TYPE_ACL_DATA;
-                  break;
-              case MSG_HC_TO_STACK_HCI_SCO:
-              case MSG_STACK_TO_HC_HCI_SCO:
-                  *p = HCIT_TYPE_SCO_DATA;
-                  break;
-              case MSG_STACK_TO_HC_HCI_CMD:
-                  *p = HCIT_TYPE_COMMAND;
-                  break;
-        }
-
-        send_ext_parser((char*)p, p_buf->len+1);
-        *(++p) = tmp;
-        return;
-    }
-#endif
-
-#if defined(BTSNOOPDISP_INCLUDED) && (BTSNOOPDISP_INCLUDED == TRUE)
-    if (hci_btsnoop_fd == -1)
-        return;
-
-    switch (p_buf->event & MSG_EVT_MASK)
-    {
-        case MSG_HC_TO_STACK_HCI_EVT:
-            SNOOPDBG("TYPE : EVT");
-            btsnoop_hci_evt(p);
-            break;
-        case MSG_HC_TO_STACK_HCI_ACL:
-        case MSG_STACK_TO_HC_HCI_ACL:
-            SNOOPDBG("TYPE : ACL");
-            btsnoop_acl_data(p, is_rcvd);
-            break;
-        case MSG_HC_TO_STACK_HCI_SCO:
-        case MSG_STACK_TO_HC_HCI_SCO:
-            SNOOPDBG("TYPE : SCO");
-            btsnoop_sco_data(p, is_rcvd);
-            break;
-        case MSG_STACK_TO_HC_HCI_CMD:
-            SNOOPDBG("TYPE : CMD");
-            btsnoop_hci_cmd(p);
-            break;
-    }
-#endif // BTSNOOPDISP_INCLUDED
-}
-
-
diff --git a/hci/src/btsnoop_net.c b/hci/src/btsnoop_net.c
new file mode 100644
index 0000000..adaddcd
--- /dev/null
+++ b/hci/src/btsnoop_net.c
@@ -0,0 +1,137 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2013 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "btsnoop_net"
+
+#include <assert.h>
+#include <cutils/log.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/prctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+#include "osi.h"
+
+static void safe_close_(int *fd);
+static void *listen_fn_(void *context);
+
+static const char *LISTEN_THREAD_NAME_ = "btsnoop_net_listen";
+static const int LOCALHOST_ = 0x7F000001;
+static const int LISTEN_PORT_ = 8872;
+
+static pthread_t listen_thread_;
+static bool listen_thread_valid_ = false;
+static pthread_mutex_t client_socket_lock_ = PTHREAD_MUTEX_INITIALIZER;
+static int listen_socket_ = -1;
+static int client_socket_ = -1;
+
+void btsnoop_net_open() {
+  listen_thread_valid_ = (pthread_create(&listen_thread_, NULL, listen_fn_, NULL) == 0);
+  if (!listen_thread_valid_) {
+    ALOGE("%s pthread_create failed: %s", __func__, strerror(errno));
+  } else {
+    ALOGD("initialized");
+  }
+}
+
+void btsnoop_net_close() {
+  if (listen_thread_valid_) {
+    shutdown(listen_socket_, SHUT_RDWR);
+    pthread_join(listen_thread_, NULL);
+    safe_close_(&client_socket_);
+    listen_thread_valid_ = false;
+  }
+}
+
+void btsnoop_net_write(const void *data, size_t length) {
+  pthread_mutex_lock(&client_socket_lock_);
+  if (client_socket_ != -1) {
+    if (send(client_socket_, data, length, 0) == -1 && errno == ECONNRESET) {
+      safe_close_(&client_socket_);
+    }
+  }
+  pthread_mutex_unlock(&client_socket_lock_);
+}
+
+static void *listen_fn_(UNUSED_ATTR void *context) {
+
+  prctl(PR_SET_NAME, (unsigned long)LISTEN_THREAD_NAME_, 0, 0, 0);
+
+  listen_socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  if (listen_socket_ == -1) {
+    ALOGE("%s socket creation failed: %s", __func__, strerror(errno));
+    goto cleanup;
+  }
+
+  int enable = 1;
+  if (setsockopt(listen_socket_, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) == -1) {
+    ALOGE("%s unable to set SO_REUSEADDR: %s", __func__, strerror(errno));
+    goto cleanup;
+  }
+
+  struct sockaddr_in addr;
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(LOCALHOST_);
+  addr.sin_port = htons(LISTEN_PORT_);
+  if (bind(listen_socket_, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+    ALOGE("%s unable to bind listen socket: %s", __func__, strerror(errno));
+    goto cleanup;
+  }
+
+  if (listen(listen_socket_, 10) == -1) {
+    ALOGE("%s unable to listen: %s", __func__, strerror(errno));
+    goto cleanup;
+  }
+
+  for (;;) {
+    ALOGD("waiting for client connection");
+    int client_socket = accept(listen_socket_, NULL, NULL);
+    if (client_socket == -1) {
+      if (errno == EINVAL || errno == EBADF) {
+        break;
+      }
+      ALOGW("%s error accepting socket: %s", __func__, strerror(errno));
+      continue;
+    }
+
+    /* When a new client connects, we have to send the btsnoop file header. This allows
+       a decoder to treat the session as a new, valid btsnoop file. */
+    ALOGI("client connected");
+    pthread_mutex_lock(&client_socket_lock_);
+    safe_close_(&client_socket_);
+    client_socket_ = client_socket;
+    send(client_socket_, "btsnoop\0\0\0\0\1\0\0\x3\xea", 16, 0);
+    pthread_mutex_unlock(&client_socket_lock_);
+  }
+
+cleanup:
+  safe_close_(&listen_socket_);
+  return NULL;
+}
+
+static void safe_close_(int *fd) {
+  assert(fd != NULL);
+  if (*fd != -1) {
+    close(*fd);
+    *fd = -1;
+  }
+}
diff --git a/hci/src/hci_h4.c b/hci/src/hci_h4.c
index ba15426..ba6e2a2 100644
--- a/hci/src/hci_h4.c
+++ b/hci/src/hci_h4.c
@@ -29,7 +29,9 @@
 #include <utils/Log.h>
 #include <stdlib.h>
 #include <fcntl.h>
+
 #include "bt_hci_bdroid.h"
+#include "btsnoop.h"
 #include "hci.h"
 #include "userial.h"
 #include "utils.h"
@@ -150,12 +152,6 @@
 **  Externs
 ******************************************************************************/
 
-extern BUFFER_Q tx_q;
-
-void btsnoop_init(void);
-void btsnoop_close(void);
-void btsnoop_cleanup (void);
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd);
 uint8_t hci_h4_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
                                   tINT_CMD_CBACK p_cback);
 void lpm_wake_assert(void);
@@ -219,7 +215,7 @@
         if ((status = hci_h4_send_int_cmd(HCI_LE_READ_BUFFER_SIZE, p_buf, \
                                            get_acl_data_length_cback)) == FALSE)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
         }
     }
@@ -230,7 +226,7 @@
 
         if (bt_hc_cbacks)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
             ALOGE("vendor lib postload completed");
             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
         }
@@ -286,8 +282,7 @@
                     // Release the p_rcv_msg buffer.
                     if (bt_hc_cbacks)
                     {
-                        bt_hc_cbacks->dealloc((TRANSAC) p_cb->p_rcv_msg, \
-                                              (char *) (p_cb->p_rcv_msg + 1));
+                        bt_hc_cbacks->dealloc(p_cb->p_rcv_msg);
                     }
                 }
                 p_cb->int_cmd_rd_idx = ((p_cb->int_cmd_rd_idx+1) & \
@@ -380,8 +375,7 @@
 
             if (bt_hc_cbacks)
             {
-                bt_hc_cbacks->dealloc((TRANSAC) p_return_buf, \
-                                          (char *) (p_return_buf + 1));
+                bt_hc_cbacks->dealloc(p_return_buf);
             }
             p_return_buf = NULL;
         }
@@ -509,7 +503,7 @@
         p_buf->offset = p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
         p_buf->len = p_buf->len - p_buf->offset;
 
-        btsnoop_capture(p_buf, TRUE);
+        btsnoop_capture(p_buf, true);
 
         /* restore contents */
         memcpy(p, p_cb->preload_buffer, HCI_ACL_PREAMBLE_SIZE);
@@ -520,7 +514,7 @@
     else
     {
         /* START PACKET */
-        btsnoop_capture(p_buf, TRUE);
+        btsnoop_capture(p_buf, true);
     }
 
     if (frame_end == TRUE)
@@ -559,8 +553,6 @@
      */
     h4_cb.hc_acl_data_size = 1021;
     h4_cb.hc_ble_acl_data_size = 27;
-
-    btsnoop_init();
 }
 
 /*******************************************************************************
@@ -575,9 +567,6 @@
 void hci_h4_cleanup(void)
 {
     HCIDBG("hci_h4_cleanup");
-
-    btsnoop_close();
-    btsnoop_cleanup();
 }
 
 /*******************************************************************************
@@ -645,7 +634,7 @@
             bytes_sent = userial_write(event,(uint8_t *) p,bytes_to_send);
 
             /* generate snoop trace message */
-            btsnoop_capture(p_msg, FALSE);
+            btsnoop_capture(p_msg, false);
 
             p_msg->layer_specific = lay_spec;
             /* Adjust offset and length for what we just sent */
@@ -713,7 +702,7 @@
     }
 
     /* generate snoop trace message */
-    btsnoop_capture(p_msg, FALSE);
+    btsnoop_capture(p_msg, false);
 
     if (bt_hc_cbacks)
     {
@@ -722,7 +711,7 @@
             (p_msg->layer_specific == lay_spec))
         {
             /* dealloc buffer of internal command */
-            bt_hc_cbacks->dealloc((TRANSAC) p_msg, (char *) (p_msg + 1));
+            bt_hc_cbacks->dealloc(p_msg);
         }
         else
         {
@@ -955,7 +944,7 @@
             /* generate snoop trace message */
             /* ACL packet tracing had done in acl_rx_frame_end_chk() */
             if (p_cb->p_rcv_msg->event != MSG_HC_TO_STACK_HCI_ACL)
-                btsnoop_capture(p_cb->p_rcv_msg, TRUE);
+                btsnoop_capture(p_cb->p_rcv_msg, true);
 
             if (p_cb->p_rcv_msg->event == MSG_HC_TO_STACK_HCI_EVT)
                 intercepted = internal_event_intercept();
@@ -1003,9 +992,7 @@
     /* stamp signature to indicate an internal command */
     p_buf->layer_specific = opcode;
 
-    utils_enqueue(&tx_q, (void *) p_buf);
-    bthc_signal_event(HC_EVENT_TX);
-
+    bthc_tx(p_buf);
     return TRUE;
 }
 
@@ -1045,7 +1032,7 @@
         if ((ret = hci_h4_send_int_cmd(HCI_READ_BUFFER_SIZE, p_buf, \
                                        get_acl_data_length_cback)) == FALSE)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
         }
         else
             return;
diff --git a/hci/src/hci_mct.c b/hci/src/hci_mct.c
old mode 100755
new mode 100644
index 4e70063..5316326
--- a/hci/src/hci_mct.c
+++ b/hci/src/hci_mct.c
@@ -30,10 +30,13 @@
 #include <utils/Log.h>
 #include <stdlib.h>
 #include <fcntl.h>
+
 #include "bt_hci_bdroid.h"
+#include "btsnoop.h"
 #include "hci.h"
 #include "userial.h"
 #include "utils.h"
+#include "vendor.h"
 
 /******************************************************************************
 **  Constants & Macros
@@ -133,12 +136,6 @@
 **  Externs
 ******************************************************************************/
 
-extern BUFFER_Q tx_q;
-
-void btsnoop_init(void);
-void btsnoop_close(void);
-void btsnoop_cleanup (void);
-void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd);
 uint8_t hci_mct_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
                                   tINT_CMD_CBACK p_cback);
 void lpm_wake_assert(void);
@@ -202,7 +199,7 @@
         if ((status = hci_mct_send_int_cmd(HCI_LE_READ_BUFFER_SIZE, p_buf, \
                                            get_acl_data_length_cback)) == FALSE)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
         }
     }
@@ -213,7 +210,7 @@
 
         if (bt_hc_cbacks)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
             ALOGE("hci lib postload completed");
             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
         }
@@ -254,7 +251,7 @@
 
         // Signal TX event so the worker thread can check if it has anything
         // to send
-        bthc_signal_event(HC_EVENT_TX);
+        bthc_tx(NULL);
 
         if (p_cb->int_cmd_rsp_pending > 0)
         {
@@ -275,8 +272,7 @@
                     // Release the p_rcv_msg buffer.
                     if (bt_hc_cbacks)
                     {
-                        bt_hc_cbacks->dealloc((TRANSAC) p_cb->rcv_evt.p_rcv_msg, \
-                                              (char *) (p_cb->rcv_evt.p_rcv_msg + 1));
+                        bt_hc_cbacks->dealloc(p_cb->rcv_evt.p_rcv_msg);
                     }
                 }
                 p_cb->int_cmd_rd_idx = ((p_cb->int_cmd_rd_idx+1) & \
@@ -294,7 +290,7 @@
 
         // Signal TX event so the worker thread can check if it has anything
         // to send
-        bthc_signal_event(HC_EVENT_TX);
+        bthc_tx(NULL);
     }
 
     return FALSE;
@@ -375,8 +371,7 @@
 
             if (bt_hc_cbacks)
             {
-                bt_hc_cbacks->dealloc((TRANSAC) p_return_buf, \
-                                          (char *) (p_return_buf + 1));
+                bt_hc_cbacks->dealloc(p_return_buf);
             }
             p_return_buf = NULL;
         }
@@ -504,7 +499,7 @@
         p_buf->offset = p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
         p_buf->len = p_buf->len - p_buf->offset;
 
-        btsnoop_capture(p_buf, TRUE);
+        btsnoop_capture(p_buf, true);
 
         /* restore contents */
         memcpy(p, p_cb->rcv_acl.preload_buffer, HCI_ACL_PREAMBLE_SIZE);
@@ -515,7 +510,7 @@
     else
     {
         /* START PACKET */
-        btsnoop_capture(p_buf, TRUE);
+        btsnoop_capture(p_buf, true);
     }
 
     if (frame_end == TRUE)
@@ -554,8 +549,6 @@
      */
     mct_cb.hc_acl_data_size = 1021;
     mct_cb.hc_ble_acl_data_size = 27;
-
-    btsnoop_init();
 }
 
 /*******************************************************************************
@@ -570,9 +563,6 @@
 void hci_mct_cleanup(void)
 {
     HCIDBG("hci_mct_cleanup");
-
-    btsnoop_close();
-    btsnoop_cleanup();
 }
 
 /*******************************************************************************
@@ -625,7 +615,7 @@
             userial_write(event, (uint8_t *) p, acl_pkt_size);
 
             /* generate snoop trace message */
-            btsnoop_capture(p_msg, FALSE);
+            btsnoop_capture(p_msg, false);
 
             /* Adjust offset and length for what we just sent */
             p_msg->offset += acl_data_size;
@@ -687,7 +677,7 @@
 
 
     /* generate snoop trace message */
-    btsnoop_capture(p_msg, FALSE);
+    btsnoop_capture(p_msg, false);
 
     if (bt_hc_cbacks)
     {
@@ -696,7 +686,7 @@
             (p_msg->layer_specific == lay_spec))
         {
             /* dealloc buffer of internal command */
-            bt_hc_cbacks->dealloc((TRANSAC) p_msg, (char *) (p_msg + 1));
+            bt_hc_cbacks->dealloc(p_msg);
         }
         else
         {
@@ -873,7 +863,7 @@
             uint8_t intercepted = FALSE;
 
             /* generate snoop trace message */
-            btsnoop_capture(p_cb->p_rcv_msg, TRUE);
+            btsnoop_capture(p_cb->p_rcv_msg, true);
 
             intercepted = internal_event_intercept();
 
@@ -1105,9 +1095,7 @@
     /* stamp signature to indicate an internal command */
     p_buf->layer_specific = opcode;
 
-    utils_enqueue(&tx_q, (void *) p_buf);
-    bthc_signal_event(HC_EVENT_TX);
-
+    bthc_tx(p_buf);
     return TRUE;
 }
 
@@ -1147,7 +1135,7 @@
         if ((ret = hci_mct_send_int_cmd(HCI_READ_BUFFER_SIZE, p_buf, \
                                        get_acl_data_length_cback)) == FALSE)
         {
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
         }
         else
             return;
diff --git a/hci/src/lpm.c b/hci/src/lpm.c
index 946b193..71023ba 100644
--- a/hci/src/lpm.c
+++ b/hci/src/lpm.c
@@ -32,6 +32,7 @@
 #include "bt_hci_bdroid.h"
 #include "bt_vendor_lib.h"
 #include "bt_utils.h"
+#include "vendor.h"
 
 /******************************************************************************
 **  Constants & Macros
@@ -55,8 +56,6 @@
 **  Externs
 ******************************************************************************/
 
-extern bt_vendor_interface_t *bt_vnd_if;
-
 /******************************************************************************
 **  Local type definitions
 ******************************************************************************/
@@ -116,7 +115,7 @@
     if ((bt_lpm_cb.state == LPM_ENABLED) && \
         (bt_lpm_cb.wake_state == LPM_WAKE_W4_TIMEOUT))
     {
-        bthc_signal_event(HC_EVENT_LPM_IDLE_TIMEOUT);
+        bthc_idle_timeout();
     }
 }
 
@@ -251,12 +250,7 @@
 void lpm_init(void)
 {
     memset(&bt_lpm_cb, 0, sizeof(bt_lpm_cb_t));
-
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-        bt_vnd_if->op(BT_VND_OP_GET_LPM_IDLE_TIMEOUT, &(bt_lpm_cb.timeout_ms));
-    else
-        bt_lpm_cb.timeout_ms = DEFAULT_LPM_IDLE_TIMEOUT;
+    vendor_send_command(BT_VND_OP_GET_LPM_IDLE_TIMEOUT, &bt_lpm_cb.timeout_ms);
 }
 
 /*******************************************************************************
@@ -306,13 +300,9 @@
             bt_hc_cbacks->lpm_cb(BT_HC_LPM_DISABLED);
     }
 
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-    {
-        uint8_t lpm_cmd = (turn_on) ? BT_VND_LPM_ENABLE : BT_VND_LPM_DISABLE;
-        bt_lpm_cb.state = (turn_on) ? LPM_ENABLING : LPM_DISABLING;
-        bt_vnd_if->op(BT_VND_OP_LPM_SET_MODE, &lpm_cmd);
-    }
+    uint8_t lpm_cmd = (turn_on) ? BT_VND_LPM_ENABLE : BT_VND_LPM_DISABLE;
+    bt_lpm_cb.state = (turn_on) ? LPM_ENABLING : LPM_DISABLING;
+    vendor_send_command(BT_VND_OP_LPM_SET_MODE, &lpm_cmd);
 }
 
 /*******************************************************************************
@@ -359,11 +349,8 @@
         BTLPMDBG("LPM WAKE assert");
 
         /* Calling vendor-specific part */
-        if (bt_vnd_if)
-        {
-            uint8_t state = BT_VND_LPM_WAKE_ASSERT;
-            bt_vnd_if->op(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
-        }
+        uint8_t state = BT_VND_LPM_WAKE_ASSERT;
+        vendor_send_command(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
 
         lpm_stop_transport_idle_timer();
 
@@ -414,14 +401,8 @@
     {
         BTLPMDBG("LPM WAKE deassert");
 
-        /* Calling vendor-specific part */
-        if (bt_vnd_if)
-        {
-            uint8_t state = BT_VND_LPM_WAKE_DEASSERT;
-            bt_vnd_if->op(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
-        }
-
+        uint8_t state = BT_VND_LPM_WAKE_DEASSERT;
+        vendor_send_command(BT_VND_OP_LPM_WAKE_SET_STATE, &state);
         bt_lpm_cb.wake_state = LPM_WAKE_DEASSERTED;
     }
 }
-
diff --git a/hci/src/userial.c b/hci/src/userial.c
index 5dc4f84..e3f3557 100644
--- a/hci/src/userial.c
+++ b/hci/src/userial.c
@@ -26,25 +26,29 @@
 
 #define LOG_TAG "bt_userial"
 
-#include <utils/Log.h>
-#include <pthread.h>
-#include <fcntl.h>
+#include <assert.h>
 #include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
 #include <stdio.h>
+#include <sys/eventfd.h>
+#include <sys/prctl.h>
 #include <sys/socket.h>
+#include <utils/Log.h>
+
 #include "bt_hci_bdroid.h"
+#include "bt_utils.h"
+#include "bt_vendor_lib.h"
 #include "userial.h"
 #include "utils.h"
-#include "bt_vendor_lib.h"
-#include <sys/prctl.h>
-#include "bt_utils.h"
+#include "vendor.h"
 
 /******************************************************************************
 **  Constants & Macros
 ******************************************************************************/
 
 #ifndef USERIAL_DBG
-#define USERIAL_DBG FALSE
+#define USERIAL_DBG TRUE
 #endif
 
 #if (USERIAL_DBG == TRUE)
@@ -53,25 +57,19 @@
 #define USERIALDBG(param, ...) {}
 #endif
 
-#ifndef ENABLE_USERIAL_TIMING_LOGS
-#define ENABLE_USERIAL_TIMING_LOGS FALSE
-#endif
-
 #define MAX_SERIAL_PORT (USERIAL_PORT_3 + 1)
-#define READ_LIMIT (BTHC_USERIAL_READ_MEM_SIZE - BT_HC_HDR_SIZE)
 
+// The set of events one can send to the userial read thread.
+// Note that the values must be >= 0x8000000000000000 to guarantee delivery
+// of the message (see eventfd(2) for details on blocking behaviour).
 enum {
-    USERIAL_RX_EXIT,
-    USERIAL_RX_FLOW_OFF,
-    USERIAL_RX_FLOW_ON
+    USERIAL_RX_EXIT     = 0x8000000000000000ULL
 };
 
 /******************************************************************************
 **  Externs
 ******************************************************************************/
 
-extern bt_vendor_interface_t *bt_vnd_if;
-
 /******************************************************************************
 **  Local type definitions
 ******************************************************************************/
@@ -92,33 +90,6 @@
 static tUSERIAL_CB userial_cb;
 static volatile uint8_t userial_running = 0;
 
-/******************************************************************************
-**  Static functions
-******************************************************************************/
-
-#if defined(ENABLE_USERIAL_TIMING_LOGS) && (ENABLE_USERIAL_TIMING_LOGS==TRUE)
-
-static void log_userial_tx_timing(int len)
-{
-    #define USEC_PER_SEC 1000000L
-    static struct timespec prev = {0, 0};
-    struct timespec now, diff;
-    unsigned int diff_us = 0;
-    unsigned int now_us = 0;
-
-    clock_gettime(CLOCK_MONOTONIC, &now);
-    now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
-    diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
-
-    ALOGW("[userial] ts %08d diff : %08d len %d", now_us, diff_us,
-                len);
-
-    prev = now;
-}
-
-#endif
-
-
 /*****************************************************************************
 **   Socket signal functions to wake up userial_read_thread for termination
 **
@@ -126,33 +97,38 @@
 **      - signal_fds[0]: join fd_set in select call of userial_read_thread
 **      - signal_fds[1]: trigger from userial_close
 *****************************************************************************/
-static int signal_fds[2]={0,1};
-static uint8_t rx_flow_on = TRUE;
-static inline int create_signal_fds(fd_set* set)
-{
-    if(signal_fds[0]==0 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds)<0)
-    {
-        ALOGE("create_signal_sockets:socketpair failed, errno: %d", errno);
-        return -1;
+static int event_fd = -1;
+
+static inline int add_event_fd(fd_set *set) {
+    if (event_fd == -1) {
+      event_fd = eventfd(0, 0);
+      if (event_fd == -1) {
+          ALOGE("%s unable to create event fd: %s", __func__, strerror(errno));
+          return -1;
+      }
     }
-    FD_SET(signal_fds[0], set);
-    return signal_fds[0];
-}
-static inline int send_wakeup_signal(char sig_cmd)
-{
-    return send(signal_fds[1], &sig_cmd, sizeof(sig_cmd), 0);
-}
-static inline char reset_signal()
-{
-    char sig_recv = -1;
-    recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
-    return sig_recv;
-}
-static inline int is_signaled(fd_set* set)
-{
-    return FD_ISSET(signal_fds[0], set);
+
+    FD_SET(event_fd, set);
+    return event_fd;
 }
 
+static inline void send_event(uint64_t event_id) {
+    assert(event_fd != -1);
+    eventfd_write(event_fd, event_id);
+}
+
+static inline uint64_t read_event() {
+    assert(event_fd != -1);
+
+    uint64_t value = 0;
+    eventfd_read(event_fd, &value);
+    return value;
+}
+
+static inline bool is_event_available(fd_set *set) {
+    assert(event_fd != -1);
+    return !!FD_ISSET(event_fd, set);
+}
 
 /*******************************************************************************
 **
@@ -170,38 +146,24 @@
 {
     fd_set input;
     int n = 0, ret = -1;
-    char reason = 0;
 
     while (userial_running)
     {
         /* Initialize the input fd set */
         FD_ZERO(&input);
-        if (rx_flow_on == TRUE)
-        {
-            FD_SET(fd, &input);
-        }
-        int fd_max = create_signal_fds(&input);
+        FD_SET(fd, &input);
+        int fd_max = add_event_fd(&input);
         fd_max = fd_max > fd ? fd_max : fd;
 
         /* Do the select */
         n = select(fd_max+1, &input, NULL, NULL, NULL);
-        if(is_signaled(&input))
+        if(is_event_available(&input))
         {
-            reason = reset_signal();
-            if (reason == USERIAL_RX_EXIT)
-            {
-                USERIALDBG("RX termination");
-                return -1;
-            }
-            else if (reason == USERIAL_RX_FLOW_OFF)
-            {
-                USERIALDBG("RX flow OFF");
-                rx_flow_on = FALSE;
-            }
-            else if (reason == USERIAL_RX_FLOW_ON)
-            {
-                USERIALDBG("RX flow ON");
-                rx_flow_on = TRUE;
+            uint64_t event = read_event();
+            switch (event) {
+                case USERIAL_RX_EXIT:
+                    USERIALDBG("RX termination");
+                    return -1;
             }
         }
 
@@ -227,15 +189,6 @@
     return ret;
 }
 
-/*******************************************************************************
-**
-** Function        userial_read_thread
-**
-** Description
-**
-** Returns         void *
-**
-*******************************************************************************/
 static void *userial_read_thread(void *arg)
 {
     int rx_length = 0;
@@ -246,7 +199,6 @@
     USERIALDBG("Entering userial_read_thread()");
     prctl(PR_SET_NAME, (unsigned long)"userial_read", 0, 0, 0);
 
-    rx_flow_on = TRUE;
     userial_running = 1;
 
     raise_priority_a2dp(TASK_HIGH_USERIAL_READ);
@@ -255,8 +207,8 @@
     {
         if (bt_hc_cbacks)
         {
-            p_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc( \
-                                                BTHC_USERIAL_READ_MEM_SIZE);
+            p_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc(
+                        BT_HC_HDR_SIZE + HCI_MAX_FRAME_SIZE + 1); /* H4 HDR = 1 */
         }
         else
             p_buf = NULL;
@@ -267,7 +219,11 @@
             p_buf->layer_specific = 0;
 
             p = (uint8_t *) (p_buf + 1);
-            rx_length = select_read(userial_cb.fd, p, READ_LIMIT);
+            int userial_fd = userial_cb.fd;
+            if (userial_fd != -1)
+                rx_length = select_read(userial_fd, p, HCI_MAX_FRAME_SIZE + 1);
+            else
+                rx_length = 0;
         }
         else
         {
@@ -282,14 +238,14 @@
         {
             p_buf->len = (uint16_t)rx_length;
             utils_enqueue(&(userial_cb.rx_q), p_buf);
-            bthc_signal_event(HC_EVENT_RX);
+            bthc_rx_ready();
         }
         else /* either 0 or < 0 */
         {
             ALOGW("select_read return size <=0:%d, exiting userial_read_thread",\
                  rx_length);
             /* if we get here, we should have a buffer */
-            bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
+            bt_hc_cbacks->dealloc(p_buf);
             /* negative value means exit thread */
             break;
         }
@@ -307,128 +263,59 @@
 **   Userial API Functions
 *****************************************************************************/
 
-/*******************************************************************************
-**
-** Function        userial_init
-**
-** Description     Initializes the userial driver
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_init(void)
+bool userial_init(void)
 {
     USERIALDBG("userial_init");
     memset(&userial_cb, 0, sizeof(tUSERIAL_CB));
     userial_cb.fd = -1;
-    utils_queue_init(&(userial_cb.rx_q));
-    return TRUE;
+    utils_queue_init(&userial_cb.rx_q);
+    return true;
 }
 
+bool userial_open(userial_port_t port) {
+    if (port >= MAX_SERIAL_PORT) {
+        ALOGE("%s serial port %d > %d (max).", __func__, port, MAX_SERIAL_PORT);
+        return false;
+    }
 
-/*******************************************************************************
-**
-** Function        userial_open
-**
-** Description     Open Bluetooth device with the port ID
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_open(uint8_t port)
-{
-    struct sched_param param;
-    int policy, result;
-    pthread_attr_t thread_attr;
-    int fd_array[CH_MAX];
-
-    USERIALDBG("userial_open(port:%d)", port);
-
-    if (userial_running)
-    {
-        /* Userial is open; close it first */
+    if (userial_running) {
         userial_close();
         utils_delay(50);
     }
 
-    if (port >= MAX_SERIAL_PORT)
-    {
-        ALOGE("Port > MAX_SERIAL_PORT");
-        return FALSE;
+    // Call in to the vendor-specific library to open the serial port.
+    int fd_array[CH_MAX];
+    for (int i = 0; i < CH_MAX; i++)
+        fd_array[i] = -1;
+
+    int num_ports = vendor_send_command(BT_VND_OP_USERIAL_OPEN, &fd_array);
+
+    if (num_ports != 1) {
+        ALOGE("%s opened wrong number of ports: got %d, expected 1.", __func__, num_ports);
+        goto error;
     }
 
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-    {
-        result = bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN, &fd_array);
-
-        if (result != 1)
-        {
-            ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
-                    result);
-            ALOGE("userial_open: HCI UART expects only one open fd");
-            bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-            return FALSE;
-        }
-
-        userial_cb.fd = fd_array[0];
+    userial_cb.fd = fd_array[0];
+    if (userial_cb.fd == -1) {
+        ALOGE("%s unable to open serial port.", __func__);
+        goto error;
     }
-    else
-    {
-        ALOGE("userial_open: missing vendor lib interface !!!");
-        ALOGE("userial_open: unable to open UART port");
-        return FALSE;
-    }
-
-    if (userial_cb.fd == -1)
-    {
-        ALOGE("userial_open: failed to open UART port");
-        return FALSE;
-    }
-
-    USERIALDBG( "fd = %d", userial_cb.fd);
 
     userial_cb.port = port;
 
-    pthread_attr_init(&thread_attr);
-
-    if (pthread_create(&(userial_cb.read_thread), &thread_attr, \
-                       userial_read_thread, NULL) != 0 )
-    {
-        ALOGE("pthread_create failed!");
-        return FALSE;
+    if (pthread_create(&userial_cb.read_thread, NULL, userial_read_thread, NULL)) {
+        ALOGE("%s unable to spawn read thread.", __func__);
+        goto error;
     }
 
-    if(pthread_getschedparam(userial_cb.read_thread, &policy, &param)==0)
-    {
-        policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-        param.sched_priority = BTHC_USERIAL_READ_THREAD_PRIORITY;
-#else
-        param.sched_priority = 0;
-#endif
-        result = pthread_setschedparam(userial_cb.read_thread, policy, &param);
-        if (result != 0)
-        {
-            ALOGW("userial_open: pthread_setschedparam failed (%s)", \
-                  strerror(result));
-        }
-    }
+    return true;
 
-    return TRUE;
+error:
+    vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+    return false;
 }
 
-/*******************************************************************************
-**
-** Function        userial_read
-**
-** Description     Read data from the userial port
-**
-** Returns         Number of bytes actually read from the userial port and
-**                 copied into p_data.  This may be less than len.
-**
-*******************************************************************************/
-uint16_t  userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
 {
     uint16_t total_len = 0;
     uint16_t copy_len = 0;
@@ -457,8 +344,7 @@
             if(userial_cb.p_rx_hdr->len == 0)
             {
                 if (bt_hc_cbacks)
-                    bt_hc_cbacks->dealloc((TRANSAC) userial_cb.p_rx_hdr, \
-                                              (char *) (userial_cb.p_rx_hdr+1));
+                    bt_hc_cbacks->dealloc(userial_cb.p_rx_hdr);
 
                 userial_cb.p_rx_hdr = NULL;
             }
@@ -473,99 +359,60 @@
     return total_len;
 }
 
-/*******************************************************************************
-**
-** Function        userial_write
-**
-** Description     Write data to the userial port
-**
-** Returns         Number of bytes actually written to the userial port. This
-**                 may be less than len.
-**
-*******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len)
-{
-    int ret, total = 0;
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len) {
     UNUSED(msg_id);
 
-    while(len != 0)
-    {
-#if defined(ENABLE_USERIAL_TIMING_LOGS) && (ENABLE_USERIAL_TIMING_LOGS==TRUE)
-        log_userial_tx_timing(len);
-#endif
-        ret = write(userial_cb.fd, p_data+total, len);
-        total += ret;
-        len -= ret;
-    }
-
-    return ((uint16_t)total);
-}
-
-/*******************************************************************************
-**
-** Function        userial_close
-**
-** Description     Close the userial port
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_close(void)
-{
-    int result;
-    TRANSAC p_buf;
-
-    USERIALDBG("userial_close(fd:%d)", userial_cb.fd);
-
-    if (userial_running)
-        send_wakeup_signal(USERIAL_RX_EXIT);
-
-    if ((result=pthread_join(userial_cb.read_thread, NULL)) < 0)
-        ALOGE( "pthread_join() FAILED result:%d", result);
-
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-        bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-
-    userial_cb.fd = -1;
-
-    if (bt_hc_cbacks)
-    {
-        while ((p_buf = utils_dequeue (&(userial_cb.rx_q))) != NULL)
-        {
-            bt_hc_cbacks->dealloc(p_buf, (char *) ((HC_BT_HDR *)p_buf+1));
+    uint16_t total = 0;
+    while (len) {
+        ssize_t ret = write(userial_cb.fd, p_data + total, len);
+        switch (ret) {
+            case -1:
+                ALOGE("%s error writing to serial port: %s", __func__, strerror(errno));
+                return total;
+            case 0:  // don't loop forever in case write returns 0.
+                return total;
+            default:
+                total += ret;
+                len -= ret;
+                break;
         }
     }
+
+    return total;
 }
 
-/*******************************************************************************
-**
-** Function        userial_ioctl
-**
-** Description     ioctl inteface
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data)
-{
-    UNUSED(p_data);
-
-    switch(op)
-    {
-        case USERIAL_OP_RXFLOW_ON:
-            if (userial_running)
-                send_wakeup_signal(USERIAL_RX_FLOW_ON);
-            break;
-
-        case USERIAL_OP_RXFLOW_OFF:
-            if (userial_running)
-                send_wakeup_signal(USERIAL_RX_FLOW_OFF);
-            break;
-
-        case USERIAL_OP_INIT:
-        default:
-            break;
+void userial_close_reader(void) {
+    // Join the reader thread if it is still running.
+    if (userial_running) {
+        send_event(USERIAL_RX_EXIT);
+        int result = pthread_join(userial_cb.read_thread, NULL);
+        USERIALDBG("%s Joined userial reader thread: %d", __func__, result);
+        if (result)
+            ALOGE("%s failed to join reader thread: %d", __func__, result);
+        return;
     }
+    ALOGW("%s Already closed userial reader thread", __func__);
 }
 
+void userial_close(void) {
+    assert(bt_hc_cbacks != NULL);
+
+    // Join the reader thread if it's still running.
+    if (userial_running) {
+        send_event(USERIAL_RX_EXIT);
+        int result = pthread_join(userial_cb.read_thread, NULL);
+        if (result)
+            ALOGE("%s failed to join reader thread: %d", __func__, result);
+    }
+
+    // Ask the vendor-specific library to close the serial port.
+    vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+
+    // Free all buffers still waiting in the RX queue.
+    // TODO: use list data structure and clean this up.
+    void *buf;
+    while ((buf = utils_dequeue(&userial_cb.rx_q)) != NULL)
+        bt_hc_cbacks->dealloc(buf);
+
+    userial_cb.fd = -1;
+}
diff --git a/hci/src/userial_mct.c b/hci/src/userial_mct.c
index d7554cc..53f954e 100644
--- a/hci/src/userial_mct.c
+++ b/hci/src/userial_mct.c
@@ -35,6 +35,7 @@
 #include "bt_hci_bdroid.h"
 #include "userial.h"
 #include "utils.h"
+#include "vendor.h"
 #include "bt_vendor_lib.h"
 #include "bt_utils.h"
 
@@ -58,15 +59,11 @@
 
 enum {
     USERIAL_RX_EXIT,
-    USERIAL_RX_FLOW_OFF,
-    USERIAL_RX_FLOW_ON
 };
 
 /******************************************************************************
 **  Externs
 ******************************************************************************/
-
-extern bt_vendor_interface_t *bt_vnd_if;
 uint16_t hci_mct_receive_evt_msg(void);
 uint16_t hci_mct_receive_acl_msg(void);
 
@@ -103,7 +100,6 @@
 **      - signal_fds[1]: trigger from userial_close
 *****************************************************************************/
 static int signal_fds[2]={0,1};
-static uint8_t rx_flow_on = TRUE;
 static inline int create_signal_fds(fd_set* set)
 {
     if(signal_fds[0]==0 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds)<0)
@@ -140,13 +136,14 @@
 *******************************************************************************/
 static void *userial_read_thread(void *arg)
 {
+    UNUSED(arg);
+
     fd_set input;
     int n;
     char reason = 0;
 
     USERIALDBG("Entering userial_read_thread()");
 
-    rx_flow_on = TRUE;
     userial_running = 1;
 
     raise_priority_a2dp(TASK_HIGH_USERIAL_READ);
@@ -155,11 +152,8 @@
     {
         /* Initialize the input fd set */
         FD_ZERO(&input);
-        if (rx_flow_on == TRUE)
-        {
-            FD_SET(userial_cb.fd[CH_EVT], &input);
-            FD_SET(userial_cb.fd[CH_ACL_IN], &input);
-        }
+        FD_SET(userial_cb.fd[CH_EVT], &input);
+        FD_SET(userial_cb.fd[CH_ACL_IN], &input);
 
         int fd_max = create_signal_fds(&input);
         fd_max = (fd_max>userial_cb.fd[CH_EVT]) ? fd_max : userial_cb.fd[CH_EVT];
@@ -177,16 +171,6 @@
                 userial_running = 0;
                 break;
             }
-            else if (reason == USERIAL_RX_FLOW_OFF)
-            {
-                USERIALDBG("RX flow OFF");
-                rx_flow_on = FALSE;
-            }
-            else if (reason == USERIAL_RX_FLOW_ON)
-            {
-                USERIALDBG("RX flow ON");
-                rx_flow_on = TRUE;
-            }
         }
 
         if (n > 0)
@@ -226,10 +210,8 @@
 **
 ** Description     Initializes the userial driver
 **
-** Returns         TRUE/FALSE
-**
 *******************************************************************************/
-uint8_t userial_init(void)
+bool userial_init(void)
 {
     int idx;
 
@@ -238,7 +220,7 @@
     for (idx=0; idx < CH_MAX; idx++)
         userial_cb.fd[idx] = -1;
     utils_queue_init(&(userial_cb.rx_q));
-    return TRUE;
+    return true;
 }
 
 
@@ -248,14 +230,10 @@
 **
 ** Description     Open Bluetooth device with the port ID
 **
-** Returns         TRUE/FALSE
-**
 *******************************************************************************/
-uint8_t userial_open(uint8_t port)
+bool userial_open(userial_port_t port)
 {
-    struct sched_param param;
-    int policy, result;
-    pthread_attr_t thread_attr;
+    int result;
 
     USERIALDBG("userial_open(port:%d)", port);
 
@@ -269,28 +247,17 @@
     if (port >= MAX_SERIAL_PORT)
     {
         ALOGE("Port > MAX_SERIAL_PORT");
-        return FALSE;
+        return false;
     }
 
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
+    result = vendor_send_command(BT_VND_OP_USERIAL_OPEN, &userial_cb.fd);
+    if ((result != 2) && (result != 4))
     {
-        result = bt_vnd_if->op(BT_VND_OP_USERIAL_OPEN, &userial_cb.fd);
-
-        if ((result != 2) && (result != 4))
-        {
-            ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
-                    result);
-            ALOGE("userial_open: HCI MCT expects 2 or 4 open file descriptors");
-            bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-            return FALSE;
-        }
-    }
-    else
-    {
-        ALOGE("userial_open: missing vendor lib interface !!!");
-        ALOGE("userial_open: unable to open BT transport");
-        return FALSE;
+        ALOGE("userial_open: wrong numbers of open fd in vendor lib [%d]!",
+                result);
+        ALOGE("userial_open: HCI MCT expects 2 or 4 open file descriptors");
+        vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+        return false;
     }
 
     ALOGI("CMD=%d, EVT=%d, ACL_Out=%d, ACL_In=%d", \
@@ -301,40 +268,21 @@
         (userial_cb.fd[CH_ACL_OUT] == -1) || (userial_cb.fd[CH_ACL_IN] == -1))
     {
         ALOGE("userial_open: failed to open BT transport");
-        bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-        return FALSE;
+        vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+        return false;
     }
 
     userial_cb.port = port;
 
     /* Start listening thread */
-    pthread_attr_init(&thread_attr);
-
-    if (pthread_create(&(userial_cb.read_thread), &thread_attr, \
-                       userial_read_thread, NULL) != 0 )
+    if (pthread_create(&userial_cb.read_thread, NULL, userial_read_thread, NULL) != 0)
     {
         ALOGE("pthread_create failed!");
-        bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
-        return FALSE;
+        vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
+        return false;
     }
 
-    if(pthread_getschedparam(userial_cb.read_thread, &policy, &param)==0)
-    {
-        policy = BTHC_LINUX_BASE_POLICY;
-#if (BTHC_LINUX_BASE_POLICY != SCHED_NORMAL)
-        param.sched_priority = BTHC_USERIAL_READ_THREAD_PRIORITY;
-#else
-        param.sched_priority = 0;
-#endif
-        result = pthread_setschedparam(userial_cb.read_thread, policy, &param);
-        if (result != 0)
-        {
-            ALOGW("userial_open: pthread_setschedparam failed (%s)", \
-                  strerror(result));
-        }
-    }
-
-    return TRUE;
+    return true;
 }
 
 /*******************************************************************************
@@ -347,7 +295,7 @@
 **                 copied into p_data.  This may be less than len.
 **
 *******************************************************************************/
-uint16_t  userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
+uint16_t userial_read(uint16_t msg_id, uint8_t *p_buffer, uint16_t len)
 {
     int ret = -1;
     int ch_idx = (msg_id == MSG_HC_TO_STACK_HCI_EVT) ? CH_EVT : CH_ACL_IN;
@@ -369,7 +317,7 @@
 **                 may be less than len.
 **
 *******************************************************************************/
-uint16_t userial_write(uint16_t msg_id, uint8_t *p_data, uint16_t len)
+uint16_t userial_write(uint16_t msg_id, const uint8_t *p_data, uint16_t len)
 {
     int ret, total = 0;
     int ch_idx = (msg_id == MSG_STACK_TO_HC_HCI_CMD) ? CH_CMD : CH_ACL_OUT;
@@ -384,14 +332,25 @@
     return ((uint16_t)total);
 }
 
+void userial_close_reader(void) {
+    // Join the reader thread if it is still running.
+    if (userial_running) {
+        send_wakeup_signal(USERIAL_RX_EXIT);
+        int result = pthread_join(userial_cb.read_thread, NULL);
+        USERIALDBG("%s Joined userial reader thread: %d", __func__, result);
+        if (result)
+            ALOGE("%s failed to join reader thread: %d", __func__, result);
+        return;
+    }
+    ALOGW("%s Already closed userial reader thread", __func__);
+}
+
 /*******************************************************************************
 **
 ** Function        userial_close
 **
 ** Description     Close the userial port
 **
-** Returns         None
-**
 *******************************************************************************/
 void userial_close(void)
 {
@@ -405,40 +364,8 @@
     if ((result=pthread_join(userial_cb.read_thread, NULL)) < 0)
         ALOGE( "pthread_join() FAILED result:%d", result);
 
-    /* Calling vendor-specific part */
-    if (bt_vnd_if)
-        bt_vnd_if->op(BT_VND_OP_USERIAL_CLOSE, NULL);
+    vendor_send_command(BT_VND_OP_USERIAL_CLOSE, NULL);
 
     for (idx=0; idx < CH_MAX; idx++)
         userial_cb.fd[idx] = -1;
 }
-
-/*******************************************************************************
-**
-** Function        userial_ioctl
-**
-** Description     ioctl inteface
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_ioctl(userial_ioctl_op_t op, void *p_data)
-{
-    switch(op)
-    {
-        case USERIAL_OP_RXFLOW_ON:
-            if (userial_running)
-                send_wakeup_signal(USERIAL_RX_FLOW_ON);
-            break;
-
-        case USERIAL_OP_RXFLOW_OFF:
-            if (userial_running)
-                send_wakeup_signal(USERIAL_RX_FLOW_OFF);
-            break;
-
-        case USERIAL_OP_INIT:
-        default:
-            break;
-    }
-}
-
diff --git a/hci/src/utils.c b/hci/src/utils.c
index bfcf724..85304fa 100644
--- a/hci/src/utils.c
+++ b/hci/src/utils.c
@@ -65,6 +65,7 @@
 *******************************************************************************/
 void utils_cleanup (void)
 {
+    pthread_mutex_destroy(&utils_mutex);
 }
 
 /*******************************************************************************
diff --git a/hci/src/vendor.c b/hci/src/vendor.c
new file mode 100644
index 0000000..4bad100
--- /dev/null
+++ b/hci/src/vendor.c
@@ -0,0 +1,180 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_vendor"
+
+#include <assert.h>
+#include <dlfcn.h>
+#include <utils/Log.h>
+
+#include "bt_hci_bdroid.h"
+#include "bt_vendor_lib.h"
+#include "hci.h"
+#include "osi.h"
+
+// TODO: eliminate these three.
+extern tHCI_IF *p_hci_if;
+extern bool fwcfg_acked;
+void lpm_vnd_cback(uint8_t vnd_result);
+
+static const char *VENDOR_LIBRARY_NAME = "libbt-vendor.so";
+static const char *VENDOR_LIBRARY_SYMBOL_NAME = "BLUETOOTH_VENDOR_LIB_INTERFACE";
+
+static void *lib_handle;
+static bt_vendor_interface_t *vendor_interface;
+
+static void firmware_config_cb(bt_vendor_op_result_t result);
+static void sco_config_cb(bt_vendor_op_result_t result);
+static void low_power_mode_cb(bt_vendor_op_result_t result);
+static void sco_audiostate_cb(bt_vendor_op_result_t result);
+static void *buffer_alloc(int size);
+static void buffer_free(void *buffer);
+static uint8_t transmit_cb(uint16_t opcode, void *buffer, tINT_CMD_CBACK callback);
+static void epilog_cb(bt_vendor_op_result_t result);
+
+static const bt_vendor_callbacks_t vendor_callbacks = {
+  sizeof(vendor_callbacks),
+  firmware_config_cb,
+  sco_config_cb,
+  low_power_mode_cb,
+  sco_audiostate_cb,
+  buffer_alloc,
+  buffer_free,
+  transmit_cb,
+  epilog_cb
+};
+
+bool vendor_open(const uint8_t *local_bdaddr) {
+  assert(lib_handle == NULL);
+
+  lib_handle = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);
+  if (!lib_handle) {
+    ALOGE("%s unable to open %s: %s", __func__, VENDOR_LIBRARY_NAME, dlerror());
+    goto error;
+  }
+
+  vendor_interface = (bt_vendor_interface_t *)dlsym(lib_handle, VENDOR_LIBRARY_SYMBOL_NAME);
+  if (!vendor_interface) {
+    ALOGE("%s unable to find symbol %s in %s: %s", __func__, VENDOR_LIBRARY_SYMBOL_NAME, VENDOR_LIBRARY_NAME, dlerror());
+    goto error;
+  }
+
+  int status = vendor_interface->init(&vendor_callbacks, (unsigned char *)local_bdaddr);
+  if (status) {
+    ALOGE("%s unable to initialize vendor library: %d", __func__, status);
+    goto error;
+  }
+
+  return true;
+
+error:;
+  vendor_interface = NULL;
+  if (lib_handle)
+    dlclose(lib_handle);
+  lib_handle = NULL;
+  return false;
+}
+
+void vendor_close(void) {
+  if (vendor_interface)
+    vendor_interface->cleanup();
+
+  if (lib_handle)
+    dlclose(lib_handle);
+
+  vendor_interface = NULL;
+  lib_handle = NULL;
+}
+
+int vendor_send_command(bt_vendor_opcode_t opcode, void *param) {
+  assert(vendor_interface != NULL);
+
+  return vendor_interface->op(opcode, param);
+}
+
+// Called back from vendor library when the firmware configuration
+// completes.
+static void firmware_config_cb(bt_vendor_op_result_t result) {
+  assert(bt_hc_cbacks != NULL);
+
+  fwcfg_acked = true;
+
+  bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS)
+      ? BT_HC_PRELOAD_SUCCESS
+      : BT_HC_PRELOAD_FAIL;
+  bt_hc_cbacks->preload_cb(NULL, status);
+}
+
+// Called back from vendor library to indicate status of previous
+// SCO configuration request. This should only happen during the
+// postload process.
+static void sco_config_cb(UNUSED_ATTR bt_vendor_op_result_t result) {
+  assert(p_hci_if != NULL);
+
+  // Continue the rest of the postload process.
+  p_hci_if->get_acl_max_len();
+}
+
+// Called back from vendor library to indicate status of previous
+// LPM enable/disable request.
+static void low_power_mode_cb(bt_vendor_op_result_t result) {
+  lpm_vnd_cback(result != BT_VND_OP_RESULT_SUCCESS);
+}
+
+/******************************************************************************
+**
+** Function         sco_audiostate_cb
+**
+** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
+**                  called when the libbt-vendor completed vendor specific codec
+**                  setup request
+**
+** Returns          None
+**
+******************************************************************************/
+static void sco_audiostate_cb(bt_vendor_op_result_t result)
+{
+    uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;
+
+    ALOGI("sco_audiostate_cb(status: %d)",status);
+}
+
+// Called by vendor library when it needs an HCI buffer.
+static void *buffer_alloc(int size) {
+  assert(bt_hc_cbacks != NULL);
+  return bt_hc_cbacks->alloc(size);
+}
+
+// Called by vendor library when it needs to free a buffer allocated with
+// |buffer_alloc|.
+static void buffer_free(void *buffer) {
+  assert(bt_hc_cbacks != NULL);
+  bt_hc_cbacks->dealloc(buffer);
+}
+
+// Called back from vendor library when it wants to send an HCI command.
+static uint8_t transmit_cb(uint16_t opcode, void *buffer, tINT_CMD_CBACK callback) {
+  assert(p_hci_if != NULL);
+  return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)buffer, callback);
+}
+
+// Called back from vendor library when the epilog procedure has
+// completed. It is safe to call vendor_interface->cleanup() after
+// this callback has been received.
+static void epilog_cb(UNUSED_ATTR bt_vendor_op_result_t result) {
+}
diff --git a/include/bt_target.h b/include/bt_target.h
index 7e77164..a34169a 100644
--- a/include/bt_target.h
+++ b/include/bt_target.h
@@ -1,5 +1,6 @@
 /******************************************************************************
  *
+ *  Copyright (c) 2014 The Android Open Source Project
  *  Copyright (C) 1999-2012 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,6 +34,9 @@
 #define BTIF_HFAG_SERVICE_NAME  ("Handsfree Gateway")
 #endif
 
+#ifndef BTIF_HF_CLIENT_SERVICE_NAME
+#define BTIF_HF_CLIENT_SERVICE_NAME  ("Handsfree")
+#endif
 
 #ifdef BUILDCFG
 
@@ -102,10 +106,6 @@
 #define SMP_HOST_ENCRYPT_INCLUDED FALSE
 #endif
 
-#ifndef SAP_INCLUDED
-#define SAP_INCLUDED FALSE
-#endif
-
 #ifndef SBC_NO_PCM_CPY_OPTION
 #define SBC_NO_PCM_CPY_OPTION FALSE
 #endif
@@ -118,34 +118,6 @@
 #define BTA_AG_INCLUDED  TRUE
 #endif
 
-#ifndef BTA_CT_INCLUDED
-#define BTA_CT_INCLUDED  FALSE
-#endif
-
-#ifndef BTA_CG_INCLUDED
-#define BTA_CG_INCLUDED  FALSE
-#endif
-
-#ifndef BTA_DG_INCLUDED
-#define BTA_DG_INCLUDED  FALSE
-#endif
-
-#ifndef BTA_FT_INCLUDED
-#define BTA_FT_INCLUDED FALSE
-#endif
-
-#ifndef BTA_OP_INCLUDED
-#define BTA_OP_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PR_INCLUDED
-#define BTA_PR_INCLUDED FALSE
-#endif
-
-#ifndef BTA_SS_INCLUDED
-#define BTA_SS_INCLUDED FALSE
-#endif
-
 #ifndef BTA_DM_INCLUDED
 #define BTA_DM_INCLUDED TRUE
 #endif
@@ -171,14 +143,6 @@
 #define BTA_FS_INCLUDED TRUE
 #endif
 
-#ifndef BTA_AC_INCLUDED
-#define BTA_AC_INCLUDED FALSE
-#endif
-
-#ifndef BTA_HD_INCLUDED
-#define BTA_HD_INCLUDED FALSE
-#endif
-
 #ifndef BTA_HH_INCLUDED
 #define BTA_HH_INCLUDED TRUE
 #endif
@@ -199,68 +163,12 @@
 #define BTA_AV_INCLUDED TRUE
 #endif
 
-#ifndef BTA_AV_VDP_INCLUDED
-#define BTA_AV_VDP_INCLUDED FALSE
+#ifndef BTA_GATT_INCLUDED
+#define BTA_GATT_INCLUDED TRUE
 #endif
 
-#ifndef BTA_AVK_INCLUDED
-#define BTA_AVK_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PBS_INCLUDED
-#define BTA_PBS_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PBC_INCLUDED
-#define BTA_PBC_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FM_INCLUDED
-#define BTA_FM_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FM_DEBUG
-#define BTA_FM_DEBUG FALSE
-#endif
-
-#ifndef BTA_FMTX_INCLUDED
-#define BTA_FMTX_INCLUDED FALSE
-#endif
-
-#ifndef BTA_FMTX_DEBUG
-#define BTA_FMTX_DEBUG FALSE
-#endif
-
-#ifndef BTA_FMTX_FMRX_SWITCH_WORKAROUND
-#define BTA_FMTX_FMRX_SWITCH_WORKAROUND FALSE
-#endif
-
-#ifndef BTA_FMTX_US_FCC_RULES
-#define BTA_FMTX_US_FCC_RULES FALSE
-#endif
-
-#ifndef BTA_HS_INCLUDED
-#define BTA_HS_INCLUDED FALSE
-#endif
-
-#ifndef BTA_MSE_INCLUDED
-#define BTA_MSE_INCLUDED FALSE
-#endif
-
-#ifndef BTA_MCE_INCLUDED
-#define BTA_MCE_INCLUDED FALSE
-#endif
-
-#ifndef BTA_PLAYBACK_INCLUDED
-#define BTA_PLAYBACK_INCLUDED FALSE
-#endif
-
-#ifndef BTA_SSR_INCLUDED
-#define BTA_SSR_INCLUDED FALSE
-#endif
-
-#ifndef BTA_JV_INCLUDED
-#define BTA_JV_INCLUDED FALSE
+#ifndef BTA_AV_SINK_INCLUDED
+#define BTA_AV_SINK_INCLUDED FALSE
 #endif
 
 #ifndef BTA_DISABLE_DELAY
@@ -352,11 +260,6 @@
 #define BTA_HOST_INTERLEAVE_SEARCH FALSE
 #endif
 
-/* This feature is used to skip query of ble read remote features*/
-#ifndef BTA_SKIP_BLE_READ_REMOTE_FEAT
-#define BTA_SKIP_BLE_READ_REMOTE_FEAT FALSE
-#endif
-
 #ifndef BT_TRACE_PROTOCOL
 #define BT_TRACE_PROTOCOL  TRUE
 #endif
@@ -397,18 +300,10 @@
 #define BTA_DM_SDP_DB_SIZE  8000
 #endif
 
-#ifndef FTS_REJECT_INVALID_OBEX_SET_PATH_REQ
-#define FTS_REJECT_INVALID_OBEX_SET_PATH_REQ FALSE
-#endif
-
 #ifndef HL_INCLUDED
 #define HL_INCLUDED  TRUE
 #endif
 
-#ifndef NO_GKI_RUN_RETURN
-#define NO_GKI_RUN_RETURN  TRUE
-#endif
-
 #ifndef AG_VOICE_SETTINGS
 #define AG_VOICE_SETTINGS  HCI_DEFAULT_VOICE_SETTINGS
 #endif
@@ -417,12 +312,16 @@
 #define BTIF_DM_OOB_TEST  TRUE
 #endif
 
+// How long to wait before activating sniff mode after entering the
+// idle state for FTS, OPS connections
+#ifndef BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS
+#define BTA_FTS_OPS_IDLE_TO_SNIFF_DELAY_MS 7000
+#endif
+
 //------------------End added from bdroid_buildcfg.h---------------------
 
 
 
-/* #define BYPASS_AVDATATRACE */
-
 /******************************************************************************
 **
 ** Platform-Specific
@@ -635,6 +534,8 @@
 
 #ifndef PAN_POOL_ID
 #define PAN_POOL_ID                 GKI_POOL_ID_3
+/* Maximum amount of the shared buffer to allocate for PAN */
+#define PAN_POOL_MAX                (GKI_BUF3_MAX / 4)
 #endif
 
 /* UNV pool for read/write serialization */
@@ -695,6 +596,11 @@
 #define GATT_DB_POOL_ID                 GKI_POOL_ID_8
 #endif
 
+/* GATT Data sending buffer pool ID, use default ACL pool for fix channel data */
+#ifndef GATT_BUF_POOL_ID
+#define GATT_BUF_POOL_ID                HCI_ACL_POOL_ID
+#endif
+
 /******************************************************************************
 **
 ** Lower Layer Interface
@@ -1026,7 +932,7 @@
 
 /* The number of SCO links. */
 #ifndef BTM_MAX_SCO_LINKS
-#define BTM_MAX_SCO_LINKS           2
+#define BTM_MAX_SCO_LINKS           3
 #endif
 
 /* The preferred type of SCO links (2-eSCO, 0-SCO). */
@@ -1130,16 +1036,6 @@
 #define BTM_MAX_VSE_CALLBACKS           3
 #endif
 
-/* Number of streams for dual stack */
-#ifndef BTM_SYNC_INFO_NUM_STR
-#define BTM_SYNC_INFO_NUM_STR           2
-#endif
-
-/* Number of streams for dual stack in BT Controller */
-#ifndef BTM_SYNC_INFO_NUM_STR_BTC
-#define BTM_SYNC_INFO_NUM_STR_BTC       2
-#endif
-
 /******************************************
 **    Lisbon Features
 *******************************************/
@@ -1403,12 +1299,29 @@
 #define BLE_INCLUDED            TRUE
 #endif
 
+#ifndef BLE_ANDROID_CONTROLLER_SCAN_FILTER
+#define BLE_ANDROID_CONTROLLER_SCAN_FILTER            TRUE
+#endif
+
 #ifndef LOCAL_BLE_CONTROLLER_ID
 #define LOCAL_BLE_CONTROLLER_ID         (1)
 #endif
 
-#ifndef BTM_BLE_PRIVACY_SPT
-#define BTM_BLE_PRIVACY_SPT      TRUE
+#ifndef BLE_PRIVACY_SPT
+#define BLE_PRIVACY_SPT         TRUE
+#endif
+
+#ifndef BLE_VND_INCLUDED
+#define BLE_VND_INCLUDED        FALSE
+#endif
+
+#ifndef BTM_BLE_ADV_TX_POWER
+#define BTM_BLE_ADV_TX_POWER {-21, -15, -7, 1, 9}
+#endif
+
+
+#ifndef BLE_BATCH_SCAN_INCLUDED
+#define BLE_BATCH_SCAN_INCLUDED  TRUE
 #endif
 
 /******************************************************************************
@@ -1428,6 +1341,12 @@
 #error "can't have GATT without BLE"
 #endif
 
+#ifndef BLE_LLT_INCLUDED
+#define BLE_LLT_INCLUDED    TRUE
+#endif
+#ifndef BTM_DUMO_ADDR_CENTRAL_ENABLED
+#define BTM_DUMO_ADDR_CENTRAL_ENABLED    FALSE
+#endif
 #ifndef ATT_INCLUDED
 #define ATT_INCLUDED         TRUE
 #endif
@@ -1445,11 +1364,7 @@
 #endif
 
 #ifndef BLE_PERIPHERAL_MODE_SUPPORT
-#define BLE_PERIPHERAL_MODE_SUPPORT  FALSE
-#endif
-
-#ifndef BLE_PERIPHERAL_DISPLAYONLY
-#define BLE_PERIPHERAL_DISPLAYONLY   FALSE
+#define BLE_PERIPHERAL_MODE_SUPPORT  TRUE
 #endif
 
 #ifndef BLE_PERIPHERAL_ADV_NAME
@@ -1475,7 +1390,7 @@
 #endif
 
 #ifndef GATT_MAX_APPS
-#define GATT_MAX_APPS            10 /* note: 2 apps used internally GATT and GAP */
+#define GATT_MAX_APPS            32 /* note: 2 apps used internally GATT and GAP */
 #endif
 
 #ifndef GATT_MAX_CL_PROFILES
@@ -1611,7 +1526,7 @@
 
 /* The MTU size for the L2CAP configuration. */
 #ifndef SDP_MTU_SIZE
-#define SDP_MTU_SIZE                256
+#define SDP_MTU_SIZE                672
 #endif
 
 /* The flush timeout for the L2CAP configuration. */
@@ -3409,7 +3324,6 @@
 #define SAP_SERVER_INCLUDED         FALSE
 #endif
 
-
 /*************************************************************************
  * A2DP Definitions
  */
@@ -3541,6 +3455,10 @@
 #define AVRC_ADV_CTRL_INCLUDED      TRUE
 #endif
 
+#ifndef AVRC_CTLR_INCLUDED
+#define AVRC_CTLR_INCLUDED          TRUE
+#endif
+
 /******************************************************************************
 **
 ** MCAP
@@ -3862,4 +3780,3 @@
 #include "bt_trace.h"
 
 #endif /* BT_TARGET_H */
-
diff --git a/include/bt_trace.h b/include/bt_trace.h
index ae1b1ae..703b582 100644
--- a/include/bt_trace.h
+++ b/include/bt_trace.h
@@ -197,17 +197,6 @@
 
 /* Prototype for message logging function. */
 EXPORT_API extern void LogMsg (UINT32 trace_set_mask, const char *fmt_str, ...);
-extern void LogMsg_0 (UINT32 trace_set_mask, const char *p_str);
-extern void LogMsg_1 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1);
-extern void LogMsg_2 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2);
-extern void LogMsg_3 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-                      UINT32 p3);
-extern void LogMsg_4 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-                      UINT32 p3, UINT32 p4);
-extern void LogMsg_5 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-                      UINT32 p3, UINT32 p4, UINT32 p5);
-extern void LogMsg_6 (UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-                      UINT32 p3, UINT32 p4, UINT32 p5, UINT32 p6);
 
 /* Prototype for stack tracing function. */
 EXPORT_API extern void BTTRC_StackTrace0(tBTTRC_LAYER_ID layer_id,
@@ -306,75 +295,18 @@
 #define L2CAP_INITIAL_TRACE_LEVEL           BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef LLCP_INITIAL_TRACE_LEVEL
-#define LLCP_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef AMP_INITIAL_TRACE_LEVEL
-#define AMP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef RFCOMM_INITIAL_TRACE_LEVEL
 #define RFCOMM_INITIAL_TRACE_LEVEL          BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef OBX_INITIAL_TRACE_LEVEL
-#define OBX_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef SDP_INITIAL_TRACE_LEVEL
 #define SDP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef TCS_INITIAL_TRACE_LEVEL
-#define TCS_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-/* Profile default trace levels */
-#ifndef DUN_INITIAL_TRACE_LEVEL
-#define DUN_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef GAP_INITIAL_TRACE_LEVEL
 #define GAP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef GOEP_INITIAL_TRACE_LEVEL
-#define GOEP_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HSP2_INITIAL_TRACE_LEVEL
-#define HSP2_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef SPP_INITIAL_TRACE_LEVEL
-#define SPP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef ICP_INITIAL_TRACE_LEVEL
-#define ICP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef CTP_INITIAL_TRACE_LEVEL
-#define CTP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HCRP_INITIAL_TRACE_LEVEL
-#define HCRP_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HCRPM_INITIAL_TRACE_LEVEL
-#define HCRPM_INITIAL_TRACE_LEVEL           BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef BPP_INITIAL_TRACE_LEVEL
-#define BPP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef BIP_INITIAL_TRACE_LEVEL
-#define BIP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef BNEP_INITIAL_TRACE_LEVEL
 #define BNEP_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
 #endif
@@ -383,34 +315,10 @@
 #define PAN_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef SAP_INITIAL_TRACE_LEVEL
-#define SAP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef FTP_INITIAL_TRACE_LEVEL
-#define FTP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef OPP_INITIAL_TRACE_LEVEL
-#define OPP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef HFP_INITIAL_TRACE_LEVEL
-#define HFP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
-#ifndef PAP_INITIAL_TRACE_LEVEL
-#define PAP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef A2D_INITIAL_TRACE_LEVEL
 #define A2D_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
 
-#ifndef VDP_INITIAL_TRACE_LEVEL
-#define VDP_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef AVDT_INITIAL_TRACE_LEVEL
 #define AVDT_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
 #endif
@@ -431,11 +339,6 @@
 #define HID_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
 
-/* Application and other default trace levels */
-#ifndef RPC_INITIAL_TRACE_LEVEL
-#define RPC_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef APPL_INITIAL_TRACE_LEVEL
 #define APPL_INITIAL_TRACE_LEVEL            BT_TRACE_LEVEL_WARNING
 #endif
@@ -444,10 +347,6 @@
 #define BT_TRACE_APPL   BT_USE_TRACES
 #endif
 
-#ifndef NFC_INITIAL_TRACE_LEVEL
-#define NFC_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
-#endif
-
 #ifndef GATT_INITIAL_TRACE_LEVEL
 #define GATT_INITIAL_TRACE_LEVEL             BT_TRACE_LEVEL_WARNING
 #endif
@@ -627,3820 +526,267 @@
 
 #if (BT_USE_TRACES == TRUE)
 
-#define BT_TRACE_0(l,t,m)                           LogMsg_0((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)),(m))
-#define BT_TRACE_1(l,t,m,p1)                        LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1))
-#define BT_TRACE_2(l,t,m,p1,p2)                     LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1),   \
-                                                        (UINT32)(p2))
-#define BT_TRACE_3(l,t,m,p1,p2,p3)                  LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1),   \
-                                                        (UINT32)(p2),(UINT32)(p3))
-#define BT_TRACE_4(l,t,m,p1,p2,p3,p4)               LogMsg_4(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1),   \
-                                                        (UINT32)(p2),(UINT32)(p3),(UINT32)(p4))
-#define BT_TRACE_5(l,t,m,p1,p2,p3,p4,p5)            LogMsg_5(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1),   \
-                                                        (UINT32)(p2),(UINT32)(p3),(UINT32)(p4), \
-                                                        (UINT32)(p5))
-#define BT_TRACE_6(l,t,m,p1,p2,p3,p4,p5,p6)         LogMsg_6(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t),(m),(UINT32)(p1),   \
-                                                        (UINT32)(p2),(UINT32)(p3),(UINT32)(p4), \
-                                                        (UINT32)(p5),(UINT32)(p6))
-
-#define BT_ERROR_TRACE_0(l,m)                     LogMsg_0(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m))
-#define BT_ERROR_TRACE_1(l,m,p1)                  LogMsg_1(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1))
-#define BT_ERROR_TRACE_2(l,m,p1,p2)               LogMsg_2(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1),(UINT32)(p2))
-#define BT_ERROR_TRACE_3(l,m,p1,p2,p3)            LogMsg_3(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR,(m),(UINT32)(p1),(UINT32)(p2),(UINT32)(p3))
+#define BT_TRACE(l,t,...)                        LogMsg((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), ##__VA_ARGS__)
+#define BT_ERROR_TRACE(l,...)                    LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, ##__VA_ARGS__)
 
 /* Define tracing for the HCI unit
 */
-#define HCI_TRACE_ERROR0(m)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m);}
-#define HCI_TRACE_ERROR1(m,p1)                  {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1);}
-#define HCI_TRACE_ERROR2(m,p1,p2)               {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCI_TRACE_ERROR3(m,p1,p2,p3)            {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCI_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
 
-#define HCI_TRACE_WARNING0(m)                   {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m);}
-#define HCI_TRACE_WARNING1(m,p1)                {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1);}
-#define HCI_TRACE_WARNING2(m,p1,p2)             {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCI_TRACE_WARNING3(m,p1,p2,p3)          {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCI_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCI_TRACE_EVENT0(m)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m);}
-#define HCI_TRACE_EVENT1(m,p1)                  {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m, p1);}
-#define HCI_TRACE_EVENT2(m,p1,p2)               {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCI_TRACE_EVENT3(m,p1,p2,p3)            {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCI_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCI_TRACE_DEBUG0(m)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m);}
-#define HCI_TRACE_DEBUG1(m,p1)                  {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1);}
-#define HCI_TRACE_DEBUG2(m,p1,p2)               {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCI_TRACE_DEBUG3(m,p1,p2,p3)            {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCI_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define HCI_TRACE_ERROR(...)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define HCI_TRACE_WARNING(...)                   {if (btu_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define HCI_TRACE_EVENT(...)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define HCI_TRACE_DEBUG(...)                     {if (btu_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 
 /* Define tracing for BTM
 */
-#define BTM_TRACE_ERROR0(m)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m);}
-#define BTM_TRACE_ERROR1(m,p1)                  {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1);}
-#define BTM_TRACE_ERROR2(m,p1,p2)               {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BTM_TRACE_ERROR3(m,p1,p2,p3)            {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BTM_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BTM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_WARNING0(m)                   {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m);}
-#define BTM_TRACE_WARNING1(m,p1)                {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1);}
-#define BTM_TRACE_WARNING2(m,p1,p2)             {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BTM_TRACE_WARNING3(m,p1,p2,p3)          {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BTM_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BTM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_API0(m)                       {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_API, m);}
-#define BTM_TRACE_API1(m,p1)                    {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_API, m, p1);}
-#define BTM_TRACE_API2(m,p1,p2)                 {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2);}
-#define BTM_TRACE_API3(m,p1,p2,p3)              {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BTM_TRACE_API4(m,p1,p2,p3,p4)           {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BTM_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_EVENT0(m)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m);}
-#define BTM_TRACE_EVENT1(m,p1)                  {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m, p1);}
-#define BTM_TRACE_EVENT2(m,p1,p2)               {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BTM_TRACE_EVENT3(m,p1,p2,p3)            {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BTM_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BTM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BTM_TRACE_DEBUG0(m)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m);}
-#define BTM_TRACE_DEBUG1(m,p1)                  {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1);}
-#define BTM_TRACE_DEBUG2(m,p1,p2)               {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BTM_TRACE_DEBUG3(m,p1,p2,p3)            {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BTM_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BTM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BTM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define BTM_TRACE_ERROR(...)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BTM_TRACE_WARNING(...)                   {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BTM_TRACE_API(...)                       {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BTM_TRACE_EVENT(...)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BTM_TRACE_DEBUG(...)                     {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 
 /* Define tracing for the L2CAP unit
 */
-#define L2CAP_TRACE_ERROR0(m)                     {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m);}
-#define L2CAP_TRACE_ERROR1(m,p1)                  {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1);}
-#define L2CAP_TRACE_ERROR2(m,p1,p2)               {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define L2CAP_TRACE_ERROR3(m,p1,p2,p3)            {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define L2CAP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_WARNING0(m)                   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m);}
-#define L2CAP_TRACE_WARNING1(m,p1)                {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1);}
-#define L2CAP_TRACE_WARNING2(m,p1,p2)             {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define L2CAP_TRACE_WARNING3(m,p1,p2,p3)          {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define L2CAP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_API0(m)                       {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m);}
-#define L2CAP_TRACE_API1(m,p1)                    {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1);}
-#define L2CAP_TRACE_API2(m,p1,p2)                 {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2);}
-#define L2CAP_TRACE_API3(m,p1,p2,p3)              {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define L2CAP_TRACE_API4(m,p1,p2,p3,p4)           {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_EVENT0(m)                     {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m);}
-#define L2CAP_TRACE_EVENT1(m,p1)                  {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m, p1);}
-#define L2CAP_TRACE_EVENT2(m,p1,p2)               {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define L2CAP_TRACE_EVENT3(m,p1,p2,p3)            {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define L2CAP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define L2CAP_TRACE_DEBUG0(m)                     {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m);}
-#define L2CAP_TRACE_DEBUG1(m,p1)                  {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1);}
-#define L2CAP_TRACE_DEBUG2(m,p1,p2)               {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define L2CAP_TRACE_DEBUG3(m,p1,p2,p3)            {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define L2CAP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define L2CAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define L2CAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the LLCP unit
-*/
-#define LLCP_TRACE_ERROR0(m)                     {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m);}
-#define LLCP_TRACE_ERROR1(m,p1)                  {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1);}
-#define LLCP_TRACE_ERROR2(m,p1,p2)               {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LLCP_TRACE_ERROR3(m,p1,p2,p3)            {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LLCP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_WARNING0(m)                   {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m);}
-#define LLCP_TRACE_WARNING1(m,p1)                {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1);}
-#define LLCP_TRACE_WARNING2(m,p1,p2)             {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LLCP_TRACE_WARNING3(m,p1,p2,p3)          {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LLCP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_API0(m)                       {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_API, m);}
-#define LLCP_TRACE_API1(m,p1)                    {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1);}
-#define LLCP_TRACE_API2(m,p1,p2)                 {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2);}
-#define LLCP_TRACE_API3(m,p1,p2,p3)              {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define LLCP_TRACE_API4(m,p1,p2,p3,p4)           {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_EVENT0(m)                     {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m);}
-#define LLCP_TRACE_EVENT1(m,p1)                  {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m, p1);}
-#define LLCP_TRACE_EVENT2(m,p1,p2)               {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LLCP_TRACE_EVENT3(m,p1,p2,p3)            {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LLCP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LLCP_TRACE_DEBUG0(m)                     {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m);}
-#define LLCP_TRACE_DEBUG1(m,p1)                  {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1);}
-#define LLCP_TRACE_DEBUG2(m,p1,p2)               {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LLCP_TRACE_DEBUG3(m,p1,p2,p3)            {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LLCP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define LLCP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LLCP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (llcp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_LLCP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define L2CAP_TRACE_ERROR(...)                   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define L2CAP_TRACE_WARNING(...)                 {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define L2CAP_TRACE_API(...)                     {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define L2CAP_TRACE_EVENT(...)                   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define L2CAP_TRACE_DEBUG(...)                   {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* Define tracing for the SDP unit
 */
-#define SDP_TRACE_ERROR0(m)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m);}
-#define SDP_TRACE_ERROR1(m,p1)                  {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1);}
-#define SDP_TRACE_ERROR2(m,p1,p2)               {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SDP_TRACE_ERROR3(m,p1,p2,p3)            {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SDP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_WARNING0(m)                   {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m);}
-#define SDP_TRACE_WARNING1(m,p1)                {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1);}
-#define SDP_TRACE_WARNING2(m,p1,p2)             {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SDP_TRACE_WARNING3(m,p1,p2,p3)          {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SDP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_API0(m)                       {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_API, m);}
-#define SDP_TRACE_API1(m,p1)                    {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1);}
-#define SDP_TRACE_API2(m,p1,p2)                 {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2);}
-#define SDP_TRACE_API3(m,p1,p2,p3)              {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SDP_TRACE_API4(m,p1,p2,p3,p4)           {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SDP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_EVENT0(m)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m);}
-#define SDP_TRACE_EVENT1(m,p1)                  {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m, p1);}
-#define SDP_TRACE_EVENT2(m,p1,p2)               {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SDP_TRACE_EVENT3(m,p1,p2,p3)            {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SDP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SDP_TRACE_DEBUG0(m)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m);}
-#define SDP_TRACE_DEBUG1(m,p1)                  {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1);}
-#define SDP_TRACE_DEBUG2(m,p1,p2)               {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SDP_TRACE_DEBUG3(m,p1,p2,p3)            {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SDP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define SDP_TRACE_ERROR(...)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define SDP_TRACE_WARNING(...)                   {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define SDP_TRACE_API(...)                       {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define SDP_TRACE_EVENT(...)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define SDP_TRACE_DEBUG(...)                     {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* Define tracing for the RFCOMM unit
 */
-#define RFCOMM_TRACE_ERROR0(m)                     {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m);}
-#define RFCOMM_TRACE_ERROR1(m,p1)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1);}
-#define RFCOMM_TRACE_ERROR2(m,p1,p2)               {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define RFCOMM_TRACE_ERROR3(m,p1,p2,p3)            {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define RFCOMM_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_WARNING0(m)                   {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m);}
-#define RFCOMM_TRACE_WARNING1(m,p1)                {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1);}
-#define RFCOMM_TRACE_WARNING2(m,p1,p2)             {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define RFCOMM_TRACE_WARNING3(m,p1,p2,p3)          {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define RFCOMM_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_API0(m)                       {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m);}
-#define RFCOMM_TRACE_API1(m,p1)                    {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1);}
-#define RFCOMM_TRACE_API2(m,p1,p2)                 {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2);}
-#define RFCOMM_TRACE_API3(m,p1,p2,p3)              {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3);}
-#define RFCOMM_TRACE_API4(m,p1,p2,p3,p4)           {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_EVENT0(m)                     {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m);}
-#define RFCOMM_TRACE_EVENT1(m,p1)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m, p1);}
-#define RFCOMM_TRACE_EVENT2(m,p1,p2)               {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define RFCOMM_TRACE_EVENT3(m,p1,p2,p3)            {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define RFCOMM_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define RFCOMM_TRACE_DEBUG0(m)                     {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m);}
-#define RFCOMM_TRACE_DEBUG1(m,p1)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1);}
-#define RFCOMM_TRACE_DEBUG2(m,p1,p2)               {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define RFCOMM_TRACE_DEBUG3(m,p1,p2,p3)            {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define RFCOMM_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define RFCOMM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define RFCOMM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for Serial Port Profile
-*/
-#define SPP_TRACE_ERROR0(m)                     {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m);}
-#define SPP_TRACE_ERROR1(m,p1)                  {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1);}
-#define SPP_TRACE_ERROR2(m,p1,p2)               {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SPP_TRACE_ERROR3(m,p1,p2,p3)            {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SPP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (spp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_WARNING0(m)                   {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m);}
-#define SPP_TRACE_WARNING1(m,p1)                {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1);}
-#define SPP_TRACE_WARNING2(m,p1,p2)             {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SPP_TRACE_WARNING3(m,p1,p2,p3)          {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SPP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (spp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_EVENT0(m)                     {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m);}
-#define SPP_TRACE_EVENT1(m,p1)                  {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m, p1);}
-#define SPP_TRACE_EVENT2(m,p1,p2)               {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SPP_TRACE_EVENT3(m,p1,p2,p3)            {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SPP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (spp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_API0(m)                       {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_API, m);}
-#define SPP_TRACE_API1(m,p1)                    {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_API, m, p1);}
-#define SPP_TRACE_API2(m,p1,p2)                 {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2);}
-#define SPP_TRACE_API3(m,p1,p2,p3)              {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SPP_TRACE_API4(m,p1,p2,p3,p4)           {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SPP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (spp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SPP_TRACE_DEBUG0(m)                     {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m);}
-#define SPP_TRACE_DEBUG1(m,p1)                  {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1);}
-#define SPP_TRACE_DEBUG2(m,p1,p2)               {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SPP_TRACE_DEBUG3(m,p1,p2,p3)            {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SPP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (spp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define RFCOMM_TRACE_ERROR(...)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_WARNING(...)                {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_API(...)                    {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_EVENT(...)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define RFCOMM_TRACE_DEBUG(...)                  {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* Generic Access Profile traces */
-#define GAP_TRACE_ERROR0(m)                     {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m);}
-#define GAP_TRACE_ERROR1(m,p1)                  {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m, p1);}
-#define GAP_TRACE_ERROR2(m,p1,p2)               {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GAP_TRACE_ERROR3(m,p1,p2,p3)            {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GAP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_EVENT0(m)                     {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m);}
-#define GAP_TRACE_EVENT1(m,p1)                  {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m, p1);}
-#define GAP_TRACE_EVENT2(m,p1,p2)               {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GAP_TRACE_EVENT3(m,p1,p2,p3)            {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GAP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_API0(m)                       {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_API, m);}
-#define GAP_TRACE_API1(m,p1)                    {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_API, m, p1);}
-#define GAP_TRACE_API2(m,p1,p2)                 {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2);}
-#define GAP_TRACE_API3(m,p1,p2,p3)              {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GAP_TRACE_API4(m,p1,p2,p3,p4)           {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GAP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define GAP_TRACE_WARNING0(m)                   {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m);}
-#define GAP_TRACE_WARNING1(m,p1)                {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m, p1);}
-#define GAP_TRACE_WARNING2(m,p1,p2)             {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GAP_TRACE_WARNING3(m,p1,p2,p3)          {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GAP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-
-/* Define tracing for OBX
-*/
-#define OBX_TRACE_ERROR0(m)                      {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m);}
-#define OBX_TRACE_ERROR1(m,p1)                   {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1);}
-#define OBX_TRACE_ERROR2(m,p1,p2)                {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2);}
-#define OBX_TRACE_ERROR3(m,p1,p2,p3)             {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define OBX_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define OBX_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (obx_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_WARNING0(m)                    {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m);}
-#define OBX_TRACE_WARNING1(m,p1)                 {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1);}
-#define OBX_TRACE_WARNING2(m,p1,p2)              {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2);}
-#define OBX_TRACE_WARNING3(m,p1,p2,p3)           {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define OBX_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define OBX_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (obx_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_EVENT0(m)                      {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m);}
-#define OBX_TRACE_EVENT1(m,p1)                   {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m, p1);}
-#define OBX_TRACE_EVENT2(m,p1,p2)                {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2);}
-#define OBX_TRACE_EVENT3(m,p1,p2,p3)             {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define OBX_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define OBX_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (obx_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_DEBUG0(m)                      {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m);}
-#define OBX_TRACE_DEBUG1(m,p1)                   {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1);}
-#define OBX_TRACE_DEBUG2(m,p1,p2)                {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define OBX_TRACE_DEBUG3(m,p1,p2,p3)             {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define OBX_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define OBX_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (obx_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define OBX_TRACE_API0(m)                        {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_OBEX, TRACE_TYPE_API, m);}
-#define OBX_TRACE_API1(m,p1)                     {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_OBEX, TRACE_TYPE_API, m, p1);}
-#define OBX_TRACE_API2(m,p1,p2)                  {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2);}
-#define OBX_TRACE_API3(m,p1,p2,p3)               {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3);}
-#define OBX_TRACE_API4(m,p1,p2,p3,p4)            {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define OBX_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define OBX_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (obx_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_OBEX, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for OBEX application profiles
-*/
-#define GOEP_TRACE_ERROR0(m)                     {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m);}
-#define GOEP_TRACE_ERROR1(m,p1)                  {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1);}
-#define GOEP_TRACE_ERROR2(m,p1,p2)               {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GOEP_TRACE_ERROR3(m,p1,p2,p3)            {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GOEP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (goep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_WARNING0(m)                   {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m);}
-#define GOEP_TRACE_WARNING1(m,p1)                {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1);}
-#define GOEP_TRACE_WARNING2(m,p1,p2)             {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GOEP_TRACE_WARNING3(m,p1,p2,p3)          {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GOEP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (goep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_EVENT0(m)                     {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m);}
-#define GOEP_TRACE_EVENT1(m,p1)                  {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m, p1);}
-#define GOEP_TRACE_EVENT2(m,p1,p2)               {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GOEP_TRACE_EVENT3(m,p1,p2,p3)            {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GOEP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (goep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_DEBUG0(m)                     {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m);}
-#define GOEP_TRACE_DEBUG1(m,p1)                  {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1);}
-#define GOEP_TRACE_DEBUG2(m,p1,p2)               {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define GOEP_TRACE_DEBUG3(m,p1,p2,p3)            {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define GOEP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (goep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define GOEP_TRACE_API0(m)                       {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_GOEP, TRACE_TYPE_API, m);}
-#define GOEP_TRACE_API1(m,p1)                    {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_GOEP, TRACE_TYPE_API, m, p1);}
-#define GOEP_TRACE_API2(m,p1,p2)                 {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2);}
-#define GOEP_TRACE_API3(m,p1,p2,p3)              {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GOEP_TRACE_API4(m,p1,p2,p3,p4)           {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GOEP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GOEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (goep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_GOEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the BPP profile
-*/
-#define BPP_TRACE_ERROR0(m)                      {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m);}
-#define BPP_TRACE_ERROR1(m,p1)                   {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1);}
-#define BPP_TRACE_ERROR2(m,p1,p2)                {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BPP_TRACE_ERROR3(m,p1,p2,p3)             {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BPP_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_WARNING0(m)                    {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m);}
-#define BPP_TRACE_WARNING1(m,p1)                 {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1);}
-#define BPP_TRACE_WARNING2(m,p1,p2)              {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BPP_TRACE_WARNING3(m,p1,p2,p3)           {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BPP_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_EVENT0(m)                      {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m);}
-#define BPP_TRACE_EVENT1(m,p1)                   {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m, p1);}
-#define BPP_TRACE_EVENT2(m,p1,p2)                {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BPP_TRACE_EVENT3(m,p1,p2,p3)             {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BPP_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_DEBUG0(m)                      {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m);}
-#define BPP_TRACE_DEBUG1(m,p1)                   {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1);}
-#define BPP_TRACE_DEBUG2(m,p1,p2)                {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BPP_TRACE_DEBUG3(m,p1,p2,p3)             {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BPP_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define BPP_TRACE_API0(m)                        {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BPP, TRACE_TYPE_API, m);}
-#define BPP_TRACE_API1(m,p1)                     {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BPP, TRACE_TYPE_API, m, p1);}
-#define BPP_TRACE_API2(m,p1,p2)                  {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2);}
-#define BPP_TRACE_API3(m,p1,p2,p3)               {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BPP_TRACE_API4(m,p1,p2,p3,p4)            {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BPP_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (bpp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BPP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the BIP profile
-*/
-#define BIP_TRACE_ERROR0(m)                      {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m);}
-#define BIP_TRACE_ERROR1(m,p1)                   {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1);}
-#define BIP_TRACE_ERROR2(m,p1,p2)                {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BIP_TRACE_ERROR3(m,p1,p2,p3)             {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BIP_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BIP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (bip_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_WARNING0(m)                    {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m);}
-#define BIP_TRACE_WARNING1(m,p1)                 {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1);}
-#define BIP_TRACE_WARNING2(m,p1,p2)              {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BIP_TRACE_WARNING3(m,p1,p2,p3)           {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BIP_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BIP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (bip_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_EVENT0(m)                      {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m);}
-#define BIP_TRACE_EVENT1(m,p1)                   {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m, p1);}
-#define BIP_TRACE_EVENT2(m,p1,p2)                {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BIP_TRACE_EVENT3(m,p1,p2,p3)             {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BIP_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BIP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (bip_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_DEBUG0(m)                      {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m);}
-#define BIP_TRACE_DEBUG1(m,p1)                   {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1);}
-#define BIP_TRACE_DEBUG2(m,p1,p2)                {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BIP_TRACE_DEBUG3(m,p1,p2,p3)             {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BIP_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BIP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (bip_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define BIP_TRACE_API0(m)                        {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BIP, TRACE_TYPE_API, m);}
-#define BIP_TRACE_API1(m,p1)                     {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BIP, TRACE_TYPE_API, m, p1);}
-#define BIP_TRACE_API2(m,p1,p2)                  {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2);}
-#define BIP_TRACE_API3(m,p1,p2,p3)               {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BIP_TRACE_API4(m,p1,p2,p3,p4)            {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BIP_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BIP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (bip_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BIP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for TCS
-*/
-#define TCS_TRACE_ERROR0(m)                     {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m);}
-#define TCS_TRACE_ERROR1(m,p1)                  {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1);}
-#define TCS_TRACE_ERROR2(m,p1,p2)               {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2);}
-#define TCS_TRACE_ERROR3(m,p1,p2,p3)            {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define TCS_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define TCS_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_WARNING0(m)                   {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m);}
-#define TCS_TRACE_WARNING1(m,p1)                {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1);}
-#define TCS_TRACE_WARNING2(m,p1,p2)             {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2);}
-#define TCS_TRACE_WARNING3(m,p1,p2,p3)          {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define TCS_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define TCS_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_EVENT0(m)                     {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m);}
-#define TCS_TRACE_EVENT1(m,p1)                  {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m, p1);}
-#define TCS_TRACE_EVENT2(m,p1,p2)               {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2);}
-#define TCS_TRACE_EVENT3(m,p1,p2,p3)            {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define TCS_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define TCS_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_DEBUG0(m)                     {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m);}
-#define TCS_TRACE_DEBUG1(m,p1)                  {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1);}
-#define TCS_TRACE_DEBUG2(m,p1,p2)               {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define TCS_TRACE_DEBUG3(m,p1,p2,p3)            {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define TCS_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define TCS_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define TCS_TRACE_API0(m)                       {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_TCS, TRACE_TYPE_API, m);}
-#define TCS_TRACE_API1(m,p1)                    {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_TCS, TRACE_TYPE_API, m, p1);}
-#define TCS_TRACE_API2(m,p1,p2)                 {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2);}
-#define TCS_TRACE_API3(m,p1,p2,p3)              {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3);}
-#define TCS_TRACE_API4(m,p1,p2,p3,p4)           {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define TCS_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define TCS_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (tcs_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_TCS, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for ICP
-*/
-#define ICP_TRACE_ERROR0(m)                     {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m);}
-#define ICP_TRACE_ERROR1(m,p1)                  {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1);}
-#define ICP_TRACE_ERROR2(m,p1,p2)               {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define ICP_TRACE_ERROR3(m,p1,p2,p3)            {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define ICP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define ICP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (icp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_WARNING0(m)                   {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m);}
-#define ICP_TRACE_WARNING1(m,p1)                {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1);}
-#define ICP_TRACE_WARNING2(m,p1,p2)             {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define ICP_TRACE_WARNING3(m,p1,p2,p3)          {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define ICP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define ICP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (icp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_EVENT0(m)                     {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m);}
-#define ICP_TRACE_EVENT1(m,p1)                  {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m, p1);}
-#define ICP_TRACE_EVENT2(m,p1,p2)               {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define ICP_TRACE_EVENT3(m,p1,p2,p3)            {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define ICP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define ICP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (icp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_DEBUG0(m)                     {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m);}
-#define ICP_TRACE_DEBUG1(m,p1)                  {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1);}
-#define ICP_TRACE_DEBUG2(m,p1,p2)               {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define ICP_TRACE_DEBUG3(m,p1,p2,p3)            {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define ICP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define ICP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (icp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define ICP_TRACE_API0(m)                       {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_ICP, TRACE_TYPE_API, m);}
-#define ICP_TRACE_API1(m,p1)                    {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_ICP, TRACE_TYPE_API, m, p1);}
-#define ICP_TRACE_API2(m,p1,p2)                 {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2);}
-#define ICP_TRACE_API3(m,p1,p2,p3)              {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define ICP_TRACE_API4(m,p1,p2,p3,p4)           {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define ICP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define ICP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (icp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_ICP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* CTP */
-#define CTP_TRACE_ERROR0(m)                     {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m);}
-#define CTP_TRACE_ERROR1(m,p1)                  {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1);}
-#define CTP_TRACE_ERROR2(m,p1,p2)               {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define CTP_TRACE_ERROR3(m,p1,p2,p3)            {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define CTP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define CTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_WARNING0(m)                   {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m);}
-#define CTP_TRACE_WARNING1(m,p1)                {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1);}
-#define CTP_TRACE_WARNING2(m,p1,p2)             {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define CTP_TRACE_WARNING3(m,p1,p2,p3)          {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define CTP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define CTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_EVENT0(m)                     {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m);}
-#define CTP_TRACE_EVENT1(m,p1)                  {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m, p1);}
-#define CTP_TRACE_EVENT2(m,p1,p2)               {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define CTP_TRACE_EVENT3(m,p1,p2,p3)            {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define CTP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define CTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define CTP_TRACE_DEBUG0(m)                     {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m);}
-#define CTP_TRACE_DEBUG1(m,p1)                  {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1);}
-#define CTP_TRACE_DEBUG2(m,p1,p2)               {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define CTP_TRACE_DEBUG3(m,p1,p2,p3)            {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define CTP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define CTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define CTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (ctp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_CTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
+#define GAP_TRACE_ERROR(...)                     {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define GAP_TRACE_EVENT(...)                     {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define GAP_TRACE_API(...)                       {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define GAP_TRACE_WARNING(...)                   {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
 
 /* define traces for HID Host */
-#define HIDH_TRACE_ERROR0(m)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m);}
-#define HIDH_TRACE_ERROR1(m,p1)                  {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m, p1);}
-#define HIDH_TRACE_ERROR2(m,p1,p2)               {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HIDH_TRACE_ERROR3(m,p1,p2,p3)            {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HIDH_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_WARNING0(m)                   {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m);}
-#define HIDH_TRACE_WARNING1(m,p1)                {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1);}
-#define HIDH_TRACE_WARNING2(m,p1,p2)             {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HIDH_TRACE_WARNING3(m,p1,p2,p3)          {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HIDH_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_API0(m)                       {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_API, m);}
-#define HIDH_TRACE_API1(m,p1)                    {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_API, m, p1);}
-#define HIDH_TRACE_API2(m,p1,p2)                 {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2);}
-#define HIDH_TRACE_API3(m,p1,p2,p3)              {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HIDH_TRACE_API4(m,p1,p2,p3,p4)           {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_EVENT0(m)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m);}
-#define HIDH_TRACE_EVENT1(m,p1)                  {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m, p1);}
-#define HIDH_TRACE_EVENT2(m,p1,p2)               {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HIDH_TRACE_EVENT3(m,p1,p2,p3)            {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HIDH_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDH_TRACE_DEBUG0(m)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m);}
-#define HIDH_TRACE_DEBUG1(m,p1)                  {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1);}
-#define HIDH_TRACE_DEBUG2(m,p1,p2)               {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HIDH_TRACE_DEBUG3(m,p1,p2,p3)            {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HIDH_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HIDH_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HIDH_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for HID Device */
-#define HIDD_TRACE_ERROR0(m)                     {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m);}
-#define HIDD_TRACE_ERROR1(m,p1)                  {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m, p1);}
-#define HIDD_TRACE_ERROR2(m,p1,p2)               {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HIDD_TRACE_ERROR3(m,p1,p2,p3)            {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HIDD_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (hd_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_WARNING0(m)                   {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m);}
-#define HIDD_TRACE_WARNING1(m,p1)                {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1);}
-#define HIDD_TRACE_WARNING2(m,p1,p2)             {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HIDD_TRACE_WARNING3(m,p1,p2,p3)          {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HIDD_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hd_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_API0(m)                       {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_API, m);}
-#define HIDD_TRACE_API1(m,p1)                    {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_API, m, p1);}
-#define HIDD_TRACE_API2(m,p1,p2)                 {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2);}
-#define HIDD_TRACE_API3(m,p1,p2,p3)              {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HIDD_TRACE_API4(m,p1,p2,p3,p4)           {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (hd_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_EVENT0(m)                     {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m);}
-#define HIDD_TRACE_EVENT1(m,p1)                  {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m, p1);}
-#define HIDD_TRACE_EVENT2(m,p1,p2)               {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HIDD_TRACE_EVENT3(m,p1,p2,p3)            {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HIDD_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (hd_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HIDD_TRACE_DEBUG0(m)                     {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m);}
-#define HIDD_TRACE_DEBUG1(m,p1)                  {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1);}
-#define HIDD_TRACE_DEBUG2(m,p1,p2)               {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HIDD_TRACE_DEBUG3(m,p1,p2,p3)            {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HIDD_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HIDD_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HIDD_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (hd_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for headset profile */
-#define HSP2_TRACE_ERROR0(pcb,m)                     {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m);}
-#define HSP2_TRACE_ERROR1(pcb,m,p1)                  {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m, p1);}
-#define HSP2_TRACE_ERROR2(pcb,m,p1,p2)               {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HSP2_TRACE_ERROR3(pcb,m,p1,p2,p3)            {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HSP2_TRACE_ERROR4(pcb,m,p1,p2,p3,p4)         {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_ERROR5(pcb,m,p1,p2,p3,p4,p5)      {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_ERROR6(pcb,m,p1,p2,p3,p4,p5,p6)   {if (pcb->trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_WARNING0(pcb,m)                   {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m);}
-#define HSP2_TRACE_WARNING1(pcb,m,p1)                {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1);}
-#define HSP2_TRACE_WARNING2(pcb,m,p1,p2)             {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HSP2_TRACE_WARNING3(pcb,m,p1,p2,p3)          {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HSP2_TRACE_WARNING4(pcb,m,p1,p2,p3,p4)       {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_WARNING5(pcb,m,p1,p2,p3,p4,p5)    {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_WARNING6(pcb,m,p1,p2,p3,p4,p5,p6) {if (pcb->trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_API0(pcb,m)                       {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_API, m);}
-#define HSP2_TRACE_API1(pcb,m,p1)                    {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_API, m, p1);}
-#define HSP2_TRACE_API2(pcb,m,p1,p2)                 {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2);}
-#define HSP2_TRACE_API3(pcb,m,p1,p2,p3)              {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HSP2_TRACE_API4(pcb,m,p1,p2,p3,p4)           {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_API5(pcb,m,p1,p2,p3,p4,p5)        {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_API6(pcb,m,p1,p2,p3,p4,p5,p6)     {if (pcb->trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_EVENT0(pcb,m)                     {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m);}
-#define HSP2_TRACE_EVENT1(pcb,m,p1)                  {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m, p1);}
-#define HSP2_TRACE_EVENT2(pcb,m,p1,p2)               {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HSP2_TRACE_EVENT3(pcb,m,p1,p2,p3)            {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HSP2_TRACE_EVENT4(pcb,m,p1,p2,p3,p4)         {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_EVENT5(pcb,m,p1,p2,p3,p4,p5)      {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_EVENT6(pcb,m,p1,p2,p3,p4,p5,p6)   {if (pcb->trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HSP2_TRACE_DEBUG0(pcb,m)                     {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m);}
-#define HSP2_TRACE_DEBUG1(pcb,m,p1)                  {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1);}
-#define HSP2_TRACE_DEBUG2(pcb,m,p1,p2)               {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HSP2_TRACE_DEBUG3(pcb,m,p1,p2,p3)            {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HSP2_TRACE_DEBUG4(pcb,m,p1,p2,p3,p4)         {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HSP2_TRACE_DEBUG5(pcb,m,p1,p2,p3,p4,p5)      {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HSP2_TRACE_DEBUG6(pcb,m,p1,p2,p3,p4,p5,p6)   {if (pcb->trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HSP2, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the NFC unit
-*/
-#define NFC_TRACE_ERROR0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m);}
-#define NFC_TRACE_ERROR1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1);}
-#define NFC_TRACE_ERROR2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NFC_TRACE_ERROR3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NFC_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NFC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_WARNING0(m)                   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m);}
-#define NFC_TRACE_WARNING1(m,p1)                {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1);}
-#define NFC_TRACE_WARNING2(m,p1,p2)             {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NFC_TRACE_WARNING3(m,p1,p2,p3)          {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NFC_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NFC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_API0(m)                       {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_API, m);}
-#define NFC_TRACE_API1(m,p1)                    {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1);}
-#define NFC_TRACE_API2(m,p1,p2)                 {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2);}
-#define NFC_TRACE_API3(m,p1,p2,p3)              {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NFC_TRACE_API4(m,p1,p2,p3,p4)           {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NFC_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_EVENT0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m);}
-#define NFC_TRACE_EVENT1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m, p1);}
-#define NFC_TRACE_EVENT2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NFC_TRACE_EVENT3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NFC_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NFC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFC_TRACE_DEBUG0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m);}
-#define NFC_TRACE_DEBUG1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1);}
-#define NFC_TRACE_DEBUG2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NFC_TRACE_DEBUG3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NFC_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NFC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NFC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NFC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_ERROR0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m);}
-#define NCI_TRACE_ERROR1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1);}
-#define NCI_TRACE_ERROR2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NCI_TRACE_ERROR3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NCI_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_WARNING0(m)                   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m);}
-#define NCI_TRACE_WARNING1(m,p1)                {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1);}
-#define NCI_TRACE_WARNING2(m,p1,p2)             {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NCI_TRACE_WARNING3(m,p1,p2,p3)          {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NCI_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_API0(m)                       {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_API, m);}
-#define NCI_TRACE_API1(m,p1)                    {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1);}
-#define NCI_TRACE_API2(m,p1,p2)                 {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2);}
-#define NCI_TRACE_API3(m,p1,p2,p3)              {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NCI_TRACE_API4(m,p1,p2,p3,p4)           {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NCI_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_EVENT0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m);}
-#define NCI_TRACE_EVENT1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m, p1);}
-#define NCI_TRACE_EVENT2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NCI_TRACE_EVENT3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NCI_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NCI_TRACE_DEBUG0(m)                     {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m);}
-#define NCI_TRACE_DEBUG1(m,p1)                  {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1);}
-#define NCI_TRACE_DEBUG2(m,p1,p2)               {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NCI_TRACE_DEBUG3(m,p1,p2,p3)            {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NCI_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (nfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NCI, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_ERROR0(m)                     {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m);}
-#define RW_TRACE_ERROR1(m,p1)                  {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1);}
-#define RW_TRACE_ERROR2(m,p1,p2)               {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2);}
-#define RW_TRACE_ERROR3(m,p1,p2,p3)            {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define RW_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define RW_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (rw_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_WARNING0(m)                   {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m);}
-#define RW_TRACE_WARNING1(m,p1)                {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1);}
-#define RW_TRACE_WARNING2(m,p1,p2)             {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2);}
-#define RW_TRACE_WARNING3(m,p1,p2,p3)          {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define RW_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define RW_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (rw_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_API0(m)                       {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_API, m);}
-#define RW_TRACE_API1(m,p1)                    {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1);}
-#define RW_TRACE_API2(m,p1,p2)                 {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2);}
-#define RW_TRACE_API3(m,p1,p2,p3)              {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3);}
-#define RW_TRACE_API4(m,p1,p2,p3,p4)           {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define RW_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (rw_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_EVENT0(m)                     {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m);}
-#define RW_TRACE_EVENT1(m,p1)                  {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m, p1);}
-#define RW_TRACE_EVENT2(m,p1,p2)               {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2);}
-#define RW_TRACE_EVENT3(m,p1,p2,p3)            {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define RW_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define RW_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (rw_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define RW_TRACE_DEBUG0(m)                     {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m);}
-#define RW_TRACE_DEBUG1(m,p1)                  {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1);}
-#define RW_TRACE_DEBUG2(m,p1,p2)               {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define RW_TRACE_DEBUG3(m,p1,p2,p3)            {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define RW_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define RW_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define RW_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (rw_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_RW, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_ERROR0(m)                     {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m);}
-#define CE_TRACE_ERROR1(m,p1)                  {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1);}
-#define CE_TRACE_ERROR2(m,p1,p2)               {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2);}
-#define CE_TRACE_ERROR3(m,p1,p2,p3)            {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define CE_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define CE_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (ce_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_WARNING0(m)                   {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m);}
-#define CE_TRACE_WARNING1(m,p1)                {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1);}
-#define CE_TRACE_WARNING2(m,p1,p2)             {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2);}
-#define CE_TRACE_WARNING3(m,p1,p2,p3)          {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define CE_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define CE_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ce_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_API0(m)                       {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_API, m);}
-#define CE_TRACE_API1(m,p1)                    {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1);}
-#define CE_TRACE_API2(m,p1,p2)                 {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2);}
-#define CE_TRACE_API3(m,p1,p2,p3)              {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3);}
-#define CE_TRACE_API4(m,p1,p2,p3,p4)           {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define CE_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (ce_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_EVENT0(m)                     {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m);}
-#define CE_TRACE_EVENT1(m,p1)                  {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m, p1);}
-#define CE_TRACE_EVENT2(m,p1,p2)               {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2);}
-#define CE_TRACE_EVENT3(m,p1,p2,p3)            {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define CE_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define CE_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (ce_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define CE_TRACE_DEBUG0(m)                     {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m);}
-#define CE_TRACE_DEBUG1(m,p1)                  {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1);}
-#define CE_TRACE_DEBUG2(m,p1,p2)               {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define CE_TRACE_DEBUG3(m,p1,p2,p3)            {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define CE_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define CE_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define CE_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (ce_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_CE, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_ERROR0(m)                     {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m);}
-#define NDEF_TRACE_ERROR1(m,p1)                  {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1);}
-#define NDEF_TRACE_ERROR2(m,p1,p2)               {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NDEF_TRACE_ERROR3(m,p1,p2,p3)            {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NDEF_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_WARNING0(m)                   {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m);}
-#define NDEF_TRACE_WARNING1(m,p1)                {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1);}
-#define NDEF_TRACE_WARNING2(m,p1,p2)             {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NDEF_TRACE_WARNING3(m,p1,p2,p3)          {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NDEF_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_API0(m)                       {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_API, m);}
-#define NDEF_TRACE_API1(m,p1)                    {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1);}
-#define NDEF_TRACE_API2(m,p1,p2)                 {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2);}
-#define NDEF_TRACE_API3(m,p1,p2,p3)              {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NDEF_TRACE_API4(m,p1,p2,p3,p4)           {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_EVENT0(m)                     {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m);}
-#define NDEF_TRACE_EVENT1(m,p1)                  {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m, p1);}
-#define NDEF_TRACE_EVENT2(m,p1,p2)               {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NDEF_TRACE_EVENT3(m,p1,p2,p3)            {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NDEF_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NDEF_TRACE_DEBUG0(m)                     {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m);}
-#define NDEF_TRACE_DEBUG1(m,p1)                  {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1);}
-#define NDEF_TRACE_DEBUG2(m,p1,p2)               {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NDEF_TRACE_DEBUG3(m,p1,p2,p3)            {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NDEF_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NDEF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NDEF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (ndef_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NDEF, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the NFA unit
-*/
-#define NFA_TRACE_ERROR0(m)                     {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m);}
-#define NFA_TRACE_ERROR1(m,p1)                  {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1);}
-#define NFA_TRACE_ERROR2(m,p1,p2)               {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2);}
-#define NFA_TRACE_ERROR3(m,p1,p2,p3)            {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define NFA_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define NFA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_WARNING0(m)                   {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m);}
-#define NFA_TRACE_WARNING1(m,p1)                {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1);}
-#define NFA_TRACE_WARNING2(m,p1,p2)             {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2);}
-#define NFA_TRACE_WARNING3(m,p1,p2,p3)          {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define NFA_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define NFA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_API0(m)                       {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_API, m);}
-#define NFA_TRACE_API1(m,p1)                    {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1);}
-#define NFA_TRACE_API2(m,p1,p2)                 {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2);}
-#define NFA_TRACE_API3(m,p1,p2,p3)              {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3);}
-#define NFA_TRACE_API4(m,p1,p2,p3,p4)           {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define NFA_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_EVENT0(m)                     {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m);}
-#define NFA_TRACE_EVENT1(m,p1)                  {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m, p1);}
-#define NFA_TRACE_EVENT2(m,p1,p2)               {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2);}
-#define NFA_TRACE_EVENT3(m,p1,p2,p3)            {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define NFA_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define NFA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define NFA_TRACE_DEBUG0(m)                     {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m);}
-#define NFA_TRACE_DEBUG1(m,p1)                  {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1);}
-#define NFA_TRACE_DEBUG2(m,p1,p2)               {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define NFA_TRACE_DEBUG3(m,p1,p2,p3)            {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define NFA_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define NFA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define NFA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (nfa_sys_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_NFA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define MMI_TRACE_0(m)
-#define MMI_TRACE_1(m,p1)
-#define MMI_TRACE_2(m,p1,p2)
-#define MMI_TRACE_3(m,p1,p2,p3)
-#define MMI_TRACE_4(m,p1,p2,p3,p4)
-#define MMI_TRACE_5(m,p1,p2,p3,p4,p5)
-#define MMI_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_DEBUG_0(m)                           BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m)
-#define MMI_DEBUG_1(m,p1)                        BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1)
-#define MMI_DEBUG_2(m,p1,p2)                     BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2)
-#define MMI_DEBUG_3(m,p1,p2,p3)                  BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3)
-#define MMI_DEBUG_4(m,p1,p2,p3,p4)               BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4)
-#define MMI_DEBUG_5(m,p1,p2,p3,p4,p5)            BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5)
-#define MMI_DEBUG_6(m,p1,p2,p3,p4,p5,p6)         BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_WARNING_0(m)                         BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m)
-#define MMI_WARNING_1(m,p1)                      BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1)
-#define MMI_WARNING_2(m,p1,p2)                   BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2)
-#define MMI_WARNING_3(m,p1,p2,p3)                BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3)
-#define MMI_WARNING_4(m,p1,p2,p3,p4)             BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4)
-#define MMI_WARNING_5(m,p1,p2,p3,p4,p5)          BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5)
-#define MMI_WARNING_6(m,p1,p2,p3,p4,p5,p6)       BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6)
-
-#define MMI_ERROR_0(m)                           BT_TRACE_0(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m)
-#define MMI_ERROR_1(m,p1)                        BT_TRACE_1(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1)
-#define MMI_ERROR_2(m,p1,p2)                     BT_TRACE_2(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2)
-#define MMI_ERROR_3(m,p1,p2,p3)                  BT_TRACE_3(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3)
-#define MMI_ERROR_4(m,p1,p2,p3,p4)               BT_TRACE_4(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4)
-#define MMI_ERROR_5(m,p1,p2,p3,p4,p5)            BT_TRACE_5(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5)
-#define MMI_ERROR_6(m,p1,p2,p3,p4,p5,p6)         BT_TRACE_6(TRACE_LAYER_HID, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6)
-
-#define TAK_TRACE_0(m)                            MMI_Echo(m)
-
-/* hid mouse module traces */
-
-#define MSKB_TRACE_0(m)                         MMI_Echo(m)
-#define MSKB_TRACE_1(m,p1)                      MMI_Echo(m,p1)
-#define MSKB_TRACE_2(m,p1,p2)                   MMI_Echo(m,p1,p2)
-#define MSKB_TRACE_3(m,p1,p2,p3)                MMI_Echo(m,p1,p2,p3)
-#define MSKB_TRACE_4(m,p1,p2,p3,p4)             MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_TRACE_5(m,p1,p2,p3,p4,p5)          MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_TRACE_6(m,p1,p2,p3,p4,p5,p6)       MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_DEBUG_0(m)                         MMI_Echo(m)
-#define MSKB_DEBUG_1(m,p1)                      MMI_Echo(m,p1)
-#define MSKB_DEBUG_2(m,p1,p2)                   MMI_Echo(m,p1,p2)
-#define MSKB_DEBUG_3(m,p1,p2,p3)                MMI_Echo(m,p1,p2,p3)
-#define MSKB_DEBUG_4(m,p1,p2,p3,p4)             MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_DEBUG_5(m,p1,p2,p3,p4,p5)          MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_DEBUG_6(m,p1,p2,p3,p4,p5,p6)       MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_ERROR_0(m)                         MMI_Echo(m)
-#define MSKB_ERROR_1(m,p1)                      MMI_Echo(m,p1)
-#define MSKB_ERROR_2(m,p1,p2)                   MMI_Echo(m,p1,p2)
-#define MSKB_ERROR_3(m,p1,p2,p3)                MMI_Echo(m,p1,p2,p3)
-#define MSKB_ERROR_4(m,p1,p2,p3,p4)             MMI_Echo(m,p1,p2,p3,p4)
-#define MSKB_ERROR_5(m,p1,p2,p3,p4,p5)          MMI_Echo(m,p1,p2,p3,p4,p5)
-#define MSKB_ERROR_6(m,p1,p2,p3,p4,p5,p6)       MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for DUN */
-
-#define DUN_TRACE_ERROR0(m)                     {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m);}
-#define DUN_TRACE_ERROR1(m,p1)                  {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m, p1);}
-#define DUN_TRACE_ERROR2(m,p1,p2)               {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2);}
-#define DUN_TRACE_ERROR3(m,p1,p2,p3)            {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define DUN_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define DUN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (dun_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_WARNING0(m)                   {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m);}
-#define DUN_TRACE_WARNING1(m,p1)                {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1);}
-#define DUN_TRACE_WARNING2(m,p1,p2)             {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2);}
-#define DUN_TRACE_WARNING3(m,p1,p2,p3)          {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define DUN_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define DUN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (dun_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_API0(m)                       {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_API, m);}
-#define DUN_TRACE_API1(m,p1)                    {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_API, m, p1);}
-#define DUN_TRACE_API2(m,p1,p2)                 {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2);}
-#define DUN_TRACE_API3(m,p1,p2,p3)              {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3);}
-#define DUN_TRACE_API4(m,p1,p2,p3,p4)           {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define DUN_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (dun_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_EVENT0(m)                     {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m);}
-#define DUN_TRACE_EVENT1(m,p1)                  {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m, p1);}
-#define DUN_TRACE_EVENT2(m,p1,p2)               {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2);}
-#define DUN_TRACE_EVENT3(m,p1,p2,p3)            {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define DUN_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define DUN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (dun_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define DUN_TRACE_DEBUG0(m)                     {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m);}
-#define DUN_TRACE_DEBUG1(m,p1)                  {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1);}
-#define DUN_TRACE_DEBUG2(m,p1,p2)               {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define DUN_TRACE_DEBUG3(m,p1,p2,p3)            {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define DUN_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define DUN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define DUN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (dun_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_DUN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for hardcopy cable replacement profile */
-
-#define HCRP_TRACE_ERROR0(m)                     {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m);}
-#define HCRP_TRACE_ERROR1(m,p1)                  {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m, p1);}
-#define HCRP_TRACE_ERROR2(m,p1,p2)               {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCRP_TRACE_ERROR3(m,p1,p2,p3)            {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCRP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_WARNING0(m)                   {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m);}
-#define HCRP_TRACE_WARNING1(m,p1)                {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1);}
-#define HCRP_TRACE_WARNING2(m,p1,p2)             {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCRP_TRACE_WARNING3(m,p1,p2,p3)          {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCRP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_API0(m)                       {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_API, m);}
-#define HCRP_TRACE_API1(m,p1)                    {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_API, m, p1);}
-#define HCRP_TRACE_API2(m,p1,p2)                 {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2);}
-#define HCRP_TRACE_API3(m,p1,p2,p3)              {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HCRP_TRACE_API4(m,p1,p2,p3,p4)           {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_EVENT0(m)                     {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m);}
-#define HCRP_TRACE_EVENT1(m,p1)                  {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m, p1);}
-#define HCRP_TRACE_EVENT2(m,p1,p2)               {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCRP_TRACE_EVENT3(m,p1,p2,p3)            {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCRP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRP_TRACE_DEBUG0(m)                     {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m);}
-#define HCRP_TRACE_DEBUG1(m,p1)                  {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1);}
-#define HCRP_TRACE_DEBUG2(m,p1,p2)               {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCRP_TRACE_DEBUG3(m,p1,p2,p3)            {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCRP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCRP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCRP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (hcrp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for multi-client server hardcopy cable replacement profile */
-
-#define HCRPM_TRACE_ERROR0(m)                     {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m);}
-#define HCRPM_TRACE_ERROR1(m,p1)                  {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m, p1);}
-#define HCRPM_TRACE_ERROR2(m,p1,p2)               {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define HCRPM_TRACE_ERROR3(m,p1,p2,p3)            {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define HCRPM_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_WARNING0(m)                   {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m);}
-#define HCRPM_TRACE_WARNING1(m,p1)                {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1);}
-#define HCRPM_TRACE_WARNING2(m,p1,p2)             {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define HCRPM_TRACE_WARNING3(m,p1,p2,p3)          {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define HCRPM_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_API0(m)                       {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_API, m);}
-#define HCRPM_TRACE_API1(m,p1)                    {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_API, m, p1);}
-#define HCRPM_TRACE_API2(m,p1,p2)                 {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2);}
-#define HCRPM_TRACE_API3(m,p1,p2,p3)              {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define HCRPM_TRACE_API4(m,p1,p2,p3,p4)           {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_EVENT0(m)                     {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m);}
-#define HCRPM_TRACE_EVENT1(m,p1)                  {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m, p1);}
-#define HCRPM_TRACE_EVENT2(m,p1,p2)               {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define HCRPM_TRACE_EVENT3(m,p1,p2,p3)            {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define HCRPM_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define HCRPM_TRACE_DEBUG0(m)                     {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m);}
-#define HCRPM_TRACE_DEBUG1(m,p1)                  {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1);}
-#define HCRPM_TRACE_DEBUG2(m,p1,p2)               {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define HCRPM_TRACE_DEBUG3(m,p1,p2,p3)            {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define HCRPM_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define HCRPM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define HCRPM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (hcrpm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_HCRP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for RPC */
-
-#define RPC_TRACE_ERROR0(m)                      {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, (m));}
-#define RPC_TRACE_ERROR1(m,p1)                   {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1));}
-#define RPC_TRACE_ERROR2(m,p1,p2)                {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_ERROR3(m,p1,p2,p3)             {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (rpc_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_WARNING0(m)                    {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, (m));}
-#define RPC_TRACE_WARNING1(m,p1)                 {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1));}
-#define RPC_TRACE_WARNING2(m,p1,p2)              {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_WARNING3(m,p1,p2,p3)           {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (rpc_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_API0(m)                        {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, (m));}
-#define RPC_TRACE_API1(m,p1)                     {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1));}
-#define RPC_TRACE_API2(m,p1,p2)                  {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_API3(m,p1,p2,p3)               {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_API4(m,p1,p2,p3,p4)            {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (rpc_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_EVENT0(m)                      {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, (m));}
-#define RPC_TRACE_EVENT1(m,p1)                   {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1));}
-#define RPC_TRACE_EVENT2(m,p1,p2)                {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_EVENT3(m,p1,p2,p3)             {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (rpc_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define RPC_TRACE_DEBUG0(m)                      {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, (m));}
-#define RPC_TRACE_DEBUG1(m,p1)                   {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1));}
-#define RPC_TRACE_DEBUG2(m,p1,p2)                {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define RPC_TRACE_DEBUG3(m,p1,p2,p3)             {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define RPC_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define RPC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define RPC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (rpc_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_RPC | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define HIDH_TRACE_ERROR(...)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define HIDH_TRACE_WARNING(...)                   {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define HIDH_TRACE_API(...)                       {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define HIDH_TRACE_EVENT(...)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define HIDH_TRACE_DEBUG(...)                     {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* define traces for BNEP */
 
-#define BNEP_TRACE_ERROR0(m)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m);}
-#define BNEP_TRACE_ERROR1(m,p1)                  {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m, p1);}
-#define BNEP_TRACE_ERROR2(m,p1,p2)               {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define BNEP_TRACE_ERROR3(m,p1,p2,p3)            {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define BNEP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_WARNING0(m)                   {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m);}
-#define BNEP_TRACE_WARNING1(m,p1)                {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1);}
-#define BNEP_TRACE_WARNING2(m,p1,p2)             {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define BNEP_TRACE_WARNING3(m,p1,p2,p3)          {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define BNEP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_API0(m)                       {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_API, m);}
-#define BNEP_TRACE_API1(m,p1)                    {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_API, m, p1);}
-#define BNEP_TRACE_API2(m,p1,p2)                 {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2);}
-#define BNEP_TRACE_API3(m,p1,p2,p3)              {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define BNEP_TRACE_API4(m,p1,p2,p3,p4)           {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_EVENT0(m)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m);}
-#define BNEP_TRACE_EVENT1(m,p1)                  {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m, p1);}
-#define BNEP_TRACE_EVENT2(m,p1,p2)               {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define BNEP_TRACE_EVENT3(m,p1,p2,p3)            {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define BNEP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define BNEP_TRACE_DEBUG0(m)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m);}
-#define BNEP_TRACE_DEBUG1(m,p1)                  {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1);}
-#define BNEP_TRACE_DEBUG2(m,p1,p2)               {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define BNEP_TRACE_DEBUG3(m,p1,p2,p3)            {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define BNEP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define BNEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define BNEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define BNEP_TRACE_ERROR(...)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BNEP_TRACE_WARNING(...)                   {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BNEP_TRACE_API(...)                       {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BNEP_TRACE_EVENT(...)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BNEP_TRACE_DEBUG(...)                     {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* define traces for PAN */
 
-#define PAN_TRACE_ERROR0(m)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m);}
-#define PAN_TRACE_ERROR1(m,p1)                  {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m, p1);}
-#define PAN_TRACE_ERROR2(m,p1,p2)               {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2);}
-#define PAN_TRACE_ERROR3(m,p1,p2,p3)            {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define PAN_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define PAN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_WARNING0(m)                   {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m);}
-#define PAN_TRACE_WARNING1(m,p1)                {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1);}
-#define PAN_TRACE_WARNING2(m,p1,p2)             {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2);}
-#define PAN_TRACE_WARNING3(m,p1,p2,p3)          {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define PAN_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define PAN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_API0(m)                       {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_API, m);}
-#define PAN_TRACE_API1(m,p1)                    {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_API, m, p1);}
-#define PAN_TRACE_API2(m,p1,p2)                 {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2);}
-#define PAN_TRACE_API3(m,p1,p2,p3)              {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3);}
-#define PAN_TRACE_API4(m,p1,p2,p3,p4)           {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define PAN_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_EVENT0(m)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m);}
-#define PAN_TRACE_EVENT1(m,p1)                  {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m, p1);}
-#define PAN_TRACE_EVENT2(m,p1,p2)               {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2);}
-#define PAN_TRACE_EVENT3(m,p1,p2,p3)            {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define PAN_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define PAN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define PAN_TRACE_DEBUG0(m)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m);}
-#define PAN_TRACE_DEBUG1(m,p1)                  {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1);}
-#define PAN_TRACE_DEBUG2(m,p1,p2)               {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define PAN_TRACE_DEBUG3(m,p1,p2,p3)            {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define PAN_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define PAN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define PAN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* define traces for SIM */
-
-#define SAP_TRACE_ERROR0(m)                     {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m);}
-#define SAP_TRACE_ERROR1(m,p1)                  {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m, p1);}
-#define SAP_TRACE_ERROR2(m,p1,p2)               {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SAP_TRACE_ERROR3(m,p1,p2,p3)            {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SAP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (sap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_WARNING0(m)                   {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m);}
-#define SAP_TRACE_WARNING1(m,p1)                {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1);}
-#define SAP_TRACE_WARNING2(m,p1,p2)             {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SAP_TRACE_WARNING3(m,p1,p2,p3)          {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SAP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_API0(m)                       {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_API, m);}
-#define SAP_TRACE_API1(m,p1)                    {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_API, m, p1);}
-#define SAP_TRACE_API2(m,p1,p2)                 {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2);}
-#define SAP_TRACE_API3(m,p1,p2,p3)              {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SAP_TRACE_API4(m,p1,p2,p3,p4)           {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SAP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (sap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_EVENT0(m)                     {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m);}
-#define SAP_TRACE_EVENT1(m,p1)                  {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m, p1);}
-#define SAP_TRACE_EVENT2(m,p1,p2)               {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SAP_TRACE_EVENT3(m,p1,p2,p3)            {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SAP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (sap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SAP_TRACE_DEBUG0(m)                     {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m);}
-#define SAP_TRACE_DEBUG1(m,p1)                  {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1);}
-#define SAP_TRACE_DEBUG2(m,p1,p2)               {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SAP_TRACE_DEBUG3(m,p1,p2,p3)            {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SAP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (sap_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SAP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for OPP profile
-*/
-#define OPP_TRACE_ERROR0(m)                      {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m);}
-#define OPP_TRACE_ERROR1(m,p1)                   {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1);}
-#define OPP_TRACE_ERROR2(m,p1,p2)                {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define OPP_TRACE_ERROR3(m,p1,p2,p3)             {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define OPP_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define OPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (opp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_WARNING0(m)                    {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m);}
-#define OPP_TRACE_WARNING1(m,p1)                 {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1);}
-#define OPP_TRACE_WARNING2(m,p1,p2)              {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define OPP_TRACE_WARNING3(m,p1,p2,p3)           {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define OPP_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define OPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (opp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_EVENT0(m)                      {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m);}
-#define OPP_TRACE_EVENT1(m,p1)                   {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m, p1);}
-#define OPP_TRACE_EVENT2(m,p1,p2)                {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define OPP_TRACE_EVENT3(m,p1,p2,p3)             {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define OPP_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define OPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (opp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define OPP_TRACE_DEBUG0(m)                      {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m);}
-#define OPP_TRACE_DEBUG1(m,p1)                   {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1);}
-#define OPP_TRACE_DEBUG2(m,p1,p2)                {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define OPP_TRACE_DEBUG3(m,p1,p2,p3)             {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define OPP_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define OPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define OPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (opp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_OPP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for FTP profile
-*/
-#define FTP_TRACE_ERROR0(m)                      {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m);}
-#define FTP_TRACE_ERROR1(m,p1)                   {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1);}
-#define FTP_TRACE_ERROR2(m,p1,p2)                {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define FTP_TRACE_ERROR3(m,p1,p2,p3)             {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define FTP_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define FTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_WARNING0(m)                    {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m);}
-#define FTP_TRACE_WARNING1(m,p1)                 {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1);}
-#define FTP_TRACE_WARNING2(m,p1,p2)              {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define FTP_TRACE_WARNING3(m,p1,p2,p3)           {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define FTP_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define FTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_EVENT0(m)                      {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m);}
-#define FTP_TRACE_EVENT1(m,p1)                   {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m, p1);}
-#define FTP_TRACE_EVENT2(m,p1,p2)                {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define FTP_TRACE_EVENT3(m,p1,p2,p3)             {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define FTP_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define FTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define FTP_TRACE_DEBUG0(m)                      {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m);}
-#define FTP_TRACE_DEBUG1(m,p1)                   {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1);}
-#define FTP_TRACE_DEBUG2(m,p1,p2)                {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define FTP_TRACE_DEBUG3(m,p1,p2,p3)             {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define FTP_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define FTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define FTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (ftp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_FTP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define PAN_TRACE_ERROR(...)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define PAN_TRACE_WARNING(...)                   {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define PAN_TRACE_API(...)                       {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define PAN_TRACE_EVENT(...)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define PAN_TRACE_DEBUG(...)                     {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* Define tracing for the A2DP profile
 */
-#define A2D_TRACE_ERROR0(m)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m);}
-#define A2D_TRACE_ERROR1(m,p1)                   {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1);}
-#define A2D_TRACE_ERROR2(m,p1,p2)                {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2);}
-#define A2D_TRACE_ERROR3(m,p1,p2,p3)             {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define A2D_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define A2D_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_WARNING0(m)                    {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m);}
-#define A2D_TRACE_WARNING1(m,p1)                 {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1);}
-#define A2D_TRACE_WARNING2(m,p1,p2)              {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2);}
-#define A2D_TRACE_WARNING3(m,p1,p2,p3)           {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define A2D_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define A2D_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_EVENT0(m)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m);}
-#define A2D_TRACE_EVENT1(m,p1)                   {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m, p1);}
-#define A2D_TRACE_EVENT2(m,p1,p2)                {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2);}
-#define A2D_TRACE_EVENT3(m,p1,p2,p3)             {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define A2D_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define A2D_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_DEBUG0(m)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m);}
-#define A2D_TRACE_DEBUG1(m,p1)                   {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1);}
-#define A2D_TRACE_DEBUG2(m,p1,p2)                {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define A2D_TRACE_DEBUG3(m,p1,p2,p3)             {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define A2D_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define A2D_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define A2D_TRACE_API0(m)                        {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_A2D, TRACE_TYPE_API,m);}
-#define A2D_TRACE_API1(m,p1)                     {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_A2D, TRACE_TYPE_API,m, p1);}
-#define A2D_TRACE_API2(m,p1,p2)                  {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2);}
-#define A2D_TRACE_API3(m,p1,p2,p3)               {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3);}
-#define A2D_TRACE_API4(m,p1,p2,p3,p4)            {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define A2D_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define A2D_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_A2D, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the VDP profile
-*/
-#define VDP_TRACE_ERROR0(m)                      {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m);}
-#define VDP_TRACE_ERROR1(m,p1)                   {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1);}
-#define VDP_TRACE_ERROR2(m,p1,p2)                {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2);}
-#define VDP_TRACE_ERROR3(m,p1,p2,p3)             {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define VDP_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define VDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_WARNING0(m)                    {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m);}
-#define VDP_TRACE_WARNING1(m,p1)                 {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1);}
-#define VDP_TRACE_WARNING2(m,p1,p2)              {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2);}
-#define VDP_TRACE_WARNING3(m,p1,p2,p3)           {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define VDP_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define VDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_EVENT0(m)                      {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m);}
-#define VDP_TRACE_EVENT1(m,p1)                   {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m, p1);}
-#define VDP_TRACE_EVENT2(m,p1,p2)                {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2);}
-#define VDP_TRACE_EVENT3(m,p1,p2,p3)             {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define VDP_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define VDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_DEBUG0(m)                      {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m);}
-#define VDP_TRACE_DEBUG1(m,p1)                   {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1);}
-#define VDP_TRACE_DEBUG2(m,p1,p2)                {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define VDP_TRACE_DEBUG3(m,p1,p2,p3)             {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define VDP_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define VDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define VDP_TRACE_API0(m)                        {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API,m);}
-#define VDP_TRACE_API1(m,p1)                     {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API,m, p1);}
-#define VDP_TRACE_API2(m,p1,p2)                  {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2);}
-#define VDP_TRACE_API3(m,p1,p2,p3)               {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3);}
-#define VDP_TRACE_API4(m,p1,p2,p3,p4)            {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define VDP_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define VDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (vdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
-
-
-/* Define tracing for the LM unit
-*/
-#define LMP_TRACE_ERROR0(m)                     {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m);}
-#define LMP_TRACE_ERROR1(m,p1)                  {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1);}
-#define LMP_TRACE_ERROR2(m,p1,p2)               {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LMP_TRACE_ERROR3(m,p1,p2,p3)            {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LMP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (lmp_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_WARNING0(m)                   {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m);}
-#define LMP_TRACE_WARNING1(m,p1)                {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1);}
-#define LMP_TRACE_WARNING2(m,p1,p2)             {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LMP_TRACE_WARNING3(m,p1,p2,p3)          {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LMP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (lmp_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_EVENT0(m)                     {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m);}
-#define LMP_TRACE_EVENT1(m,p1)                  {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m, p1);}
-#define LMP_TRACE_EVENT2(m,p1,p2)               {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LMP_TRACE_EVENT3(m,p1,p2,p3)            {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LMP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (lmp_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LMP_TRACE_DEBUG0(m)                     {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m);}
-#define LMP_TRACE_DEBUG1(m,p1)                  {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1);}
-#define LMP_TRACE_DEBUG2(m,p1,p2)               {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LMP_TRACE_DEBUG3(m,p1,p2,p3)            {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LMP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define LMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (lmp_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_LM, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the LC unit
-*/
-#define LC_TRACE_ERROR0(m)                     {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m);}
-#define LC_TRACE_ERROR1(m,p1)                  {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1);}
-#define LC_TRACE_ERROR2(m,p1,p2)               {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2);}
-#define LC_TRACE_ERROR3(m,p1,p2,p3)            {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define LC_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define LC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_ERROR]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_WARNING0(m)                   {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m);}
-#define LC_TRACE_WARNING1(m,p1)                {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1);}
-#define LC_TRACE_WARNING2(m,p1,p2)             {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2);}
-#define LC_TRACE_WARNING3(m,p1,p2,p3)          {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define LC_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define LC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_WARNING]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_EVENT0(m)                     {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m);}
-#define LC_TRACE_EVENT1(m,p1)                  {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m, p1);}
-#define LC_TRACE_EVENT2(m,p1,p2)               {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2);}
-#define LC_TRACE_EVENT3(m,p1,p2,p3)            {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define LC_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_4(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define LC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_EVENT]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define LC_TRACE_DEBUG0(m)                     {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_0(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m);}
-#define LC_TRACE_DEBUG1(m,p1)                  {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_1(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1);}
-#define LC_TRACE_DEBUG2(m,p1,p2)               {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_2(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define LC_TRACE_DEBUG3(m,p1,p2,p3)            {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_3(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define LC_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_5(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define LC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (lc_trace_level & trace_map[BT_TRACE_LEVEL_DEBUG]) BT_TRACE_6(TRACE_LAYER_LC, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the Serial Dongle Application SDA
-*/
-#define SDA_TRACE_ERROR0(m)                     {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(m);}
-#define SDA_TRACE_ERROR1(m,p1)                  {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_ERROR2(m,p1,p2)               {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_ERROR3(m,p1,p2,p3)            {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_WARNING0(m)                   {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(m);}
-#define SDA_TRACE_WARNING1(m,p1)                {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_WARNING2(m,p1,p2)             {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_WARNING3(m,p1,p2,p3)          {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_EVENT0(m)                     {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(m);}
-#define SDA_TRACE_EVENT1(m,p1)                  {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(m, p1);}
-#define SDA_TRACE_EVENT2(m,p1,p2)               {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_EVENT3(m,p1,p2,p3)            {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
-
-#define SDA_TRACE_DEBUG0(m)                     {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(m);}
-#define SDA_TRACE_DEBUG1(m,p1)                  {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(m,p1);}
-#define SDA_TRACE_DEBUG2(m,p1,p2)               {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(m,p1,p2);}
-#define SDA_TRACE_DEBUG3(m,p1,p2,p3)            {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(m,p1,p2,p3);}
-#define SDA_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(m,p1,p2,p3,p4);}
-#define SDA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(m,p1,p2,p3,p4,p5);}
-#define SDA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (sda_config_cb.sda_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(m,p1,p2,p3,p4,p5,p6);}
+#define A2D_TRACE_ERROR(...)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,##__VA_ARGS__);}
+#define A2D_TRACE_WARNING(...)                    {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,##__VA_ARGS__);}
+#define A2D_TRACE_EVENT(...)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,##__VA_ARGS__);}
+#define A2D_TRACE_DEBUG(...)                      {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,##__VA_ARGS__);}
+#define A2D_TRACE_API(...)                        {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_API,##__VA_ARGS__);}
 
 /* AVDTP
 */
-#define AVDT_TRACE_ERROR0(m)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m);}
-#define AVDT_TRACE_ERROR1(m,p1)                  {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1);}
-#define AVDT_TRACE_ERROR2(m,p1,p2)               {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AVDT_TRACE_ERROR3(m,p1,p2,p3)            {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AVDT_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_WARNING0(m)                   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m);}
-#define AVDT_TRACE_WARNING1(m,p1)                {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1);}
-#define AVDT_TRACE_WARNING2(m,p1,p2)             {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AVDT_TRACE_WARNING3(m,p1,p2,p3)          {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AVDT_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_EVENT0(m)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m);}
-#define AVDT_TRACE_EVENT1(m,p1)                  {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m, p1);}
-#define AVDT_TRACE_EVENT2(m,p1,p2)               {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AVDT_TRACE_EVENT3(m,p1,p2,p3)            {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AVDT_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_DEBUG0(m)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m);}
-#define AVDT_TRACE_DEBUG1(m,p1)                  {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1);}
-#define AVDT_TRACE_DEBUG2(m,p1,p2)               {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AVDT_TRACE_DEBUG3(m,p1,p2,p3)            {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AVDT_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVDT_TRACE_API0(m)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API, m);}
-#define AVDT_TRACE_API1(m,p1)                  {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1);}
-#define AVDT_TRACE_API2(m,p1,p2)               {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2);}
-#define AVDT_TRACE_API3(m,p1,p2,p3)            {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AVDT_TRACE_API4(m,p1,p2,p3,p4)         {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AVDT_TRACE_API5(m,p1,p2,p3,p4,p5)      {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AVDT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
+#define AVDT_TRACE_ERROR(...)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVDT_TRACE_WARNING(...)                   {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVDT_TRACE_EVENT(...)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVDT_TRACE_DEBUG(...)                     {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVDT_TRACE_API(...)                       {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
 
 /* Define tracing for the AVCTP protocol
 */
-#define AVCT_TRACE_ERROR0(m)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m);}
-#define AVCT_TRACE_ERROR1(m,p1)                  {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1);}
-#define AVCT_TRACE_ERROR2(m,p1,p2)               {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AVCT_TRACE_ERROR3(m,p1,p2,p3)            {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AVCT_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_WARNING0(m)                   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m);}
-#define AVCT_TRACE_WARNING1(m,p1)                {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1);}
-#define AVCT_TRACE_WARNING2(m,p1,p2)             {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AVCT_TRACE_WARNING3(m,p1,p2,p3)          {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AVCT_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_EVENT0(m)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m);}
-#define AVCT_TRACE_EVENT1(m,p1)                  {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m, p1);}
-#define AVCT_TRACE_EVENT2(m,p1,p2)               {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AVCT_TRACE_EVENT3(m,p1,p2,p3)            {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AVCT_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_DEBUG0(m)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m);}
-#define AVCT_TRACE_DEBUG1(m,p1)                  {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1);}
-#define AVCT_TRACE_DEBUG2(m,p1,p2)               {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AVCT_TRACE_DEBUG3(m,p1,p2,p3)            {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AVCT_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define AVCT_TRACE_API0(m)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API, m);}
-#define AVCT_TRACE_API1(m,p1)                  {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1);}
-#define AVCT_TRACE_API2(m,p1,p2)               {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2);}
-#define AVCT_TRACE_API3(m,p1,p2,p3)            {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AVCT_TRACE_API4(m,p1,p2,p3,p4)         {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AVCT_TRACE_API5(m,p1,p2,p3,p4,p5)      {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AVCT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
+#define AVCT_TRACE_ERROR(...)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVCT_TRACE_WARNING(...)                   {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVCT_TRACE_EVENT(...)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVCT_TRACE_DEBUG(...)                     {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVCT_TRACE_API(...)                       {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
 
 /* Define tracing for the AVRCP profile
 */
-#define AVRC_TRACE_ERROR0(m)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m);}
-#define AVRC_TRACE_ERROR1(m,p1)                   {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1);}
-#define AVRC_TRACE_ERROR2(m,p1,p2)                {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2);}
-#define AVRC_TRACE_ERROR3(m,p1,p2,p3)             {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3);}
-#define AVRC_TRACE_ERROR4(m,p1,p2,p3,p4)          {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_WARNING0(m)                    {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m);}
-#define AVRC_TRACE_WARNING1(m,p1)                 {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1);}
-#define AVRC_TRACE_WARNING2(m,p1,p2)              {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2);}
-#define AVRC_TRACE_WARNING3(m,p1,p2,p3)           {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3);}
-#define AVRC_TRACE_WARNING4(m,p1,p2,p3,p4)        {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)     {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)  {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_WARNING,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_EVENT0(m)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m);}
-#define AVRC_TRACE_EVENT1(m,p1)                   {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m, p1);}
-#define AVRC_TRACE_EVENT2(m,p1,p2)                {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2);}
-#define AVRC_TRACE_EVENT3(m,p1,p2,p3)             {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3);}
-#define AVRC_TRACE_EVENT4(m,p1,p2,p3,p4)          {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)       {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)    {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_EVENT,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_DEBUG0(m)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m);}
-#define AVRC_TRACE_DEBUG1(m,p1)                   {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1);}
-#define AVRC_TRACE_DEBUG2(m,p1,p2)                {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2);}
-#define AVRC_TRACE_DEBUG3(m,p1,p2,p3)             {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3);}
-#define AVRC_TRACE_DEBUG4(m,p1,p2,p3,p4)          {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)       {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)    {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG,m,p1,p2,p3,p4,p5,p6);}
-
-#define AVRC_TRACE_API0(m)                        {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AVP, TRACE_TYPE_API,m);}
-#define AVRC_TRACE_API1(m,p1)                     {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AVP, TRACE_TYPE_API,m, p1);}
-#define AVRC_TRACE_API2(m,p1,p2)                  {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2);}
-#define AVRC_TRACE_API3(m,p1,p2,p3)               {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3);}
-#define AVRC_TRACE_API4(m,p1,p2,p3,p4)            {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4);}
-#define AVRC_TRACE_API5(m,p1,p2,p3,p4,p5)         {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5);}
-#define AVRC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AVP, TRACE_TYPE_API,m,p1,p2,p3,p4,p5,p6);}
+#define AVRC_TRACE_ERROR(...)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define AVRC_TRACE_WARNING(...)                    {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define AVRC_TRACE_EVENT(...)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define AVRC_TRACE_DEBUG(...)                      {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define AVRC_TRACE_API(...)                        {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);}
 
 /* MCAP
 */
-#define MCA_TRACE_ERROR0(m)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m);}
-#define MCA_TRACE_ERROR1(m,p1)                  {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1);}
-#define MCA_TRACE_ERROR2(m,p1,p2)               {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2);}
-#define MCA_TRACE_ERROR3(m,p1,p2,p3)            {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define MCA_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define MCA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_WARNING0(m)                   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m);}
-#define MCA_TRACE_WARNING1(m,p1)                {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1);}
-#define MCA_TRACE_WARNING2(m,p1,p2)             {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2);}
-#define MCA_TRACE_WARNING3(m,p1,p2,p3)          {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define MCA_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define MCA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_EVENT0(m)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m);}
-#define MCA_TRACE_EVENT1(m,p1)                  {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m, p1);}
-#define MCA_TRACE_EVENT2(m,p1,p2)               {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2);}
-#define MCA_TRACE_EVENT3(m,p1,p2,p3)            {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define MCA_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define MCA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_DEBUG0(m)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m);}
-#define MCA_TRACE_DEBUG1(m,p1)                  {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1);}
-#define MCA_TRACE_DEBUG2(m,p1,p2)               {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define MCA_TRACE_DEBUG3(m,p1,p2,p3)            {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define MCA_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define MCA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
-
-#define MCA_TRACE_API0(m)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_MCA, TRACE_TYPE_API, m);}
-#define MCA_TRACE_API1(m,p1)                  {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1);}
-#define MCA_TRACE_API2(m,p1,p2)               {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2);}
-#define MCA_TRACE_API3(m,p1,p2,p3)            {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3);}
-#define MCA_TRACE_API4(m,p1,p2,p3,p4)         {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define MCA_TRACE_API5(m,p1,p2,p3,p4,p5)      {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define MCA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_MCA, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-/* Define tracing for the AMP unit
-*/
-#define AMP_TRACE_ERROR0(m)                     {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m);}
-#define AMP_TRACE_ERROR1(m,p1)                  {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1);}
-#define AMP_TRACE_ERROR2(m,p1,p2)               {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define AMP_TRACE_ERROR3(m,p1,p2,p3)            {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define AMP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define AMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (amp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_WARNING0(m)                   {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m);}
-#define AMP_TRACE_WARNING1(m,p1)                {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1);}
-#define AMP_TRACE_WARNING2(m,p1,p2)             {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define AMP_TRACE_WARNING3(m,p1,p2,p3)          {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define AMP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define AMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (amp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_API0(m)                       {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_API, m);}
-#define AMP_TRACE_API1(m,p1)                    {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1);}
-#define AMP_TRACE_API2(m,p1,p2)                 {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2);}
-#define AMP_TRACE_API3(m,p1,p2,p3)              {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define AMP_TRACE_API4(m,p1,p2,p3,p4)           {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define AMP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (amp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_EVENT0(m)                     {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m);}
-#define AMP_TRACE_EVENT1(m,p1)                  {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m, p1);}
-#define AMP_TRACE_EVENT2(m,p1,p2)               {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define AMP_TRACE_EVENT3(m,p1,p2,p3)            {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define AMP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define AMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (amp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define AMP_TRACE_DEBUG0(m)                     {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m);}
-#define AMP_TRACE_DEBUG1(m,p1)                  {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1);}
-#define AMP_TRACE_DEBUG2(m,p1,p2)               {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define AMP_TRACE_DEBUG3(m,p1,p2,p3)            {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define AMP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define AMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define AMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (amp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_AMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define MCA_TRACE_ERROR(...)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define MCA_TRACE_WARNING(...)                   {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define MCA_TRACE_EVENT(...)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define MCA_TRACE_DEBUG(...)                     {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define MCA_TRACE_API(...)                       {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_API, ##__VA_ARGS__);}
 
 /* Define tracing for the ATT/GATT unit
 */
-#define GATT_TRACE_ERROR0(m)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m);}
-#define GATT_TRACE_ERROR1(m,p1)                  {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1);}
-#define GATT_TRACE_ERROR2(m,p1,p2)               {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2);}
-#define GATT_TRACE_ERROR3(m,p1,p2,p3)            {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define GATT_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define GATT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_WARNING0(m)                   {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m);}
-#define GATT_TRACE_WARNING1(m,p1)                {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1);}
-#define GATT_TRACE_WARNING2(m,p1,p2)             {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2);}
-#define GATT_TRACE_WARNING3(m,p1,p2,p3)          {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define GATT_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define GATT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_API0(m)                       {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_API, m);}
-#define GATT_TRACE_API1(m,p1)                    {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1);}
-#define GATT_TRACE_API2(m,p1,p2)                 {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2);}
-#define GATT_TRACE_API3(m,p1,p2,p3)              {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3);}
-#define GATT_TRACE_API4(m,p1,p2,p3,p4)           {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define GATT_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_EVENT0(m)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m);}
-#define GATT_TRACE_EVENT1(m,p1)                  {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m, p1);}
-#define GATT_TRACE_EVENT2(m,p1,p2)               {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2);}
-#define GATT_TRACE_EVENT3(m,p1,p2,p3)            {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define GATT_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define GATT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define GATT_TRACE_DEBUG0(m)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m);}
-#define GATT_TRACE_DEBUG1(m,p1)                  {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1);}
-#define GATT_TRACE_DEBUG2(m,p1,p2)               {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define GATT_TRACE_DEBUG3(m,p1,p2,p3)            {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define GATT_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define GATT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define GATT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define GATT_TRACE_ERROR(...)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define GATT_TRACE_WARNING(...)                   {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define GATT_TRACE_API(...)                       {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define GATT_TRACE_EVENT(...)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define GATT_TRACE_DEBUG(...)                     {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* Define tracing for the SMP unit
 */
-#define SMP_TRACE_ERROR0(m)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m);}
-#define SMP_TRACE_ERROR1(m,p1)                  {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1);}
-#define SMP_TRACE_ERROR2(m,p1,p2)               {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2);}
-#define SMP_TRACE_ERROR3(m,p1,p2,p3)            {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3);}
-#define SMP_TRACE_ERROR4(m,p1,p2,p3,p4)         {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4);}
-#define SMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)      {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)   {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_WARNING0(m)                   {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m);}
-#define SMP_TRACE_WARNING1(m,p1)                {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1);}
-#define SMP_TRACE_WARNING2(m,p1,p2)             {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2);}
-#define SMP_TRACE_WARNING3(m,p1,p2,p3)          {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3);}
-#define SMP_TRACE_WARNING4(m,p1,p2,p3,p4)       {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4);}
-#define SMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)    {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_API0(m)                       {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_API, m);}
-#define SMP_TRACE_API1(m,p1)                    {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1);}
-#define SMP_TRACE_API2(m,p1,p2)                 {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2);}
-#define SMP_TRACE_API3(m,p1,p2,p3)              {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3);}
-#define SMP_TRACE_API4(m,p1,p2,p3,p4)           {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4);}
-#define SMP_TRACE_API5(m,p1,p2,p3,p4,p5)        {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_API, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_EVENT0(m)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m);}
-#define SMP_TRACE_EVENT1(m,p1)                  {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m, p1);}
-#define SMP_TRACE_EVENT2(m,p1,p2)               {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2);}
-#define SMP_TRACE_EVENT3(m,p1,p2,p3)            {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3);}
-#define SMP_TRACE_EVENT4(m,p1,p2,p3,p4)         {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4);}
-#define SMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)      {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)   {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, m,p1,p2,p3,p4,p5,p6);}
-
-#define SMP_TRACE_DEBUG0(m)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_0(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m);}
-#define SMP_TRACE_DEBUG1(m,p1)                  {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_1(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1);}
-#define SMP_TRACE_DEBUG2(m,p1,p2)               {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_2(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2);}
-#define SMP_TRACE_DEBUG3(m,p1,p2,p3)            {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_3(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3);}
-#define SMP_TRACE_DEBUG4(m,p1,p2,p3,p4)         {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_4(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4);}
-#define SMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)      {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_5(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5);}
-#define SMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)   {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE_6(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, m,p1,p2,p3,p4,p5,p6);}
+#define SMP_TRACE_ERROR(...)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define SMP_TRACE_WARNING(...)                   {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define SMP_TRACE_API(...)                       {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_API, ##__VA_ARGS__);}
+#define SMP_TRACE_EVENT(...)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define SMP_TRACE_DEBUG(...)                     {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 /* END OF USE TRACES */
 #else
 
-#define BT_TRACE_0(l,t,m)
-#define BT_TRACE_1(l,t,m,p1)
-#define BT_TRACE_2(l,t,m,p1,p2)
-#define BT_TRACE_3(l,t,m,p1,p2,p3)
-#define BT_TRACE_4(l,t,m,p1,p2,p3,p4)
-#define BT_TRACE_5(l,t,m,p1,p2,p3,p4,p5)
-#define BT_TRACE_6(l,t,m,p1,p2,p3,p4,p5,p6)
-
-#define BT_ERROR_TRACE_0(l,m)
-#define BT_ERROR_TRACE_1(l,m,p1)
-#define BT_ERROR_TRACE_2(l,m,p1,p2)
-#define BT_ERROR_TRACE_3(l,m,p1,p2,p3)
+#define BT_TRACE(l,t,...)
+#define BT_BT_ERROR_TRACE(l,...)
 
 /* Define tracing for the HCI unit
 */
-#define HCI_TRACE_ERROR0(m)
-#define HCI_TRACE_ERROR1(m,p1)
-#define HCI_TRACE_ERROR2(m,p1,p2)
-#define HCI_TRACE_ERROR3(m,p1,p2,p3)
-#define HCI_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_WARNING0(m)
-#define HCI_TRACE_WARNING1(m,p1)
-#define HCI_TRACE_WARNING2(m,p1,p2)
-#define HCI_TRACE_WARNING3(m,p1,p2,p3)
-#define HCI_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_EVENT0(m)
-#define HCI_TRACE_EVENT1(m,p1)
-#define HCI_TRACE_EVENT2(m,p1,p2)
-#define HCI_TRACE_EVENT3(m,p1,p2,p3)
-#define HCI_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCI_TRACE_DEBUG0(m)
-#define HCI_TRACE_DEBUG1(m,p1)
-#define HCI_TRACE_DEBUG2(m,p1,p2)
-#define HCI_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCI_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define HCI_TRACE_ERROR(...)
+#define HCI_TRACE_WARNING(...)
+#define HCI_TRACE_EVENT(...)
+#define HCI_TRACE_DEBUG(...)
 
 
 /* Define tracing for BTM
 */
-#define BTM_TRACE_ERROR0(m)
-#define BTM_TRACE_ERROR1(m,p1)
-#define BTM_TRACE_ERROR2(m,p1,p2)
-#define BTM_TRACE_ERROR3(m,p1,p2,p3)
-#define BTM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BTM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_WARNING0(m)
-#define BTM_TRACE_WARNING1(m,p1)
-#define BTM_TRACE_WARNING2(m,p1,p2)
-#define BTM_TRACE_WARNING3(m,p1,p2,p3)
-#define BTM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BTM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_API0(m)
-#define BTM_TRACE_API1(m,p1)
-#define BTM_TRACE_API2(m,p1,p2)
-#define BTM_TRACE_API3(m,p1,p2,p3)
-#define BTM_TRACE_API4(m,p1,p2,p3,p4)
-#define BTM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_EVENT0(m)
-#define BTM_TRACE_EVENT1(m,p1)
-#define BTM_TRACE_EVENT2(m,p1,p2)
-#define BTM_TRACE_EVENT3(m,p1,p2,p3)
-#define BTM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BTM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTM_TRACE_DEBUG0(m)
-#define BTM_TRACE_DEBUG1(m,p1)
-#define BTM_TRACE_DEBUG2(m,p1,p2)
-#define BTM_TRACE_DEBUG3(m,p1,p2,p3)
-#define BTM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BTM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BTM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define BTM_TRACE_ERROR(...)
+#define BTM_TRACE_WARNING(...)
+#define BTM_TRACE_API(...)
+#define BTM_TRACE_EVENT(...)
+#define BTM_TRACE_DEBUG(...)
 
 
 /* Define tracing for the L2CAP unit
 */
-#define L2CAP_TRACE_ERROR0(m)
-#define L2CAP_TRACE_ERROR1(m,p1)
-#define L2CAP_TRACE_ERROR2(m,p1,p2)
-#define L2CAP_TRACE_ERROR3(m,p1,p2,p3)
-#define L2CAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_WARNING0(m)
-#define L2CAP_TRACE_WARNING1(m,p1)
-#define L2CAP_TRACE_WARNING2(m,p1,p2)
-#define L2CAP_TRACE_WARNING3(m,p1,p2,p3)
-#define L2CAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_API0(m)
-#define L2CAP_TRACE_API1(m,p1)
-#define L2CAP_TRACE_API2(m,p1,p2)
-#define L2CAP_TRACE_API3(m,p1,p2,p3)
-#define L2CAP_TRACE_API4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_EVENT0(m)
-#define L2CAP_TRACE_EVENT1(m,p1)
-#define L2CAP_TRACE_EVENT2(m,p1,p2)
-#define L2CAP_TRACE_EVENT3(m,p1,p2,p3)
-#define L2CAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define L2CAP_TRACE_DEBUG0(m)
-#define L2CAP_TRACE_DEBUG1(m,p1)
-#define L2CAP_TRACE_DEBUG2(m,p1,p2)
-#define L2CAP_TRACE_DEBUG3(m,p1,p2,p3)
-#define L2CAP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define L2CAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define L2CAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the LLCP unit
-*/
-#define LLCP_TRACE_ERROR0(m)
-#define LLCP_TRACE_ERROR1(m,p1)
-#define LLCP_TRACE_ERROR2(m,p1,p2)
-#define LLCP_TRACE_ERROR3(m,p1,p2,p3)
-#define LLCP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_WARNING0(m)
-#define LLCP_TRACE_WARNING1(m,p1)
-#define LLCP_TRACE_WARNING2(m,p1,p2)
-#define LLCP_TRACE_WARNING3(m,p1,p2,p3)
-#define LLCP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_API0(m)
-#define LLCP_TRACE_API1(m,p1)
-#define LLCP_TRACE_API2(m,p1,p2)
-#define LLCP_TRACE_API3(m,p1,p2,p3)
-#define LLCP_TRACE_API4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_EVENT0(m)
-#define LLCP_TRACE_EVENT1(m,p1)
-#define LLCP_TRACE_EVENT2(m,p1,p2)
-#define LLCP_TRACE_EVENT3(m,p1,p2,p3)
-#define LLCP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LLCP_TRACE_DEBUG0(m)
-#define LLCP_TRACE_DEBUG1(m,p1)
-#define LLCP_TRACE_DEBUG2(m,p1,p2)
-#define LLCP_TRACE_DEBUG3(m,p1,p2,p3)
-#define LLCP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LLCP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LLCP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define L2CAP_TRACE_ERROR(...)
+#define L2CAP_TRACE_WARNING(...)
+#define L2CAP_TRACE_API(...)
+#define L2CAP_TRACE_EVENT(...)
+#define L2CAP_TRACE_DEBUG(...)
 
 /* Define tracing for the SDP unit
 */
-#define SDP_TRACE_ERROR0(m)
-#define SDP_TRACE_ERROR1(m,p1)
-#define SDP_TRACE_ERROR2(m,p1,p2)
-#define SDP_TRACE_ERROR3(m,p1,p2,p3)
-#define SDP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_WARNING0(m)
-#define SDP_TRACE_WARNING1(m,p1)
-#define SDP_TRACE_WARNING2(m,p1,p2)
-#define SDP_TRACE_WARNING3(m,p1,p2,p3)
-#define SDP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_API0(m)
-#define SDP_TRACE_API1(m,p1)
-#define SDP_TRACE_API2(m,p1,p2)
-#define SDP_TRACE_API3(m,p1,p2,p3)
-#define SDP_TRACE_API4(m,p1,p2,p3,p4)
-#define SDP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_EVENT0(m)
-#define SDP_TRACE_EVENT1(m,p1)
-#define SDP_TRACE_EVENT2(m,p1,p2)
-#define SDP_TRACE_EVENT3(m,p1,p2,p3)
-#define SDP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDP_TRACE_DEBUG0(m)
-#define SDP_TRACE_DEBUG1(m,p1)
-#define SDP_TRACE_DEBUG2(m,p1,p2)
-#define SDP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SDP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define SDP_TRACE_ERROR(...)
+#define SDP_TRACE_WARNING(...)
+#define SDP_TRACE_API(...)
+#define SDP_TRACE_EVENT(...)
+#define SDP_TRACE_DEBUG(...)
 
 /* Define tracing for the RFCOMM unit
 */
-#define RFCOMM_TRACE_ERROR0(m)
-#define RFCOMM_TRACE_ERROR1(m,p1)
-#define RFCOMM_TRACE_ERROR2(m,p1,p2)
-#define RFCOMM_TRACE_ERROR3(m,p1,p2,p3)
-#define RFCOMM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_WARNING0(m)
-#define RFCOMM_TRACE_WARNING1(m,p1)
-#define RFCOMM_TRACE_WARNING2(m,p1,p2)
-#define RFCOMM_TRACE_WARNING3(m,p1,p2,p3)
-#define RFCOMM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_API0(m)
-#define RFCOMM_TRACE_API1(m,p1)
-#define RFCOMM_TRACE_API2(m,p1,p2)
-#define RFCOMM_TRACE_API3(m,p1,p2,p3)
-#define RFCOMM_TRACE_API4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_EVENT0(m)
-#define RFCOMM_TRACE_EVENT1(m,p1)
-#define RFCOMM_TRACE_EVENT2(m,p1,p2)
-#define RFCOMM_TRACE_EVENT3(m,p1,p2,p3)
-#define RFCOMM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RFCOMM_TRACE_DEBUG0(m)
-#define RFCOMM_TRACE_DEBUG1(m,p1)
-#define RFCOMM_TRACE_DEBUG2(m,p1,p2)
-#define RFCOMM_TRACE_DEBUG3(m,p1,p2,p3)
-#define RFCOMM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RFCOMM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RFCOMM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for Serial Port Profile
-*/
-#define SPP_TRACE_ERROR0(m)
-#define SPP_TRACE_ERROR1(m,p1)
-#define SPP_TRACE_ERROR2(m,p1,p2)
-#define SPP_TRACE_ERROR3(m,p1,p2,p3)
-#define SPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_WARNING0(m)
-#define SPP_TRACE_WARNING1(m,p1)
-#define SPP_TRACE_WARNING2(m,p1,p2)
-#define SPP_TRACE_WARNING3(m,p1,p2,p3)
-#define SPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_EVENT0(m)
-#define SPP_TRACE_EVENT1(m,p1)
-#define SPP_TRACE_EVENT2(m,p1,p2)
-#define SPP_TRACE_EVENT3(m,p1,p2,p3)
-#define SPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_API0(m)
-#define SPP_TRACE_API1(m,p1)
-#define SPP_TRACE_API2(m,p1,p2)
-#define SPP_TRACE_API3(m,p1,p2,p3)
-#define SPP_TRACE_API4(m,p1,p2,p3,p4)
-#define SPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SPP_TRACE_DEBUG0(m)
-#define SPP_TRACE_DEBUG1(m,p1)
-#define SPP_TRACE_DEBUG2(m,p1,p2)
-#define SPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
+#define RFCOMM_TRACE_ERROR(...)
+#define RFCOMM_TRACE_WARNING(...)
+#define RFCOMM_TRACE_API(...)
+#define RFCOMM_TRACE_EVENT(...)
+#define RFCOMM_TRACE_DEBUG(...)
 
 /* Generic Access Profile traces */
-#define GAP_TRACE_ERROR0(m)
-#define GAP_TRACE_ERROR1(m,p1)
-#define GAP_TRACE_ERROR2(m,p1,p2)
-#define GAP_TRACE_ERROR3(m,p1,p2,p3)
-#define GAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_EVENT0(m)
-#define GAP_TRACE_EVENT1(m,p1)
-#define GAP_TRACE_EVENT2(m,p1,p2)
-#define GAP_TRACE_EVENT3(m,p1,p2,p3)
-#define GAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_API0(m)
-#define GAP_TRACE_API1(m,p1)
-#define GAP_TRACE_API2(m,p1,p2)
-#define GAP_TRACE_API3(m,p1,p2,p3)
-#define GAP_TRACE_API4(m,p1,p2,p3,p4)
-#define GAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define GAP_TRACE_WARNING0(m)
-#define GAP_TRACE_WARNING1(m,p1)
-#define GAP_TRACE_WARNING2(m,p1,p2)
-#define GAP_TRACE_WARNING3(m,p1,p2,p3)
-#define GAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* Define tracing for OBX
-*/
-#define OBX_TRACE_ERROR0(m)
-#define OBX_TRACE_ERROR1(m,p1)
-#define OBX_TRACE_ERROR2(m,p1,p2)
-#define OBX_TRACE_ERROR3(m,p1,p2,p3)
-#define OBX_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define OBX_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_WARNING0(m)
-#define OBX_TRACE_WARNING1(m,p1)
-#define OBX_TRACE_WARNING2(m,p1,p2)
-#define OBX_TRACE_WARNING3(m,p1,p2,p3)
-#define OBX_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define OBX_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_EVENT0(m)
-#define OBX_TRACE_EVENT1(m,p1)
-#define OBX_TRACE_EVENT2(m,p1,p2)
-#define OBX_TRACE_EVENT3(m,p1,p2,p3)
-#define OBX_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define OBX_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_DEBUG0(m)
-#define OBX_TRACE_DEBUG1(m,p1)
-#define OBX_TRACE_DEBUG2(m,p1,p2)
-#define OBX_TRACE_DEBUG3(m,p1,p2,p3)
-#define OBX_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define OBX_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define OBX_TRACE_API0(m)
-#define OBX_TRACE_API1(m,p1)
-#define OBX_TRACE_API2(m,p1,p2)
-#define OBX_TRACE_API3(m,p1,p2,p3)
-#define OBX_TRACE_API4(m,p1,p2,p3,p4)
-#define OBX_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define OBX_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for GOEP application profiles
-*/
-#define GOEP_TRACE_ERROR0(m)
-#define GOEP_TRACE_ERROR1(m,p1)
-#define GOEP_TRACE_ERROR2(m,p1,p2)
-#define GOEP_TRACE_ERROR3(m,p1,p2,p3)
-#define GOEP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_WARNING0(m)
-#define GOEP_TRACE_WARNING1(m,p1)
-#define GOEP_TRACE_WARNING2(m,p1,p2)
-#define GOEP_TRACE_WARNING3(m,p1,p2,p3)
-#define GOEP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_EVENT0(m)
-#define GOEP_TRACE_EVENT1(m,p1)
-#define GOEP_TRACE_EVENT2(m,p1,p2)
-#define GOEP_TRACE_EVENT3(m,p1,p2,p3)
-#define GOEP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_DEBUG0(m)
-#define GOEP_TRACE_DEBUG1(m,p1)
-#define GOEP_TRACE_DEBUG2(m,p1,p2)
-#define GOEP_TRACE_DEBUG3(m,p1,p2,p3)
-#define GOEP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define GOEP_TRACE_API0(m)
-#define GOEP_TRACE_API1(m,p1)
-#define GOEP_TRACE_API2(m,p1,p2)
-#define GOEP_TRACE_API3(m,p1,p2,p3)
-#define GOEP_TRACE_API4(m,p1,p2,p3,p4)
-#define GOEP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GOEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the BPP profile
-*/
-#define BPP_TRACE_ERROR0(m)
-#define BPP_TRACE_ERROR1(m,p1)
-#define BPP_TRACE_ERROR2(m,p1,p2)
-#define BPP_TRACE_ERROR3(m,p1,p2,p3)
-#define BPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_WARNING0(m)
-#define BPP_TRACE_WARNING1(m,p1)
-#define BPP_TRACE_WARNING2(m,p1,p2)
-#define BPP_TRACE_WARNING3(m,p1,p2,p3)
-#define BPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_EVENT0(m)
-#define BPP_TRACE_EVENT1(m,p1)
-#define BPP_TRACE_EVENT2(m,p1,p2)
-#define BPP_TRACE_EVENT3(m,p1,p2,p3)
-#define BPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_DEBUG0(m)
-#define BPP_TRACE_DEBUG1(m,p1)
-#define BPP_TRACE_DEBUG2(m,p1,p2)
-#define BPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define BPP_TRACE_API0(m)
-#define BPP_TRACE_API1(m,p1)
-#define BPP_TRACE_API2(m,p1,p2)
-#define BPP_TRACE_API3(m,p1,p2,p3)
-#define BPP_TRACE_API4(m,p1,p2,p3,p4)
-#define BPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the BIP profile
-*/
-#define BIP_TRACE_ERROR0(m)
-#define BIP_TRACE_ERROR1(m,p1)
-#define BIP_TRACE_ERROR2(m,p1,p2)
-#define BIP_TRACE_ERROR3(m,p1,p2,p3)
-#define BIP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BIP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_WARNING0(m)
-#define BIP_TRACE_WARNING1(m,p1)
-#define BIP_TRACE_WARNING2(m,p1,p2)
-#define BIP_TRACE_WARNING3(m,p1,p2,p3)
-#define BIP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BIP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_EVENT0(m)
-#define BIP_TRACE_EVENT1(m,p1)
-#define BIP_TRACE_EVENT2(m,p1,p2)
-#define BIP_TRACE_EVENT3(m,p1,p2,p3)
-#define BIP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BIP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_DEBUG0(m)
-#define BIP_TRACE_DEBUG1(m,p1)
-#define BIP_TRACE_DEBUG2(m,p1,p2)
-#define BIP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BIP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BIP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define BIP_TRACE_API0(m)
-#define BIP_TRACE_API1(m,p1)
-#define BIP_TRACE_API2(m,p1,p2)
-#define BIP_TRACE_API3(m,p1,p2,p3)
-#define BIP_TRACE_API4(m,p1,p2,p3,p4)
-#define BIP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BIP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for TCS
-*/
-#define TCS_TRACE_ERROR0(m)
-#define TCS_TRACE_ERROR1(m,p1)
-#define TCS_TRACE_ERROR2(m,p1,p2)
-#define TCS_TRACE_ERROR3(m,p1,p2,p3)
-#define TCS_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define TCS_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_WARNING0(m)
-#define TCS_TRACE_WARNING1(m,p1)
-#define TCS_TRACE_WARNING2(m,p1,p2)
-#define TCS_TRACE_WARNING3(m,p1,p2,p3)
-#define TCS_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define TCS_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_EVENT0(m)
-#define TCS_TRACE_EVENT1(m,p1)
-#define TCS_TRACE_EVENT2(m,p1,p2)
-#define TCS_TRACE_EVENT3(m,p1,p2,p3)
-#define TCS_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define TCS_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_DEBUG0(m)
-#define TCS_TRACE_DEBUG1(m,p1)
-#define TCS_TRACE_DEBUG2(m,p1,p2)
-#define TCS_TRACE_DEBUG3(m,p1,p2,p3)
-#define TCS_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define TCS_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define TCS_TRACE_API0(m)
-#define TCS_TRACE_API1(m,p1)
-#define TCS_TRACE_API2(m,p1,p2)
-#define TCS_TRACE_API3(m,p1,p2,p3)
-#define TCS_TRACE_API4(m,p1,p2,p3,p4)
-#define TCS_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define TCS_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for ICP
-*/
-#define ICP_TRACE_ERROR0(m)
-#define ICP_TRACE_ERROR1(m,p1)
-#define ICP_TRACE_ERROR2(m,p1,p2)
-#define ICP_TRACE_ERROR3(m,p1,p2,p3)
-#define ICP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define ICP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_WARNING0(m)
-#define ICP_TRACE_WARNING1(m,p1)
-#define ICP_TRACE_WARNING2(m,p1,p2)
-#define ICP_TRACE_WARNING3(m,p1,p2,p3)
-#define ICP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define ICP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_EVENT0(m)
-#define ICP_TRACE_EVENT1(m,p1)
-#define ICP_TRACE_EVENT2(m,p1,p2)
-#define ICP_TRACE_EVENT3(m,p1,p2,p3)
-#define ICP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define ICP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_DEBUG0(m)
-#define ICP_TRACE_DEBUG1(m,p1)
-#define ICP_TRACE_DEBUG2(m,p1,p2)
-#define ICP_TRACE_DEBUG3(m,p1,p2,p3)
-#define ICP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define ICP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define ICP_TRACE_API0(m)
-#define ICP_TRACE_API1(m,p1)
-#define ICP_TRACE_API2(m,p1,p2)
-#define ICP_TRACE_API3(m,p1,p2,p3)
-#define ICP_TRACE_API4(m,p1,p2,p3,p4)
-#define ICP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define ICP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for CTP
-*/
-#define CTP_TRACE_ERROR0(m)
-#define CTP_TRACE_ERROR1(m,p1)
-#define CTP_TRACE_ERROR2(m,p1,p2)
-#define CTP_TRACE_ERROR3(m,p1,p2,p3)
-#define CTP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define CTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_WARNING0(m)
-#define CTP_TRACE_WARNING1(m,p1)
-#define CTP_TRACE_WARNING2(m,p1,p2)
-#define CTP_TRACE_WARNING3(m,p1,p2,p3)
-#define CTP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define CTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_EVENT0(m)
-#define CTP_TRACE_EVENT1(m,p1)
-#define CTP_TRACE_EVENT2(m,p1,p2)
-#define CTP_TRACE_EVENT3(m,p1,p2,p3)
-#define CTP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define CTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_DEBUG0(m)
-#define CTP_TRACE_DEBUG1(m,p1)
-#define CTP_TRACE_DEBUG2(m,p1,p2)
-#define CTP_TRACE_DEBUG3(m,p1,p2,p3)
-#define CTP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define CTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define CTP_TRACE_API0(m)
-#define CTP_TRACE_API1(m,p1)
-#define CTP_TRACE_API2(m,p1,p2)
-#define CTP_TRACE_API3(m,p1,p2,p3)
-#define CTP_TRACE_API4(m,p1,p2,p3,p4)
-#define CTP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define CTP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for headset profile */
-
-#define HSP2_TRACE_ERROR0(pcb,m)
-#define HSP2_TRACE_ERROR1(pcb,m,p1)
-#define HSP2_TRACE_ERROR2(pcb,m,p1,p2)
-#define HSP2_TRACE_ERROR3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_ERROR4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_ERROR5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_ERROR6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_WARNING0(pcb,m)
-#define HSP2_TRACE_WARNING1(pcb,m,p1)
-#define HSP2_TRACE_WARNING2(pcb,m,p1,p2)
-#define HSP2_TRACE_WARNING3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_WARNING4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_WARNING5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_WARNING6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_API0(pcb,m)
-#define HSP2_TRACE_API1(pcb,m,p1)
-#define HSP2_TRACE_API2(pcb,m,p1,p2)
-#define HSP2_TRACE_API3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_API4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_API5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_API6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_EVENT0(pcb,m)
-#define HSP2_TRACE_EVENT1(pcb,m,p1)
-#define HSP2_TRACE_EVENT2(pcb,m,p1,p2)
-#define HSP2_TRACE_EVENT3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_EVENT4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_EVENT5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_EVENT6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-#define HSP2_TRACE_DEBUG0(pcb,m)
-#define HSP2_TRACE_DEBUG1(pcb,m,p1)
-#define HSP2_TRACE_DEBUG2(pcb,m,p1,p2)
-#define HSP2_TRACE_DEBUG3(pcb,m,p1,p2,p3)
-#define HSP2_TRACE_DEBUG4(pcb,m,p1,p2,p3,p4)
-#define HSP2_TRACE_DEBUG5(pcb,m,p1,p2,p3,p4,p5)
-#define HSP2_TRACE_DEBUG6(pcb,m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the NFC unit
-*/
-#define NFC_TRACE_ERROR0(m)
-#define NFC_TRACE_ERROR1(m,p1)
-#define NFC_TRACE_ERROR2(m,p1,p2)
-#define NFC_TRACE_ERROR3(m,p1,p2,p3)
-#define NFC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NFC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_WARNING0(m)
-#define NFC_TRACE_WARNING1(m,p1)
-#define NFC_TRACE_WARNING2(m,p1,p2)
-#define NFC_TRACE_WARNING3(m,p1,p2,p3)
-#define NFC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NFC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_API0(m)
-#define NFC_TRACE_API1(m,p1)
-#define NFC_TRACE_API2(m,p1,p2)
-#define NFC_TRACE_API3(m,p1,p2,p3)
-#define NFC_TRACE_API4(m,p1,p2,p3,p4)
-#define NFC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_EVENT0(m)
-#define NFC_TRACE_EVENT1(m,p1)
-#define NFC_TRACE_EVENT2(m,p1,p2)
-#define NFC_TRACE_EVENT3(m,p1,p2,p3)
-#define NFC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NFC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFC_TRACE_DEBUG0(m)
-#define NFC_TRACE_DEBUG1(m,p1)
-#define NFC_TRACE_DEBUG2(m,p1,p2)
-#define NFC_TRACE_DEBUG3(m,p1,p2,p3)
-#define NFC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NFC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NFC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_ERROR0(m)
-#define NCI_TRACE_ERROR1(m,p1)
-#define NCI_TRACE_ERROR2(m,p1,p2)
-#define NCI_TRACE_ERROR3(m,p1,p2,p3)
-#define NCI_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NCI_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_WARNING0(m)
-#define NCI_TRACE_WARNING1(m,p1)
-#define NCI_TRACE_WARNING2(m,p1,p2)
-#define NCI_TRACE_WARNING3(m,p1,p2,p3)
-#define NCI_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NCI_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_API0(m)
-#define NCI_TRACE_API1(m,p1)
-#define NCI_TRACE_API2(m,p1,p2)
-#define NCI_TRACE_API3(m,p1,p2,p3)
-#define NCI_TRACE_API4(m,p1,p2,p3,p4)
-#define NCI_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_EVENT0(m)
-#define NCI_TRACE_EVENT1(m,p1)
-#define NCI_TRACE_EVENT2(m,p1,p2)
-#define NCI_TRACE_EVENT3(m,p1,p2,p3)
-#define NCI_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NCI_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NCI_TRACE_DEBUG0(m)
-#define NCI_TRACE_DEBUG1(m,p1)
-#define NCI_TRACE_DEBUG2(m,p1,p2)
-#define NCI_TRACE_DEBUG3(m,p1,p2,p3)
-#define NCI_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NCI_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NCI_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_ERROR0(m)
-#define RW_TRACE_ERROR1(m,p1)
-#define RW_TRACE_ERROR2(m,p1,p2)
-#define RW_TRACE_ERROR3(m,p1,p2,p3)
-#define RW_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RW_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_WARNING0(m)
-#define RW_TRACE_WARNING1(m,p1)
-#define RW_TRACE_WARNING2(m,p1,p2)
-#define RW_TRACE_WARNING3(m,p1,p2,p3)
-#define RW_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RW_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) }
-
-#define RW_TRACE_API0(m)
-#define RW_TRACE_API1(m,p1)
-#define RW_TRACE_API2(m,p1,p2)
-#define RW_TRACE_API3(m,p1,p2,p3)
-#define RW_TRACE_API4(m,p1,p2,p3,p4)
-#define RW_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_EVENT0(m)
-#define RW_TRACE_EVENT1(m,p1)
-#define RW_TRACE_EVENT2(m,p1,p2)
-#define RW_TRACE_EVENT3(m,p1,p2,p3)
-#define RW_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RW_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RW_TRACE_DEBUG0(m)
-#define RW_TRACE_DEBUG1(m,p1)
-#define RW_TRACE_DEBUG2(m,p1,p2)
-#define RW_TRACE_DEBUG3(m,p1,p2,p3)
-#define RW_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RW_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RW_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_ERROR0(m)
-#define CE_TRACE_ERROR1(m,p1)
-#define CE_TRACE_ERROR2(m,p1,p2)
-#define CE_TRACE_ERROR3(m,p1,p2,p3)
-#define CE_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define CE_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_WARNING0(m)
-#define CE_TRACE_WARNING1(m,p1)
-#define CE_TRACE_WARNING2(m,p1,p2)
-#define CE_TRACE_WARNING3(m,p1,p2,p3)
-#define CE_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define CE_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_API0(m)
-#define CE_TRACE_API1(m,p1)
-#define CE_TRACE_API2(m,p1,p2)
-#define CE_TRACE_API3(m,p1,p2,p3)
-#define CE_TRACE_API4(m,p1,p2,p3,p4)
-#define CE_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_EVENT0(m)
-#define CE_TRACE_EVENT1(m,p1)
-#define CE_TRACE_EVENT2(m,p1,p2)
-#define CE_TRACE_EVENT3(m,p1,p2,p3)
-#define CE_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define CE_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define CE_TRACE_DEBUG0(m)
-#define CE_TRACE_DEBUG1(m,p1)
-#define CE_TRACE_DEBUG2(m,p1,p2)
-#define CE_TRACE_DEBUG3(m,p1,p2,p3)
-#define CE_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define CE_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define CE_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_ERROR0(m)
-#define NDEF_TRACE_ERROR1(m,p1)
-#define NDEF_TRACE_ERROR2(m,p1,p2)
-#define NDEF_TRACE_ERROR3(m,p1,p2,p3)
-#define NDEF_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_WARNING0(m)
-#define NDEF_TRACE_WARNING1(m,p1)
-#define NDEF_TRACE_WARNING2(m,p1,p2)
-#define NDEF_TRACE_WARNING3(m,p1,p2,p3)
-#define NDEF_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_API0(m)
-#define NDEF_TRACE_API1(m,p1)
-#define NDEF_TRACE_API2(m,p1,p2)
-#define NDEF_TRACE_API3(m,p1,p2,p3)
-#define NDEF_TRACE_API4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_EVENT0(m)
-#define NDEF_TRACE_EVENT1(m,p1)
-#define NDEF_TRACE_EVENT2(m,p1,p2)
-#define NDEF_TRACE_EVENT3(m,p1,p2,p3)
-#define NDEF_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NDEF_TRACE_DEBUG0(m)
-#define NDEF_TRACE_DEBUG1(m,p1)
-#define NDEF_TRACE_DEBUG2(m,p1,p2)
-#define NDEF_TRACE_DEBUG3(m,p1,p2,p3)
-#define NDEF_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NDEF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NDEF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the NFA unit
-*/
-#define NFA_TRACE_ERROR0(m)
-#define NFA_TRACE_ERROR1(m,p1)
-#define NFA_TRACE_ERROR2(m,p1,p2)
-#define NFA_TRACE_ERROR3(m,p1,p2,p3)
-#define NFA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define NFA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_WARNING0(m)
-#define NFA_TRACE_WARNING1(m,p1)
-#define NFA_TRACE_WARNING2(m,p1,p2)
-#define NFA_TRACE_WARNING3(m,p1,p2,p3)
-#define NFA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define NFA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_API0(m)
-#define NFA_TRACE_API1(m,p1)
-#define NFA_TRACE_API2(m,p1,p2)
-#define NFA_TRACE_API3(m,p1,p2,p3)
-#define NFA_TRACE_API4(m,p1,p2,p3,p4)
-#define NFA_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_EVENT0(m)
-#define NFA_TRACE_EVENT1(m,p1)
-#define NFA_TRACE_EVENT2(m,p1,p2)
-#define NFA_TRACE_EVENT3(m,p1,p2,p3)
-#define NFA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define NFA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define NFA_TRACE_DEBUG0(m)
-#define NFA_TRACE_DEBUG1(m,p1)
-#define NFA_TRACE_DEBUG2(m,p1,p2)
-#define NFA_TRACE_DEBUG3(m,p1,p2,p3)
-#define NFA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define NFA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define NFA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
+#define GAP_TRACE_ERROR(...)
+#define GAP_TRACE_EVENT(...)
+#define GAP_TRACE_API(...)
+#define GAP_TRACE_WARNING(...)
 
 /* define traces for HID Host */
-#define HIDH_TRACE_ERROR0(m)
-#define HIDH_TRACE_ERROR1(m,p1)
-#define HIDH_TRACE_ERROR2(m,p1,p2)
-#define HIDH_TRACE_ERROR3(m,p1,p2,p3)
-#define HIDH_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_WARNING0(m)
-#define HIDH_TRACE_WARNING1(m,p1)
-#define HIDH_TRACE_WARNING2(m,p1,p2)
-#define HIDH_TRACE_WARNING3(m,p1,p2,p3)
-#define HIDH_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_API0(m)
-#define HIDH_TRACE_API1(m,p1)
-#define HIDH_TRACE_API2(m,p1,p2)
-#define HIDH_TRACE_API3(m,p1,p2,p3)
-#define HIDH_TRACE_API4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_EVENT0(m)
-#define HIDH_TRACE_EVENT1(m,p1)
-#define HIDH_TRACE_EVENT2(m,p1,p2)
-#define HIDH_TRACE_EVENT3(m,p1,p2,p3)
-#define HIDH_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDH_TRACE_DEBUG0(m)
-#define HIDH_TRACE_DEBUG1(m,p1)
-#define HIDH_TRACE_DEBUG2(m,p1,p2)
-#define HIDH_TRACE_DEBUG3(m,p1,p2,p3)
-#define HIDH_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HIDH_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HIDH_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for HID Device */
-#define HIDD_TRACE_ERROR0(m)
-#define HIDD_TRACE_ERROR1(m,p1)
-#define HIDD_TRACE_ERROR2(m,p1,p2)
-#define HIDD_TRACE_ERROR3(m,p1,p2,p3)
-#define HIDD_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_WARNING0(m)
-#define HIDD_TRACE_WARNING1(m,p1)
-#define HIDD_TRACE_WARNING2(m,p1,p2)
-#define HIDD_TRACE_WARNING3(m,p1,p2,p3)
-#define HIDD_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_API0(m)
-#define HIDD_TRACE_API1(m,p1)
-#define HIDD_TRACE_API2(m,p1,p2)
-#define HIDD_TRACE_API3(m,p1,p2,p3)
-#define HIDD_TRACE_API4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_EVENT0(m)
-#define HIDD_TRACE_EVENT1(m,p1)
-#define HIDD_TRACE_EVENT2(m,p1,p2)
-#define HIDD_TRACE_EVENT3(m,p1,p2,p3)
-#define HIDD_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HIDD_TRACE_DEBUG0(m)
-#define HIDD_TRACE_DEBUG1(m,p1)
-#define HIDD_TRACE_DEBUG2(m,p1,p2)
-#define HIDD_TRACE_DEBUG3(m,p1,p2,p3)
-#define HIDD_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HIDD_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HIDD_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for DUN */
-
-#define DUN_TRACE_ERROR0(m)
-#define DUN_TRACE_ERROR1(m,p1)
-#define DUN_TRACE_ERROR2(m,p1,p2)
-#define DUN_TRACE_ERROR3(m,p1,p2,p3)
-#define DUN_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define DUN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_WARNING0(m)
-#define DUN_TRACE_WARNING1(m,p1)
-#define DUN_TRACE_WARNING2(m,p1,p2)
-#define DUN_TRACE_WARNING3(m,p1,p2,p3)
-#define DUN_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DUN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_API0(m)
-#define DUN_TRACE_API1(m,p1)
-#define DUN_TRACE_API2(m,p1,p2)
-#define DUN_TRACE_API3(m,p1,p2,p3)
-#define DUN_TRACE_API4(m,p1,p2,p3,p4)
-#define DUN_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_EVENT0(m)
-#define DUN_TRACE_EVENT1(m,p1)
-#define DUN_TRACE_EVENT2(m,p1,p2)
-#define DUN_TRACE_EVENT3(m,p1,p2,p3)
-#define DUN_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define DUN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define DUN_TRACE_DEBUG0(m)
-#define DUN_TRACE_DEBUG1(m,p1)
-#define DUN_TRACE_DEBUG2(m,p1,p2)
-#define DUN_TRACE_DEBUG3(m,p1,p2,p3)
-#define DUN_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define DUN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define DUN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for HCRP */
-
-#define HCRP_TRACE_ERROR0(m)
-#define HCRP_TRACE_ERROR1(m,p1)
-#define HCRP_TRACE_ERROR2(m,p1,p2)
-#define HCRP_TRACE_ERROR3(m,p1,p2,p3)
-#define HCRP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_WARNING0(m)
-#define HCRP_TRACE_WARNING1(m,p1)
-#define HCRP_TRACE_WARNING2(m,p1,p2)
-#define HCRP_TRACE_WARNING3(m,p1,p2,p3)
-#define HCRP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_API0(m)
-#define HCRP_TRACE_API1(m,p1)
-#define HCRP_TRACE_API2(m,p1,p2)
-#define HCRP_TRACE_API3(m,p1,p2,p3)
-#define HCRP_TRACE_API4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_EVENT0(m)
-#define HCRP_TRACE_EVENT1(m,p1)
-#define HCRP_TRACE_EVENT2(m,p1,p2)
-#define HCRP_TRACE_EVENT3(m,p1,p2,p3)
-#define HCRP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRP_TRACE_DEBUG0(m)
-#define HCRP_TRACE_DEBUG1(m,p1)
-#define HCRP_TRACE_DEBUG2(m,p1,p2)
-#define HCRP_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCRP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCRP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCRP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* define traces for HCRP */
-
-#define HCRPM_TRACE_ERROR0(m)
-#define HCRPM_TRACE_ERROR1(m,p1)
-#define HCRPM_TRACE_ERROR2(m,p1,p2)
-#define HCRPM_TRACE_ERROR3(m,p1,p2,p3)
-#define HCRPM_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_WARNING0(m)
-#define HCRPM_TRACE_WARNING1(m,p1)
-#define HCRPM_TRACE_WARNING2(m,p1,p2)
-#define HCRPM_TRACE_WARNING3(m,p1,p2,p3)
-#define HCRPM_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_API0(m)
-#define HCRPM_TRACE_API1(m,p1)
-#define HCRPM_TRACE_API2(m,p1,p2)
-#define HCRPM_TRACE_API3(m,p1,p2,p3)
-#define HCRPM_TRACE_API4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_EVENT0(m)
-#define HCRPM_TRACE_EVENT1(m,p1)
-#define HCRPM_TRACE_EVENT2(m,p1,p2)
-#define HCRPM_TRACE_EVENT3(m,p1,p2,p3)
-#define HCRPM_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define HCRPM_TRACE_DEBUG0(m)
-#define HCRPM_TRACE_DEBUG1(m,p1)
-#define HCRPM_TRACE_DEBUG2(m,p1,p2)
-#define HCRPM_TRACE_DEBUG3(m,p1,p2,p3)
-#define HCRPM_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define HCRPM_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define HCRPM_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for RPC */
-
-#define RPC_TRACE_ERROR0(m)
-#define RPC_TRACE_ERROR1(m,p1)
-#define RPC_TRACE_ERROR2(m,p1,p2)
-#define RPC_TRACE_ERROR3(m,p1,p2,p3)
-#define RPC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define RPC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_WARNING0(m)
-#define RPC_TRACE_WARNING1(m,p1)
-#define RPC_TRACE_WARNING2(m,p1,p2)
-#define RPC_TRACE_WARNING3(m,p1,p2,p3)
-#define RPC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define RPC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_API0(m)
-#define RPC_TRACE_API1(m,p1)
-#define RPC_TRACE_API2(m,p1,p2)
-#define RPC_TRACE_API3(m,p1,p2,p3)
-#define RPC_TRACE_API4(m,p1,p2,p3,p4)
-#define RPC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_EVENT0(m)
-#define RPC_TRACE_EVENT1(m,p1)
-#define RPC_TRACE_EVENT2(m,p1,p2)
-#define RPC_TRACE_EVENT3(m,p1,p2,p3)
-#define RPC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define RPC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define RPC_TRACE_DEBUG0(m)
-#define RPC_TRACE_DEBUG1(m,p1)
-#define RPC_TRACE_DEBUG2(m,p1,p2)
-#define RPC_TRACE_DEBUG3(m,p1,p2,p3)
-#define RPC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define RPC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define RPC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define HIDH_TRACE_ERROR(...)
+#define HIDH_TRACE_WARNING(...)
+#define HIDH_TRACE_API(...)
+#define HIDH_TRACE_EVENT(...)
+#define HIDH_TRACE_DEBUG(...)
 
 /* define traces for BNEP */
 
-#define BNEP_TRACE_ERROR0(m)
-#define BNEP_TRACE_ERROR1(m,p1)
-#define BNEP_TRACE_ERROR2(m,p1,p2)
-#define BNEP_TRACE_ERROR3(m,p1,p2,p3)
-#define BNEP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_WARNING0(m)
-#define BNEP_TRACE_WARNING1(m,p1)
-#define BNEP_TRACE_WARNING2(m,p1,p2)
-#define BNEP_TRACE_WARNING3(m,p1,p2,p3)
-#define BNEP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_API0(m)
-#define BNEP_TRACE_API1(m,p1)
-#define BNEP_TRACE_API2(m,p1,p2)
-#define BNEP_TRACE_API3(m,p1,p2,p3)
-#define BNEP_TRACE_API4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_EVENT0(m)
-#define BNEP_TRACE_EVENT1(m,p1)
-#define BNEP_TRACE_EVENT2(m,p1,p2)
-#define BNEP_TRACE_EVENT3(m,p1,p2,p3)
-#define BNEP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BNEP_TRACE_DEBUG0(m)
-#define BNEP_TRACE_DEBUG1(m,p1)
-#define BNEP_TRACE_DEBUG2(m,p1,p2)
-#define BNEP_TRACE_DEBUG3(m,p1,p2,p3)
-#define BNEP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BNEP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BNEP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* hid module traces */
-
-#define MSKB_TRACE_0(m)
-#define MSKB_TRACE_1(m,p1)
-#define MSKB_TRACE_2(m,p1,p2)
-#define MSKB_TRACE_3(m,p1,p2,p3)
-#define MSKB_TRACE_4(m,p1,p2,p3,p4)
-#define MSKB_TRACE_5(m,p1,p2,p3,p4,p5)
-#define MSKB_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_DEBUG_0(m)
-#define MSKB_DEBUG_1(m,p1)
-#define MSKB_DEBUG_2(m,p1,p2)
-#define MSKB_DEBUG_3(m,p1,p2,p3)
-#define MSKB_DEBUG_4(m,p1,p2,p3,p4)
-#define MSKB_DEBUG_5(m,p1,p2,p3,p4,p5)
-#define MSKB_DEBUG_6(m,p1,p2,p3,p4,p5,p6)
-
-#define MSKB_ERROR_0(m)
-#define MSKB_ERROR_1(m,p1)
-#define MSKB_ERROR_2(m,p1,p2)
-#define MSKB_ERROR_3(m,p1,p2,p3)
-#define MSKB_ERROR_4(m,p1,p2,p3,p4)
-#define MSKB_ERROR_5(m,p1,p2,p3,p4,p5)
-#define MSKB_ERROR_6(m,p1,p2,p3,p4,p5,p6)
+#define BNEP_TRACE_ERROR(...)
+#define BNEP_TRACE_WARNING(...)
+#define BNEP_TRACE_API(...)
+#define BNEP_TRACE_EVENT(...)
+#define BNEP_TRACE_DEBUG(...)
 
 /* define traces for PAN */
 
-#define PAN_TRACE_ERROR0(m)
-#define PAN_TRACE_ERROR1(m,p1)
-#define PAN_TRACE_ERROR2(m,p1,p2)
-#define PAN_TRACE_ERROR3(m,p1,p2,p3)
-#define PAN_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define PAN_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_WARNING0(m)
-#define PAN_TRACE_WARNING1(m,p1)
-#define PAN_TRACE_WARNING2(m,p1,p2)
-#define PAN_TRACE_WARNING3(m,p1,p2,p3)
-#define PAN_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define PAN_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_API0(m)
-#define PAN_TRACE_API1(m,p1)
-#define PAN_TRACE_API2(m,p1,p2)
-#define PAN_TRACE_API3(m,p1,p2,p3)
-#define PAN_TRACE_API4(m,p1,p2,p3,p4)
-#define PAN_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_EVENT0(m)
-#define PAN_TRACE_EVENT1(m,p1)
-#define PAN_TRACE_EVENT2(m,p1,p2)
-#define PAN_TRACE_EVENT3(m,p1,p2,p3)
-#define PAN_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define PAN_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define PAN_TRACE_DEBUG0(m)
-#define PAN_TRACE_DEBUG1(m,p1)
-#define PAN_TRACE_DEBUG2(m,p1,p2)
-#define PAN_TRACE_DEBUG3(m,p1,p2,p3)
-#define PAN_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define PAN_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define PAN_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* define traces for SIM */
-
-#define SAP_TRACE_ERROR0(m)
-#define SAP_TRACE_ERROR1(m,p1)
-#define SAP_TRACE_ERROR2(m,p1,p2)
-#define SAP_TRACE_ERROR3(m,p1,p2,p3)
-#define SAP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SAP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_WARNING0(m)
-#define SAP_TRACE_WARNING1(m,p1)
-#define SAP_TRACE_WARNING2(m,p1,p2)
-#define SAP_TRACE_WARNING3(m,p1,p2,p3)
-#define SAP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SAP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_API0(m)
-#define SAP_TRACE_API1(m,p1)
-#define SAP_TRACE_API2(m,p1,p2)
-#define SAP_TRACE_API3(m,p1,p2,p3)
-#define SAP_TRACE_API4(m,p1,p2,p3,p4)
-#define SAP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_EVENT0(m)
-#define SAP_TRACE_EVENT1(m,p1)
-#define SAP_TRACE_EVENT2(m,p1,p2)
-#define SAP_TRACE_EVENT3(m,p1,p2,p3)
-#define SAP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SAP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SAP_TRACE_DEBUG0(m)
-#define SAP_TRACE_DEBUG1(m,p1)
-#define SAP_TRACE_DEBUG2(m,p1,p2)
-#define SAP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SAP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SAP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the OPP profile
-*/
-#define OPP_TRACE_ERROR0(m)
-#define OPP_TRACE_ERROR1(m,p1)
-#define OPP_TRACE_ERROR2(m,p1,p2)
-#define OPP_TRACE_ERROR3(m,p1,p2,p3)
-#define OPP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define OPP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_WARNING0(m)
-#define OPP_TRACE_WARNING1(m,p1)
-#define OPP_TRACE_WARNING2(m,p1,p2)
-#define OPP_TRACE_WARNING3(m,p1,p2,p3)
-#define OPP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define OPP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_EVENT0(m)
-#define OPP_TRACE_EVENT1(m,p1)
-#define OPP_TRACE_EVENT2(m,p1,p2)
-#define OPP_TRACE_EVENT3(m,p1,p2,p3)
-#define OPP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define OPP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_DEBUG0(m)
-#define OPP_TRACE_DEBUG1(m,p1)
-#define OPP_TRACE_DEBUG2(m,p1,p2)
-#define OPP_TRACE_DEBUG3(m,p1,p2,p3)
-#define OPP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define OPP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define OPP_TRACE_API0(m)
-#define OPP_TRACE_API1(m,p1)
-#define OPP_TRACE_API2(m,p1,p2)
-#define OPP_TRACE_API3(m,p1,p2,p3)
-#define OPP_TRACE_API4(m,p1,p2,p3,p4)
-#define OPP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define OPP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the FTP profile
-*/
-#define FTP_TRACE_ERROR0(m)
-#define FTP_TRACE_ERROR1(m,p1)
-#define FTP_TRACE_ERROR2(m,p1,p2)
-#define FTP_TRACE_ERROR3(m,p1,p2,p3)
-#define FTP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define FTP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_WARNING0(m)
-#define FTP_TRACE_WARNING1(m,p1)
-#define FTP_TRACE_WARNING2(m,p1,p2)
-#define FTP_TRACE_WARNING3(m,p1,p2,p3)
-#define FTP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define FTP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_EVENT0(m)
-#define FTP_TRACE_EVENT1(m,p1)
-#define FTP_TRACE_EVENT2(m,p1,p2)
-#define FTP_TRACE_EVENT3(m,p1,p2,p3)
-#define FTP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define FTP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_DEBUG0(m)
-#define FTP_TRACE_DEBUG1(m,p1)
-#define FTP_TRACE_DEBUG2(m,p1,p2)
-#define FTP_TRACE_DEBUG3(m,p1,p2,p3)
-#define FTP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define FTP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define FTP_TRACE_API0(m)
-#define FTP_TRACE_API1(m,p1)
-#define FTP_TRACE_API2(m,p1,p2)
-#define FTP_TRACE_API3(m,p1,p2,p3)
-#define FTP_TRACE_API4(m,p1,p2,p3,p4)
-#define FTP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define FTP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
+#define PAN_TRACE_ERROR(...)
+#define PAN_TRACE_WARNING(...)
+#define PAN_TRACE_API(...)
+#define PAN_TRACE_EVENT(...)
+#define PAN_TRACE_DEBUG(...)
 
 /* Define tracing for the A2DP profile
 */
-#define A2D_TRACE_ERROR0(m)
-#define A2D_TRACE_ERROR1(m,p1)
-#define A2D_TRACE_ERROR2(m,p1,p2)
-#define A2D_TRACE_ERROR3(m,p1,p2,p3)
-#define A2D_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define A2D_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_WARNING0(m)
-#define A2D_TRACE_WARNING1(m,p1)
-#define A2D_TRACE_WARNING2(m,p1,p2)
-#define A2D_TRACE_WARNING3(m,p1,p2,p3)
-#define A2D_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define A2D_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_EVENT0(m)
-#define A2D_TRACE_EVENT1(m,p1)
-#define A2D_TRACE_EVENT2(m,p1,p2)
-#define A2D_TRACE_EVENT3(m,p1,p2,p3)
-#define A2D_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define A2D_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_DEBUG0(m)
-#define A2D_TRACE_DEBUG1(m,p1)
-#define A2D_TRACE_DEBUG2(m,p1,p2)
-#define A2D_TRACE_DEBUG3(m,p1,p2,p3)
-#define A2D_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define A2D_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define A2D_TRACE_API0(m)
-#define A2D_TRACE_API1(m,p1)
-#define A2D_TRACE_API2(m,p1,p2)
-#define A2D_TRACE_API3(m,p1,p2,p3)
-#define A2D_TRACE_API4(m,p1,p2,p3,p4)
-#define A2D_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define A2D_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the VDP profile
-*/
-#define VDP_TRACE_ERROR0(m)
-#define VDP_TRACE_ERROR1(m,p1)
-#define VDP_TRACE_ERROR2(m,p1,p2)
-#define VDP_TRACE_ERROR3(m,p1,p2,p3)
-#define VDP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define VDP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_WARNING0(m)
-#define VDP_TRACE_WARNING1(m,p1)
-#define VDP_TRACE_WARNING2(m,p1,p2)
-#define VDP_TRACE_WARNING3(m,p1,p2,p3)
-#define VDP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define VDP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_EVENT0(m)
-#define VDP_TRACE_EVENT1(m,p1)
-#define VDP_TRACE_EVENT2(m,p1,p2)
-#define VDP_TRACE_EVENT3(m,p1,p2,p3)
-#define VDP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define VDP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_DEBUG0(m)
-#define VDP_TRACE_DEBUG1(m,p1)
-#define VDP_TRACE_DEBUG2(m,p1,p2)
-#define VDP_TRACE_DEBUG3(m,p1,p2,p3)
-#define VDP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define VDP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define VDP_TRACE_API0(m)
-#define VDP_TRACE_API1(m,p1)
-#define VDP_TRACE_API2(m,p1,p2)
-#define VDP_TRACE_API3(m,p1,p2,p3)
-#define VDP_TRACE_API4(m,p1,p2,p3,p4)
-#define VDP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define VDP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-
-/* Define tracing for the LM unit
-*/
-#define LMP_TRACE_ERROR0(m)
-#define LMP_TRACE_ERROR1(m,p1)
-#define LMP_TRACE_ERROR2(m,p1,p2)
-#define LMP_TRACE_ERROR3(m,p1,p2,p3)
-#define LMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_WARNING0(m)
-#define LMP_TRACE_WARNING1(m,p1)
-#define LMP_TRACE_WARNING2(m,p1,p2)
-#define LMP_TRACE_WARNING3(m,p1,p2,p3)
-#define LMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_EVENT0(m)
-#define LMP_TRACE_EVENT1(m,p1)
-#define LMP_TRACE_EVENT2(m,p1,p2)
-#define LMP_TRACE_EVENT3(m,p1,p2,p3)
-#define LMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LMP_TRACE_DEBUG0(m)
-#define LMP_TRACE_DEBUG1(m,p1)
-#define LMP_TRACE_DEBUG2(m,p1,p2)
-#define LMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define LMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the LC unit
-*/
-#define LC_TRACE_ERROR0(m)
-#define LC_TRACE_ERROR1(m,p1)
-#define LC_TRACE_ERROR2(m,p1,p2)
-#define LC_TRACE_ERROR3(m,p1,p2,p3)
-#define LC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define LC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_WARNING0(m)
-#define LC_TRACE_WARNING1(m,p1)
-#define LC_TRACE_WARNING2(m,p1,p2)
-#define LC_TRACE_WARNING3(m,p1,p2,p3)
-#define LC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define LC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_EVENT0(m)
-#define LC_TRACE_EVENT1(m,p1)
-#define LC_TRACE_EVENT2(m,p1,p2)
-#define LC_TRACE_EVENT3(m,p1,p2,p3)
-#define LC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define LC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define LC_TRACE_DEBUG0(m)
-#define LC_TRACE_DEBUG1(m,p1)
-#define LC_TRACE_DEBUG2(m,p1,p2)
-#define LC_TRACE_DEBUG3(m,p1,p2,p3)
-#define LC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define LC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define LC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_ERROR0(m)
-#define SDA_TRACE_ERROR1(m,p1)
-#define SDA_TRACE_ERROR2(m,p1,p2)
-#define SDA_TRACE_ERROR3(m,p1,p2,p3)
-#define SDA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SDA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_WARNING0(m)
-#define SDA_TRACE_WARNING1(m,p1)
-#define SDA_TRACE_WARNING2(m,p1,p2)
-#define SDA_TRACE_WARNING3(m,p1,p2,p3)
-#define SDA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SDA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_EVENT0(m)
-#define SDA_TRACE_EVENT1(m,p1)
-#define SDA_TRACE_EVENT2(m,p1,p2)
-#define SDA_TRACE_EVENT3(m,p1,p2,p3)
-#define SDA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SDA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SDA_TRACE_DEBUG0(m)
-#define SDA_TRACE_DEBUG1(m,p1)
-#define SDA_TRACE_DEBUG2(m,p1,p2)
-#define SDA_TRACE_DEBUG3(m,p1,p2,p3)
-#define SDA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SDA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SDA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define A2D_TRACE_ERROR(...)
+#define A2D_TRACE_WARNING(...)
+#define A2D_TRACE_EVENT(...)
+#define A2D_TRACE_DEBUG(...)
+#define A2D_TRACE_API(...)
 
 /* AVDTP
 */
-#define AVDT_TRACE_ERROR0(m)
-#define AVDT_TRACE_ERROR1(m,p1)
-#define AVDT_TRACE_ERROR2(m,p1,p2)
-#define AVDT_TRACE_ERROR3(m,p1,p2,p3)
-#define AVDT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_WARNING0(m)
-#define AVDT_TRACE_WARNING1(m,p1)
-#define AVDT_TRACE_WARNING2(m,p1,p2)
-#define AVDT_TRACE_WARNING3(m,p1,p2,p3)
-#define AVDT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_EVENT0(m)
-#define AVDT_TRACE_EVENT1(m,p1)
-#define AVDT_TRACE_EVENT2(m,p1,p2)
-#define AVDT_TRACE_EVENT3(m,p1,p2,p3)
-#define AVDT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_DEBUG0(m)
-#define AVDT_TRACE_DEBUG1(m,p1)
-#define AVDT_TRACE_DEBUG2(m,p1,p2)
-#define AVDT_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVDT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVDT_TRACE_API0(m)
-#define AVDT_TRACE_API1(m,p1)
-#define AVDT_TRACE_API2(m,p1,p2)
-#define AVDT_TRACE_API3(m,p1,p2,p3)
-#define AVDT_TRACE_API4(m,p1,p2,p3,p4)
-#define AVDT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVDT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
+#define AVDT_TRACE_ERROR(...)
+#define AVDT_TRACE_WARNING(...)
+#define AVDT_TRACE_EVENT(...)
+#define AVDT_TRACE_DEBUG(...)
+#define AVDT_TRACE_API(...)
 
 /* Define tracing for the AVCTP protocol
 */
-#define AVCT_TRACE_ERROR0(m)
-#define AVCT_TRACE_ERROR1(m,p1)
-#define AVCT_TRACE_ERROR2(m,p1,p2)
-#define AVCT_TRACE_ERROR3(m,p1,p2,p3)
-#define AVCT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_WARNING0(m)
-#define AVCT_TRACE_WARNING1(m,p1)
-#define AVCT_TRACE_WARNING2(m,p1,p2)
-#define AVCT_TRACE_WARNING3(m,p1,p2,p3)
-#define AVCT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_EVENT0(m)
-#define AVCT_TRACE_EVENT1(m,p1)
-#define AVCT_TRACE_EVENT2(m,p1,p2)
-#define AVCT_TRACE_EVENT3(m,p1,p2,p3)
-#define AVCT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_DEBUG0(m)
-#define AVCT_TRACE_DEBUG1(m,p1)
-#define AVCT_TRACE_DEBUG2(m,p1,p2)
-#define AVCT_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVCT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVCT_TRACE_API0(m)
-#define AVCT_TRACE_API1(m,p1)
-#define AVCT_TRACE_API2(m,p1,p2)
-#define AVCT_TRACE_API3(m,p1,p2,p3)
-#define AVCT_TRACE_API4(m,p1,p2,p3,p4)
-#define AVCT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVCT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
+#define AVCT_TRACE_ERROR(...)
+#define AVCT_TRACE_WARNING(...)
+#define AVCT_TRACE_EVENT(...)
+#define AVCT_TRACE_DEBUG(...)
+#define AVCT_TRACE_API(...)
 
 /* Define tracing for the AVRCP profile
 */
-#define AVRC_TRACE_ERROR0(m)
-#define AVRC_TRACE_ERROR1(m,p1)
-#define AVRC_TRACE_ERROR2(m,p1,p2)
-#define AVRC_TRACE_ERROR3(m,p1,p2,p3)
-#define AVRC_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_WARNING0(m)
-#define AVRC_TRACE_WARNING1(m,p1)
-#define AVRC_TRACE_WARNING2(m,p1,p2)
-#define AVRC_TRACE_WARNING3(m,p1,p2,p3)
-#define AVRC_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_EVENT0(m)
-#define AVRC_TRACE_EVENT1(m,p1)
-#define AVRC_TRACE_EVENT2(m,p1,p2)
-#define AVRC_TRACE_EVENT3(m,p1,p2,p3)
-#define AVRC_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_DEBUG0(m)
-#define AVRC_TRACE_DEBUG1(m,p1)
-#define AVRC_TRACE_DEBUG2(m,p1,p2)
-#define AVRC_TRACE_DEBUG3(m,p1,p2,p3)
-#define AVRC_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define AVRC_TRACE_API0(m)
-#define AVRC_TRACE_API1(m,p1)
-#define AVRC_TRACE_API2(m,p1,p2)
-#define AVRC_TRACE_API3(m,p1,p2,p3)
-#define AVRC_TRACE_API4(m,p1,p2,p3,p4)
-#define AVRC_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AVRC_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
+#define AVRC_TRACE_ERROR(...)
+#define AVRC_TRACE_WARNING(...)
+#define AVRC_TRACE_EVENT(...)
+#define AVRC_TRACE_DEBUG(...)
+#define AVRC_TRACE_API(...)
 
 /* MCAP
 */
-#define MCA_TRACE_ERROR0(m)
-#define MCA_TRACE_ERROR1(m,p1)
-#define MCA_TRACE_ERROR2(m,p1,p2)
-#define MCA_TRACE_ERROR3(m,p1,p2,p3)
-#define MCA_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define MCA_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_WARNING0(m)
-#define MCA_TRACE_WARNING1(m,p1)
-#define MCA_TRACE_WARNING2(m,p1,p2)
-#define MCA_TRACE_WARNING3(m,p1,p2,p3)
-#define MCA_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define MCA_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_EVENT0(m)
-#define MCA_TRACE_EVENT1(m,p1)
-#define MCA_TRACE_EVENT2(m,p1,p2)
-#define MCA_TRACE_EVENT3(m,p1,p2,p3)
-#define MCA_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define MCA_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_DEBUG0(m)
-#define MCA_TRACE_DEBUG1(m,p1)
-#define MCA_TRACE_DEBUG2(m,p1,p2)
-#define MCA_TRACE_DEBUG3(m,p1,p2,p3)
-#define MCA_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define MCA_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define MCA_TRACE_API0(m)
-#define MCA_TRACE_API1(m,p1)
-#define MCA_TRACE_API2(m,p1,p2)
-#define MCA_TRACE_API3(m,p1,p2,p3)
-#define MCA_TRACE_API4(m,p1,p2,p3,p4)
-#define MCA_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define MCA_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-/* Define tracing for the AMP unit
-*/
-#define AMP_TRACE_ERROR0(m)
-#define AMP_TRACE_ERROR1(m,p1)
-#define AMP_TRACE_ERROR2(m,p1,p2)
-#define AMP_TRACE_ERROR3(m,p1,p2,p3)
-#define AMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define AMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_WARNING0(m)
-#define AMP_TRACE_WARNING1(m,p1)
-#define AMP_TRACE_WARNING2(m,p1,p2)
-#define AMP_TRACE_WARNING3(m,p1,p2,p3)
-#define AMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define AMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_API0(m)
-#define AMP_TRACE_API1(m,p1)
-#define AMP_TRACE_API2(m,p1,p2)
-#define AMP_TRACE_API3(m,p1,p2,p3)
-#define AMP_TRACE_API4(m,p1,p2,p3,p4)
-#define AMP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_EVENT0(m)
-#define AMP_TRACE_EVENT1(m,p1)
-#define AMP_TRACE_EVENT2(m,p1,p2)
-#define AMP_TRACE_EVENT3(m,p1,p2,p3)
-#define AMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define AMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define AMP_TRACE_DEBUG0(m)
-#define AMP_TRACE_DEBUG1(m,p1)
-#define AMP_TRACE_DEBUG2(m,p1,p2)
-#define AMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define AMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define AMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define AMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define MCA_TRACE_ERROR(...)
+#define MCA_TRACE_WARNING(...)
+#define MCA_TRACE_EVENT(...)
+#define MCA_TRACE_DEBUG(...)
+#define MCA_TRACE_API(...)
 
 /* Define tracing for the GATT
 */
-#define GATT_TRACE_ERROR0(m)
-#define GATT_TRACE_ERROR1(m,p1)
-#define GATT_TRACE_ERROR2(m,p1,p2)
-#define GATT_TRACE_ERROR3(m,p1,p2,p3)
-#define GATT_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define GATT_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_WARNING0(m)
-#define GATT_TRACE_WARNING1(m,p1)
-#define GATT_TRACE_WARNING2(m,p1,p2)
-#define GATT_TRACE_WARNING3(m,p1,p2,p3)
-#define GATT_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define GATT_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_API0(m)
-#define GATT_TRACE_API1(m,p1)
-#define GATT_TRACE_API2(m,p1,p2)
-#define GATT_TRACE_API3(m,p1,p2,p3)
-#define GATT_TRACE_API4(m,p1,p2,p3,p4)
-#define GATT_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_EVENT0(m)
-#define GATT_TRACE_EVENT1(m,p1)
-#define GATT_TRACE_EVENT2(m,p1,p2)
-#define GATT_TRACE_EVENT3(m,p1,p2,p3)
-#define GATT_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define GATT_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define GATT_TRACE_DEBUG0(m)
-#define GATT_TRACE_DEBUG1(m,p1)
-#define GATT_TRACE_DEBUG2(m,p1,p2)
-#define GATT_TRACE_DEBUG3(m,p1,p2,p3)
-#define GATT_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define GATT_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define GATT_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define GATT_TRACE_ERROR(...)
+#define GATT_TRACE_WARNING(...)
+#define GATT_TRACE_API(...)
+#define GATT_TRACE_EVENT(...)
+#define GATT_TRACE_DEBUG(...)
 
 /* Define tracing for the SMP unit
 */
-#define SMP_TRACE_ERROR0(m)
-#define SMP_TRACE_ERROR1(m,p1)
-#define SMP_TRACE_ERROR2(m,p1,p2)
-#define SMP_TRACE_ERROR3(m,p1,p2,p3)
-#define SMP_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define SMP_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_WARNING0(m)
-#define SMP_TRACE_WARNING1(m,p1)
-#define SMP_TRACE_WARNING2(m,p1,p2)
-#define SMP_TRACE_WARNING3(m,p1,p2,p3)
-#define SMP_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define SMP_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_API0(m)
-#define SMP_TRACE_API1(m,p1)
-#define SMP_TRACE_API2(m,p1,p2)
-#define SMP_TRACE_API3(m,p1,p2,p3)
-#define SMP_TRACE_API4(m,p1,p2,p3,p4)
-#define SMP_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_EVENT0(m)
-#define SMP_TRACE_EVENT1(m,p1)
-#define SMP_TRACE_EVENT2(m,p1,p2)
-#define SMP_TRACE_EVENT3(m,p1,p2,p3)
-#define SMP_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define SMP_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define SMP_TRACE_DEBUG0(m)
-#define SMP_TRACE_DEBUG1(m,p1)
-#define SMP_TRACE_DEBUG2(m,p1,p2)
-#define SMP_TRACE_DEBUG3(m,p1,p2,p3)
-#define SMP_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define SMP_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define SMP_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
+#define SMP_TRACE_ERROR(...)
+#define SMP_TRACE_WARNING(...)
+#define SMP_TRACE_API(...)
+#define SMP_TRACE_EVENT(...)
+#define SMP_TRACE_DEBUG(...)
 
 #endif
 
@@ -4449,149 +795,22 @@
 extern UINT8 btif_trace_level;
 
 /* define traces for application */
-#define BTIF_TRACE_ERROR0(m)                    {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, (m));}
-#define BTIF_TRACE_ERROR1(m,p1)                 {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_ERROR2(m,p1,p2)              {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_ERROR3(m,p1,p2,p3)           {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_ERROR4(m,p1,p2,p3,p4)        {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)     {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)  {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_WARNING0(m)                  {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, (m));}
-#define BTIF_TRACE_WARNING1(m,p1)               {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_WARNING2(m,p1,p2)            {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_WARNING3(m,p1,p2,p3)         {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_WARNING4(m,p1,p2,p3,p4)      {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)   {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_API0(m)                      {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, (m));}
-#define BTIF_TRACE_API1(m,p1)                   {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_API2(m,p1,p2)                {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_API3(m,p1,p2,p3)             {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_API4(m,p1,p2,p3,p4)          {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_API5(m,p1,p2,p3,p4,p5)       {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)    {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_EVENT0(m)                    {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, (m));}
-#define BTIF_TRACE_EVENT1(m,p1)                 {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_EVENT2(m,p1,p2)              {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_EVENT3(m,p1,p2,p3)           {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_EVENT4(m,p1,p2,p3,p4)        {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)     {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)  {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_DEBUG0(m)                    {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define BTIF_TRACE_DEBUG1(m,p1)                 {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_DEBUG2(m,p1,p2)              {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_DEBUG3(m,p1,p2,p3)           {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_DEBUG4(m,p1,p2,p3,p4)        {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)     {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)  {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define BTIF_TRACE_VERBOSE0(m)                    {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define BTIF_TRACE_VERBOSE1(m,p1)                 {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1));}
-#define BTIF_TRACE_VERBOSE2(m,p1,p2)              {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define BTIF_TRACE_VERBOSE3(m,p1,p2,p3)           {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define BTIF_TRACE_VERBOSE4(m,p1,p2,p3,p4)        {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define BTIF_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)     {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define BTIF_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)  {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define BTIF_TRACE_ERROR(...)                    {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define BTIF_TRACE_WARNING(...)                  {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define BTIF_TRACE_API(...)                      {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);}
+#define BTIF_TRACE_EVENT(...)                    {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define BTIF_TRACE_DEBUG(...)                    {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define BTIF_TRACE_VERBOSE(...)                  {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 #else
 /* define traces for Application */
 
-#define BTIF_TRACE_ERROR0(m)
-#define BTIF_TRACE_ERROR1(m,p1)
-#define BTIF_TRACE_ERROR2(m,p1,p2)
-#define BTIF_TRACE_ERROR3(m,p1,p2,p3)
-#define BTIF_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_ERROR7(m,p1,p2,p3,p4,p5,p6,p7)
-
-
-#define BTIF_TRACE_WARNING0(m)
-#define BTIF_TRACE_WARNING1(m,p1)
-#define BTIF_TRACE_WARNING2(m,p1,p2)
-#define BTIF_TRACE_WARNING3(m,p1,p2,p3)
-#define BTIF_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_WARNING7(m,p1,p2,p3,p4,p5,p6,p7)
-
-
-#define BTIF_TRACE_API0(m)
-#define BTIF_TRACE_API1(m,p1)
-#define BTIF_TRACE_API2(m,p1,p2)
-#define BTIF_TRACE_API3(m,p1,p2,p3)
-#define BTIF_TRACE_API4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTIF_TRACE_EVENT0(m)
-#define BTIF_TRACE_EVENT1(m,p1)
-#define BTIF_TRACE_EVENT2(m,p1,p2)
-#define BTIF_TRACE_EVENT3(m,p1,p2,p3)
-#define BTIF_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define BTIF_TRACE_DEBUG0(m)
-#define BTIF_TRACE_DEBUG1(m,p1)
-#define BTIF_TRACE_DEBUG2(m,p1,p2)
-#define BTIF_TRACE_DEBUG3(m,p1,p2,p3)
-#define BTIF_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-#define BTIF_TRACE_DEBUG7(m,p1,p2,p3,p4,p5,p6,p7)
-#define BTIF_TRACE_DEBUG8(m,p1,p2,p3,p4,p5,p6,p7,p8)
-
-
-
-
-#define BTIF_TRACE_VERBOSE0(m)
-#define BTIF_TRACE_VERBOSE1(m,p1)
-#define BTIF_TRACE_VERBOSE2(m,p1,p2)
-#define BTIF_TRACE_VERBOSE3(m,p1,p2,p3)
-#define BTIF_TRACE_VERBOSE4(m,p1,p2,p3,p4)
-#define BTIF_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)
-#define BTIF_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)
+#define BTIF_TRACE_ERROR(...)
+#define BTIF_TRACE_WARNING(...)
+#define BTIF_TRACE_API(...)
+#define BTIF_TRACE_EVENT(...)
+#define BTIF_TRACE_DEBUG(...)
+#define BTIF_TRACE_VERBOSE(...)
 
 #endif
 
@@ -4599,209 +818,25 @@
 #if (BT_USE_TRACES == TRUE || BT_TRACE_APPL == TRUE)
 
 /* define traces for application */
-#define APPL_TRACE_ERROR0(m)                    {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, (m));}
-#define APPL_TRACE_ERROR1(m,p1)                 {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1));}
-#define APPL_TRACE_ERROR2(m,p1,p2)              {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_ERROR3(m,p1,p2,p3)           {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_ERROR4(m,p1,p2,p3,p4)        {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5)     {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)  {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_WARNING0(m)                  {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, (m));}
-#define APPL_TRACE_WARNING1(m,p1)               {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1));}
-#define APPL_TRACE_WARNING2(m,p1,p2)            {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_WARNING3(m,p1,p2,p3)         {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_WARNING4(m,p1,p2,p3,p4)      {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5)   {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_API0(m)                      {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, (m));}
-#define APPL_TRACE_API1(m,p1)                   {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1));}
-#define APPL_TRACE_API2(m,p1,p2)                {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_API3(m,p1,p2,p3)             {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_API4(m,p1,p2,p3,p4)          {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_API5(m,p1,p2,p3,p4,p5)       {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_API6(m,p1,p2,p3,p4,p5,p6)    {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_EVENT0(m)                    {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, (m));}
-#define APPL_TRACE_EVENT1(m,p1)                 {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1));}
-#define APPL_TRACE_EVENT2(m,p1,p2)              {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_EVENT3(m,p1,p2,p3)           {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_EVENT4(m,p1,p2,p3,p4)        {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_EVENT5(m,p1,p2,p3,p4,p5)     {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)  {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_DEBUG0(m)                    {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define APPL_TRACE_DEBUG1(m,p1)                 {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1));}
-#define APPL_TRACE_DEBUG2(m,p1,p2)              {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_DEBUG3(m,p1,p2,p3)           {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_DEBUG4(m,p1,p2,p3,p4)        {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)     {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)  {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, \
-                                                        (m), (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
-
-#define APPL_TRACE_VERBOSE0(m)                    {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_0(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m));}
-#define APPL_TRACE_VERBOSE1(m,p1)                 {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_1(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1));}
-#define APPL_TRACE_VERBOSE2(m,p1,p2)              {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_2(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1), (UINT32)(p2));}
-#define APPL_TRACE_VERBOSE3(m,p1,p2,p3)           {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_3(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1), (UINT32)(p2), (UINT32)(p3));}
-#define APPL_TRACE_VERBOSE4(m,p1,p2,p3,p4)        {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_4(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4));}
-#define APPL_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)     {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_5(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5));}
-#define APPL_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)  {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE)\
-    LogMsg_6(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, (m), \
-    (UINT32)(p1), (UINT32)(p2), (UINT32)(p3), (UINT32)(p4), (UINT32)(p5), (UINT32)(p6));}
+#define APPL_TRACE_ERROR(...)                    {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);}
+#define APPL_TRACE_WARNING(...)                  {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);}
+#define APPL_TRACE_API(...)                      {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);}
+#define APPL_TRACE_EVENT(...)                    {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);}
+#define APPL_TRACE_DEBUG(...)                    {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
+#define APPL_TRACE_VERBOSE(...)                  {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);}
 
 #else
 /* define traces for Application */
 
-#define APPL_TRACE_ERROR0(m)
-#define APPL_TRACE_ERROR1(m,p1)
-#define APPL_TRACE_ERROR2(m,p1,p2)
-#define APPL_TRACE_ERROR3(m,p1,p2,p3)
-#define APPL_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_WARNING0(m)
-#define APPL_TRACE_WARNING1(m,p1)
-#define APPL_TRACE_WARNING2(m,p1,p2)
-#define APPL_TRACE_WARNING3(m,p1,p2,p3)
-#define APPL_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_API0(m)
-#define APPL_TRACE_API1(m,p1)
-#define APPL_TRACE_API2(m,p1,p2)
-#define APPL_TRACE_API3(m,p1,p2,p3)
-#define APPL_TRACE_API4(m,p1,p2,p3,p4)
-#define APPL_TRACE_API5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_API6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_EVENT0(m)
-#define APPL_TRACE_EVENT1(m,p1)
-#define APPL_TRACE_EVENT2(m,p1,p2)
-#define APPL_TRACE_EVENT3(m,p1,p2,p3)
-#define APPL_TRACE_EVENT4(m,p1,p2,p3,p4)
-#define APPL_TRACE_EVENT5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_EVENT6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_DEBUG0(m)
-#define APPL_TRACE_DEBUG1(m,p1)
-#define APPL_TRACE_DEBUG2(m,p1,p2)
-#define APPL_TRACE_DEBUG3(m,p1,p2,p3)
-#define APPL_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
-#define APPL_TRACE_VERBOSE0(m)
-#define APPL_TRACE_VERBOSE1(m,p1)
-#define APPL_TRACE_VERBOSE2(m,p1,p2)
-#define APPL_TRACE_VERBOSE3(m,p1,p2,p3)
-#define APPL_TRACE_VERBOSE4(m,p1,p2,p3,p4)
-#define APPL_TRACE_VERBOSE5(m,p1,p2,p3,p4,p5)
-#define APPL_TRACE_VERBOSE6(m,p1,p2,p3,p4,p5,p6)
+#define APPL_TRACE_ERROR(...)
+#define APPL_TRACE_WARNING(...)
+#define APPL_TRACE_API(...)
+#define APPL_TRACE_EVENT(...)
+#define APPL_TRACE_DEBUG(...)
+#define APPL_TRACE_VERBOSE(...)
 
 #endif
 
-#if ((MMI_INCLUDED == TRUE) && (!defined(HID_MSKB_INCLUDED) || (HID_MSKB_INCLUDED == FALSE)))
-/* UI for sample applications */
-#define SAP_TRACE_0(m)                            MMI_Echo(m)
-#define SAP_TRACE_1(m,p1)                         MMI_Echo(m,p1)
-#define SAP_TRACE_2(m,p1,p2)                      MMI_Echo(m,p1,p2)
-#define SAP_TRACE_3(m,p1,p2,p3)                   MMI_Echo(m,p1,p2,p3)
-#define SAP_TRACE_4(m,p1,p2,p3,p4)                MMI_Echo(m,p1,p2,p3,p4)
-#define SAP_TRACE_5(m,p1,p2,p3,p4,p5)             MMI_Echo(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_6(m,p1,p2,p3,p4,p5,p6)          MMI_Echo(m,p1,p2,p3,p4,p5,p6)
-#else
-#define SAP_TRACE_0(m)
-#define SAP_TRACE_1(m,p1)
-#define SAP_TRACE_2(m,p1,p2)
-#define SAP_TRACE_3(m,p1,p2,p3)
-#define SAP_TRACE_4(m,p1,p2,p3,p4)
-#define SAP_TRACE_5(m,p1,p2,p3,p4,p5)
-#define SAP_TRACE_6(m,p1,p2,p3,p4,p5,p6)
-
-#endif  /* End of MMI_INCLUDED */
-#if defined(DRV_DEBUG_MSG) && (DRV_DEBUG_MSG == TRUE)
-/* Driver Trace macros
-*/
-#define DRV_TRACE_WARNING0(m)                      APPL_TRACE_WARNING0(m)
-#define DRV_TRACE_WARNING1(m,p1)                   APPL_TRACE_WARNING1(m,p1)
-#define DRV_TRACE_WARNING2(m,p1,p2)                APPL_TRACE_WARNING2(m,p1,p2)
-#define DRV_TRACE_WARNING3(m,p1,p2,p3)             APPL_TRACE_WARNING3(m,p1,p2,p3)
-#define DRV_TRACE_WARNING4(m,p1,p2,p3,p4)          APPL_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DRV_TRACE_WARNING5(m,p1,p2,p3,p4,p5)       APPL_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)    APPL_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#else
-/* Driver Trace macros
-*/
-#define DRV_TRACE_WARNING0(m)
-#define DRV_TRACE_WARNING1(m,p1)
-#define DRV_TRACE_WARNING2(m,p1,p2)
-#define DRV_TRACE_WARNING3(m,p1,p2,p3)
-#define DRV_TRACE_WARNING4(m,p1,p2,p3,p4)
-#define DRV_TRACE_WARNING5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_WARNING6(m,p1,p2,p3,p4,p5,p6)
-#endif
-
-#define DRV_TRACE_ERROR0(m)                      APPL_TRACE_ERROR0(m)
-#define DRV_TRACE_ERROR1(m,p1)                   APPL_TRACE_ERROR1(m,p1)
-#define DRV_TRACE_ERROR2(m,p1,p2)                APPL_TRACE_ERROR2(m,p1,p2)
-#define DRV_TRACE_ERROR3(m,p1,p2,p3)             APPL_TRACE_ERROR3(m,p1,p2,p3)
-#define DRV_TRACE_ERROR4(m,p1,p2,p3,p4)          APPL_TRACE_ERROR4(m,p1,p2,p3,p4)
-#define DRV_TRACE_ERROR5(m,p1,p2,p3,p4,p5)       APPL_TRACE_ERROR5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)    APPL_TRACE_ERROR6(m,p1,p2,p3,p4,p5,p6)
-
-/* Driver Trace macros
-*/
-#define DRV_TRACE_DEBUG0(m)                    APPL_TRACE_DEBUG0(m)
-#define DRV_TRACE_DEBUG1(m,p1)                 APPL_TRACE_DEBUG1(m,p1)
-#define DRV_TRACE_DEBUG2(m,p1,p2)              APPL_TRACE_DEBUG2(m,p1,p2)
-#define DRV_TRACE_DEBUG3(m,p1,p2,p3)           APPL_TRACE_DEBUG3(m,p1,p2,p3)
-#define DRV_TRACE_DEBUG4(m,p1,p2,p3,p4)        APPL_TRACE_DEBUG4(m,p1,p2,p3,p4)
-#define DRV_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)     APPL_TRACE_DEBUG5(m,p1,p2,p3,p4,p5)
-#define DRV_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)  APPL_TRACE_DEBUG6(m,p1,p2,p3,p4,p5,p6)
-
 /* Simplified Trace Helper Macro
 */
 #if (BT_USE_TRACES == TRUE)
@@ -4835,5 +870,3 @@
 #define bdla(assert_if) ((void)0)
 #endif
 #endif /* BT_TRACE_H */
-
-
diff --git a/include/bte.h b/include/bte.h
index 968b68a..eebabd4 100644
--- a/include/bte.h
+++ b/include/bte.h
@@ -100,12 +100,6 @@
 /* Protocol trace mask */
 extern UINT32 bte_proto_trace_mask;
 
-/* BTE version string */
-extern const UINT8 bte_version_string[];
-
-/* BTIF version string */
-extern const UINT8 btif_version_string[];
-
 typedef struct tBAUD_REG_tag {
     UINT8 DHBR;
     UINT8 DLBR;
diff --git a/include/gki_target.h b/include/gki_target.h
index cdd7726..d71c268 100644
--- a/include/gki_target.h
+++ b/include/gki_target.h
@@ -82,7 +82,7 @@
 
 /* The number of GKI timers in the software system. */
 #ifndef GKI_NUM_TIMERS
-#define GKI_NUM_TIMERS              3
+#define GKI_NUM_TIMERS              4
 #endif
 
 /* A conversion value for translating ticks to calculate GKI timer.  */
@@ -129,17 +129,6 @@
 #define GKI_OS_TICKS_TO_SECS(x)   ((x) / OS_TICKS_PER_SEC))
 #endif
 
-
-/* delay in ticks before stopping system tick. */
-#ifndef GKI_DELAY_STOP_SYS_TICK
-#define GKI_DELAY_STOP_SYS_TICK     10
-#endif
-
-/* Option to guarantee no preemption during timer expiration (most system don't need this) */
-#ifndef GKI_TIMER_LIST_NOPREEMPT
-#define GKI_TIMER_LIST_NOPREEMPT    FALSE
-#endif
-
 /******************************************************************************
 **
 ** Buffer configuration
@@ -316,11 +305,6 @@
 #define GKI_MAX_EXCEPTION_MSGLEN    64
 #endif
 
-#ifndef GKI_SEND_MSG_FROM_ISR
-#define GKI_SEND_MSG_FROM_ISR    FALSE
-#endif
-
-
 /* The following is intended to be a reserved pool for SCO
 over HCI data and intentionally kept out of order */
 
@@ -402,23 +386,6 @@
 #endif
 // btla-specific --
 
-/* GKI Trace Macros */
-#define GKI_TRACE_0(m)                          LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m)
-#define GKI_TRACE_1(m,p1)                       LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1)
-#define GKI_TRACE_2(m,p1,p2)                    LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2)
-#define GKI_TRACE_3(m,p1,p2,p3)                 LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3)
-#define GKI_TRACE_4(m,p1,p2,p3,p4)              LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4)
-#define GKI_TRACE_5(m,p1,p2,p3,p4,p5)           LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4,p5)
-#define GKI_TRACE_6(m,p1,p2,p3,p4,p5,p6)        LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_GENERIC,m,p1,p2,p3,p4,p5,p6)
-
-#define GKI_TRACE_ERROR_0(m)                    LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m)
-#define GKI_TRACE_ERROR_1(m,p1)                 LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1)
-#define GKI_TRACE_ERROR_2(m,p1,p2)              LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2)
-#define GKI_TRACE_ERROR_3(m,p1,p2,p3)           LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3)
-#define GKI_TRACE_ERROR_4(m,p1,p2,p3,p4)        LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4)
-#define GKI_TRACE_ERROR_5(m,p1,p2,p3,p4,p5)     LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5)
-#define GKI_TRACE_ERROR_6(m,p1,p2,p3,p4,p5,p6)  LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI | TRACE_TYPE_ERROR,m,p1,p2,p3,p4,p5,p6)
-
 #ifdef __cplusplus
 extern "C"
 {
diff --git a/main/Android.mk b/main/Android.mk
index 5230b32..21dfa1c 100644
--- a/main/Android.mk
+++ b/main/Android.mk
@@ -1,4 +1,4 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
 
 #
 # Bluetooth HW module
@@ -11,56 +11,58 @@
 	../btif/src/bluetooth.c
 
 # platform specific
-LOCAL_SRC_FILES+= \
-	bte_main.c \
+LOCAL_SRC_FILES += \
+	bte_conf.c \
 	bte_init.c \
-	bte_version.c \
 	bte_logmsg.c \
-	bte_conf.c
+	bte_main.c
 
 # BTIF
 LOCAL_SRC_FILES += \
-    ../btif/src/btif_core.c \
-    ../btif/src/btif_dm.c \
-    ../btif/src/btif_storage.c \
-    ../btif/src/btif_util.c \
-    ../btif/src/btif_sm.c \
-    ../btif/src/btif_hf.c \
-    ../btif/src/btif_av.c \
-    ../btif/src/btif_rc.c \
-    ../btif/src/btif_media_task.c \
-    ../btif/src/btif_hh.c \
-    ../btif/src/btif_hl.c \
-    ../btif/src/btif_sock.c \
-    ../btif/src/btif_sock_rfc.c \
-    ../btif/src/btif_sock_thread.c \
-    ../btif/src/btif_sock_sdp.c \
-    ../btif/src/btif_sock_util.c \
-    ../btif/src/btif_pan.c \
-    ../btif/src/btif_gatt.c \
-    ../btif/src/btif_gatt_client.c \
-    ../btif/src/btif_gatt_server.c \
-    ../btif/src/btif_gatt_util.c \
-    ../btif/src/btif_gatt_test.c \
-    ../btif/src/btif_config.c \
-    ../btif/src/btif_config_util.cpp \
-    ../btif/src/btif_profile_queue.c
+	../btif/src/btif_av.c \
+	../btif/src/btif_config.c \
+	../btif/src/btif_config_util.cpp \
+	../btif/src/btif_core.c \
+	../btif/src/btif_dm.c \
+	../btif/src/btif_gatt.c \
+	../btif/src/btif_gatt_client.c \
+	../btif/src/btif_gatt_multi_adv_util.c \
+	../btif/src/btif_gatt_server.c \
+	../btif/src/btif_gatt_test.c \
+	../btif/src/btif_gatt_util.c \
+	../btif/src/btif_hf.c \
+	../btif/src/btif_hf_client.c \
+	../btif/src/btif_hh.c \
+	../btif/src/btif_hl.c \
+	../btif/src/btif_mce.c \
+	../btif/src/btif_media_task.c \
+	../btif/src/btif_pan.c \
+	../btif/src/btif_profile_queue.c \
+	../btif/src/btif_rc.c \
+	../btif/src/btif_sm.c \
+	../btif/src/btif_sock.c \
+	../btif/src/btif_sock_rfc.c \
+	../btif/src/btif_sock_sdp.c \
+	../btif/src/btif_sock_thread.c \
+	../btif/src/btif_sock_util.c \
+	../btif/src/btif_storage.c \
+	../btif/src/btif_util.c
 
 # callouts
-LOCAL_SRC_FILES+= \
-    ../btif/co/bta_sys_co.c \
-    ../btif/co/bta_fs_co.c \
-    ../btif/co/bta_ag_co.c \
-    ../btif/co/bta_dm_co.c \
-    ../btif/co/bta_av_co.c \
-    ../btif/co/bta_hh_co.c \
-    ../btif/co/bta_hl_co.c \
-    ../btif/co/bta_pan_co.c \
-    ../btif/co/bta_gattc_co.c \
-    ../btif/co/bta_gatts_co.c \
+LOCAL_SRC_FILES += \
+	../btif/co/bta_ag_co.c \
+	../btif/co/bta_av_co.c \
+	../btif/co/bta_dm_co.c \
+	../btif/co/bta_fs_co.c \
+	../btif/co/bta_gattc_co.c \
+	../btif/co/bta_gatts_co.c \
+	../btif/co/bta_hh_co.c \
+	../btif/co/bta_hl_co.c \
+	../btif/co/bta_pan_co.c \
+	../btif/co/bta_sys_co.c
 
 # sbc encoder
-LOCAL_SRC_FILES+= \
+LOCAL_SRC_FILES += \
 	../embdrv/sbc/encoder/srce/sbc_analysis.c \
 	../embdrv/sbc/encoder/srce/sbc_dct.c \
 	../embdrv/sbc/encoder/srce/sbc_dct_coeffs.c \
@@ -70,13 +72,14 @@
 	../embdrv/sbc/encoder/srce/sbc_encoder.c \
 	../embdrv/sbc/encoder/srce/sbc_packing.c \
 
-LOCAL_SRC_FILES+= \
+LOCAL_SRC_FILES += \
 	../udrv/ulinux/uipc.c
 
-LOCAL_C_INCLUDES+= . \
+LOCAL_C_INCLUDES += . \
 	$(LOCAL_PATH)/../bta/include \
 	$(LOCAL_PATH)/../bta/sys \
 	$(LOCAL_PATH)/../bta/dm \
+	$(LOCAL_PATH)/../osi/include \
 	$(LOCAL_PATH)/../gki/common \
 	$(LOCAL_PATH)/../gki/ulinux \
 	$(LOCAL_PATH)/../include \
@@ -92,46 +95,53 @@
 	$(LOCAL_PATH)/../btif/include \
 	$(LOCAL_PATH)/../btif/co \
 	$(LOCAL_PATH)/../hci/include\
-	$(LOCAL_PATH)/../brcm/include \
+	$(LOCAL_PATH)/../vnd/include \
 	$(LOCAL_PATH)/../embdrv/sbc/encoder/include \
+	$(LOCAL_PATH)/../embdrv/sbc/decoder/include \
 	$(LOCAL_PATH)/../audio_a2dp_hw \
 	$(LOCAL_PATH)/../utils/include \
 	$(bdroid_C_INCLUDES) \
 	external/tinyxml2
 
-LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Werror -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter
+LOCAL_CFLAGS += -DBUILDCFG $(bdroid_CFLAGS) -Wno-error=maybe-uninitialized -Wno-error=uninitialized -Wno-error=unused-parameter
+LOCAL_CONLYFLAGS := -std=c99
 
 ifeq ($(TARGET_PRODUCT), full_crespo)
-     LOCAL_CFLAGS += -DTARGET_CRESPO
+	LOCAL_CFLAGS += -DTARGET_CRESPO
 endif
 ifeq ($(TARGET_PRODUCT), full_crespo4g)
-     LOCAL_CFLAGS += -DTARGET_CRESPO
+	LOCAL_CFLAGS += -DTARGET_CRESPO
 endif
 ifeq ($(TARGET_PRODUCT), full_maguro)
-     LOCAL_CFLAGS += -DTARGET_MAGURO
+	LOCAL_CFLAGS += -DTARGET_MAGURO
 endif
 
-# Fix this
-#ifeq ($(TARGET_VARIANT), eng)
-#     LOCAL_CFLAGS += -O2 # and other production release flags
-#else
-#     LOCAL_CFLAGS +=
-#endif
-
 LOCAL_SHARED_LIBRARIES := \
-    libcutils \
-    liblog \
-    libpower \
-    libbt-hci \
-    libbt-utils
+	libcutils \
+	libdl \
+	liblog \
+	libpower
 
-#LOCAL_WHOLE_STATIC_LIBRARIES := libbt-brcm_gki libbt-brcm_stack libbt-brcm_bta
-LOCAL_STATIC_LIBRARIES := libbt-brcm_gki libbt-brcm_bta libbt-brcm_stack libtinyxml2
+LOCAL_STATIC_LIBRARIES := \
+	libbt-brcm_bta \
+	libbt-brcm_gki \
+	libbt-brcm_stack \
+	libbt-hci \
+	libbt-utils \
+	libbt-qcom_sbc_decoder \
+	libosi \
+	libtinyxml2 \
+	libbt-qcom_sbc_decoder
 
 LOCAL_MODULE := bluetooth.default
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_REQUIRED_MODULES := libbt-hci libbt-vendor bt_stack.conf bt_did.conf auto_pair_devlist.conf
+LOCAL_REQUIRED_MODULES := \
+	auto_pair_devlist.conf \
+	bt_did.conf \
+	bt_stack.conf \
+	libbt-vendor
+LOCAL_MULTILIB := 32
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/main/bte_conf.c b/main/bte_conf.c
index ddad0c7..63ace86 100644
--- a/main/bte_conf.c
+++ b/main/bte_conf.c
@@ -16,440 +16,122 @@
  *
  ******************************************************************************/
 
-/******************************************************************************
- *
- *  Filename:      bte_conf.c
- *
- *  Description:   Contains functions to conduct run-time module configuration
- *                 based on entries present in the .conf file
- *
- ******************************************************************************/
-
 #define LOG_TAG "bte_conf"
 
-#include <utils/Log.h>
+#include <assert.h>
 #include <stdio.h>
 #include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
+#include <utils/Log.h>
 
-#include "bt_target.h"
 #include "bta_api.h"
-#include "bt_utils.h"
+#include "config.h"
 
-/******************************************************************************
-**  Externs
-******************************************************************************/
-extern BOOLEAN hci_logging_enabled;
+// TODO: eliminate these global variables.
 extern char hci_logfile[256];
+extern BOOLEAN hci_logging_enabled;
+extern BOOLEAN hci_save_log;
 extern BOOLEAN trace_conf_enabled;
-void bte_trace_conf(char *p_name, char *p_conf_value);
-int device_name_cfg(char *p_conf_name, char *p_conf_value);
-int device_class_cfg(char *p_conf_name, char *p_conf_value);
-int logging_cfg_onoff(char *p_conf_name, char *p_conf_value);
-int logging_set_filepath(char *p_conf_name, char *p_conf_value);
-int trace_cfg_onoff(char *p_conf_name, char *p_conf_value);
+void bte_trace_conf_config(const config_t *config);
 
-BD_NAME local_device_default_name = BTM_DEF_LOCAL_NAME;
-DEV_CLASS local_device_default_class = {0x40, 0x02, 0x0C};
+// Reads the stack configuration file and populates global variables with
+// the contents of the file.
+void bte_load_conf(const char *path) {
+  assert(path != NULL);
 
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-#define CONF_DBG          0
-#define info(format, ...) ALOGI (format, ## __VA_ARGS__)
-#define debug(format, ...) if (CONF_DBG) ALOGD (format, ## __VA_ARGS__)
-#define error(format, ...) ALOGE (format, ## __VA_ARGS__)
+  ALOGI("%s attempt to load stack conf from %s", __func__, path);
 
-#define CONF_KEY_LEN   32
-#define CONF_VALUE_LEN 96
+  config_t *config = config_new(path);
+  if (!config) {
+    ALOGI("%s file >%s< not found", __func__, path);
+    return;
+  }
 
-#define CONF_COMMENT '#'
-#define CONF_DELIMITERS " =\n\r\t"
-#define CONF_VALUES_DELIMITERS "\"=\n\r\t"
-#define CONF_COD_DELIMITERS " {,}\t"
-#define CONF_MAX_LINE_LEN 255
+  strlcpy(hci_logfile, config_get_string(config, CONFIG_DEFAULT_SECTION, "BtSnoopFileName", ""), sizeof(hci_logfile));
+  hci_logging_enabled = config_get_bool(config, CONFIG_DEFAULT_SECTION, "BtSnoopLogOutput", false);
+  hci_save_log = config_get_bool(config, CONFIG_DEFAULT_SECTION, "BtSnoopSaveLog", false);
+  trace_conf_enabled = config_get_bool(config, CONFIG_DEFAULT_SECTION, "TraceConf", false);
 
-typedef int (conf_action_t)(char *p_conf_name, char *p_conf_value);
-
-typedef struct {
-    const char *conf_entry;
-    conf_action_t *p_action;
-} conf_entry_t;
-
-typedef struct {
-    char key[CONF_KEY_LEN];
-    char value[CONF_VALUE_LEN];
-} tKEY_VALUE_PAIRS;
-
-enum {
-    CONF_DID,
-    CONF_DID_RECORD_NUM,
-    CONF_DID_PRIMARY_RECORD,
-    CONF_DID_VENDOR_ID,
-    CONF_DID_VENDOR_ID_SOURCE,
-    CONF_DID_PRODUCT_ID,
-    CONF_DID_VERSION,
-    CONF_DID_CLIENT_EXECUTABLE_URL,
-    CONF_DID_SERVICE_DESCRIPTION,
-    CONF_DID_DOCUMENTATION_URL,
-    CONF_DID_MAX
-};
-typedef UINT8 tCONF_DID;
-/******************************************************************************
-**  Static variables
-******************************************************************************/
-
-/*
- * Current supported entries and corresponding action functions
- */
-/* TODO: Name and Class are duplicated with NVRAM adapter_info. Need to be sorted out */
-static const conf_entry_t conf_table[] = {
-    /*{"Name", device_name_cfg},
-    {"Class", device_class_cfg},*/
-    {"BtSnoopLogOutput", logging_cfg_onoff},
-    {"BtSnoopFileName", logging_set_filepath},
-    {"TraceConf", trace_cfg_onoff},
-    {(const char *) NULL, NULL}
-};
-
-static tKEY_VALUE_PAIRS did_conf_pairs[CONF_DID_MAX] = {
-    { "[DID]",               "" },
-    { "recordNumber",        "" },
-    { "primaryRecord",       "" },
-    { "vendorId",            "" },
-    { "vendorIdSource",      "" },
-    { "productId",           "" },
-    { "version",             "" },
-    { "clientExecutableURL", "" },
-    { "serviceDescription",  "" },
-    { "documentationURL",    "" },
-};
-/*****************************************************************************
-**   FUNCTIONS
-*****************************************************************************/
-
-int device_name_cfg(char *p_conf_name, char *p_conf_value)
-{
-    UNUSED(p_conf_name);
-    strcpy((char *)local_device_default_name, p_conf_value);
-    return 0;
+  bte_trace_conf_config(config);
+  config_free(config);
 }
 
-int device_class_cfg(char *p_conf_name, char *p_conf_value)
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+extern int btm_ble_tx_power[BTM_BLE_ADV_TX_POWER_MAX + 1];
+void bte_load_ble_conf(const char* path)
 {
-    char *p_token;
-    unsigned int x;
-    UNUSED(p_conf_name);
+  assert(path != NULL);
 
-    p_token = strtok(p_conf_value, CONF_COD_DELIMITERS);
-    sscanf(p_token, "%x", &x);
-    local_device_default_class[0] = (UINT8) x;
-    p_token = strtok(NULL, CONF_COD_DELIMITERS);
-    sscanf(p_token, "%x", &x);
-    local_device_default_class[1] = (UINT8) x;
-    p_token = strtok(NULL, CONF_COD_DELIMITERS);
-    sscanf(p_token, "%x", &x);
-    local_device_default_class[2] = (UINT8) x;
+  ALOGI("%s attempt to load ble stack conf from %s", __func__, path);
 
-    return 0;
+  config_t *config = config_new(path);
+  if (!config) {
+    ALOGI("%s file >%s< not found", __func__, path);
+    return;
+  }
+
+  const char* ble_adv_tx_power = config_get_string(config, CONFIG_DEFAULT_SECTION, "BLE_ADV_TX_POWER", "");
+  if(*ble_adv_tx_power) {
+    sscanf(ble_adv_tx_power, "%d,%d,%d,%d,%d", btm_ble_tx_power, btm_ble_tx_power + 1, btm_ble_tx_power + 2,
+                                               btm_ble_tx_power + 3, btm_ble_tx_power + 4);
+    ALOGI("loaded btm_ble_tx_power: %d, %d, %d, %d, %d", (char)btm_ble_tx_power[0], (char)btm_ble_tx_power[1],
+                                        btm_ble_tx_power[2], btm_ble_tx_power[3], btm_ble_tx_power[4]);
+  }
+  config_free(config);
 }
+#endif
 
-int logging_cfg_onoff(char *p_conf_name, char *p_conf_value)
-{
-    UNUSED(p_conf_name);
-    if (strcmp(p_conf_value, "true") == 0)
-        hci_logging_enabled = TRUE;
-    else
-        hci_logging_enabled = FALSE;
-    return 0;
-}
+// Parses the specified Device ID configuration file and registers the
+// Device ID records with SDP.
+void bte_load_did_conf(const char *p_path) {
+    assert(p_path != NULL);
 
-int logging_set_filepath(char *p_conf_name, char *p_conf_value)
-{
-    UNUSED(p_conf_name);
-    strcpy(hci_logfile, p_conf_value);
-    return 0;
-}
-
-int trace_cfg_onoff(char *p_conf_name, char *p_conf_value)
-{
-    UNUSED(p_conf_name);
-    trace_conf_enabled = (strcmp(p_conf_value, "true") == 0) ? TRUE : FALSE;
-    return 0;
-}
-
-/*****************************************************************************
-**   CONF INTERFACE FUNCTIONS
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function        bte_load_conf
-**
-** Description     Read conf entry from p_path file one by one and call
-**                 the corresponding config function
-**
-** Returns         None
-**
-*******************************************************************************/
-void bte_load_conf(const char *p_path)
-{
-    FILE    *p_file;
-    char    *p_name;
-    char    *p_value;
-    conf_entry_t    *p_entry;
-    char    line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
-    BOOLEAN name_matched;
-
-    ALOGI("Attempt to load stack conf from %s", p_path);
-
-    if ((p_file = fopen(p_path, "r")) != NULL)
-    {
-        /* read line by line */
-        while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
-        {
-            if (line[0] == CONF_COMMENT)
-                continue;
-
-            p_name = strtok(line, CONF_DELIMITERS);
-
-            if (NULL == p_name)
-            {
-                continue;
-            }
-
-            p_value = strtok(NULL, CONF_VALUES_DELIMITERS);
-
-            if (NULL == p_value)
-            {
-                ALOGW("bte_load_conf: missing value for name: %s", p_name);
-                continue;
-            }
-
-            name_matched = FALSE;
-            p_entry = (conf_entry_t *)conf_table;
-
-            while (p_entry->conf_entry != NULL)
-            {
-                if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0)
-                {
-                    name_matched = TRUE;
-                    if (p_entry->p_action != NULL)
-                        p_entry->p_action(p_name, p_value);
-                    break;
-                }
-
-                p_entry++;
-            }
-
-            if ((name_matched == FALSE) && (trace_conf_enabled == TRUE))
-            {
-                /* Check if this is a TRC config item */
-                bte_trace_conf(p_name, p_value);
-            }
-        }
-
-        fclose(p_file);
+    config_t *config = config_new(p_path);
+    if (!config) {
+        ALOGE("%s unable to load DID config '%s'.", __func__, p_path);
+        return;
     }
-    else
-    {
-        ALOGI( "bte_load_conf file >%s< not found", p_path);
-    }
-}
 
-/*******************************************************************************
-**
-** Function        bte_parse_did_conf
-**
-** Description     Read conf entry from p_path file one by one and get
-**                 the corresponding config value
-**
-** Returns         TRUE if success, else FALSE
-**
-*******************************************************************************/
-static BOOLEAN bte_parse_did_conf (const char *p_path, UINT32 num,
-    tKEY_VALUE_PAIRS *conf_pairs, UINT32 conf_pairs_num)
-{
-    UINT32 i, param_num=0, count=0, start_count=0, end_count=0, conf_num=0;
-    BOOLEAN key=TRUE, conf_found=FALSE;
+    for (int i = 1; i <= BTA_DI_NUM_MAX; ++i) {
+        char section_name[16] = { 0 };
+        snprintf(section_name, sizeof(section_name), "DID%d", i);
 
-    FILE    *p_file;
-    char    *p;
-    char    line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
-
-    ALOGI("Attempt to load did conf from %s", p_path);
-
-    if ((p_file = fopen(p_path, "r")) != NULL)
-    {
-        /* read line by line */
-        while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
-        {
-            count++;
-            if (line[0] == CONF_COMMENT)
-                continue;
-
-            if (conf_found && (conf_num == num) && (*line == '[')) {
-                conf_found = FALSE;
-                end_count = count-1;
-                break;
-            }
-
-            p = strtok(line, CONF_DELIMITERS);
-            while (p != NULL) {
-                if (conf_num <= num) {
-                    if (key) {
-                        if (!strcmp(p, conf_pairs[0].key)) {
-                            if (++conf_num == num) {
-                                conf_found = TRUE;
-                                start_count = count;
-                                strncpy(conf_pairs[0].value, "1", CONF_VALUE_LEN);
-                            }
-                        } else {
-                            if (conf_num == num) {
-                                for (i=1; i<conf_pairs_num; i++) {
-                                    if (!strcmp(p, conf_pairs[i].key)) {
-                                        param_num = i;
-                                        break;
-                                    }
-                                }
-                                if (i == conf_pairs_num) {
-                                    error("Attribute %s does not belong to %s configuration",
-                                        p, conf_pairs[0].key);
-                                    fclose(p_file);
-                                    return FALSE;
-                                }
-                            }
-                            key = FALSE;
-                        }
-                    } else {
-                        if ((conf_num == num) && param_num) {
-                            strncpy(conf_pairs[param_num].value, p, CONF_VALUE_LEN-1);
-                            param_num = 0;
-                        }
-                        key = TRUE;
-                    }
-                }
-                p = strtok(NULL, CONF_DELIMITERS);
-            }
+        if (!config_has_section(config, section_name)) {
+            ALOGD("%s no section named %s.", __func__, section_name);
+            break;
         }
 
-        fclose(p_file);
-   }
-   else
-   {
-        ALOGI( "bte_parse_did_conf file >%s< not found", p_path);
-   }
-   if (!end_count)
-       end_count = count;
+        tBTA_DI_RECORD record;
+        record.vendor = config_get_int(config, section_name, "vendorId", LMP_COMPID_BROADCOM);
+        record.vendor_id_source = config_get_int(config, section_name, "vendorIdSource", DI_VENDOR_ID_SOURCE_BTSIG);
+        record.product = config_get_int(config, section_name, "productId", 0);
+        record.version = config_get_int(config, section_name, "version", 0);
+        record.primary_record = config_get_bool(config, section_name, "primaryRecord", false);
+        strlcpy(record.client_executable_url, config_get_string(config, section_name, "clientExecutableURL", ""), sizeof(record.client_executable_url));
+        strlcpy(record.service_description, config_get_string(config, section_name, "serviceDescription", ""), sizeof(record.service_description));
+        strlcpy(record.documentation_url, config_get_string(config, section_name, "documentationURL", ""), sizeof(record.documentation_url));
 
-   if (start_count) {
-        debug("Read %s configuration #%u from lines %u to %u in file %s",
-            conf_pairs[0].key, (unsigned int)num, (unsigned int)start_count,
-            (unsigned int)end_count, p_path);
-        return TRUE;
-   }
-
-   error("%s configuration not found in file %s", conf_pairs[0].key, p_path);
-        return FALSE;
-}
-
-/*******************************************************************************
-**
-** Function        bte_load_did_conf
-**
-** Description     Set local Device ID records, reading from configuration files
-**
-** Returns         None
-**
-*******************************************************************************/
-
-void bte_load_did_conf (const char *p_path)
-{
-    tBTA_DI_RECORD rec;
-    UINT32 rec_num, i, j;
-
-    for (i=1; i<=BTA_DI_NUM_MAX; i++) {
-        for (j=0; j<CONF_DID_MAX; j++) {
-            *did_conf_pairs[j].value = 0;
+        if (record.vendor_id_source != DI_VENDOR_ID_SOURCE_BTSIG &&
+            record.vendor_id_source != DI_VENDOR_ID_SOURCE_USBIF) {
+            ALOGE("%s invalid vendor id source %d; ignoring DID record %d.", __func__, record.vendor_id_source, i);
+            continue;
         }
 
-        if (bte_parse_did_conf(p_path, i, did_conf_pairs, CONF_DID_MAX)) {
-            memset(&rec, 0, sizeof(rec));
+        ALOGD("Device ID record %d : %s", i, (record.primary_record ? "primary" : "not primary"));
+        ALOGD("  vendorId            = %04x", record.vendor);
+        ALOGD("  vendorIdSource      = %04x", record.vendor_id_source);
+        ALOGD("  product             = %04x", record.product);
+        ALOGD("  version             = %04x", record.version);
+        ALOGD("  clientExecutableURL = %s", record.client_executable_url);
+        ALOGD("  serviceDescription  = %s", record.service_description);
+        ALOGD("  documentationURL    = %s", record.documentation_url);
 
-            if (*did_conf_pairs[CONF_DID_RECORD_NUM].value) {
-                rec_num = (UINT32)(strtoul(did_conf_pairs[CONF_DID_RECORD_NUM].value, NULL, 0)-1);
-            } else {
-                debug("[%d] Unknown %s", (unsigned int)i, did_conf_pairs[CONF_DID_RECORD_NUM].key);
-                continue;
-            }
-
-            if (*did_conf_pairs[CONF_DID_VENDOR_ID].value) {
-                rec.vendor = (UINT16)strtoul(did_conf_pairs[CONF_DID_VENDOR_ID].value, NULL, 0);
-            } else {
-                rec.vendor = LMP_COMPID_BROADCOM;
-            }
-
-            if (*did_conf_pairs[CONF_DID_VENDOR_ID_SOURCE].value) {
-                rec.vendor_id_source = (UINT16)strtoul(did_conf_pairs[CONF_DID_VENDOR_ID_SOURCE].value, NULL, 0);
-            } else {
-                rec.vendor_id_source = DI_VENDOR_ID_SOURCE_BTSIG;
-            }
-
-            if ((*did_conf_pairs[CONF_DID].value == 0) ||
-                (rec_num >= BTA_DI_NUM_MAX) ||
-                (!((rec.vendor_id_source >= DI_VENDOR_ID_SOURCE_BTSIG) &&
-                   (rec.vendor_id_source <= DI_VENDOR_ID_SOURCE_USBIF))) ||
-                (rec.vendor == DI_VENDOR_ID_DEFAULT)) {
-
-                error("DID record #%u not set", (unsigned int)i);
-                for (j=0; j<CONF_DID_MAX; j++) {
-                    error("%s:%s", did_conf_pairs[j].key, did_conf_pairs[j].value);
-                }
-                continue;
-            }
-
-            rec.product = (UINT16)strtoul(did_conf_pairs[CONF_DID_PRODUCT_ID].value, NULL, 0);
-            rec.version = (UINT16)strtoul(did_conf_pairs[CONF_DID_VERSION].value, NULL, 0);
-
-            strncpy(rec.client_executable_url,
-                did_conf_pairs[CONF_DID_CLIENT_EXECUTABLE_URL].value,
-                SDP_MAX_ATTR_LEN);
-            strncpy(rec.service_description,
-                did_conf_pairs[CONF_DID_SERVICE_DESCRIPTION].value,
-                SDP_MAX_ATTR_LEN);
-            strncpy(rec.documentation_url,
-                did_conf_pairs[CONF_DID_DOCUMENTATION_URL].value,
-                SDP_MAX_ATTR_LEN);
-
-            for (j=0; j<strlen(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value); j++) {
-                did_conf_pairs[CONF_DID_PRIMARY_RECORD].value[j] =
-                    tolower(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value[j]);
-            }
-            if ((!strcmp(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value, "true")) ||
-                (!strcmp(did_conf_pairs[CONF_DID_PRIMARY_RECORD].value, "1"))) {
-                rec.primary_record = TRUE;
-            } else {
-                rec.primary_record = FALSE;
-            }
-
-            info("[%u] primary_record=%d vendor_id=0x%04X vendor_id_source=0x%04X product_id=0x%04X version=0x%04X",
-                (unsigned int)rec_num+1, rec.primary_record, rec.vendor,
-                rec.vendor_id_source, rec.product, rec.version);
-            if (*rec.client_executable_url) {
-                info(" client_executable_url=%s", rec.client_executable_url);
-            }
-            if (*rec.service_description) {
-                info(" service_description=%s", rec.service_description);
-            }
-            if (*rec.documentation_url) {
-                info(" documentation_url=%s", rec.documentation_url);
-            }
-
-            if (BTA_DmSetLocalDiRecord(&rec, &rec_num) != BTA_SUCCESS) {
-                error("SetLocalDiInfo failed for #%u!", (unsigned int)i);
-            }
+        uint32_t record_handle;
+        tBTA_STATUS status = BTA_DmSetLocalDiRecord(&record, &record_handle);
+        if (status != BTA_SUCCESS) {
+            ALOGE("%s unable to set device ID record %d: error %d.", __func__, i, status);
         }
     }
+
+    config_free(config);
 }
 
diff --git a/main/bte_init.c b/main/bte_init.c
index b189281..3e3c1ad 100644
--- a/main/bte_init.c
+++ b/main/bte_init.c
@@ -18,7 +18,7 @@
 
 /******************************************************************************
  *
- *  This module contains the routines that initialize the stack components. 
+ *  This module contains the routines that initialize the stack components.
  *  It must be called before the BTU task is started.
  *
  ******************************************************************************/
diff --git a/main/bte_logmsg.c b/main/bte_logmsg.c
index 6c9a5eb..c9fc17e 100644
--- a/main/bte_logmsg.c
+++ b/main/bte_logmsg.c
@@ -23,11 +23,13 @@
  *
  ******************************************************************************/
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
 
+#include "config.h"
 #include "gki.h"
 #include "bte.h"
 
@@ -206,13 +208,13 @@
 //#define DBG_TRACE
 
 #if defined( DBG_TRACE )
-#define DBG_TRACE_API0( m ) BT_TRACE_0( TRACE_LAYER_HCI, TRACE_TYPE_API, m )
-#define DBG_TRACE_WARNING2( m, p0, p1 ) BT_TRACE_2( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_WARNING), m, p0, p1 )
+#define DBG_TRACE_API0( m ) BT_TRACE( TRACE_LAYER_HCI, TRACE_TYPE_API, m )
+#define DBG_TRACE_WARNING2( m, p0, p1 ) BT_TRACE( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_WARNING), m, p0, p1 )
 #else
 #define DBG_TRACE_API0( m )
 #define DBG_TRACE_WARNING2( m, p0, p1 )
 #endif
-#define DBG_TRACE_DEBUG2( m, p0, p1 ) BT_TRACE_2( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_DEBUG), m, p0, p1 )
+#define DBG_TRACE_DEBUG2( m, p0, p1 ) BT_TRACE( TRACE_LAYER_BTM, (TRACE_ORG_APPL|TRACE_TYPE_DEBUG), m, p0, p1 )
 
 void
 LogMsg(UINT32 trace_set_mask, const char *fmt_str, ...)
@@ -329,7 +331,7 @@
 
 BOOLEAN trace_conf_enabled = FALSE;
 
-void bte_trace_conf(char *p_conf_name, char *p_conf_value)
+void bte_trace_conf(const char *p_conf_name, const char *p_conf_value)
 {
     tBTTRC_FUNC_MAP *p_f_map = (tBTTRC_FUNC_MAP *) &bttrc_set_level_map[0];
 
@@ -344,6 +346,16 @@
     }
 }
 
+void bte_trace_conf_config(const config_t *config) {
+  assert(config != NULL);
+
+  for (tBTTRC_FUNC_MAP *functions = &bttrc_set_level_map[0]; functions->trc_name; ++functions) {
+    int value = config_get_int(config, CONFIG_DEFAULT_SECTION, functions->trc_name, -1);
+    if (value != -1)
+      functions->trace_level = value;
+  }
+}
+
 /********************************************************************************
  **
  **    Function Name:    BTA_SysSetTraceLevel
@@ -526,121 +538,3 @@
     }
 #endif
 }
-
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_0
- **
- **    Purpose:  Encodes a trace message that has no parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_0(UINT32 trace_set_mask, const char *fmt_str) {
-    LogMsg(trace_set_mask, fmt_str);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_1
- **
- **    Purpose:  Encodes a trace message that has one parameter argument
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_1(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1) {
-
-    LogMsg(trace_set_mask, fmt_str, p1);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_2
- **
- **    Purpose:  Encodes a trace message that has two parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_2(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2) {
-    LogMsg(trace_set_mask, fmt_str, p1, p2);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_3
- **
- **    Purpose:  Encodes a trace message that has three parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_3(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-        UINT32 p3) {
-    LogMsg(trace_set_mask, fmt_str, p1, p2, p3);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_4
- **
- **    Purpose:  Encodes a trace message that has four parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_4(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-        UINT32 p3, UINT32 p4) {
-    LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_5
- **
- **    Purpose:  Encodes a trace message that has five parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_5(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-        UINT32 p3, UINT32 p4, UINT32 p5) {
-    LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4, p5);
-}
-
-/********************************************************************************
- **
- **    Function Name:   LogMsg_6
- **
- **    Purpose:  Encodes a trace message that has six parameter arguments
- **
- **    Input Parameters:  trace_set_mask: tester trace type.
- **                       fmt_str: displayable string.
- **    Returns:
- **                      Nothing.
- **
- *********************************************************************************/
-void LogMsg_6(UINT32 trace_set_mask, const char *fmt_str, UINT32 p1, UINT32 p2,
-        UINT32 p3, UINT32 p4, UINT32 p5, UINT32 p6) {
-    LogMsg(trace_set_mask, fmt_str, p1, p2, p3, p4, p5, p6);
-}
diff --git a/main/bte_main.c b/main/bte_main.c
old mode 100644
new mode 100755
index cf21456..75cc440
--- a/main/bte_main.c
+++ b/main/bte_main.c
@@ -35,8 +35,8 @@
 #include "btu.h"
 #include "bte.h"
 #include "bta_api.h"
-#include "bt_hci_lib.h"
 #include "bt_utils.h"
+#include "bt_hci_bdroid.h"
 
 /*******************************************************************************
 **  Constants & Macros
@@ -46,6 +46,10 @@
 #ifndef BTE_STACK_CONF_FILE
 #define BTE_STACK_CONF_FILE "/etc/bluetooth/bt_stack.conf"
 #endif
+/* Run-time configuration file for BLE*/
+#ifndef BTE_BLE_STACK_CONF_FILE
+#define BTE_BLE_STACK_CONF_FILE "/etc/bluetooth/ble_stack.conf"
+#endif
 
 /* if not specified in .txt file then use this as default  */
 #ifndef HCI_LOGGING_FILENAME
@@ -78,9 +82,9 @@
 ******************************************************************************/
 BOOLEAN hci_logging_enabled = FALSE;    /* by default, turn hci log off */
 BOOLEAN hci_logging_config = FALSE;    /* configured from bluetooth framework */
+BOOLEAN hci_save_log = FALSE; /* save a copy of the log before starting again */
 char hci_logfile[256] = HCI_LOGGING_FILENAME;
 
-
 /*******************************************************************************
 **  Static variables
 *******************************************************************************/
@@ -88,6 +92,8 @@
 static const bt_hc_callbacks_t hc_callbacks;
 static BOOLEAN lpm_enabled = FALSE;
 static bt_preload_retry_cb_t preload_retry_cb;
+// Lock to serialize cleanup requests from upper layer.
+static pthread_mutex_t cleanup_lock;
 
 /*******************************************************************************
 **  Static functions
@@ -107,6 +113,7 @@
 BT_API void BTE_UnloadStack(void);
 extern void scru_flip_bda (BD_ADDR dst, const BD_ADDR src);
 extern void bte_load_conf(const char *p_path);
+extern void bte_load_ble_conf(const char *p_path);
 extern bt_bdaddr_t btif_local_bd_addr;
 
 
@@ -135,7 +142,7 @@
     if ( (bt_hc_if = (bt_hc_interface_t *) bt_hc_get_interface()) \
          == NULL)
     {
-        APPL_TRACE_ERROR0("!!! Failed to get BtHostControllerInterface !!!");
+        APPL_TRACE_ERROR("!!! Failed to get BtHostControllerInterface !!!");
     }
 
     memset(&preload_retry_cb, 0, sizeof(bt_preload_retry_cb_t));
@@ -158,11 +165,17 @@
     bte_main_in_hw_init();
 
     bte_load_conf(BTE_STACK_CONF_FILE);
+#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+    bte_load_ble_conf(BTE_BLE_STACK_CONF_FILE);
+#endif
 
 #if (BTTRC_INCLUDED == TRUE)
     /* Initialize trace feature */
     BTTRC_TraceInit(MAX_TRACE_RAM_SIZE, &BTE_TraceLogBuf[0], BTTRC_METHOD_RAM);
 #endif
+
+    pthread_mutex_init(&cleanup_lock, NULL);
+
 }
 
 /******************************************************************************
@@ -176,6 +189,8 @@
 ******************************************************************************/
 void bte_main_shutdown()
 {
+    pthread_mutex_destroy(&cleanup_lock);
+
     GKI_shutdown();
 }
 
@@ -191,20 +206,20 @@
 ******************************************************************************/
 void bte_main_enable()
 {
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
     /* Initialize BTE control block */
     BTE_Init();
 
     lpm_enabled = FALSE;
 
-    bte_hci_enable();
-
     GKI_create_task((TASKPTR)btu_task, BTU_TASK, BTE_BTU_TASK_STR,
                     (UINT16 *) ((UINT8 *)bte_btu_stack + BTE_BTU_STACK_SIZE),
                     sizeof(bte_btu_stack));
 
-    GKI_run(0);
+    bte_hci_enable();
+
+    GKI_run();
 }
 
 /******************************************************************************
@@ -219,12 +234,11 @@
 ******************************************************************************/
 void bte_main_disable(void)
 {
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
     preload_stop_wait_timer();
     bte_hci_disable();
     GKI_destroy_task(BTU_TASK);
-    GKI_freeze();
 }
 
 /******************************************************************************
@@ -253,7 +267,7 @@
         return;
     }
 
-    bt_hc_if->logging(new ? BT_HC_LOGGING_ON : BT_HC_LOGGING_OFF, hci_logfile);
+    bt_hc_if->logging(new ? BT_HC_LOGGING_ON : BT_HC_LOGGING_OFF, hci_logfile, hci_save_log);
 }
 
 /******************************************************************************
@@ -267,22 +281,22 @@
 ******************************************************************************/
 static void bte_hci_enable(void)
 {
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
     preload_start_wait_timer();
 
     if (bt_hc_if)
     {
         int result = bt_hc_if->init(&hc_callbacks, btif_local_bd_addr.address);
-        APPL_TRACE_EVENT1("libbt-hci init returns %d", result);
+        APPL_TRACE_EVENT("libbt-hci init returns %d", result);
 
         assert(result == BT_HC_STATUS_SUCCESS);
 
         if (hci_logging_enabled == TRUE || hci_logging_config == TRUE)
-            bt_hc_if->logging(BT_HC_LOGGING_ON, hci_logfile);
+            bt_hc_if->logging(BT_HC_LOGGING_ON, hci_logfile, hci_save_log);
 
 #if (defined (BT_CLEAN_TURN_ON_DISABLED) && BT_CLEAN_TURN_ON_DISABLED == TRUE)
-        APPL_TRACE_DEBUG1("%s  Not Turninig Off the BT before Turninig ON", __FUNCTION__);
+        APPL_TRACE_DEBUG("%s  Not Turninig Off the BT before Turninig ON", __FUNCTION__);
 
         /* Do not power off the chip before powering on  if BT_CLEAN_TURN_ON_DISABLED flag
          is defined and set to TRUE to avoid below mentioned issue.
@@ -316,15 +330,19 @@
 ******************************************************************************/
 static void bte_hci_disable(void)
 {
-    APPL_TRACE_DEBUG1("%s", __FUNCTION__);
+    APPL_TRACE_DEBUG("%s", __FUNCTION__);
 
-    if (bt_hc_if)
-    {
-        bt_hc_if->cleanup();
-        bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);
-        if (hci_logging_enabled == TRUE ||  hci_logging_config == TRUE)
-            bt_hc_if->logging(BT_HC_LOGGING_OFF, hci_logfile);
-    }
+    if (!bt_hc_if)
+        return;
+
+    // Cleanup is not thread safe and must be protected.
+    pthread_mutex_lock(&cleanup_lock);
+
+    if (hci_logging_enabled == TRUE ||  hci_logging_config == TRUE)
+        bt_hc_if->logging(BT_HC_LOGGING_OFF, hci_logfile, hci_save_log);
+    bt_hc_if->cleanup();
+
+    pthread_mutex_unlock(&cleanup_lock);
 }
 
 /*******************************************************************************
@@ -340,7 +358,7 @@
 {
     UNUSED(arg);
 
-    APPL_TRACE_ERROR2("...preload_wait_timeout (retried:%d/max-retry:%d)...",
+    APPL_TRACE_ERROR("...preload_wait_timeout (retried:%d/max-retry:%d)...",
                         preload_retry_cb.retry_counts,
                         PRELOAD_MAX_RETRY_ATTEMPTS);
 
@@ -395,7 +413,7 @@
 
         status = timer_settime(preload_retry_cb.timer_id, 0, &ts, 0);
         if (status == -1)
-            APPL_TRACE_ERROR0("Failed to fire preload watchdog timer");
+            APPL_TRACE_ERROR("Failed to fire preload watchdog timer");
     }
 }
 
@@ -451,7 +469,7 @@
         (enable == TRUE) ? BT_HC_LPM_ENABLE : BT_HC_LPM_DISABLE \
         );
 
-    APPL_TRACE_EVENT2("HC lib lpm enable=%d return %d", enable, result);
+    APPL_TRACE_EVENT("HC lib lpm enable=%d return %d", enable, result);
 }
 
 /******************************************************************************
@@ -470,7 +488,7 @@
     if ((bt_hc_if) && (lpm_enabled == TRUE))
         result = bt_hc_if->lpm(BT_HC_LPM_WAKE_DEASSERT);
 
-    APPL_TRACE_DEBUG1("HC lib lpm deassertion return %d", result);
+    APPL_TRACE_DEBUG("HC lib lpm deassertion return %d", result);
 }
 
 /******************************************************************************
@@ -489,10 +507,70 @@
     if ((bt_hc_if) && (lpm_enabled == TRUE))
         result = bt_hc_if->lpm(BT_HC_LPM_WAKE_ASSERT);
 
-    APPL_TRACE_DEBUG1("HC lib lpm assertion return %d", result);
+    APPL_TRACE_DEBUG("HC lib lpm assertion return %d", result);
 }
 #endif  // HCILP_INCLUDED
 
+
+/* NOTICE:
+ *  Definitions for audio state structure, this type needs to match to
+ *  the bt_vendor_op_audio_state_t type defined in bt_vendor_lib.h
+ */
+typedef struct {
+    UINT16  handle;
+    UINT16  peer_codec;
+    UINT16  state;
+} bt_hc_audio_state_t;
+
+struct bt_audio_state_tag {
+    BT_HDR hdr;
+    bt_hc_audio_state_t audio;
+};
+
+/******************************************************************************
+**
+** Function         set_audio_state
+**
+** Description      Sets audio state on controller state for SCO (PCM, WBS, FM)
+**
+** Parameters       handle: codec related handle for SCO: sco cb idx, unused for
+**                  codec: BTA_AG_CODEC_MSBC, BTA_AG_CODEC_CSVD or FM codec
+**                  state: codec state, eg. BTA_AG_CO_AUD_STATE_SETUP
+**                  param: future extensions, e.g. call-in structure/event.
+**
+** Returns          None
+**
+******************************************************************************/
+int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param)
+{
+    struct bt_audio_state_tag *p_msg;
+    int result = -1;
+
+    APPL_TRACE_API("set_audio_state(handle: %d, codec: 0x%x, state: %d)", handle,
+                    codec, state);
+    if (NULL != param)
+        APPL_TRACE_WARNING("set_audio_state() non-null param not supported");
+    p_msg = (struct bt_audio_state_tag *)GKI_getbuf(sizeof(*p_msg));
+    if (!p_msg)
+        return result;
+    p_msg->audio.handle = handle;
+    p_msg->audio.peer_codec = codec;
+    p_msg->audio.state = state;
+
+    p_msg->hdr.event = MSG_CTRL_TO_HC_CMD | (MSG_SUB_EVT_MASK & BT_HC_AUDIO_STATE);
+    p_msg->hdr.len = sizeof(p_msg->audio);
+    p_msg->hdr.offset = 0;
+    /* layer_specific shall contain return path event! for BTA events!
+     * 0 means no return message is expected. */
+    p_msg->hdr.layer_specific = 0;
+       if (bt_hc_if)
+       {
+        bt_hc_if->tx_cmd((TRANSAC)p_msg, (char *)(&p_msg->audio), sizeof(*p_msg));
+        }
+    return result;
+}
+
+
 /******************************************************************************
 **
 ** Function         bte_main_hci_send
@@ -524,7 +602,7 @@
     }
     else
     {
-        APPL_TRACE_ERROR0("Invalid Controller ID. Discarding message.");
+        APPL_TRACE_ERROR("Invalid Controller ID. Discarding message.");
         GKI_freebuf(p_msg);
     }
 }
@@ -564,7 +642,7 @@
 {
     UNUSED(transac);
 
-    APPL_TRACE_EVENT1("HC preload_cb %d [0:SUCCESS 1:FAIL]", result);
+    APPL_TRACE_EVENT("HC preload_cb %d [0:SUCCESS 1:FAIL]", result);
 
     if (result == BT_HC_PRELOAD_SUCCESS)
     {
@@ -589,7 +667,7 @@
 {
     UNUSED(transac);
 
-    APPL_TRACE_EVENT1("HC postload_cb %d", result);
+    APPL_TRACE_EVENT("HC postload_cb %d", result);
 }
 
 /******************************************************************************
@@ -604,7 +682,7 @@
 ******************************************************************************/
 static void lpm_cb(bt_hc_lpm_request_result_t result)
 {
-    APPL_TRACE_EVENT1("HC lpm_result_cb %d", result);
+    APPL_TRACE_EVENT("HC lpm_result_cb %d", result);
     lpm_enabled = (result == BT_HC_LPM_ENABLED) ? TRUE : FALSE;
 }
 
@@ -620,7 +698,7 @@
 ******************************************************************************/
 static void hostwake_ind(bt_hc_low_power_event_t event)
 {
-    APPL_TRACE_EVENT1("HC hostwake_ind %d", event);
+    APPL_TRACE_EVENT("HC hostwake_ind %d", event);
 }
 
 /******************************************************************************
@@ -638,14 +716,22 @@
     BT_HDR *p_hdr = NULL;
 
     /*
-    APPL_TRACE_DEBUG1("HC alloc size=%d", size);
+    APPL_TRACE_DEBUG("HC alloc size=%d", size);
     */
 
+    /* Requested buffer size cannot exceed GKI_MAX_BUF_SIZE. */
+    if (size > GKI_MAX_BUF_SIZE)
+    {
+         APPL_TRACE_ERROR("HCI DATA SIZE %d greater than MAX %d",
+                           size, GKI_MAX_BUF_SIZE);
+         return NULL;
+    }
+
     p_hdr = (BT_HDR *) GKI_getbuf ((UINT16) size);
 
     if (p_hdr == NULL)
     {
-        APPL_TRACE_WARNING0("alloc returns NO BUFFER!");
+        APPL_TRACE_WARNING("alloc returns NO BUFFER! (sz %d)", size);
     }
 
     return ((char *) p_hdr);
@@ -661,18 +747,12 @@
 **
 **                  Bluedroid libbt-hci library uses 'transac' parameter to
 **                  pass data-path buffer/packet across bt_hci_lib interface
-**                  boundary. The 'p_buf' is not intended to be used here
-**                  but might point to data portion of data-path buffer.
-**
-** Returns          bt_hc_status_t
+**                  boundary.
 **
 ******************************************************************************/
-static int dealloc(TRANSAC transac, char *p_buf)
+static void dealloc(TRANSAC transac)
 {
-    UNUSED(p_buf);
-
     GKI_freebuf(transac);
-    return BT_HC_STATUS_SUCCESS;
 }
 
 /******************************************************************************
@@ -702,7 +782,7 @@
     UNUSED(len);
 
     /*
-    APPL_TRACE_DEBUG2("HC data_ind event=0x%04X (len=%d)", p_msg->event, len);
+    APPL_TRACE_DEBUG("HC data_ind event=0x%04X (len=%d)", p_msg->event, len);
     */
 
     GKI_send_msg (BTU_TASK, BTU_HCI_RCV_MBOX, transac);
@@ -733,7 +813,7 @@
 {
     UNUSED(p_buf);
     /*
-    APPL_TRACE_DEBUG2("HC tx_result %d (event=%04X)", result, \
+    APPL_TRACE_DEBUG("HC tx_result %d (event=%04X)", result, \
                       ((BT_HDR *)transac)->event);
     */
 
diff --git a/osi/Android.mk b/osi/Android.mk
new file mode 100644
index 0000000..91f76ef
--- /dev/null
+++ b/osi/Android.mk
@@ -0,0 +1,45 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := \
+    $(LOCAL_PATH)/include
+
+LOCAL_SRC_FILES := \
+    ./src/alarm.c \
+    ./src/config.c \
+    ./src/fixed_queue.c \
+    ./src/list.c \
+    ./src/reactor.c \
+    ./src/semaphore.c \
+    ./src/thread.c
+
+LOCAL_CFLAGS := -std=c99 -Wall -Werror
+LOCAL_MODULE := libosi
+LOCAL_MODULE_TAGS := optional
+LOCAL_SHARED_LIBRARIES := libc liblog
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
+
+include $(BUILD_STATIC_LIBRARY)
+
+#####################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := \
+    $(LOCAL_PATH)/include
+
+LOCAL_SRC_FILES := \
+    ./test/alarm_test.cpp \
+    ./test/config_test.cpp \
+    ./test/list_test.cpp \
+    ./test/reactor_test.cpp \
+    ./test/thread_test.cpp
+
+LOCAL_CFLAGS := -Wall -Werror
+LOCAL_MODULE := ositests
+LOCAL_MODULE_TAGS := tests
+LOCAL_SHARED_LIBRARIES := liblog
+LOCAL_STATIC_LIBRARIES := libosi
+
+include $(BUILD_NATIVE_TEST)
diff --git a/osi/include/alarm.h b/osi/include/alarm.h
new file mode 100644
index 0000000..7e687ba
--- /dev/null
+++ b/osi/include/alarm.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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
+
+typedef struct alarm_t alarm_t;
+typedef uint64_t period_ms_t;
+
+// Prototype for the callback function.
+typedef void (*alarm_callback_t)(void *data);
+
+// Creates a new alarm object. The returned object must be freed by calling
+// |alarm_free|. Returns NULL on failure.
+alarm_t *alarm_new(void);
+
+// Frees an alarm object created by |alarm_new|. |alarm| may be NULL. If the
+// alarm is pending, it will be cancelled. It is not safe to call |alarm_free|
+// from inside the callback of |alarm|.
+void alarm_free(alarm_t *alarm);
+
+// Sets an alarm to fire |cb| after the given |deadline|. Note that |deadline| is the
+// number of milliseconds relative to the current time. |data| is a context variable
+// for the callback and may be NULL. |cb| will be called back in the context of an
+// unspecified thread (i.e. it will not be called back in the same thread as the caller).
+// |alarm| and |cb| may not be NULL.
+void alarm_set(alarm_t *alarm, period_ms_t deadline, alarm_callback_t cb, void *data);
+
+// This function cancels the |alarm| if it was previously set. When this call
+// returns, the caller has a guarantee that the callback is not in progress and
+// will not be called if it hasn't already been called. This function is idempotent.
+// |alarm| may not be NULL.
+void alarm_cancel(alarm_t *alarm);
diff --git a/osi/include/config.h b/osi/include/config.h
new file mode 100644
index 0000000..5e45003
--- /dev/null
+++ b/osi/include/config.h
@@ -0,0 +1,78 @@
+#pragma once
+
+// This module implements a configuration parser. Clients can query the
+// contents of a configuration file through the interface provided here.
+// The current implementation is read-only; mutations are only kept in
+// memory. This parser supports the INI file format.
+
+// Implementation notes:
+// - Key/value pairs that are not within a section are assumed to be under
+//   the |CONFIG_DEFAULT_SECTION| section.
+// - Multiple sections with the same name will be merged as if they were in
+//   a single section.
+// - Empty sections with no key/value pairs will be treated as if they do
+//   not exist. In other words, |config_has_section| will return false for
+//   empty sections.
+// - Duplicate keys in a section will overwrite previous values.
+
+#include <stdbool.h>
+
+// The default section name to use if a key/value pair is not defined within
+// a section.
+#define CONFIG_DEFAULT_SECTION "Global"
+
+struct config_t;
+typedef struct config_t config_t;
+
+// Loads the specified file and returns a handle to the config file. If there
+// was a problem loading the file or allocating memory, this function returns
+// NULL. Clients must call |config_free| on the returned handle when it is no
+// longer required. |filename| must not be NULL and must point to a readable
+// file on the filesystem.
+config_t *config_new(const char *filename);
+
+// Frees resources associated with the config file. No further operations may
+// be performed on the |config| object after calling this function. |config|
+// may be NULL.
+void config_free(config_t *config);
+
+// Returns true if the config file contains a section named |section|. If
+// the section has no key/value pairs in it, this function will return false.
+// |config| and |section| must not be NULL.
+bool config_has_section(const config_t *config, const char *section);
+
+// Returns true if the config file has a key named |key| under |section|.
+// Returns false otherwise. |config|, |section|, and |key| must not be NULL.
+bool config_has_key(const config_t *config, const char *section, const char *key);
+
+// Returns the integral value for a given |key| in |section|. If |section|
+// or |key| do not exist, or the value cannot be fully converted to an integer,
+// this function returns |def_value|. |config|, |section|, and |key| must not
+// be NULL.
+int config_get_int(const config_t *config, const char *section, const char *key, int def_value);
+
+// Returns the boolean value for a given |key| in |section|. If |section|
+// or |key| do not exist, or the value cannot be converted to a boolean, this
+// function returns |def_value|. |config|, |section|, and |key| must not be NULL.
+bool config_get_bool(const config_t *config, const char *section, const char *key, bool def_value);
+
+// Returns the string value for a given |key| in |section|. If |section| or
+// |key| do not exist, this function returns |def_value|. The returned string
+// is owned by the config module and must not be freed. |config|, |section|,
+// and |key| must not be NULL. |def_value| may be NULL.
+const char *config_get_string(const config_t *config, const char *section, const char *key, const char *def_value);
+
+// Sets an integral value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, and |key|
+// must not be NULL.
+void config_set_int(config_t *config, const char *section, const char *key, int value);
+
+// Sets a boolean value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, and |key|
+// must not be NULL.
+void config_set_bool(config_t *config, const char *section, const char *key, bool value);
+
+// Sets a string value for the |key| in |section|. If |key| or |section| do
+// not already exist, this function creates them. |config|, |section|, |key|, and
+// |value| must not be NULL.
+void config_set_string(config_t *config, const char *section, const char *key, const char *value);
diff --git a/osi/include/fixed_queue.h b/osi/include/fixed_queue.h
new file mode 100644
index 0000000..a3b896c
--- /dev/null
+++ b/osi/include/fixed_queue.h
@@ -0,0 +1,72 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 <stdbool.h>
+
+struct fixed_queue_t;
+typedef struct fixed_queue_t fixed_queue_t;
+
+typedef void (*fixed_queue_free_cb)(void *data);
+
+// Creates a new fixed queue with the given |capacity|. If more elements than
+// |capacity| are added to the queue, the caller is blocked until space is
+// made available in the queue. Returns NULL on failure. The caller must free
+// the returned queue with |fixed_queue_free|.
+fixed_queue_t *fixed_queue_new(size_t capacity);
+
+// Freeing a queue that is currently in use (i.e. has waiters
+// blocked on it) results in undefined behaviour.
+void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb);
+
+// Enqueues the given |data| into the |queue|. The caller will be blocked
+// if nore more space is available in the queue. Neither |queue| nor |data|
+// may be NULL.
+void fixed_queue_enqueue(fixed_queue_t *queue, void *data);
+
+// Dequeues the next element from |queue|. If the queue is currently empty,
+// this function will block the caller until an item is enqueued. This
+// function will never return NULL. |queue| may not be NULL.
+void *fixed_queue_dequeue(fixed_queue_t *queue);
+
+// Tries to enqueue |data| into the |queue|. This function will never block
+// the caller. If the queue capacity would be exceeded by adding one more
+// element, this function returns false immediately. Otherwise, this function
+// returns true. Neither |queue| nor |data| may be NULL.
+bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data);
+
+// Tries to dequeue an element from |queue|. This function will never block
+// the caller. If the queue is empty, this function returns NULL immediately.
+// Otherwise, the next element in the queue is returned. |queue| may not be
+// NULL.
+void *fixed_queue_try_dequeue(fixed_queue_t *queue);
+
+// This function returns a valid file descriptor. Callers may perform one
+// operation on the fd: select(2). If |select| indicates that the file
+// descriptor is readable, the caller may call |fixed_queue_enqueue| without
+// blocking. The caller must not close the returned file descriptor. |queue|
+// may not be NULL.
+int fixed_queue_get_enqueue_fd(const fixed_queue_t *queue);
+
+// This function returns a valid file descriptor. Callers may perform one
+// operation on the fd: select(2). If |select| indicates that the file
+// descriptor is readable, the caller may call |fixed_queue_dequeue| without
+// blocking. The caller must not close the returned file descriptor. |queue|
+// may not be NULL.
+int fixed_queue_get_dequeue_fd(const fixed_queue_t *queue);
diff --git a/osi/include/list.h b/osi/include/list.h
new file mode 100644
index 0000000..56cb739
--- /dev/null
+++ b/osi/include/list.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+struct list_node_t;
+typedef struct list_node_t list_node_t;
+
+struct list_t;
+typedef struct list_t list_t;
+
+typedef void (*list_free_cb)(void *data);
+typedef bool (*list_iter_cb)(void *data);
+
+// Lifecycle.
+list_t *list_new(list_free_cb callback);
+void list_free(list_t *list);
+
+// Accessors.
+bool list_is_empty(const list_t *list);
+size_t list_length(const list_t *list);
+void *list_front(const list_t *list);
+void *list_back(const list_t *list);
+
+// Mutators.
+bool list_insert_after(list_t *list, list_node_t *prev_node, void *data);
+bool list_prepend(list_t *list, void *data);
+bool list_append(list_t *list, void *data);
+bool list_remove(list_t *list, void *data);
+void list_clear(list_t *list);
+
+// Iteration.
+void list_foreach(const list_t *list, list_iter_cb callback);
+
+list_node_t *list_begin(const list_t *list);
+list_node_t *list_end(const list_t *list);
+list_node_t *list_next(const list_node_t *node);
+void *list_node(const list_node_t *node);
diff --git a/osi/include/osi.h b/osi/include/osi.h
new file mode 100644
index 0000000..6b38e9b
--- /dev/null
+++ b/osi/include/osi.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#define UNUSED_ATTR __attribute__((unused))
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+typedef uint32_t timeout_t;
diff --git a/osi/include/reactor.h b/osi/include/reactor.h
new file mode 100644
index 0000000..eeb538d
--- /dev/null
+++ b/osi/include/reactor.h
@@ -0,0 +1,89 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 <stdbool.h>
+#include <stdint.h>
+
+#include "osi.h"
+
+// This module implements the Reactor pattern.
+// See http://en.wikipedia.org/wiki/Reactor_pattern for details.
+
+struct reactor_t;
+typedef struct reactor_t reactor_t;
+
+struct reactor_object_t;
+typedef struct reactor_object_t reactor_object_t;
+
+// Enumerates the types of events a reactor object is interested
+// in responding to.
+typedef enum {
+  REACTOR_INTEREST_READ  = 1,
+  REACTOR_INTEREST_WRITE = 2,
+  REACTOR_INTEREST_READ_WRITE = 3,
+} reactor_interest_t;
+
+// Enumerates the reasons a reactor has stopped.
+typedef enum {
+  REACTOR_STATUS_STOP,     // |reactor_stop| was called.
+  REACTOR_STATUS_TIMEOUT,  // a timeout was specified and the reactor timed out.
+  REACTOR_STATUS_ERROR,    // there was an error during the operation.
+  REACTOR_STATUS_DONE,     // the reactor completed its work (for the _run_once* variants).
+} reactor_status_t;
+
+struct reactor_object_t {
+  void *context;                       // a context that's passed back to the *_ready functions.
+  int fd;                              // the file descriptor to monitor for events.
+  reactor_interest_t interest;         // the event types to monitor the file descriptor for.
+
+  void (*read_ready)(void *context);   // function to call when the file descriptor becomes readable.
+  void (*write_ready)(void *context);  // function to call when the file descriptor becomes writeable.
+};
+
+// Creates a new reactor object. Returns NULL on failure. The returned object
+// must be freed by calling |reactor_free|.
+reactor_t *reactor_new(void);
+
+// Frees a reactor object created with |reactor_new|. |reactor| may be NULL.
+void reactor_free(reactor_t *reactor);
+
+// Starts the reactor. This function blocks the caller until |reactor_stop| is called
+// from another thread or in a callback. |reactor| may not be NULL.
+reactor_status_t reactor_start(reactor_t *reactor);
+
+// Runs one iteration of the reactor. This function blocks until at least one registered object
+// becomes ready. |reactor| may not be NULL.
+reactor_status_t reactor_run_once(reactor_t *reactor);
+
+// Same as |reactor_run_once| with a bounded wait time in case no object becomes ready.
+reactor_status_t reactor_run_once_timeout(reactor_t *reactor, timeout_t timeout_ms);
+
+// Immediately unblocks the reactor. This function is safe to call from any thread.
+// |reactor| may not be NULL.
+void reactor_stop(reactor_t *reactor);
+
+// Registers an object with the reactor. |obj| is neither copied nor is its ownership transferred
+// so the pointer must remain valid until it is unregistered with |reactor_unregister|. Neither
+// |reactor| nor |obj| may be NULL.
+void reactor_register(reactor_t *reactor, reactor_object_t *obj);
+
+// Unregisters a previously registered object with the |reactor|. Neither |reactor| nor |obj|
+// may be NULL.
+void reactor_unregister(reactor_t *reactor, reactor_object_t *obj);
diff --git a/osi/include/semaphore.h b/osi/include/semaphore.h
new file mode 100644
index 0000000..20932b2
--- /dev/null
+++ b/osi/include/semaphore.h
@@ -0,0 +1,57 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 <stdbool.h>
+
+struct semaphore_t;
+typedef struct semaphore_t semaphore_t;
+
+// Creates a new semaphore with an initial value of |value|.
+// Returns NULL on failure. The returned object must be released
+// with |semaphore_free|.
+semaphore_t *semaphore_new(unsigned int value);
+
+// Frees a semaphore allocated with |semaphore_new|. |semaphore| may
+// be NULL.
+void semaphore_free(semaphore_t *semaphore);
+
+// Decrements the value of |semaphore|. If it is 0, this call blocks until
+// it becomes non-zero. |semaphore| may not be NULL.
+void semaphore_wait(semaphore_t *semaphore);
+
+// Tries to decrement the value of |semaphore|. Returns true if the value was
+// decremented, false if the value was 0. This function never blocks. |semaphore|
+// may not be NULL.
+bool semaphore_try_wait(semaphore_t *semaphore);
+
+// Increments the value of |semaphore|. |semaphore| may not be NULL.
+void semaphore_post(semaphore_t *semaphore);
+
+// Returns a file descriptor representing this semaphore. The caller may
+// only perform one operation on the file descriptor: select(2). If |select|
+// indicates the fd is readable, the caller may call |semaphore_wait|
+// without blocking. If select indicates the fd is writable, the caller may
+// call |semaphore_post| without blocking. Note that there may be a race
+// condition between calling |select| and |semaphore_wait| or |semaphore_post|
+// which results in blocking behaviour.
+//
+// The caller must not close the returned file descriptor. |semaphore| may not
+// be NULL.
+int semaphore_get_fd(const semaphore_t *semaphore);
diff --git a/osi/include/thread.h b/osi/include/thread.h
new file mode 100644
index 0000000..c78c5e3
--- /dev/null
+++ b/osi/include/thread.h
@@ -0,0 +1,50 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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
+
+#define THREAD_NAME_MAX 16
+
+typedef struct thread_t thread_t;
+typedef void (*thread_fn)(void *context);
+
+// Creates and starts a new thread with the given name. Only THREAD_NAME_MAX
+// bytes from |name| will be assigned to the newly-created thread. Returns a
+// thread object if the thread was successfully started, NULL otherwise. The
+// returned thread object must be freed with |thread_free|. |name| may not
+// be NULL.
+thread_t *thread_new(const char *name);
+
+// Frees the given |thread|. If the thread is still running, it is stopped
+// and the calling thread will block until |thread| terminates. |thread|
+// may be NULL.
+void thread_free(thread_t *thread);
+
+// Call |func| with the argument |context| on |thread|. This function typically
+// does not block unless there are an excessive number of functions posted to
+// |thread| that have not been dispatched yet. Neither |thread| nor |func| may
+// be NULL. |context| may be NULL.
+bool thread_post(thread_t *thread, thread_fn func, void *context);
+
+// Requests |thread| to stop. Only |thread_free| and |thread_name| may be called
+// after calling |thread_stop|. This function is guaranteed to not block.
+// |thread| may not be NULL.
+void thread_stop(thread_t *thread);
+
+// Returns the name of the given |thread|. |thread| may not be NULL.
+const char *thread_name(const thread_t *thread);
diff --git a/osi/src/alarm.c b/osi/src/alarm.c
new file mode 100644
index 0000000..d2ae461
--- /dev/null
+++ b/osi/src/alarm.c
@@ -0,0 +1,283 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_osi_alarm"
+
+#include <assert.h>
+#include <errno.h>
+#include <hardware/bluetooth.h>
+#include <inttypes.h>
+#include <time.h>
+#include <utils/Log.h>
+
+#include "alarm.h"
+#include "list.h"
+#include "osi.h"
+
+struct alarm_t {
+  // The lock is held while the callback for this alarm is being executed.
+  // It allows us to release the coarse-grained monitor lock while a potentially
+  // long-running callback is executing. |alarm_cancel| uses this lock to provide
+  // a guarantee to its caller that the callback will not be in progress when it
+  // returns.
+  pthread_mutex_t callback_lock;
+  period_ms_t deadline;
+  alarm_callback_t callback;
+  void *data;
+};
+
+extern bt_os_callouts_t *bt_os_callouts;
+
+// If the next wakeup time is less than this threshold, we should acquire
+// a wakelock instead of setting a wake alarm so we're not bouncing in
+// and out of suspend frequently. This value is externally visible to allow
+// unit tests to run faster. It should not be modified by production code.
+int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 3000;
+static const clockid_t CLOCK_ID = CLOCK_BOOTTIME;
+static const char *WAKE_LOCK_ID = "bluedroid_timer";
+
+// This mutex ensures that the |alarm_set|, |alarm_cancel|, and alarm callback
+// functions execute serially and not concurrently. As a result, this mutex also
+// protects the |alarms| list.
+static pthread_mutex_t monitor;
+static list_t *alarms;
+static timer_t timer;
+static bool timer_set;
+
+static bool lazy_initialize(void);
+static period_ms_t now(void);
+static void timer_callback(void *data);
+static void reschedule(void);
+
+alarm_t *alarm_new(void) {
+  // Make sure we have a list we can insert alarms into.
+  if (!alarms && !lazy_initialize())
+    return NULL;
+
+  pthread_mutexattr_t attr;
+  pthread_mutexattr_init(&attr);
+
+  alarm_t *ret = calloc(1, sizeof(alarm_t));
+  if (!ret) {
+    ALOGE("%s unable to allocate memory for alarm.", __func__);
+    goto error;
+  }
+
+  // Make this a recursive mutex to make it safe to call |alarm_cancel| from
+  // within the callback function of the alarm.
+  int error = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+  if (error) {
+    ALOGE("%s unable to create a recursive mutex: %s", __func__, strerror(error));
+    goto error;
+  }
+
+  error = pthread_mutex_init(&ret->callback_lock, &attr);
+  if (error) {
+    ALOGE("%s unable to initialize mutex: %s", __func__, strerror(error));
+    goto error;
+  }
+
+  pthread_mutexattr_destroy(&attr);
+  return ret;
+
+error:;
+  pthread_mutexattr_destroy(&attr);
+  free(ret);
+  return NULL;
+}
+
+void alarm_free(alarm_t *alarm) {
+  if (!alarm)
+    return;
+
+  alarm_cancel(alarm);
+  pthread_mutex_destroy(&alarm->callback_lock);
+  free(alarm);
+}
+
+// Runs in exclusion with alarm_cancel and timer_callback.
+void alarm_set(alarm_t *alarm, period_ms_t deadline, alarm_callback_t cb, void *data) {
+  assert(alarms != NULL);
+  assert(alarm != NULL);
+  assert(cb != NULL);
+
+  pthread_mutex_lock(&monitor);
+
+  // If the alarm is currently set and it's at the start of the list,
+  // we'll need to re-schedule since we've adjusted the earliest deadline.
+  bool needs_reschedule = (!list_is_empty(alarms) && list_front(alarms) == alarm);
+  if (alarm->callback)
+    list_remove(alarms, alarm);
+
+  alarm->deadline = now() + deadline;
+  alarm->callback = cb;
+  alarm->data = data;
+
+  // Add it into the timer list sorted by deadline (earliest deadline first).
+  if (list_is_empty(alarms))
+    list_prepend(alarms, alarm);
+  else
+    for (list_node_t *node = list_begin(alarms); node != list_end(alarms); node = list_next(node)) {
+      list_node_t *next = list_next(node);
+      if (next == list_end(alarms) || ((alarm_t *)list_node(next))->deadline >= alarm->deadline) {
+        list_insert_after(alarms, node, alarm);
+        break;
+      }
+    }
+
+  // If the new alarm has the earliest deadline, we need to re-evaluate our schedule.
+  if (needs_reschedule || (!list_is_empty(alarms) && list_front(alarms) == alarm))
+    reschedule();
+
+  pthread_mutex_unlock(&monitor);
+}
+
+void alarm_cancel(alarm_t *alarm) {
+  assert(alarms != NULL);
+  assert(alarm != NULL);
+
+  pthread_mutex_lock(&monitor);
+
+  bool needs_reschedule = (!list_is_empty(alarms) && list_front(alarms) == alarm);
+
+  list_remove(alarms, alarm);
+  alarm->deadline = 0;
+  alarm->callback = NULL;
+  alarm->data = NULL;
+
+  if (needs_reschedule)
+    reschedule();
+
+  pthread_mutex_unlock(&monitor);
+
+  // If the callback for |alarm| is in progress, wait here until it completes.
+  pthread_mutex_lock(&alarm->callback_lock);
+  pthread_mutex_unlock(&alarm->callback_lock);
+}
+
+static bool lazy_initialize(void) {
+  assert(alarms == NULL);
+
+  pthread_mutex_init(&monitor, NULL);
+
+  alarms = list_new(NULL);
+  if (!alarms) {
+    ALOGE("%s unable to allocate alarm list.", __func__);
+    return false;
+  }
+
+  return true;
+}
+
+static period_ms_t now(void) {
+  assert(alarms != NULL);
+
+  struct timespec ts;
+  if (clock_gettime(CLOCK_ID, &ts) == -1) {
+    ALOGE("%s unable to get current time: %s", __func__, strerror(errno));
+    return 0;
+  }
+
+  return (ts.tv_sec * 1000LL) + (ts.tv_nsec / 1000000LL);
+}
+
+// Warning: this function is called in the context of an unknown thread.
+// As a result, it must be thread-safe relative to other operations on
+// the alarm list.
+static void timer_callback(void *ptr) {
+  alarm_t *alarm = (alarm_t *)ptr;
+  assert(alarm != NULL);
+
+  pthread_mutex_lock(&monitor);
+
+  bool alarm_valid = list_remove(alarms, alarm);
+  alarm_callback_t callback = alarm->callback;
+  void *data = alarm->data;
+
+  alarm->deadline = 0;
+  alarm->callback = NULL;
+  alarm->data = NULL;
+
+  reschedule();
+
+  // The alarm was cancelled before we got to it. Release the monitor
+  // lock and exit right away since there's nothing left to do.
+  if (!alarm_valid) {
+    pthread_mutex_unlock(&monitor);
+    return;
+  }
+
+  // Downgrade lock.
+  pthread_mutex_lock(&alarm->callback_lock);
+  pthread_mutex_unlock(&monitor);
+
+  callback(data);
+
+  pthread_mutex_unlock(&alarm->callback_lock);
+}
+
+// NOTE: must be called with monitor lock.
+static void reschedule(void) {
+  assert(alarms != NULL);
+
+  if (timer_set) {
+    timer_delete(timer);
+    timer_set = false;
+  }
+
+  if (list_is_empty(alarms)) {
+    bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+    return;
+  }
+
+  alarm_t *next = list_front(alarms);
+  int64_t next_exp = next->deadline - now();
+  if (next_exp < TIMER_INTERVAL_FOR_WAKELOCK_IN_MS) {
+    int status = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
+    if (status != BT_STATUS_SUCCESS) {
+      ALOGE("%s unable to acquire wake lock: %d", __func__, status);
+      return;
+    }
+
+    struct sigevent sigevent;
+    memset(&sigevent, 0, sizeof(sigevent));
+    sigevent.sigev_notify = SIGEV_THREAD;
+    sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback;
+    sigevent.sigev_value.sival_ptr = next;
+    if (timer_create(CLOCK_ID, &sigevent, &timer) == -1) {
+      ALOGE("%s unable to create timer: %s", __func__, strerror(errno));
+      return;
+    }
+
+    struct itimerspec wakeup_time;
+    memset(&wakeup_time, 0, sizeof(wakeup_time));
+    wakeup_time.it_value.tv_sec = (next->deadline / 1000);
+    wakeup_time.it_value.tv_nsec = (next->deadline % 1000) * 1000000LL;
+    if (timer_settime(timer, TIMER_ABSTIME, &wakeup_time, NULL) == -1) {
+      ALOGE("%s unable to set timer: %s", __func__, strerror(errno));
+      timer_delete(timer);
+      return;
+    }
+    timer_set = true;
+  } else {
+    if (!bt_os_callouts->set_wake_alarm(next_exp, true, timer_callback, next))
+      ALOGE("%s unable to set wake alarm for %" PRId64 "ms.", __func__, next_exp);
+
+    bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+  }
+}
diff --git a/osi/src/config.c b/osi/src/config.c
new file mode 100644
index 0000000..f38c7f0
--- /dev/null
+++ b/osi/src/config.c
@@ -0,0 +1,278 @@
+#define LOG_TAG "bt_osi_config"
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utils/Log.h>
+
+#include "config.h"
+#include "list.h"
+
+typedef struct {
+  char *key;
+  char *value;
+} entry_t;
+
+typedef struct {
+  char *name;
+  list_t *entries;
+} section_t;
+
+struct config_t {
+  list_t *sections;
+};
+
+static void config_parse(FILE *fp, config_t *config);
+
+static section_t *section_new(const char *name);
+static void section_free(void *ptr);
+static section_t *section_find(const config_t *config, const char *section);
+
+static entry_t *entry_new(const char *key, const char *value);
+static void entry_free(void *ptr);
+static entry_t *entry_find(const config_t *config, const char *section, const char *key);
+
+config_t *config_new(const char *filename) {
+  assert(filename != NULL);
+
+  FILE *fp = fopen(filename, "rt");
+  if (!fp) {
+    ALOGE("%s unable to open file '%s': %s", __func__, filename, strerror(errno));
+    return NULL;
+  }
+
+  config_t *config = calloc(1, sizeof(config_t));
+  if (!config) {
+    ALOGE("%s unable to allocate memory for config_t.", __func__);
+    fclose(fp);
+    return NULL;
+  }
+
+  config->sections = list_new(section_free);
+  config_parse(fp, config);
+
+  fclose(fp);
+
+  return config;
+}
+
+void config_free(config_t *config) {
+  if (!config)
+    return;
+
+  list_free(config->sections);
+  free(config);
+}
+
+bool config_has_section(const config_t *config, const char *section) {
+  assert(config != NULL);
+  assert(section != NULL);
+
+  return (section_find(config, section) != NULL);
+}
+
+bool config_has_key(const config_t *config, const char *section, const char *key) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  return (entry_find(config, section, key) != NULL);
+}
+
+int config_get_int(const config_t *config, const char *section, const char *key, int def_value) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  entry_t *entry = entry_find(config, section, key);
+  if (!entry)
+    return def_value;
+
+  char *endptr;
+  int ret = strtol(entry->value, &endptr, 0);
+  return (*endptr == '\0') ? ret : def_value;
+}
+
+bool config_get_bool(const config_t *config, const char *section, const char *key, bool def_value) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  entry_t *entry = entry_find(config, section, key);
+  if (!entry)
+    return def_value;
+
+  if (!strcmp(entry->value, "true"))
+    return true;
+  if (!strcmp(entry->value, "false"))
+    return false;
+
+  return def_value;
+}
+
+const char *config_get_string(const config_t *config, const char *section, const char *key, const char *def_value) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  entry_t *entry = entry_find(config, section, key);
+  if (!entry)
+    return def_value;
+
+  return entry->value;
+}
+
+void config_set_int(config_t *config, const char *section, const char *key, int value) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  char value_str[32] = { 0 };
+  sprintf(value_str, "%d", value);
+  config_set_string(config, section, key, value_str);
+}
+
+void config_set_bool(config_t *config, const char *section, const char *key, bool value) {
+  assert(config != NULL);
+  assert(section != NULL);
+  assert(key != NULL);
+
+  config_set_string(config, section, key, value ? "true" : "false");
+}
+
+void config_set_string(config_t *config, const char *section, const char *key, const char *value) {
+  section_t *sec = section_find(config, section);
+  if (!sec) {
+    sec = section_new(section);
+    list_append(config->sections, sec);
+  }
+
+  for (const list_node_t *node = list_begin(sec->entries); node != list_end(sec->entries); node = list_next(node)) {
+    entry_t *entry = list_node(node);
+    if (!strcmp(entry->key, key)) {
+      free(entry->value);
+      entry->value = strdup(value);
+      return;
+    }
+  }
+
+  entry_t *entry = entry_new(key, value);
+  list_append(sec->entries, entry);
+}
+
+static char *trim(char *str) {
+  while (isspace(*str))
+    ++str;
+
+  if (!*str)
+    return str;
+
+  char *end_str = str + strlen(str) - 1;
+  while (end_str > str && isspace(*end_str))
+    --end_str;
+
+  end_str[1] = '\0';
+  return str;
+}
+
+static void config_parse(FILE *fp, config_t *config) {
+  assert(fp != NULL);
+  assert(config != NULL);
+
+  int line_num = 0;
+  char line[1024];
+  char section[1024];
+  strcpy(section, CONFIG_DEFAULT_SECTION);
+
+  while (fgets(line, sizeof(line), fp)) {
+    char *line_ptr = trim(line);
+    ++line_num;
+
+    // Skip blank and comment lines.
+    if (*line_ptr == '\0' || *line_ptr == '#')
+      continue;
+
+    if (*line_ptr == '[') {
+      size_t len = strlen(line_ptr);
+      if (line_ptr[len - 1] != ']') {
+        ALOGD("%s unterminated section name on line %d.", __func__, line_num);
+        continue;
+      }
+      strncpy(section, line_ptr + 1, len - 2);
+      section[len - 2] = '\0';
+    } else {
+      char *split = strchr(line_ptr, '=');
+      if (!split) {
+        ALOGD("%s no key/value separator found on line %d.", __func__, line_num);
+        continue;
+      }
+
+      *split = '\0';
+      config_set_string(config, section, trim(line_ptr), trim(split + 1));
+    }
+  }
+}
+
+static section_t *section_new(const char *name) {
+  section_t *section = calloc(1, sizeof(section_t));
+  if (!section)
+    return NULL;
+
+  section->name = strdup(name);
+  section->entries = list_new(entry_free);
+  return section;
+}
+
+static void section_free(void *ptr) {
+  if (!ptr)
+    return;
+
+  section_t *section = ptr;
+  free(section->name);
+  list_free(section->entries);
+}
+
+static section_t *section_find(const config_t *config, const char *section) {
+  for (const list_node_t *node = list_begin(config->sections); node != list_end(config->sections); node = list_next(node)) {
+    section_t *sec = list_node(node);
+    if (!strcmp(sec->name, section))
+      return sec;
+  }
+
+  return NULL;
+}
+
+static entry_t *entry_new(const char *key, const char *value) {
+  entry_t *entry = calloc(1, sizeof(entry_t));
+  if (!entry)
+    return NULL;
+
+  entry->key = strdup(key);
+  entry->value = strdup(value);
+  return entry;
+}
+
+static void entry_free(void *ptr) {
+  if (!ptr)
+    return;
+
+  entry_t *entry = ptr;
+  free(entry->key);
+  free(entry->value);
+}
+
+static entry_t *entry_find(const config_t *config, const char *section, const char *key) {
+  section_t *sec = section_find(config, section);
+  if (!sec)
+    return NULL;
+
+  for (const list_node_t *node = list_begin(sec->entries); node != list_end(sec->entries); node = list_next(node)) {
+    entry_t *entry = list_node(node);
+    if (!strcmp(entry->key, key))
+      return entry;
+  }
+
+  return NULL;
+}
diff --git a/osi/src/fixed_queue.c b/osi/src/fixed_queue.c
new file mode 100644
index 0000000..2d64367
--- /dev/null
+++ b/osi/src/fixed_queue.c
@@ -0,0 +1,151 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#include "fixed_queue.h"
+#include "list.h"
+#include "osi.h"
+#include "semaphore.h"
+
+typedef struct fixed_queue_t {
+  list_t *list;
+  semaphore_t *enqueue_sem;
+  semaphore_t *dequeue_sem;
+  pthread_mutex_t lock;
+  size_t capacity;
+} fixed_queue_t;
+
+fixed_queue_t *fixed_queue_new(size_t capacity) {
+  fixed_queue_t *ret = calloc(1, sizeof(fixed_queue_t));
+  if (!ret)
+    goto error;
+
+  ret->list = list_new(NULL);
+  if (!ret->list)
+    goto error;
+
+  ret->enqueue_sem = semaphore_new(capacity);
+  if (!ret->enqueue_sem)
+    goto error;
+
+  ret->dequeue_sem = semaphore_new(0);
+  if (!ret->dequeue_sem)
+    goto error;
+
+  pthread_mutex_init(&ret->lock, NULL);
+  ret->capacity = capacity;
+
+  return ret;
+
+error:;
+  if (ret) {
+    list_free(ret->list);
+    semaphore_free(ret->enqueue_sem);
+    semaphore_free(ret->dequeue_sem);
+  }
+
+  free(ret);
+  return NULL;
+}
+
+void fixed_queue_free(fixed_queue_t *queue, fixed_queue_free_cb free_cb) {
+  if (!queue)
+    return;
+
+  if (free_cb)
+    for (const list_node_t *node = list_begin(queue->list); node != list_end(queue->list); node = list_next(node))
+      free_cb(list_node(node));
+
+  list_free(queue->list);
+  semaphore_free(queue->enqueue_sem);
+  semaphore_free(queue->dequeue_sem);
+  pthread_mutex_destroy(&queue->lock);
+  free(queue);
+}
+
+void fixed_queue_enqueue(fixed_queue_t *queue, void *data) {
+  assert(queue != NULL);
+  assert(data != NULL);
+
+  semaphore_wait(queue->enqueue_sem);
+
+  pthread_mutex_lock(&queue->lock);
+  list_append(queue->list, data);
+  pthread_mutex_unlock(&queue->lock);
+
+  semaphore_post(queue->dequeue_sem);
+}
+
+void *fixed_queue_dequeue(fixed_queue_t *queue) {
+  assert(queue != NULL);
+
+  semaphore_wait(queue->dequeue_sem);
+
+  pthread_mutex_lock(&queue->lock);
+  void *ret = list_front(queue->list);
+  list_remove(queue->list, ret);
+  pthread_mutex_unlock(&queue->lock);
+
+  semaphore_post(queue->enqueue_sem);
+
+  return ret;
+}
+
+bool fixed_queue_try_enqueue(fixed_queue_t *queue, void *data) {
+  assert(queue != NULL);
+  assert(data != NULL);
+
+  if (!semaphore_try_wait(queue->enqueue_sem))
+    return false;
+
+  pthread_mutex_lock(&queue->lock);
+  list_append(queue->list, data);
+  pthread_mutex_unlock(&queue->lock);
+
+  semaphore_post(queue->dequeue_sem);
+  return true;
+}
+
+void *fixed_queue_try_dequeue(fixed_queue_t *queue) {
+  assert(queue != NULL);
+
+  if (!semaphore_try_wait(queue->dequeue_sem))
+    return NULL;
+
+  pthread_mutex_lock(&queue->lock);
+  void *ret = list_front(queue->list);
+  list_remove(queue->list, ret);
+  pthread_mutex_unlock(&queue->lock);
+
+  semaphore_post(queue->enqueue_sem);
+
+  return ret;
+}
+
+int fixed_queue_get_dequeue_fd(const fixed_queue_t *queue) {
+  assert(queue != NULL);
+  return semaphore_get_fd(queue->dequeue_sem);
+}
+
+int fixed_queue_get_enqueue_fd(const fixed_queue_t *queue) {
+  assert(queue != NULL);
+  return semaphore_get_fd(queue->enqueue_sem);
+}
diff --git a/osi/src/list.c b/osi/src/list.c
new file mode 100644
index 0000000..691f039
--- /dev/null
+++ b/osi/src/list.c
@@ -0,0 +1,239 @@
+#include <assert.h>
+
+#include "list.h"
+#include "osi.h"
+
+typedef struct list_node_t {
+  struct list_node_t *next;
+  void *data;
+} list_node_t;
+
+typedef struct list_t {
+  list_node_t *head;
+  list_node_t *tail;
+  size_t length;
+  list_free_cb free_cb;
+} list_t;
+
+static list_node_t *list_free_node_(list_t *list, list_node_t *node);
+
+// Returns a new, empty list. Returns NULL if not enough memory could be allocated
+// for the list structure. The returned list must be freed with |list_free|. The
+// |callback| specifies a function to be called whenever a list element is removed
+// from the list. It can be used to release resources held by the list element, e.g.
+// memory or file descriptor. |callback| may be NULL if no cleanup is necessary on
+// element removal.
+list_t *list_new(list_free_cb callback) {
+  list_t *list = (list_t *)calloc(sizeof(list_t), 1);
+  if (list)
+    list->free_cb = callback;
+  return list;
+}
+
+// Frees the list. This function accepts NULL as an argument, in which case it
+// behaves like a no-op.
+void list_free(list_t *list) {
+  if (list != NULL)
+    list_clear(list);
+
+  free(list);
+}
+
+// Returns true if the list is empty (has no elements), false otherwise.
+// Note that a NULL list is not the same as an empty list. This function
+// does not accept a NULL list.
+bool list_is_empty(const list_t *list) {
+  assert(list != NULL);
+  return (list->length == 0);
+}
+
+// Returns the length of the list. This function does not accept a NULL list.
+size_t list_length(const list_t *list) {
+  assert(list != NULL);
+  return list->length;
+}
+
+// Returns the first element in the list without removing it. |list| may not
+// be NULL or empty.
+void *list_front(const list_t *list) {
+  assert(list != NULL);
+  assert(!list_is_empty(list));
+
+  return list->head->data;
+}
+
+// Returns the last element in the list without removing it. |list| may not
+// be NULL or empty.
+void *list_back(const list_t *list) {
+  assert(list != NULL);
+  assert(!list_is_empty(list));
+
+  return list->tail->data;
+}
+
+bool list_insert_after(list_t *list, list_node_t *prev_node, void *data) {
+  assert(list != NULL);
+  assert(node != NULL);
+  assert(data != NULL);
+
+  list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+  if (!node)
+    return false;
+
+  node->next = prev_node->next;
+  node->data = data;
+  prev_node->next = node;
+  if (list->tail == prev_node)
+    list->tail = node;
+  ++list->length;
+  return true;
+}
+
+// Inserts |data| at the beginning of |list|. Neither |data| nor |list| may be NULL.
+// This function does not make a copy of |data| so the pointer must remain valid
+// at least until the element is removed from the list or the list is freed.
+// Returns true if |data| could be inserted, false otherwise (e.g. out of memory).
+bool list_prepend(list_t *list, void *data) {
+  assert(list != NULL);
+  assert(data != NULL);
+
+  list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+  if (!node)
+    return false;
+  node->next = list->head;
+  node->data = data;
+  list->head = node;
+  if (list->tail == NULL)
+    list->tail = list->head;
+  ++list->length;
+  return true;
+}
+
+// Inserts |data| at the end of |list|. Neither |data| nor |list| may be NULL.
+// This function does not make a copy of |data| so the pointer must remain valid
+// at least until the element is removed from the list or the list is freed.
+// Returns true if |data| could be inserted, false otherwise (e.g. out of memory).
+bool list_append(list_t *list, void *data) {
+  assert(list != NULL);
+  assert(data != NULL);
+
+  list_node_t *node = (list_node_t *)malloc(sizeof(list_node_t));
+  if (!node)
+    return false;
+  node->next = NULL;
+  node->data = data;
+  if (list->tail == NULL) {
+    list->head = node;
+    list->tail = node;
+  } else {
+    list->tail->next = node;
+    list->tail = node;
+  }
+  ++list->length;
+  return true;
+}
+
+// Removes |data| from the list. Neither |list| nor |data| may be NULL. If |data|
+// is inserted multiple times in the list, this function will only remove the first
+// instance. If a free function was specified in |list_new|, it will be called back
+// with |data|. This function returns true if |data| was found in the list and removed,
+// false otherwise.
+bool list_remove(list_t *list, void *data) {
+  assert(list != NULL);
+  assert(data != NULL);
+
+  if (list_is_empty(list))
+    return false;
+
+  if (list->head->data == data) {
+    list_node_t *next = list_free_node_(list, list->head);
+    if (list->tail == list->head)
+      list->tail = next;
+    list->head = next;
+    return true;
+  }
+
+  for (list_node_t *prev = list->head, *node = list->head->next; node; prev = node, node = node->next)
+    if (node->data == data) {
+      prev->next = list_free_node_(list, node);
+      if (list->tail == node)
+        list->tail = prev;
+      return true;
+    }
+
+  return false;
+}
+
+// Removes all elements in the list. Calling this function will return the list to the
+// same state it was in after |list_new|. |list| may not be NULL.
+void list_clear(list_t *list) {
+  assert(list != NULL);
+  for (list_node_t *node = list->head; node; )
+    node = list_free_node_(list, node);
+  list->head = NULL;
+  list->tail = NULL;
+  list->length = 0;
+}
+
+// Iterates through the entire |list| and calls |callback| for each data element.
+// If the list is empty, |callback| will never be called. It is safe to mutate the
+// list inside the callback. If an element is added before the node being visited,
+// there will be no callback for the newly-inserted node. Neither |list| nor
+// |callback| may be NULL.
+void list_foreach(const list_t *list, list_iter_cb callback) {
+  assert(list != NULL);
+  assert(callback != NULL);
+
+  for (list_node_t *node = list->head; node; ) {
+    list_node_t *next = node->next;
+    callback(node->data);
+    node = next;
+  }
+}
+
+// Returns an iterator to the first element in |list|. |list| may not be NULL.
+// The returned iterator is valid as long as it does not equal the value returned
+// by |list_end|.
+list_node_t *list_begin(const list_t *list) {
+  assert(list != NULL);
+  return list->head;
+}
+
+// Returns an iterator that points past the end of the list. In other words,
+// this function returns the value of an invalid iterator for the given list.
+// When an iterator has the same value as what's returned by this function, you
+// may no longer call |list_next| with the iterator. |list| may not be NULL.
+list_node_t *list_end(UNUSED_ATTR const list_t *list) {
+  assert(list != NULL);
+  return NULL;
+}
+
+// Given a valid iterator |node|, this function returns the next value for the
+// iterator. If the returned value equals the value returned by |list_end|, the
+// iterator has reached the end of the list and may no longer be used for any
+// purpose.
+list_node_t *list_next(const list_node_t *node) {
+  assert(node != NULL);
+  return node->next;
+}
+
+// Returns the value stored at the location pointed to by the iterator |node|.
+// |node| must not equal the value returned by |list_end|.
+void *list_node(const list_node_t *node) {
+  assert(node != NULL);
+  return node->data;
+}
+
+static list_node_t *list_free_node_(list_t *list, list_node_t *node) {
+  assert(list != NULL);
+  assert(node != NULL);
+
+  list_node_t *next = node->next;
+
+  if (list->free_cb)
+    list->free_cb(node->data);
+  free(node);
+  --list->length;
+
+  return next;
+}
diff --git a/osi/src/reactor.c b/osi/src/reactor.c
new file mode 100644
index 0000000..d3d7767
--- /dev/null
+++ b/osi/src/reactor.c
@@ -0,0 +1,174 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "bt_osi_reactor"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/eventfd.h>
+#include <sys/select.h>
+#include <utils/Log.h>
+
+#include "list.h"
+#include "reactor.h"
+
+#if !defined(EFD_SEMAPHORE)
+#  define EFD_SEMAPHORE (1 << 0)
+#endif
+
+struct reactor_t {
+  int event_fd;
+  list_t *objects;
+};
+
+static reactor_status_t run_reactor(reactor_t *reactor, int iterations, struct timeval *tv);
+
+reactor_t *reactor_new(void) {
+  reactor_t *ret = (reactor_t *)calloc(1, sizeof(reactor_t));
+  if (!ret)
+    return NULL;
+
+  ret->event_fd = eventfd(0, EFD_SEMAPHORE);
+  if (ret->event_fd == -1) {
+    ALOGE("%s unable to create eventfd: %s", __func__, strerror(errno));
+    goto error;
+  }
+
+  ret->objects = list_new(NULL);
+  if (!ret->objects)
+    goto error;
+
+  return ret;
+
+error:;
+  list_free(ret->objects);
+  close(ret->event_fd);
+  free(ret);
+  return NULL;
+}
+
+void reactor_free(reactor_t *reactor) {
+  if (!reactor)
+    return;
+
+  list_free(reactor->objects);
+  close(reactor->event_fd);
+  free(reactor);
+}
+
+reactor_status_t reactor_start(reactor_t *reactor) {
+  assert(reactor != NULL);
+  return run_reactor(reactor, 0, NULL);
+}
+
+reactor_status_t reactor_run_once(reactor_t *reactor) {
+  assert(reactor != NULL);
+  return run_reactor(reactor, 1, NULL);
+}
+
+reactor_status_t reactor_run_once_timeout(reactor_t *reactor, timeout_t timeout_ms) {
+  assert(reactor != NULL);
+
+  struct timeval tv;
+  tv.tv_sec = timeout_ms / 1000;
+  tv.tv_usec = (timeout_ms % 1000) * 1000;
+  return run_reactor(reactor, 1, &tv);
+}
+
+void reactor_stop(reactor_t *reactor) {
+  assert(reactor != NULL);
+
+  eventfd_write(reactor->event_fd, 1);
+}
+
+void reactor_register(reactor_t *reactor, reactor_object_t *obj) {
+  assert(reactor != NULL);
+  assert(obj != NULL);
+
+  list_append(reactor->objects, obj);
+}
+
+void reactor_unregister(reactor_t *reactor, reactor_object_t *obj) {
+  assert(reactor != NULL);
+  assert(obj != NULL);
+
+  list_remove(reactor->objects, obj);
+}
+
+// Runs the reactor loop for a maximum of |iterations| with the given timeout, |tv|.
+// 0 |iterations| means loop forever.
+// NULL |tv| means no timeout (block until an event occurs).
+// |reactor| may not be NULL.
+static reactor_status_t run_reactor(reactor_t *reactor, int iterations, struct timeval *tv) {
+  assert(reactor != NULL);
+
+  for (int i = 0; iterations == 0 || i < iterations; ++i) {
+    fd_set read_set;
+    fd_set write_set;
+    FD_ZERO(&read_set);
+    FD_ZERO(&write_set);
+    FD_SET(reactor->event_fd, &read_set);
+
+    int max_fd = reactor->event_fd;
+    for (const list_node_t *iter = list_begin(reactor->objects); iter != list_end(reactor->objects); iter = list_next(iter)) {
+      reactor_object_t *object = (reactor_object_t *)list_node(iter);
+      int fd = object->fd;
+      reactor_interest_t interest = object->interest;
+      if (interest & REACTOR_INTEREST_READ)
+        FD_SET(fd, &read_set);
+      if (interest & REACTOR_INTEREST_WRITE)
+        FD_SET(fd, &write_set);
+      if (fd > max_fd)
+        max_fd = fd;
+    }
+
+    int ret;
+    do {
+      ret = select(max_fd + 1, &read_set, &write_set, NULL, tv);
+    } while (ret == -1 && errno == EINTR);
+
+    if (ret == -1) {
+      ALOGE("%s error in select: %s", __func__, strerror(errno));
+      return REACTOR_STATUS_ERROR;
+    }
+
+    if (ret == 0)
+      return REACTOR_STATUS_TIMEOUT;
+
+    if (FD_ISSET(reactor->event_fd, &read_set)) {
+      eventfd_t value;
+      eventfd_read(reactor->event_fd, &value);
+      return REACTOR_STATUS_STOP;
+    }
+
+    for (const list_node_t *iter = list_begin(reactor->objects); ret > 0 && iter != list_end(reactor->objects); iter = list_next(iter)) {
+      reactor_object_t *object = (reactor_object_t *)list_node(iter);
+      int fd = object->fd;
+      if (FD_ISSET(fd, &read_set)) {
+        object->read_ready(object->context);
+        --ret;
+      }
+      if (FD_ISSET(fd, &write_set)) {
+        object->write_ready(object->context);
+        --ret;
+      }
+    }
+  }
+  return REACTOR_STATUS_DONE;
+}
diff --git a/osi/src/semaphore.c b/osi/src/semaphore.c
new file mode 100644
index 0000000..c1d038a
--- /dev/null
+++ b/osi/src/semaphore.c
@@ -0,0 +1,101 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "osi_semaphore"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/eventfd.h>
+#include <utils/Log.h>
+
+#include "semaphore.h"
+
+#if !defined(EFD_SEMAPHORE)
+#  define EFD_SEMAPHORE (1 << 0)
+#endif
+
+struct semaphore_t {
+  int fd;
+};
+
+semaphore_t *semaphore_new(unsigned int value) {
+  semaphore_t *ret = malloc(sizeof(semaphore_t));
+  if (ret) {
+    ret->fd = eventfd(value, EFD_SEMAPHORE);
+    if (ret->fd == -1) {
+      ALOGE("%s unable to allocate semaphore: %s", __func__, strerror(errno));
+      free(ret);
+      ret = NULL;
+    }
+  }
+  return ret;
+}
+
+void semaphore_free(semaphore_t *semaphore) {
+  if (semaphore->fd != -1)
+    close(semaphore->fd);
+  free(semaphore);
+}
+
+void semaphore_wait(semaphore_t *semaphore) {
+  assert(semaphore != NULL);
+  assert(semaphore->fd != -1);
+
+  uint64_t value;
+  if (eventfd_read(semaphore->fd, &value) == -1)
+    ALOGE("%s unable to wait on semaphore: %s", __func__, strerror(errno));
+}
+
+bool semaphore_try_wait(semaphore_t *semaphore) {
+  assert(semaphore != NULL);
+  assert(semaphore->fd != -1);
+
+  int flags = fcntl(semaphore->fd, F_GETFL);
+  if (flags == -1) {
+    ALOGE("%s unable to get flags for semaphore fd: %s", __func__, strerror(errno));
+    return false;
+  }
+  if (fcntl(semaphore->fd, F_SETFL, flags | O_NONBLOCK) == -1) {
+    ALOGE("%s unable to set O_NONBLOCK for semaphore fd: %s", __func__, strerror(errno));
+    return false;
+  }
+
+  eventfd_t value;
+  if (eventfd_read(semaphore->fd, &value) == -1)
+    return false;
+
+  if (fcntl(semaphore->fd, F_SETFL, flags) == -1)
+    ALOGE("%s unable to resetore flags for semaphore fd: %s", __func__, strerror(errno));
+  return true;
+}
+
+void semaphore_post(semaphore_t *semaphore) {
+  assert(semaphore != NULL);
+  assert(semaphore->fd != -1);
+
+  if (eventfd_write(semaphore->fd, 1ULL) == -1)
+    ALOGE("%s unable to post to semaphore: %s", __func__, strerror(errno));
+}
+
+int semaphore_get_fd(const semaphore_t *semaphore) {
+  assert(semaphore != NULL);
+  assert(semaphore->fd != -1);
+  return semaphore->fd;
+}
diff --git a/osi/src/thread.c b/osi/src/thread.c
new file mode 100644
index 0000000..cb644d3
--- /dev/null
+++ b/osi/src/thread.c
@@ -0,0 +1,192 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#define LOG_TAG "osi_thread"
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/prctl.h>
+#include <sys/types.h>
+#include <utils/Log.h>
+
+#include "fixed_queue.h"
+#include "reactor.h"
+#include "semaphore.h"
+#include "thread.h"
+
+struct thread_t {
+  pthread_t pthread;
+  pid_t tid;
+  char name[THREAD_NAME_MAX + 1];
+  reactor_t *reactor;
+  fixed_queue_t *work_queue;
+};
+
+struct start_arg {
+  thread_t *thread;
+  semaphore_t *start_sem;
+  int error;
+};
+
+typedef struct {
+  thread_fn func;
+  void *context;
+} work_item_t;
+
+static void *run_thread(void *start_arg);
+static void work_queue_read_cb(void *context);
+
+static const size_t WORK_QUEUE_CAPACITY = 128;
+
+thread_t *thread_new(const char *name) {
+  assert(name != NULL);
+
+  // Start is on the stack, but we use a semaphore, so it's safe
+  thread_t *ret = calloc(1, sizeof(thread_t));
+  if (!ret)
+    goto error;
+
+  ret->reactor = reactor_new();
+  if (!ret->reactor)
+    goto error;
+
+  ret->work_queue = fixed_queue_new(WORK_QUEUE_CAPACITY);
+  if (!ret->work_queue)
+    goto error;
+
+  struct start_arg start;
+  start.start_sem = semaphore_new(0);
+  if (!start.start_sem)
+    goto error;
+
+  strncpy(ret->name, name, THREAD_NAME_MAX);
+  start.thread = ret;
+  start.error = 0;
+  pthread_create(&ret->pthread, NULL, run_thread, &start);
+  semaphore_wait(start.start_sem);
+  semaphore_free(start.start_sem);
+  if (start.error)
+    goto error;
+  return ret;
+
+error:;
+  if (ret) {
+    fixed_queue_free(ret->work_queue, free);
+    reactor_free(ret->reactor);
+  }
+  free(ret);
+  return NULL;
+}
+
+void thread_free(thread_t *thread) {
+  if (!thread)
+    return;
+
+  thread_stop(thread);
+  pthread_join(thread->pthread, NULL);
+  fixed_queue_free(thread->work_queue, free);
+  reactor_free(thread->reactor);
+  free(thread);
+}
+
+bool thread_post(thread_t *thread, thread_fn func, void *context) {
+  assert(thread != NULL);
+  assert(func != NULL);
+
+  // TODO(sharvil): if the current thread == |thread| and we've run out
+  // of queue space, we should abort this operation, otherwise we'll
+  // deadlock.
+
+  // Queue item is freed either when the queue itself is destroyed
+  // or when the item is removed from the queue for dispatch.
+  work_item_t *item = (work_item_t *)malloc(sizeof(work_item_t));
+  if (!item) {
+    ALOGE("%s unable to allocate memory: %s", __func__, strerror(errno));
+    return false;
+  }
+  item->func = func;
+  item->context = context;
+  fixed_queue_enqueue(thread->work_queue, item);
+  return true;
+}
+
+void thread_stop(thread_t *thread) {
+  assert(thread != NULL);
+  reactor_stop(thread->reactor);
+}
+
+const char *thread_name(const thread_t *thread) {
+  assert(thread != NULL);
+  return thread->name;
+}
+
+static void *run_thread(void *start_arg) {
+  assert(start_arg != NULL);
+
+  struct start_arg *start = start_arg;
+  thread_t *thread = start->thread;
+
+  assert(thread != NULL);
+
+  if (prctl(PR_SET_NAME, (unsigned long)thread->name) == -1) {
+    ALOGE("%s unable to set thread name: %s", __func__, strerror(errno));
+    start->error = errno;
+    semaphore_post(start->start_sem);
+    return NULL;
+  }
+  thread->tid = gettid();
+
+  semaphore_post(start->start_sem);
+
+  reactor_object_t work_queue_object;
+  work_queue_object.context = thread->work_queue;
+  work_queue_object.fd = fixed_queue_get_dequeue_fd(thread->work_queue);
+  work_queue_object.interest = REACTOR_INTEREST_READ;
+  work_queue_object.read_ready = work_queue_read_cb;
+
+  reactor_register(thread->reactor, &work_queue_object);
+  reactor_start(thread->reactor);
+
+  // Make sure we dispatch all queued work items before exiting the thread.
+  // This allows a caller to safely tear down by enqueuing a teardown
+  // work item and then joining the thread.
+  size_t count = 0;
+  work_item_t *item = fixed_queue_try_dequeue(thread->work_queue);
+  while (item && count <= WORK_QUEUE_CAPACITY) {
+    item->func(item->context);
+    free(item);
+    item = fixed_queue_try_dequeue(thread->work_queue);
+    ++count;
+  }
+
+  if (count > WORK_QUEUE_CAPACITY)
+    ALOGD("%s growing event queue on shutdown.", __func__);
+
+  return NULL;
+}
+
+static void work_queue_read_cb(void *context) {
+  assert(context != NULL);
+
+  fixed_queue_t *queue = (fixed_queue_t *)context;
+  work_item_t *item = fixed_queue_dequeue(queue);
+  item->func(item->context);
+  free(item);
+}
diff --git a/osi/test/alarm_test.cpp b/osi/test/alarm_test.cpp
new file mode 100644
index 0000000..d08cf6d
--- /dev/null
+++ b/osi/test/alarm_test.cpp
@@ -0,0 +1,246 @@
+#include <gtest/gtest.h>
+#include <hardware/bluetooth.h>
+#include <unistd.h>
+
+extern "C" {
+#include "alarm.h"
+#include "osi.h"
+#include "semaphore.h"
+}
+
+extern int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS;
+
+static semaphore_t *semaphore;
+static int cb_counter;
+static int lock_count;
+static timer_t timer;
+static alarm_cb saved_callback;
+static void *saved_data;
+
+static const uint64_t EPSILON_MS = 5;
+
+static void msleep(uint64_t ms) {
+  usleep(ms * 1000);
+}
+
+static void timer_callback(void *) {
+  saved_callback(saved_data);
+}
+
+class AlarmTest : public ::testing::Test {
+  protected:
+    virtual void SetUp() {
+      TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 100;
+      cb_counter = 0;
+      lock_count = 0;
+
+      semaphore = semaphore_new(0);
+
+      struct sigevent sigevent;
+      memset(&sigevent, 0, sizeof(sigevent));
+      sigevent.sigev_notify = SIGEV_THREAD;
+      sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback;
+      sigevent.sigev_value.sival_ptr = NULL;
+      timer_create(CLOCK_BOOTTIME, &sigevent, &timer);
+    }
+
+    virtual void TearDown() {
+      timer_delete(timer);
+    }
+};
+
+static void cb(UNUSED_ATTR void *data) {
+  ++cb_counter;
+  semaphore_post(semaphore);
+}
+
+static bool set_wake_alarm(uint64_t delay_millis, bool, alarm_cb cb, void *data) {
+  saved_callback = cb;
+  saved_data = data;
+
+  struct itimerspec wakeup_time;
+  memset(&wakeup_time, 0, sizeof(wakeup_time));
+  wakeup_time.it_value.tv_sec = (delay_millis / 1000);
+  wakeup_time.it_value.tv_nsec = (delay_millis % 1000) * 1000000LL;
+  timer_settime(timer, 0, &wakeup_time, NULL);
+  return true;
+}
+
+static int acquire_wake_lock(const char *) {
+  if (!lock_count)
+    lock_count = 1;
+  return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *) {
+  if (lock_count)
+    lock_count = 0;
+  return BT_STATUS_SUCCESS;
+}
+
+static bt_os_callouts_t stub = {
+  sizeof(bt_os_callouts_t),
+  set_wake_alarm,
+  acquire_wake_lock,
+  release_wake_lock,
+};
+
+bt_os_callouts_t *bt_os_callouts = &stub;
+
+TEST_F(AlarmTest, test_new_simple) {
+  alarm_t *alarm = alarm_new();
+  ASSERT_TRUE(alarm != NULL);
+}
+
+TEST_F(AlarmTest, test_free_simple) {
+  alarm_t *alarm = alarm_new();
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_free_null) {
+  alarm_free(NULL);
+}
+
+TEST_F(AlarmTest, test_simple_cancel) {
+  alarm_t *alarm = alarm_new();
+  alarm_cancel(alarm);
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_cancel) {
+  alarm_t *alarm = alarm_new();
+  alarm_set(alarm, 10, cb, NULL);
+  alarm_cancel(alarm);
+
+  msleep(10 + EPSILON_MS);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 0);
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_cancel_idempotent) {
+  alarm_t *alarm = alarm_new();
+  alarm_set(alarm, 10, cb, NULL);
+  alarm_cancel(alarm);
+  alarm_cancel(alarm);
+  alarm_cancel(alarm);
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_short) {
+  alarm_t *alarm = alarm_new();
+  alarm_set(alarm, 10, cb, NULL);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 1);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 1);
+  EXPECT_EQ(lock_count, 0);
+
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_long) {
+  alarm_t *alarm = alarm_new();
+  alarm_set(alarm, TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 0);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 1);
+  EXPECT_EQ(lock_count, 0);
+
+  alarm_free(alarm);
+}
+
+TEST_F(AlarmTest, test_set_short_short) {
+  alarm_t *alarm[2] = {
+    alarm_new(),
+    alarm_new()
+  };
+
+  alarm_set(alarm[0], 10, cb, NULL);
+  alarm_set(alarm[1], 20, cb, NULL);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 1);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 1);
+  EXPECT_EQ(lock_count, 1);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 2);
+  EXPECT_EQ(lock_count, 0);
+
+  alarm_free(alarm[0]);
+  alarm_free(alarm[1]);
+}
+
+TEST_F(AlarmTest, test_set_short_long) {
+  alarm_t *alarm[2] = {
+    alarm_new(),
+    alarm_new()
+  };
+
+  alarm_set(alarm[0], 10, cb, NULL);
+  alarm_set(alarm[1], 10 + TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 1);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 1);
+  EXPECT_EQ(lock_count, 0);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 2);
+  EXPECT_EQ(lock_count, 0);
+
+  alarm_free(alarm[0]);
+  alarm_free(alarm[1]);
+}
+
+TEST_F(AlarmTest, test_set_long_long) {
+  alarm_t *alarm[2] = {
+    alarm_new(),
+    alarm_new()
+  };
+
+  alarm_set(alarm[0], TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL);
+  alarm_set(alarm[1], 2 * TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL);
+
+  EXPECT_EQ(cb_counter, 0);
+  EXPECT_EQ(lock_count, 0);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 1);
+  EXPECT_EQ(lock_count, 0);
+
+  semaphore_wait(semaphore);
+
+  EXPECT_EQ(cb_counter, 2);
+  EXPECT_EQ(lock_count, 0);
+
+  alarm_free(alarm[0]);
+  alarm_free(alarm[1]);
+}
+
+// Try to catch any race conditions between the timer callback and |alarm_free|.
+TEST_F(AlarmTest, test_callback_free_race) {
+  for (int i = 0; i < 1000; ++i) {
+    alarm_t *alarm = alarm_new();
+    alarm_set(alarm, 0, cb, NULL);
+    alarm_free(alarm);
+  }
+}
diff --git a/osi/test/config_test.cpp b/osi/test/config_test.cpp
new file mode 100644
index 0000000..1ce199d
--- /dev/null
+++ b/osi/test/config_test.cpp
@@ -0,0 +1,113 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "config.h"
+}
+
+static const char CONFIG_FILE[] = "/data/local/tmp/config_test.conf";
+static const char CONFIG_FILE_CONTENT[] =
+"                                                                                    \n\
+first_key=value                                                                      \n\
+                                                                                     \n\
+# Device ID (DID) configuration                                                      \n\
+[DID]                                                                                \n\
+                                                                                     \n\
+# Record Number: 1, 2 or 3 - maximum of 3 records                                    \n\
+recordNumber = 1                                                                     \n\
+                                                                                     \n\
+# Primary Record - true or false (default)                                           \n\
+# There can be only one primary record                                               \n\
+primaryRecord = true                                                                 \n\
+                                                                                     \n\
+# Vendor ID '0xFFFF' indicates no Device ID Service Record is present in the device  \n\
+# 0x000F = Broadcom Corporation (default)                                            \n\
+#vendorId = 0x000F                                                                   \n\
+                                                                                     \n\
+# Vendor ID Source                                                                   \n\
+# 0x0001 = Bluetooth SIG assigned Device ID Vendor ID value (default)                \n\
+# 0x0002 = USB Implementer's Forum assigned Device ID Vendor ID value                \n\
+#vendorIdSource = 0x0001                                                             \n\
+                                                                                     \n\
+# Product ID & Product Version                                                       \n\
+# Per spec DID v1.3 0xJJMN for version is interpreted as JJ.M.N                      \n\
+# JJ: major version number, M: minor version number, N: sub-minor version number     \n\
+# For example: 1200, v14.3.6                                                         \n\
+productId = 0x1200                                                                   \n\
+version = 0x1111                                                                     \n\
+                                                                                     \n\
+# Optional attributes                                                                \n\
+#clientExecutableURL =                                                               \n\
+#serviceDescription =                                                                \n\
+#documentationURL =                                                                  \n\
+                                                                                     \n\
+# Additional optional DID records. Bluedroid supports up to 3 records.               \n\
+[DID]                                                                                \n\
+[DID]                                                                                \n\
+version = 0x1436                                                                     \n\
+";
+
+class ConfigTest : public ::testing::Test {
+  protected:
+    virtual void SetUp() {
+      FILE *fp = fopen(CONFIG_FILE, "wt");
+      fwrite(CONFIG_FILE_CONTENT, 1, sizeof(CONFIG_FILE_CONTENT), fp);
+      fclose(fp);
+    }
+};
+
+TEST_F(ConfigTest, config_new_no_file) {
+  config_t *config = config_new("/meow");
+  EXPECT_TRUE(config == NULL);
+}
+
+TEST_F(ConfigTest, config_new) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_TRUE(config != NULL);
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_free_null) {
+  config_free(NULL);
+}
+
+TEST_F(ConfigTest, config_has_section) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_TRUE(config_has_section(config, "DID"));
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_has_key_in_default_section) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_TRUE(config_has_key(config, CONFIG_DEFAULT_SECTION, "first_key"));
+  EXPECT_STREQ(config_get_string(config, CONFIG_DEFAULT_SECTION, "first_key", "meow"), "value");
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_has_keys) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_TRUE(config_has_key(config, "DID", "recordNumber"));
+  EXPECT_TRUE(config_has_key(config, "DID", "primaryRecord"));
+  EXPECT_TRUE(config_has_key(config, "DID", "productId"));
+  EXPECT_TRUE(config_has_key(config, "DID", "version"));
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_no_bad_keys) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_FALSE(config_has_key(config, "DID_BAD", "primaryRecord"));
+  EXPECT_FALSE(config_has_key(config, "DID", "primaryRecord_BAD"));
+  EXPECT_FALSE(config_has_key(config, CONFIG_DEFAULT_SECTION, "primaryRecord"));
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_get_int_version) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_EQ(config_get_int(config, "DID", "version", 0), 0x1436);
+  config_free(config);
+}
+
+TEST_F(ConfigTest, config_get_int_default) {
+  config_t *config = config_new(CONFIG_FILE);
+  EXPECT_EQ(config_get_int(config, "DID", "primaryRecord", 123), 123);
+  config_free(config);
+}
diff --git a/osi/test/list_test.cpp b/osi/test/list_test.cpp
new file mode 100644
index 0000000..d874b4b
--- /dev/null
+++ b/osi/test/list_test.cpp
@@ -0,0 +1,149 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "list.h"
+#include "osi.h"
+}
+
+TEST(ListTest, test_new_simple) {
+  list_t *list = list_new(NULL);
+  ASSERT_TRUE(list != NULL);
+}
+
+TEST(ListTest, test_free_simple) {
+  // In this test we just verify that list_free is callable with a valid list.
+  list_t *list = list_new(NULL);
+  list_free(list);
+}
+
+TEST(ListTest, test_free_null) {
+  // In this test we just verify that list_free is callable with NULL.
+  list_free(NULL);
+}
+
+TEST(ListTest, test_empty_list_is_empty) {
+  list_t *list = list_new(NULL);
+  EXPECT_TRUE(list_is_empty(list));
+  list_free(list);
+}
+
+TEST(ListTest, test_empty_list_has_no_length) {
+  list_t *list = list_new(NULL);
+  EXPECT_EQ(list_length(list), 0U);
+  list_free(list);
+}
+
+TEST(ListTest, test_simple_list_prepend) {
+  list_t *list = list_new(NULL);
+  EXPECT_TRUE(list_prepend(list, &list));
+  EXPECT_FALSE(list_is_empty(list));
+  EXPECT_EQ(list_length(list), 1U);
+  list_free(list);
+}
+
+TEST(ListTest, test_simple_list_append) {
+  list_t *list = list_new(NULL);
+  EXPECT_TRUE(list_append(list, &list));
+  EXPECT_FALSE(list_is_empty(list));
+  EXPECT_EQ(list_length(list), 1U);
+  list_free(list);
+}
+
+TEST(ListTest, test_list_remove_found) {
+  list_t *list = list_new(NULL);
+  list_append(list, &list);
+  EXPECT_TRUE(list_remove(list, &list));
+  EXPECT_TRUE(list_is_empty(list));
+  EXPECT_EQ(list_length(list),  0U);
+  list_free(list);
+}
+
+TEST(ListTest, test_list_remove_not_found) {
+  int x;
+  list_t *list = list_new(NULL);
+  list_append(list, &list);
+  EXPECT_FALSE(list_remove(list, &x));
+  EXPECT_FALSE(list_is_empty(list));
+  EXPECT_EQ(list_length(list), 1U);
+  list_free(list);
+}
+
+TEST(ListTest, test_list_front) {
+  int x[] = { 1, 2, 3, 4, 5 };
+  list_t *list = list_new(NULL);
+
+  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+    list_append(list, &x[i]);
+
+  EXPECT_EQ(list_front(list), &x[0]);
+
+  list_free(list);
+}
+
+TEST(ListTest, test_list_back) {
+  int x[] = { 1, 2, 3, 4, 5 };
+  list_t *list = list_new(NULL);
+
+  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+    list_append(list, &x[i]);
+
+  EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
+
+  list_free(list);
+}
+
+TEST(ListTest, test_list_clear) {
+  int x[] = { 1, 2, 3, 4, 5 };
+  list_t *list = list_new(NULL);
+
+  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+    list_append(list, &x[i]);
+
+  list_clear(list);
+  EXPECT_TRUE(list_is_empty(list));
+  EXPECT_EQ(list_length(list), 0U);
+
+  list_free(list);
+}
+
+TEST(ListTest, test_list_append_multiple) {
+  int x[] = { 1, 2, 3, 4, 5 };
+  list_t *list = list_new(NULL);
+
+  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+    list_append(list, &x[i]);
+
+  int i = 0;
+  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), ++i)
+    EXPECT_EQ(list_node(node), &x[i]);
+
+  list_free(list);
+}
+
+TEST(ListTest, test_list_prepend_multiple) {
+  int x[] = { 1, 2, 3, 4, 5 };
+  list_t *list = list_new(NULL);
+
+  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
+    list_prepend(list, &x[i]);
+
+  int i = ARRAY_SIZE(x) - 1;
+  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), --i)
+    EXPECT_EQ(list_node(node), &x[i]);
+
+  list_free(list);
+}
+
+TEST(ListTest, test_list_begin_empty_list) {
+  list_t *list = list_new(NULL);
+  EXPECT_EQ(list_begin(list), list_end(list));
+  list_free(list);
+}
+
+TEST(ListTest, test_list_next) {
+  list_t *list = list_new(NULL);
+  list_append(list, &list);
+  EXPECT_NE(list_begin(list), list_end(list));
+  EXPECT_EQ(list_next(list_begin(list)), list_end(list));
+  list_free(list);
+}
diff --git a/osi/test/reactor_test.cpp b/osi/test/reactor_test.cpp
new file mode 100644
index 0000000..4a9fb21
--- /dev/null
+++ b/osi/test/reactor_test.cpp
@@ -0,0 +1,101 @@
+#include <gtest/gtest.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+extern "C" {
+#include "reactor.h"
+}
+
+static pthread_t thread;
+static volatile bool thread_running;
+
+static void *reactor_thread(void *ptr) {
+  reactor_t *reactor = (reactor_t *)ptr;
+
+  thread_running = true;
+  reactor_start(reactor);
+  thread_running = false;
+
+  return NULL;
+}
+
+static void spawn_reactor_thread(reactor_t *reactor) {
+  int ret = pthread_create(&thread, NULL, reactor_thread, reactor);
+  EXPECT_EQ(ret, 0);
+}
+
+static void join_reactor_thread() {
+  pthread_join(thread, NULL);
+}
+
+static uint64_t get_timestamp(void) {
+  struct timeval tv;
+  gettimeofday(&tv, NULL);
+  return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+TEST(ReactorTest, reactor_new) {
+  reactor_t *reactor = reactor_new();
+  EXPECT_TRUE(reactor != NULL);
+  reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_free_null) {
+  reactor_free(NULL);
+}
+
+TEST(ReactorTest, reactor_stop_start) {
+  reactor_t *reactor = reactor_new();
+  reactor_stop(reactor);
+  reactor_start(reactor);
+  reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_repeated_stop_start) {
+  reactor_t *reactor = reactor_new();
+  for (int i = 0; i < 10; ++i) {
+    reactor_stop(reactor);
+    reactor_start(reactor);
+  }
+  reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_multi_stop_start) {
+  reactor_t *reactor = reactor_new();
+
+  reactor_stop(reactor);
+  reactor_stop(reactor);
+  reactor_stop(reactor);
+
+  reactor_start(reactor);
+  reactor_start(reactor);
+  reactor_start(reactor);
+
+  reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_start_wait_stop) {
+  reactor_t *reactor = reactor_new();
+
+  spawn_reactor_thread(reactor);
+  usleep(50 * 1000);
+  EXPECT_TRUE(thread_running);
+
+  reactor_stop(reactor);
+  join_reactor_thread();
+  EXPECT_FALSE(thread_running);
+
+  reactor_free(reactor);
+}
+
+TEST(ReactorTest, reactor_run_once_timeout) {
+  reactor_t *reactor = reactor_new();
+
+  uint64_t start = get_timestamp();
+  reactor_status_t status = reactor_run_once_timeout(reactor, 50);
+  EXPECT_GE(get_timestamp() - start, static_cast<uint64_t>(50));
+  EXPECT_EQ(status, REACTOR_STATUS_TIMEOUT);
+
+  reactor_free(reactor);
+}
diff --git a/osi/test/thread_test.cpp b/osi/test/thread_test.cpp
new file mode 100644
index 0000000..edbc005
--- /dev/null
+++ b/osi/test/thread_test.cpp
@@ -0,0 +1,35 @@
+#include <gtest/gtest.h>
+
+extern "C" {
+#include "thread.h"
+#include "osi.h"
+}
+
+TEST(ThreadTest, test_new_simple) {
+  thread_t *thread = thread_new("test_thread");
+  ASSERT_TRUE(thread != NULL);
+  thread_free(thread);
+}
+
+TEST(ThreadTest, test_free_simple) {
+  thread_t *thread = thread_new("test_thread");
+  thread_free(thread);
+}
+
+TEST(ThreadTest, test_name) {
+  thread_t *thread = thread_new("test_name");
+  ASSERT_STREQ(thread_name(thread), "test_name");
+  thread_free(thread);
+}
+
+TEST(ThreadTest, test_long_name) {
+  thread_t *thread = thread_new("0123456789abcdef");
+  ASSERT_STREQ("0123456789abcdef", thread_name(thread));
+  thread_free(thread);
+}
+
+TEST(ThreadTest, test_very_long_name) {
+  thread_t *thread = thread_new("0123456789abcdefg");
+  ASSERT_STREQ("0123456789abcdef", thread_name(thread));
+  thread_free(thread);
+}
diff --git a/stack/Android.mk b/stack/Android.mk
old mode 100755
new mode 100644
index 92ce253..f1159a6
--- a/stack/Android.mk
+++ b/stack/Android.mk
@@ -1,5 +1,3 @@
-ifneq ($(TARGET_SIMULATOR),true)
-
 LOCAL_PATH:= $(call my-dir)
 
 include $(CLEAR_VARS)
@@ -19,6 +17,8 @@
                    $(LOCAL_PATH)/sdp \
                    $(LOCAL_PATH)/smp \
                    $(LOCAL_PATH)/srvc \
+                   $(LOCAL_PATH)/../vnd/include \
+                   $(LOCAL_PATH)/../vnd/ble \
                    $(LOCAL_PATH)/../include \
                    $(LOCAL_PATH)/../gki/common \
                    $(LOCAL_PATH)/../gki/ulinux \
@@ -28,11 +28,10 @@
                    $(LOCAL_PATH)/../ctrlr/include \
                    $(LOCAL_PATH)/../bta/include \
                    $(LOCAL_PATH)/../bta/sys \
-                   $(LOCAL_PATH)/../brcm/include \
                    $(LOCAL_PATH)/../utils/include \
                    $(bdroid_C_INCLUDES) \
 
-LOCAL_CFLAGS += $(bdroid_CFLAGS)
+LOCAL_CFLAGS += $(bdroid_CFLAGS) -std=c99
 
 ifeq ($(BOARD_HAVE_BLUETOOTH_BCM),true)
 LOCAL_CFLAGS += \
@@ -66,6 +65,10 @@
     ./btm/btm_main.c \
     ./btm/btm_dev.c \
     ./btm/btm_ble_gap.c \
+    ./btm/btm_ble_adv_filter.c \
+    ./btm/btm_ble_multi_adv.c \
+    ./btm/btm_ble_batchscan.c \
+    ./btm/btm_ble_cont_energy.c \
     ./btm/btm_acl.c \
     ./btm/btm_sco.c \
     ./btm/btm_pm.c \
@@ -145,13 +148,13 @@
     ./gap/gap_api.c \
     ./gap/gap_ble.c \
     ./gap/gap_conn.c \
-    ./gap/gap_utils.c
+    ./gap/gap_utils.c \
+    ../vnd/ble/vendor_ble.c
 
 LOCAL_MODULE := libbt-brcm_stack
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := STATIC_LIBRARIES
 LOCAL_SHARED_LIBRARIES := libcutils libc
+LOCAL_MULTILIB := 32
 
 include $(BUILD_STATIC_LIBRARY)
-
-endif  # TARGET_SIMULATOR != true
diff --git a/stack/a2dp/a2d_api.c b/stack/a2dp/a2d_api.c
index 71dcc13..f0f4a83 100644
--- a/stack/a2dp/a2d_api.c
+++ b/stack/a2dp/a2d_api.c
@@ -59,7 +59,7 @@
     tA2D_Service        a2d_svc;
     tSDP_PROTOCOL_ELEM  elem;
 
-    A2D_TRACE_API1("a2d_sdp_cback status: %d", status);
+    A2D_TRACE_API("a2d_sdp_cback status: %d", status);
 
     if (status == SDP_SUCCESS)
     {
@@ -101,7 +101,7 @@
             if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_AVDTP, &elem))
             {
                 a2d_svc.avdt_version = elem.params[0];
-                A2D_TRACE_DEBUG1("avdt_version: 0x%x", a2d_svc.avdt_version);
+                A2D_TRACE_DEBUG("avdt_version: 0x%x", a2d_svc.avdt_version);
             }
 
             /* we've got everything, we're done */
@@ -175,7 +175,7 @@
     UINT8       *p;
     tSDP_PROTOCOL_ELEM  proto_list [A2D_NUM_PROTO_ELEMS];
 
-    A2D_TRACE_API1("A2D_AddRecord uuid: %x", service_uuid);
+    A2D_TRACE_API("A2D_AddRecord uuid: %x", service_uuid);
 
     if( (sdp_handle == 0) ||
         (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) )
@@ -277,7 +277,7 @@
                                    ATTR_ID_PROTOCOL_DESC_LIST,
                                    ATTR_ID_PROVIDER_NAME};
 
-    A2D_TRACE_API1("A2D_FindService uuid: %x", service_uuid);
+    A2D_TRACE_API("A2D_FindService uuid: %x", service_uuid);
     if( (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) ||
         p_db == NULL || p_db->p_db == NULL || p_cback == NULL)
         return A2D_INVALID_PARAMS;
diff --git a/stack/avct/avct_api.c b/stack/avct/avct_api.c
index d590cb5..5b27cc8 100644
--- a/stack/avct/avct_api.c
+++ b/stack/avct/avct_api.c
@@ -56,7 +56,7 @@
 {
     UNUSED(mtu_br);
 
-    AVCT_TRACE_API0("AVCT_Register");
+    AVCT_TRACE_API("AVCT_Register");
 
     /* register PSM with L2CAP */
     L2CA_Register(AVCT_PSM, (tL2CAP_APPL_INFO *) &avct_l2c_appl);
@@ -108,7 +108,7 @@
 *******************************************************************************/
 void AVCT_Deregister(void)
 {
-    AVCT_TRACE_API0("AVCT_Deregister");
+    AVCT_TRACE_API("AVCT_Deregister");
 
     /* deregister PSM with L2CAP */
     L2CA_Deregister(AVCT_PSM);
@@ -136,7 +136,7 @@
     tAVCT_CCB   *p_ccb;
     tAVCT_LCB   *p_lcb;
 
-    AVCT_TRACE_API2("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control);
+    AVCT_TRACE_API("AVCT_CreateConn: %d, control:%d", p_cc->role, p_cc->control);
 
     /* Allocate ccb; if no ccbs, return failure */
     if ((p_ccb = avct_ccb_alloc(p_cc)) == NULL)
@@ -172,7 +172,7 @@
             {
                 /* bind lcb to ccb */
                 p_ccb->p_lcb = p_lcb;
-                AVCT_TRACE_DEBUG1("ch_state: %d", p_lcb->ch_state);
+                AVCT_TRACE_DEBUG("ch_state: %d", p_lcb->ch_state);
                 avct_lcb_event(p_lcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb);
             }
         }
@@ -198,7 +198,7 @@
     UINT16              result = AVCT_SUCCESS;
     tAVCT_CCB           *p_ccb;
 
-    AVCT_TRACE_API0("AVCT_RemoveConn");
+    AVCT_TRACE_API("AVCT_RemoveConn");
 
     /* map handle to ccb */
     if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -242,7 +242,7 @@
     tAVCT_BCB   *p_bcb;
     int         index;
 
-    AVCT_TRACE_API1("AVCT_CreateBrowse: %d", role);
+    AVCT_TRACE_API("AVCT_CreateBrowse: %d", role);
 
     /* map handle to ccb */
     if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -285,7 +285,7 @@
         {
             /* bind bcb to ccb */
             p_ccb->p_bcb = p_bcb;
-            AVCT_TRACE_DEBUG1("ch_state: %d", p_bcb->ch_state);
+            AVCT_TRACE_DEBUG("ch_state: %d", p_bcb->ch_state);
             avct_bcb_event(p_bcb, AVCT_LCB_UL_BIND_EVT, (tAVCT_LCB_EVT *) &p_ccb);
         }
     }
@@ -317,7 +317,7 @@
     UINT16              result = AVCT_SUCCESS;
     tAVCT_CCB           *p_ccb;
 
-    AVCT_TRACE_API0("AVCT_RemoveBrowse");
+    AVCT_TRACE_API("AVCT_RemoveBrowse");
 
     /* map handle to ccb */
     if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
@@ -416,14 +416,14 @@
     tAVCT_CCB       *p_ccb;
     tAVCT_UL_MSG    ul_msg;
 
-    AVCT_TRACE_API0("AVCT_MsgReq");
+    AVCT_TRACE_API("AVCT_MsgReq");
 
     /* verify p_msg parameter */
     if (p_msg == NULL)
     {
         return AVCT_NO_RESOURCES;
     }
-    AVCT_TRACE_API1("len: %d", p_msg->len);
+    AVCT_TRACE_API("len: %d", p_msg->len);
 
     /* map handle to ccb */
     if ((p_ccb = avct_ccb_by_idx(handle)) == NULL)
diff --git a/stack/avct/avct_ccb.c b/stack/avct/avct_ccb.c
index 09051b1..f2c821c 100644
--- a/stack/avct/avct_ccb.c
+++ b/stack/avct/avct_ccb.c
@@ -50,7 +50,7 @@
         {
             p_ccb->allocated = AVCT_ALOC_LCB;
             memcpy(&p_ccb->cc, p_cc, sizeof(tAVCT_CC));
-            AVCT_TRACE_DEBUG1("avct_ccb_alloc %d", i);
+            AVCT_TRACE_DEBUG("avct_ccb_alloc %d", i);
             break;
         }
     }
@@ -59,7 +59,7 @@
     {
         /* out of ccbs */
         p_ccb = NULL;
-        AVCT_TRACE_WARNING0("Out of ccbs");
+        AVCT_TRACE_WARNING("Out of ccbs");
     }
     return p_ccb;
 }
@@ -79,7 +79,7 @@
 {
     tAVCT_CTRL_CBACK    *p_cback = p_ccb->cc.p_ctrl_cback;
 
-    AVCT_TRACE_DEBUG1("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb));
+    AVCT_TRACE_DEBUG("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb));
 #if (AVCT_BROWSE_INCLUDED == TRUE)
     if(p_ccb->p_bcb == NULL)
         memset(p_ccb, 0, sizeof(tAVCT_CCB));
@@ -138,13 +138,13 @@
         if (!p_ccb->allocated)
         {
             p_ccb = NULL;
-            AVCT_TRACE_WARNING1("ccb %d not allocated", idx);
+            AVCT_TRACE_WARNING("ccb %d not allocated", idx);
         }
     }
     else
     {
         p_ccb = NULL;
-        AVCT_TRACE_WARNING1("No ccb for idx %d", idx);
+        AVCT_TRACE_WARNING("No ccb for idx %d", idx);
     }
     return p_ccb;
 }
diff --git a/stack/avct/avct_l2c.c b/stack/avct/avct_l2c.c
index aabcd0e..bb01e89 100644
--- a/stack/avct/avct_l2c.c
+++ b/stack/avct/avct_l2c.c
@@ -80,7 +80,7 @@
     {
         if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb))
         {
-            AVCT_TRACE_DEBUG1("avct_l2c_is_ct control:x%x", p_ccb->cc.control);
+            AVCT_TRACE_DEBUG("avct_l2c_is_ct control:x%x", p_ccb->cc.control);
             if (p_ccb->cc.control & AVCT_PASSIVE)
             {
                 is_passive = TRUE;
@@ -130,13 +130,13 @@
         {
             /* TG role only - accept the connection from CT. move the channel ID to the conflict list */
             p_lcb->conflict_lcid = p_lcb->ch_lcid;
-            AVCT_TRACE_DEBUG1("avct_l2c_connect_ind_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
+            AVCT_TRACE_DEBUG("avct_l2c_connect_ind_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
         }
     }
 
     if(p_lcb)
     {
-        AVCT_TRACE_DEBUG3("avct_l2c_connect_ind_cback: 0x%x, res: %d, ch_state: %d",
+        AVCT_TRACE_DEBUG("avct_l2c_connect_ind_cback: 0x%x, res: %d, ch_state: %d",
             lcid, result, p_lcb->ch_state);
     }
     /* Send L2CAP connect rsp */
@@ -156,12 +156,12 @@
         cfg.mtu_present = TRUE;
         cfg.mtu = avct_cb.mtu;
         L2CA_ConfigReq(lcid, &cfg);
-        AVCT_TRACE_DEBUG0("avct_l2c snd Cfg Req");
+        AVCT_TRACE_DEBUG("avct_l2c snd Cfg Req");
     }
 
 #if (BT_USE_TRACES == TRUE)
     if(p_lcb)
-        AVCT_TRACE_DEBUG1("ch_state cni: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state cni: %d ", p_lcb->ch_state);
 #endif
 }
 
@@ -183,7 +183,7 @@
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
-        AVCT_TRACE_DEBUG4("avct_l2c_connect_cfm_cback lcid:0x%x result: %d ch_state: %d, conflict_lcid:0x%x",
+        AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback lcid:0x%x result: %d ch_state: %d, conflict_lcid:0x%x",
             lcid, result, p_lcb->ch_state, p_lcb->conflict_lcid);
         /* if in correct state */
         if (p_lcb->ch_state == AVCT_CH_CONN)
@@ -199,12 +199,12 @@
                 cfg.mtu_present = TRUE;
                 cfg.mtu = avct_cb.mtu;
                 L2CA_ConfigReq(lcid, &cfg);
-                AVCT_TRACE_DEBUG0("avct_l2c snd Cfg Req");
+                AVCT_TRACE_DEBUG("avct_l2c snd Cfg Req");
             }
             /* else failure */
             else
             {
-                AVCT_TRACE_DEBUG1("avct_l2c_connect_cfm_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
+                AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback conflict_lcid:0x%x", p_lcb->conflict_lcid);
                 if (p_lcb->conflict_lcid == lcid)
                     p_lcb->conflict_lcid = 0;
                 else
@@ -214,7 +214,7 @@
         else if (p_lcb->conflict_lcid == lcid)
         {
             /* we must be in AVCT_CH_CFG state for the ch_lcid channel */
-            AVCT_TRACE_DEBUG2("avct_l2c_connect_cfm_cback ch_state: %d, conflict_lcid:0x%x", p_lcb->ch_state, p_lcb->conflict_lcid);
+            AVCT_TRACE_DEBUG("avct_l2c_connect_cfm_cback ch_state: %d, conflict_lcid:0x%x", p_lcb->ch_state, p_lcb->conflict_lcid);
             if (result == L2CAP_CONN_OK)
             {
                 /* just in case the peer also accepts our connection - Send L2CAP disconnect req */
@@ -222,7 +222,7 @@
             }
             p_lcb->conflict_lcid = 0;
         }
-        AVCT_TRACE_DEBUG1("ch_state cnc: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state cnc: %d ", p_lcb->ch_state);
     }
 }
 
@@ -243,7 +243,7 @@
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
-        AVCT_TRACE_DEBUG3("avct_l2c_config_cfm_cback: 0x%x, ch_state: %d, res: %d",
+        AVCT_TRACE_DEBUG("avct_l2c_config_cfm_cback: 0x%x, ch_state: %d, res: %d",
             lcid, p_lcb->ch_state, p_cfg->result);
         /* if in correct state */
         if (p_lcb->ch_state == AVCT_CH_CFG)
@@ -264,7 +264,7 @@
             /* else failure */
             else
             {
-                AVCT_TRACE_DEBUG1("ERROR avct_l2c_config_cfm_cback L2CA_DisconnectReq %d ", p_lcb->ch_state);
+                AVCT_TRACE_DEBUG("ERROR avct_l2c_config_cfm_cback L2CA_DisconnectReq %d ", p_lcb->ch_state);
                 /* store result value */
                 p_lcb->ch_result = p_cfg->result;
 
@@ -272,7 +272,7 @@
                 L2CA_DisconnectReq(lcid);
             }
         }
-        AVCT_TRACE_DEBUG1("ch_state cfc: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state cfc: %d ", p_lcb->ch_state);
     }
 }
 
@@ -293,7 +293,7 @@
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
-        AVCT_TRACE_DEBUG2("avct_l2c_config_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("avct_l2c_config_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
         /* store the mtu in tbl */
         if (p_cfg->mtu_present)
         {
@@ -322,7 +322,7 @@
                 avct_lcb_event(p_lcb, AVCT_LCB_LL_OPEN_EVT, NULL);
             }
         }
-        AVCT_TRACE_DEBUG1("ch_state cfi: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state cfi: %d ", p_lcb->ch_state);
     }
 }
 
@@ -344,7 +344,7 @@
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
-        AVCT_TRACE_DEBUG2("avct_l2c_disconnect_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("avct_l2c_disconnect_ind_cback: 0x%x, ch_state: %d", lcid, p_lcb->ch_state);
         if (ack_needed)
         {
             /* send L2CAP disconnect response */
@@ -352,7 +352,7 @@
         }
 
         avct_lcb_event(p_lcb, AVCT_LCB_LL_CLOSE_EVT, (tAVCT_LCB_EVT *) &result);
-        AVCT_TRACE_DEBUG1("ch_state di: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state di: %d ", p_lcb->ch_state);
     }
 }
 
@@ -374,14 +374,14 @@
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
-        AVCT_TRACE_DEBUG3("avct_l2c_disconnect_cfm_cback: 0x%x, ch_state: %d, res: %d",
+        AVCT_TRACE_DEBUG("avct_l2c_disconnect_cfm_cback: 0x%x, ch_state: %d, res: %d",
             lcid, p_lcb->ch_state, result);
         /* result value may be previously stored */
         res = (p_lcb->ch_result != 0) ? p_lcb->ch_result : result;
         p_lcb->ch_result = 0;
 
         avct_lcb_event(p_lcb, AVCT_LCB_LL_CLOSE_EVT, (tAVCT_LCB_EVT *) &res);
-        AVCT_TRACE_DEBUG1("ch_state dc: %d ", p_lcb->ch_state);
+        AVCT_TRACE_DEBUG("ch_state dc: %d ", p_lcb->ch_state);
     }
 }
 
@@ -399,7 +399,7 @@
 {
     tAVCT_LCB       *p_lcb;
 
-    AVCT_TRACE_DEBUG1("avct_l2c_congestion_ind_cback: 0x%x", lcid);
+    AVCT_TRACE_DEBUG("avct_l2c_congestion_ind_cback: 0x%x", lcid);
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
@@ -421,7 +421,7 @@
 {
     tAVCT_LCB       *p_lcb;
 
-    AVCT_TRACE_DEBUG1("avct_l2c_data_ind_cback: 0x%x", lcid);
+    AVCT_TRACE_DEBUG("avct_l2c_data_ind_cback: 0x%x", lcid);
     /* look up lcb for this channel */
     if ((p_lcb = avct_lcb_by_lcid(lcid)) != NULL)
     {
@@ -429,7 +429,7 @@
     }
     else /* prevent buffer leak */
     {
-        AVCT_TRACE_WARNING0("ERROR -> avct_l2c_data_ind_cback drop buffer");
+        AVCT_TRACE_WARNING("ERROR -> avct_l2c_data_ind_cback drop buffer");
         GKI_freebuf(p_buf);
     }
 }
diff --git a/stack/avct/avct_lcb.c b/stack/avct/avct_lcb.c
index 6bc7e51..6c8fd2e 100644
--- a/stack/avct/avct_lcb.c
+++ b/stack/avct/avct_lcb.c
@@ -198,9 +198,9 @@
     int                 i;
 
 #if BT_TRACE_VERBOSE == TRUE
-    AVCT_TRACE_EVENT3("LCB lcb=%d event=%s state=%s", p_lcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_lcb->state]);
+    AVCT_TRACE_EVENT("LCB lcb=%d event=%s state=%s", p_lcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_lcb->state]);
 #else
-    AVCT_TRACE_EVENT3("LCB lcb=%d event=%d state=%d", p_lcb->allocated, event, p_lcb->state);
+    AVCT_TRACE_EVENT("LCB lcb=%d event=%d state=%d", p_lcb->allocated, event, p_lcb->state);
 #endif
 
     /* look up the state table for the current state */
@@ -241,9 +241,9 @@
     int                 i;
 
 #if BT_TRACE_VERBOSE == TRUE
-    AVCT_TRACE_EVENT3("BCB lcb=%d event=%s state=%s", p_bcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_bcb->state]);
+    AVCT_TRACE_EVENT("BCB lcb=%d event=%s state=%s", p_bcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_bcb->state]);
 #else
-    AVCT_TRACE_EVENT3("BCB lcb=%d event=%d state=%d", p_bcb->allocated, event, p_bcb->state);
+    AVCT_TRACE_EVENT("BCB lcb=%d event=%d state=%d", p_bcb->allocated, event, p_bcb->state);
 #endif
 
     /* look up the state table for the current state */
@@ -296,7 +296,7 @@
         /* if no lcb found */
         p_lcb = NULL;
 
-        AVCT_TRACE_DEBUG6("No lcb for addr %02x-%02x-%02x-%02x-%02x-%02x",
+        AVCT_TRACE_DEBUG("No lcb for addr %02x-%02x-%02x-%02x-%02x-%02x",
                           bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
     }
     return p_lcb;
@@ -323,7 +323,7 @@
         {
             p_lcb->allocated = (UINT8)(i + 1);
             memcpy(p_lcb->peer_addr, bd_addr, BD_ADDR_LEN);
-            AVCT_TRACE_DEBUG1("avct_lcb_alloc %d", p_lcb->allocated);
+            AVCT_TRACE_DEBUG("avct_lcb_alloc %d", p_lcb->allocated);
             break;
         }
     }
@@ -332,7 +332,7 @@
     {
         /* out of lcbs */
         p_lcb = NULL;
-        AVCT_TRACE_WARNING0("Out of lcbs");
+        AVCT_TRACE_WARNING("Out of lcbs");
     }
     return p_lcb;
 }
@@ -354,7 +354,7 @@
     int         i;
     UNUSED(p_data);
 
-    AVCT_TRACE_DEBUG1("avct_lcb_dealloc %d", p_lcb->allocated);
+    AVCT_TRACE_DEBUG("avct_lcb_dealloc %d", p_lcb->allocated);
 
     for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
     {
@@ -363,7 +363,7 @@
         {
             if (p_ccb->p_lcb == p_lcb)
             {
-                AVCT_TRACE_DEBUG1("avct_lcb_dealloc used by ccb: %d", i);
+                AVCT_TRACE_DEBUG("avct_lcb_dealloc used by ccb: %d", i);
                 found = TRUE;
                 break;
             }
@@ -372,7 +372,7 @@
 
     if (!found)
     {
-        AVCT_TRACE_DEBUG0("avct_lcb_dealloc now");
+        AVCT_TRACE_DEBUG("avct_lcb_dealloc now");
 
         /* clear reassembled msg buffer if in use */
         if (p_lcb->p_rx_msg != NULL)
@@ -410,7 +410,7 @@
     {
         /* out of lcbs */
         p_lcb = NULL;
-        AVCT_TRACE_WARNING1("No lcb for lcid %x", lcid);
+        AVCT_TRACE_WARNING("No lcb for lcid %x", lcid);
     }
 
     return p_lcb;
@@ -456,10 +456,10 @@
     tAVCT_CCB   *p_ccb = &avct_cb.ccb[0];
     int         i;
 
-    AVCT_TRACE_WARNING0("avct_lcb_last_ccb");
+    AVCT_TRACE_WARNING("avct_lcb_last_ccb");
     for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
     {
-        AVCT_TRACE_WARNING6("%x: aloc:%d, lcb:0x%x/0x%x, ccb:0x%x/0x%x",
+        AVCT_TRACE_WARNING("%x: aloc:%d, lcb:0x%x/0x%x, ccb:0x%x/0x%x",
             i, p_ccb->allocated, p_ccb->p_lcb, p_lcb, p_ccb, p_ccb_last);
         if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb) && (p_ccb != p_ccb_last))
         {
diff --git a/stack/avct/avct_lcb_act.c b/stack/avct/avct_lcb_act.c
index 23ad332..17d5d3d 100644
--- a/stack/avct/avct_lcb_act.c
+++ b/stack/avct/avct_lcb_act.c
@@ -65,7 +65,7 @@
     if (p_buf->len < avct_lcb_pkt_type_len[pkt_type])
     {
         GKI_freebuf(p_buf);
-        AVCT_TRACE_WARNING0("Bad length during reassembly");
+        AVCT_TRACE_WARNING("Bad length during reassembly");
         p_ret = NULL;
     }
     /* single packet */
@@ -76,7 +76,7 @@
         {
             GKI_freebuf(p_lcb->p_rx_msg);
             p_lcb->p_rx_msg = NULL;
-            AVCT_TRACE_WARNING0("Got single during reassembly");
+            AVCT_TRACE_WARNING("Got single during reassembly");
         }
         p_ret = p_buf;
     }
@@ -87,37 +87,19 @@
         if (p_lcb->p_rx_msg != NULL)
         {
             GKI_freebuf(p_lcb->p_rx_msg);
-            AVCT_TRACE_WARNING0("Got start during reassembly");
+            AVCT_TRACE_WARNING("Got start during reassembly");
         }
-        /* Allocate bigger buffer for reassembly. As lower layers are
-         * not aware of possible packet size after reassembly they
-         * would have allocated smaller buffer.
-         */
-        p_lcb->p_rx_msg = (BT_HDR*)GKI_getbuf(GKI_MAX_BUF_SIZE);
-        if (p_lcb->p_rx_msg == NULL)
-        {
-            AVCT_TRACE_ERROR0 ("Cannot alloc buffer for reassembly !!");
-            GKI_freebuf(p_buf);
-        }
-        else
-        {
-            memcpy (p_lcb->p_rx_msg, p_buf,
-                sizeof(BT_HDR) + p_buf->offset + p_buf->len);
-            /* Free original buffer */
-            GKI_freebuf(p_buf);
+        p_lcb->p_rx_msg = p_buf;
 
-            /* update p to point to new buffer */
-            p = (UINT8 *)(p_lcb->p_rx_msg + 1) + p_lcb->p_rx_msg->offset;
+        /* copy first header byte over nosp */
+        *(p + 1) = *p;
 
-            /* copy first header byte over nosp */
-            *(p + 1) = *p;
+        /* set offset to point to where to copy next */
+        p_lcb->p_rx_msg->offset += p_lcb->p_rx_msg->len;
 
-            /* set offset to point to where to copy next */
-            p_lcb->p_rx_msg->offset += p_lcb->p_rx_msg->len;
+        /* adjust length for packet header */
+        p_lcb->p_rx_msg->len -= 1;
 
-            /* adjust length for packet header */
-            p_lcb->p_rx_msg->len -= 1;
-        }
         p_ret = NULL;
     }
     /* continue or end */
@@ -127,7 +109,7 @@
         if (p_lcb->p_rx_msg == NULL)
         {
             GKI_freebuf(p_buf);
-            AVCT_TRACE_WARNING1("Pkt type=%d out of order", pkt_type);
+            AVCT_TRACE_WARNING("Pkt type=%d out of order", pkt_type);
             p_ret = NULL;
         }
         else
@@ -147,7 +129,7 @@
                 p_lcb->p_rx_msg = NULL;
                 GKI_freebuf(p_buf);
                 p_ret = NULL;
-                AVCT_TRACE_WARNING0("Fragmented message to big!");
+                AVCT_TRACE_WARNING("Fragmented message to big!");
             }
             else
             {
@@ -410,19 +392,19 @@
 *******************************************************************************/
 void avct_lcb_chk_disc(tAVCT_LCB *p_lcb, tAVCT_LCB_EVT *p_data)
 {
-    AVCT_TRACE_WARNING0("avct_lcb_chk_disc");
+    AVCT_TRACE_WARNING("avct_lcb_chk_disc");
 #if (AVCT_BROWSE_INCLUDED == TRUE)
     avct_close_bcb(p_lcb, p_data);
 #endif
     if (avct_lcb_last_ccb(p_lcb, p_data->p_ccb))
     {
-        AVCT_TRACE_WARNING0("closing");
+        AVCT_TRACE_WARNING("closing");
         p_data->p_ccb->ch_close = TRUE;
         avct_lcb_event(p_lcb, AVCT_LCB_INT_CLOSE_EVT, p_data);
     }
     else
     {
-        AVCT_TRACE_WARNING0("dealloc ccb");
+        AVCT_TRACE_WARNING("dealloc ccb");
         avct_lcb_unbind_disc(p_lcb, p_data);
     }
 }
@@ -517,7 +499,7 @@
 {
     UNUSED(p_lcb);
 
-    AVCT_TRACE_WARNING0("Dropping msg");
+    AVCT_TRACE_WARNING("Dropping msg");
 
     GKI_freebuf(p_data->ul_msg.p_buf);
 }
@@ -574,7 +556,7 @@
             if ((p_buf = (BT_HDR *) GKI_getbuf(buf_size)) == NULL)
             {
                 /* whoops; free original msg buf and bail */
-                AVCT_TRACE_ERROR0 ("avct_lcb_send_msg cannot alloc buffer!!");
+                AVCT_TRACE_ERROR ("avct_lcb_send_msg cannot alloc buffer!!");
                 GKI_freebuf(p_data->ul_msg.p_buf);
                 break;
             }
@@ -636,7 +618,7 @@
             pkt_type = AVCT_PKT_TYPE_END;
         }
     }
-    AVCT_TRACE_DEBUG1 ("avct_lcb_send_msg tx_q_count:%d", p_lcb->tx_q.count);
+    AVCT_TRACE_DEBUG ("avct_lcb_send_msg tx_q_count:%d", p_lcb->tx_q.count);
     return;
 }
 
@@ -696,7 +678,7 @@
     /* check for invalid cr_ipid */
     if (cr_ipid == AVCT_CR_IPID_INVALID)
     {
-        AVCT_TRACE_WARNING1("Invalid cr_ipid", cr_ipid);
+        AVCT_TRACE_WARNING("Invalid cr_ipid", cr_ipid);
         GKI_freebuf(p_data->p_buf);
         return;
     }
@@ -713,7 +695,7 @@
     else
     {
         /* PID not found; drop message */
-        AVCT_TRACE_WARNING1("No ccb for PID=%x", pid);
+        AVCT_TRACE_WARNING("No ccb for PID=%x", pid);
         GKI_freebuf(p_data->p_buf);
 
         /* if command send reject */
diff --git a/stack/avdt/avdt_ad.c b/stack/avdt/avdt_ad.c
index 7fe665c..4686887 100644
--- a/stack/avdt/avdt_ad.c
+++ b/stack/avdt/avdt_ad.c
@@ -56,7 +56,7 @@
     {
         scb_idx = avdt_scb_to_hdl(p_scb) - 1;
         /*
-        AVDT_TRACE_DEBUG2("type: %d, tcid: %d", type, ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type));
+        AVDT_TRACE_DEBUG("type: %d, tcid: %d", type, ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type));
         */
         return ((scb_idx * (AVDT_CHAN_NUM_TYPES - 1)) + type);
     }
@@ -89,7 +89,7 @@
         */
         type = ((tcid + AVDT_CHAN_NUM_TYPES - 2) % (AVDT_CHAN_NUM_TYPES - 1)) + 1;
     }
-    AVDT_TRACE_DEBUG2("tcid: %d, type: %d", tcid, type);
+    AVDT_TRACE_DEBUG("tcid: %d, type: %d", tcid, type);
     return type;
 }
 
@@ -299,7 +299,7 @@
 *******************************************************************************/
 UINT8 avdt_ad_tc_tbl_to_idx(tAVDT_TC_TBL *p_tbl)
 {
-    AVDT_TRACE_DEBUG1("avdt_ad_tc_tbl_to_idx: %d", (p_tbl - avdt_cb.ad.tc_tbl));
+    AVDT_TRACE_DEBUG("avdt_ad_tc_tbl_to_idx: %d", (p_tbl - avdt_cb.ad.tc_tbl));
     /* use array arithmetic to determine index */
     return (UINT8) (p_tbl - avdt_cb.ad.tc_tbl);
 }
@@ -331,7 +331,7 @@
     p_tbl->cfg_flags = 0;
     p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
 
-    AVDT_TRACE_DEBUG2("avdt_ad_tc_close_ind tcid: %d, old: %d",
+    AVDT_TRACE_DEBUG("avdt_ad_tc_close_ind tcid: %d, old: %d",
         p_tbl->tcid, close.old_tc_state);
     /* if signaling channel, notify ccb that channel open */
     if (p_tbl->tcid == 0)
@@ -482,7 +482,10 @@
             avdt_scb_event(p_scb, AVDT_SCB_TC_DATA_EVT, (tAVDT_SCB_EVT *) &p_buf);
         }
         else
+        {
             GKI_freebuf(p_buf);
+            AVDT_TRACE_ERROR(" avdt_ad_tc_data_ind buffer freed");
+        }
     }
 }
 
@@ -537,7 +540,7 @@
     p_tbl = avdt_ad_tc_tbl_alloc(p_ccb);
 
     p_tbl->tcid = avdt_ad_type_to_tcid(type, p_scb);
-    AVDT_TRACE_DEBUG3("avdt_ad_open_req: type: %d, role: %d, tcid:%d",
+    AVDT_TRACE_DEBUG("avdt_ad_open_req: type: %d, role: %d, tcid:%d",
         type, role, p_tbl->tcid);
 
     if (type == AVDT_CHAN_SIG)
@@ -554,7 +557,7 @@
 
         /* also set scb_hdl in rt_tbl */
         avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].scb_hdl = avdt_scb_to_hdl(p_scb);
-        AVDT_TRACE_DEBUG3("avdt_cb.ad.rt_tbl[%d][%d].scb_hdl = %d",
+        AVDT_TRACE_DEBUG("avdt_cb.ad.rt_tbl[%d][%d].scb_hdl = %d",
             avdt_ccb_to_idx(p_ccb), p_tbl->tcid,
             avdt_scb_to_hdl(p_scb));
     }
@@ -574,11 +577,11 @@
         {
             /* if connect req ok, store tcid in lcid table  */
             avdt_cb.ad.lcid_tbl[lcid - L2CAP_BASE_APPL_CID] = avdt_ad_tc_tbl_to_idx(p_tbl);
-            AVDT_TRACE_DEBUG2("avdt_cb.ad.lcid_tbl[%d] = %d",
+            AVDT_TRACE_DEBUG("avdt_cb.ad.lcid_tbl[%d] = %d",
                 (lcid - L2CAP_BASE_APPL_CID), avdt_ad_tc_tbl_to_idx(p_tbl));
 
             avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][p_tbl->tcid].lcid = lcid;
-            AVDT_TRACE_DEBUG3("avdt_cb.ad.rt_tbl[%d][%d].lcid = 0x%x",
+            AVDT_TRACE_DEBUG("avdt_cb.ad.rt_tbl[%d][%d].lcid = 0x%x",
                 avdt_ccb_to_idx(p_ccb), p_tbl->tcid,
                 lcid);
         }
@@ -608,7 +611,7 @@
     tAVDT_TC_TBL    *p_tbl;
 
     p_tbl = avdt_ad_tc_tbl_by_type(type, p_ccb, p_scb);
-    AVDT_TRACE_DEBUG1("avdt_ad_close_req state: %d", p_tbl->state);
+    AVDT_TRACE_DEBUG("avdt_ad_close_req state: %d", p_tbl->state);
 
     switch(p_tbl->state)
     {
diff --git a/stack/avdt/avdt_api.c b/stack/avdt/avdt_api.c
index 855f17e..f18c556 100644
--- a/stack/avdt/avdt_api.c
+++ b/stack/avdt/avdt_api.c
@@ -176,6 +176,68 @@
 
 /*******************************************************************************
 **
+** Function         AVDT_SINK_Activate
+**
+** Description      Activate SEP of A2DP Sink. In Use parameter is adjusted.
+**                  In Use will be made false in case of activation. A2DP SRC
+**                  will receive in_use as false and can open A2DP Sink
+**                  connection
+**
+** Returns          void.
+**
+*******************************************************************************/
+void AVDT_SINK_Activate()
+{
+    tAVDT_SCB           *p_scb = &avdt_cb.scb[0];
+    int                 i;
+    AVDT_TRACE_DEBUG("AVDT_SINK_Activate");
+    /* for all allocated scbs */
+    for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
+    {
+        if ((p_scb->allocated) && (p_scb->cs.tsep == AVDT_TSEP_SNK))
+        {
+            AVDT_TRACE_DEBUG("AVDT_SINK_Activate found scb");
+            p_scb->sink_activated = TRUE;
+            /* update in_use */
+            p_scb->in_use = FALSE;
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         AVDT_SINK_Deactivate
+**
+** Description      Deactivate SEP of A2DP Sink. In Use parameter is adjusted.
+**                  In Use will be made TRUE in case of activation. A2DP SRC
+**                  will receive in_use as true and will not open A2DP Sink
+**                  connection
+**
+** Returns          void.
+**
+*******************************************************************************/
+void AVDT_SINK_Deactivate()
+{
+    tAVDT_SCB           *p_scb = &avdt_cb.scb[0];
+    int                 i;
+    AVDT_TRACE_DEBUG("AVDT_SINK_Deactivate");
+    /* for all allocated scbs */
+    for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++)
+    {
+        if ((p_scb->allocated) && (p_scb->cs.tsep == AVDT_TSEP_SNK))
+        {
+            AVDT_TRACE_DEBUG("AVDT_SINK_Deactivate, found scb");
+            p_scb->sink_activated = FALSE;
+            /* update in_use */
+            p_scb->in_use = TRUE;
+            break;
+        }
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         AVDT_CreateStream
 **
 ** Description      Create a stream endpoint.  After a stream endpoint is
@@ -329,7 +391,7 @@
     /* verify SEID */
     if ((p_evt->single.seid < AVDT_SEID_MIN) || (p_evt->single.seid > AVDT_SEID_MAX))
     {
-        AVDT_TRACE_ERROR1("seid: %d", p_evt->single.seid);
+        AVDT_TRACE_ERROR("seid: %d", p_evt->single.seid);
         result = AVDT_BAD_PARAMS;
     }
     /* find channel control block for this bd addr; if none, allocate one */
@@ -1017,7 +1079,7 @@
     }
     else if (p_ccb->ll_opened == FALSE)
     {
-        AVDT_TRACE_WARNING0("AVDT_ConnectReq: CCB LL is in the middle of opening");
+        AVDT_TRACE_WARNING("AVDT_ConnectReq: CCB LL is in the middle of opening");
 
         /* ccb was already allocated for the incoming signalling. */
         result = AVDT_BUSY;
@@ -1178,7 +1240,7 @@
             result = AVDT_BAD_HANDLE;
             break;
         }
-        AVDT_TRACE_WARNING1("mux_tsid_media:%d", p_scb->curr_cfg.mux_tsid_media);
+        AVDT_TRACE_WARNING("mux_tsid_media:%d", p_scb->curr_cfg.mux_tsid_media);
 
         if (p_scb->p_pkt != NULL
             || p_scb->p_ccb == NULL
@@ -1187,7 +1249,7 @@
             || p_scb->curr_cfg.mux_tsid_media == 0)
         {
             result = AVDT_ERR_BAD_STATE;
-            AVDT_TRACE_WARNING4("p_scb->p_pkt=%x, p_scb->p_ccb=%x, IsQueueEmpty=%x, p_scb->frag_off=%x",
+            AVDT_TRACE_WARNING("p_scb->p_pkt=%x, p_scb->p_ccb=%x, IsQueueEmpty=%x, p_scb->frag_off=%x",
                 p_scb->p_pkt, p_scb->p_ccb, GKI_queue_is_empty(&p_scb->frag_q), p_scb->frag_off);
             break;
         }
@@ -1200,7 +1262,7 @@
 
         if(GKI_queue_is_empty(&evt.apiwrite.frag_q))
         {
-            AVDT_TRACE_WARNING0("AVDT_WriteDataReq out of GKI buffers");
+            AVDT_TRACE_WARNING("AVDT_WriteDataReq out of GKI buffers");
             result = AVDT_ERR_RESOURCE;
             break;
         }
@@ -1216,7 +1278,7 @@
 #if (BT_USE_TRACES == TRUE)
     if(result != AVDT_SUCCESS)
     {
-        AVDT_TRACE_WARNING1("*** AVDT_WriteDataReq failed result=%d",result);
+        AVDT_TRACE_WARNING("*** AVDT_WriteDataReq failed result=%d",result);
     }
 #endif
     return result;
@@ -1343,9 +1405,9 @@
 
             case AVDT_RTCP_PT_RR:   /* Receiver Report */
                 *p++ = p_data->rr.frag_lost;
-                AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
+                AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost);
                 p_data->rr.packet_lost &= 0xFFFFFF;
-                AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
+                AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost);
                 UINT24_TO_BE_STREAM(p, p_data->rr.packet_lost);
                 UINT32_TO_BE_STREAM(p, p_data->rr.seq_num_rcvd);
                 UINT32_TO_BE_STREAM(p, p_data->rr.jitter);
diff --git a/stack/avdt/avdt_ccb.c b/stack/avdt/avdt_ccb.c
index c2ef2f4..2a10ef8 100644
--- a/stack/avdt/avdt_ccb.c
+++ b/stack/avdt/avdt_ccb.c
@@ -302,7 +302,7 @@
     int                 i;
 
 #if AVDT_DEBUG == TRUE
-    AVDT_TRACE_EVENT3("CCB ccb=%d event=%s state=%s", avdt_ccb_to_idx(p_ccb), avdt_ccb_evt_str[event], avdt_ccb_st_str[p_ccb->state]);
+    AVDT_TRACE_EVENT("CCB ccb=%d event=%s state=%s", avdt_ccb_to_idx(p_ccb), avdt_ccb_evt_str[event], avdt_ccb_st_str[p_ccb->state]);
 #endif
     BTTRC_AVDT_CCB_EVENT(event, p_ccb->state);
 
@@ -360,7 +360,7 @@
         /* if no ccb found */
         p_ccb = NULL;
 
-        AVDT_TRACE_DEBUG6("No ccb for addr %02x-%02x-%02x-%02x-%02x-%02x",
+        AVDT_TRACE_DEBUG("No ccb for addr %02x-%02x-%02x-%02x-%02x-%02x",
                           bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
     }
     return p_ccb;
@@ -390,7 +390,7 @@
             GKI_init_q(&p_ccb->cmd_q);
             GKI_init_q(&p_ccb->rsp_q);
             p_ccb->timer_entry.param = (UINT32) p_ccb;
-            AVDT_TRACE_DEBUG1("avdt_ccb_alloc %d", i);
+            AVDT_TRACE_DEBUG("avdt_ccb_alloc %d", i);
             break;
         }
     }
@@ -399,7 +399,7 @@
     {
         /* out of ccbs */
         p_ccb = NULL;
-        AVDT_TRACE_WARNING0("Out of ccbs");
+        AVDT_TRACE_WARNING("Out of ccbs");
     }
     return p_ccb;
 }
@@ -418,7 +418,7 @@
 {
     UNUSED(p_data);
 
-    AVDT_TRACE_DEBUG1("avdt_ccb_dealloc %d", avdt_ccb_to_idx(p_ccb));
+    AVDT_TRACE_DEBUG("avdt_ccb_dealloc %d", avdt_ccb_to_idx(p_ccb));
     btu_stop_timer(&p_ccb->timer_entry);
     memset(p_ccb, 0, sizeof(tAVDT_CCB));
 }
@@ -461,7 +461,7 @@
     else
     {
         p_ccb = NULL;
-        AVDT_TRACE_WARNING1("No ccb for idx %d", idx);
+        AVDT_TRACE_WARNING("No ccb for idx %d", idx);
     }
     return p_ccb;
 }
diff --git a/stack/avdt/avdt_ccb_act.c b/stack/avdt/avdt_ccb_act.c
index 1249c63..d87dbb1 100644
--- a/stack/avdt/avdt_ccb_act.c
+++ b/stack/avdt/avdt_ccb_act.c
@@ -1034,7 +1034,7 @@
 void avdt_ccb_set_disconn(tAVDT_CCB *p_ccb, tAVDT_CCB_EVT *p_data)
 {
     /*
-    AVDT_TRACE_EVENT2("avdt_ccb_set_disconn:conn:x%x, api:x%x",
+    AVDT_TRACE_EVENT("avdt_ccb_set_disconn:conn:x%x, api:x%x",
         p_ccb->p_conn_cback, p_data->disconnect.p_cback);
         */
     /* save callback */
diff --git a/stack/avdt/avdt_int.h b/stack/avdt/avdt_int.h
index 04968a6..e9752c2 100644
--- a/stack/avdt/avdt_int.h
+++ b/stack/avdt/avdt_int.h
@@ -491,6 +491,7 @@
     UINT16          media_seq;      /* media packet sequence number */
     BOOLEAN         allocated;      /* whether scb is allocated or unused */
     BOOLEAN         in_use;         /* whether stream being used by peer */
+    BOOLEAN         sink_activated; /* A2DP Sink activated/de-activated from Application */
     UINT8           role;           /* initiator/acceptor role in current procedure */
     BOOLEAN         remove;         /* whether CB is marked for removal */
     UINT8           state;          /* state machine state */
diff --git a/stack/avdt/avdt_l2c.c b/stack/avdt/avdt_l2c.c
index 2256a90..c13b5b4 100644
--- a/stack/avdt/avdt_l2c.c
+++ b/stack/avdt/avdt_l2c.c
@@ -70,17 +70,18 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void avdt_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void avdt_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+                                                 void *p_ref_data, UINT8 res)
 {
     tAVDT_CCB       *p_ccb = NULL;
     tL2CAP_CFG_INFO cfg;
     tAVDT_TC_TBL    *p_tbl;
     UNUSED(p_ref_data);
 
-    AVDT_TRACE_DEBUG1("avdt_sec_check_complete_term res: %d", res);
+    AVDT_TRACE_DEBUG("avdt_sec_check_complete_term res: %d", res);
     if (!bd_addr)
     {
-        AVDT_TRACE_WARNING0("avdt_sec_check_complete_term: NULL BD_ADDR");
+        AVDT_TRACE_WARNING("avdt_sec_check_complete_term: NULL BD_ADDR");
         return;
 
     }
@@ -92,7 +93,7 @@
 
     if (res == BTM_SUCCESS)
     {
-	    /* Send response to the L2CAP layer. */
+        /* Send response to the L2CAP layer. */
         L2CA_ConnectRsp (bd_addr, p_tbl->id, p_tbl->lcid, L2CAP_CONN_OK, L2CAP_CONN_OK);
 
         /* store idx in LCID table, store LCID in routing table */
@@ -127,14 +128,15 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void avdt_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void avdt_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+                                                void *p_ref_data, UINT8 res)
 {
     tAVDT_CCB       *p_ccb = NULL;
     tL2CAP_CFG_INFO cfg;
     tAVDT_TC_TBL    *p_tbl;
     UNUSED(p_ref_data);
 
-    AVDT_TRACE_DEBUG1("avdt_sec_check_complete_orig res: %d", res);
+    AVDT_TRACE_DEBUG("avdt_sec_check_complete_orig res: %d", res);
     if (bd_addr)
         p_ccb = avdt_ccb_by_bd(bd_addr);
     p_tbl = avdt_ad_tc_tbl_by_st(AVDT_CHAN_SIG, p_ccb, AVDT_AD_ST_SEC_INT);
@@ -281,7 +283,7 @@
     tL2CAP_CFG_INFO cfg;
     tAVDT_CCB *p_ccb;
 
-    AVDT_TRACE_DEBUG2("avdt_l2c_connect_cfm_cback lcid: %d, result: %d",
+    AVDT_TRACE_DEBUG("avdt_l2c_connect_cfm_cback lcid: %d, result: %d",
         lcid, result);
     /* look up info for this channel */
     if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
@@ -405,7 +407,7 @@
         {
             p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
         }
-        AVDT_TRACE_DEBUG2("peer_mtu: %d, lcid: x%x",p_tbl->peer_mtu, lcid);
+        AVDT_TRACE_DEBUG("peer_mtu: %d, lcid: x%x",p_tbl->peer_mtu, lcid);
 
         /* send L2CAP configure response */
         memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO));
@@ -441,7 +443,7 @@
 {
     tAVDT_TC_TBL    *p_tbl;
 
-    AVDT_TRACE_DEBUG2("avdt_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
+    AVDT_TRACE_DEBUG("avdt_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
         lcid, ack_needed);
     /* look up info for this channel */
     if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
@@ -470,7 +472,7 @@
 {
     tAVDT_TC_TBL    *p_tbl;
 
-    AVDT_TRACE_DEBUG2("avdt_l2c_disconnect_cfm_cback lcid: %d, result: %d",
+    AVDT_TRACE_DEBUG("avdt_l2c_disconnect_cfm_cback lcid: %d, result: %d",
         lcid, result);
     /* look up info for this channel */
     if ((p_tbl = avdt_ad_tc_tbl_by_lcid(lcid)) != NULL)
diff --git a/stack/avdt/avdt_msg.c b/stack/avdt/avdt_msg.c
index a1c57b3..2f38c3a 100644
--- a/stack/avdt/avdt_msg.c
+++ b/stack/avdt/avdt_msg.c
@@ -589,7 +589,7 @@
 
     if (!p_cfg)
     {
-        AVDT_TRACE_ERROR0 ("not expecting this cfg");
+        AVDT_TRACE_ERROR ("not expecting this cfg");
         return AVDT_ERR_BAD_STATE;
     }
 
@@ -633,7 +633,7 @@
             {
                 /* Skip unknown categories. */
                 p += elem_len;
-                AVDT_TRACE_DEBUG2("skipping unknown service category=%d len: %d", elem, elem_len);
+                AVDT_TRACE_DEBUG("skipping unknown service category=%d len: %d", elem, elem_len);
                 continue;
             }
         }
@@ -647,7 +647,7 @@
 
         /* add element to psc mask, but mask out codec or protect */
         p_cfg->psc_mask |= (1 << elem);
-        AVDT_TRACE_DEBUG3("elem=%d elem_len: %d psc_mask=0x%x", elem, elem_len, p_cfg->psc_mask);
+        AVDT_TRACE_DEBUG("elem=%d elem_len: %d psc_mask=0x%x", elem, elem_len, p_cfg->psc_mask);
 
         /* parse individual information elements with additional parameters */
         switch (elem)
@@ -689,7 +689,7 @@
 #if AVDT_MULTIPLEXING == TRUE
             case AVDT_CAT_MUX:
                 /* verify length */
-                AVDT_TRACE_WARNING2("psc_mask=0x%x elem_len=%d", p_cfg->psc_mask, elem_len);
+                AVDT_TRACE_WARNING("psc_mask=0x%x elem_len=%d", p_cfg->psc_mask, elem_len);
                 if( ((0 == (p_cfg->psc_mask & (AVDT_PSC_RECOV|AVDT_PSC_REPORT))) && (elem_len != 3))
                     || (((p_cfg->psc_mask & AVDT_PSC_REPORT) && !(p_cfg->psc_mask & AVDT_PSC_RECOV))
                     && (elem_len != 5))
@@ -760,7 +760,7 @@
         } /* switch */
     } /* while ! err, !end*/
     *p_elem = elem;
-    AVDT_TRACE_DEBUG3("err=0x%x, elem:0x%x psc_mask=0x%x", err, elem, p_cfg->psc_mask);
+    AVDT_TRACE_DEBUG("err=0x%x, elem:0x%x psc_mask=0x%x", err, elem, p_cfg->psc_mask);
 
     return err;
 }
@@ -914,7 +914,7 @@
             /* verify no protocol service capabilities in parameters */
             if (!err)
             {
-                AVDT_TRACE_DEBUG2("avdt_msg_prs_reconfig_cmd psc_mask=0x%x/0x%x", p_msg->config_cmd.p_cfg->psc_mask, AVDT_MSG_PSC_MASK);
+                AVDT_TRACE_DEBUG("avdt_msg_prs_reconfig_cmd psc_mask=0x%x/0x%x", p_msg->config_cmd.p_cfg->psc_mask, AVDT_MSG_PSC_MASK);
                 if ((p_msg->config_cmd.p_cfg->psc_mask != 0) ||
                     (p_msg->config_cmd.p_cfg->num_codec == 0 && p_msg->config_cmd.p_cfg->num_protect == 0))
                 {
@@ -1161,7 +1161,7 @@
     /* verify len */
     if (len != AVDT_LEN_DELAY_RPT)
     {
-        AVDT_TRACE_WARNING2("avdt_msg_prs_delay_rpt expected len: %u  got: %u", AVDT_LEN_DELAY_RPT, len);
+        AVDT_TRACE_WARNING("avdt_msg_prs_delay_rpt expected len: %u  got: %u", AVDT_LEN_DELAY_RPT, len);
         err = AVDT_ERR_LENGTH;
     }
     else
@@ -1176,7 +1176,7 @@
         else
         {
             BE_STREAM_TO_UINT16 (p_msg->delay_rpt_cmd.delay, p);
-            AVDT_TRACE_DEBUG1("avdt_msg_prs_delay_rpt delay: %u", p_msg->delay_rpt_cmd.delay);
+            AVDT_TRACE_DEBUG("avdt_msg_prs_delay_rpt delay: %u", p_msg->delay_rpt_cmd.delay);
         }
     }
     return err;
@@ -1289,7 +1289,7 @@
         label = AVDT_LAYERSPEC_LABEL(p_ccb->p_curr_msg->layer_specific);
         msg = AVDT_LAYERSPEC_MSG(p_ccb->p_curr_msg->layer_specific);
         sig = (UINT8) p_ccb->p_curr_msg->event;
-        AVDT_TRACE_DEBUG3("avdt_msg_send label:%d, msg:%d, sig:%d", label, msg, sig);
+        AVDT_TRACE_DEBUG("avdt_msg_send label:%d, msg:%d, sig:%d", label, msg, sig);
 
         /* keep track of how much of msg we've sent */
         curr_msg_len -= p_buf->len;
@@ -1368,7 +1368,7 @@
     if (p_buf->len < avdt_msg_pkt_type_len[pkt_type])
     {
         GKI_freebuf(p_buf);
-        AVDT_TRACE_WARNING0("Bad length during reassembly");
+        AVDT_TRACE_WARNING("Bad length during reassembly");
         p_ret = NULL;
     }
     /* single packet */
@@ -1379,7 +1379,7 @@
         {
             GKI_freebuf(p_ccb->p_rx_msg);
             p_ccb->p_rx_msg = NULL;
-            AVDT_TRACE_WARNING0("Got single during reassembly");
+            AVDT_TRACE_WARNING("Got single during reassembly");
         }
         p_ret = p_buf;
     }
@@ -1390,7 +1390,7 @@
         if (p_ccb->p_rx_msg != NULL)
         {
             GKI_freebuf(p_ccb->p_rx_msg);
-            AVDT_TRACE_WARNING0("Got start during reassembly");
+            AVDT_TRACE_WARNING("Got start during reassembly");
         }
         p_ccb->p_rx_msg = p_buf;
 
@@ -1412,7 +1412,7 @@
         if (p_ccb->p_rx_msg == NULL)
         {
             GKI_freebuf(p_buf);
-            AVDT_TRACE_WARNING1("Pkt type=%d out of order", pkt_type);
+            AVDT_TRACE_WARNING("Pkt type=%d out of order", pkt_type);
             p_ret = NULL;
         }
         else
@@ -1484,7 +1484,7 @@
     p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
     if (p_buf == NULL)
     {
-        AVDT_TRACE_ERROR0("avdt_msg_send_cmd out of buffer!!");
+        AVDT_TRACE_ERROR("avdt_msg_send_cmd out of buffer!!");
         return;
     }
 
@@ -1620,7 +1620,7 @@
         /* add the error code */
         AVDT_MSG_BLD_ERR(p, p_params->hdr.err_code);
     }
-    AVDT_TRACE_DEBUG0("avdt_msg_send_rej");
+    AVDT_TRACE_DEBUG("avdt_msg_send_rej");
 
     /* calculate length */
     p_buf->len = (UINT16) (p - p_start);
@@ -1654,7 +1654,6 @@
     BT_HDR      *p_buf;
     UINT8       *p;
     UINT8       *p_start;
-    UNUSED(sig_id);
 
     /* get a buffer */
     p_buf = (BT_HDR *) GKI_getpoolbuf(AVDT_CMD_POOL_ID);
@@ -1667,10 +1666,12 @@
     /* calculate length */
     p_buf->len = (UINT16) (p - p_start);
 
-    /* stash label, and message type in buf */
+    /* stash sig, label, and message type in buf */
+    p_buf->event = sig_id;
     AVDT_BLD_LAYERSPEC(p_buf->layer_specific, AVDT_MSG_TYPE_GRJ, p_params->hdr.label);
-    p_buf->event = 0;
-    AVDT_TRACE_DEBUG0("avdt_msg_send_grej");
+    //p_buf->event = 0;
+    //AVDT_BLD_LAYERSPEC(p_buf->layer_specific, 0, p_params->hdr.label);
+    AVDT_TRACE_DEBUG("avdt_msg_send_grej");
 
     /* queue message and trigger ccb to send it */
     GKI_enqueue(&p_ccb->rsp_q, p_buf);
@@ -1718,7 +1719,7 @@
     /* parse the message header */
     AVDT_MSG_PRS_HDR(p, label, pkt_type, msg_type);
 
-    /* AVDT_TRACE_DEBUG1("msg_type=%d", msg_type); */
+    /* AVDT_TRACE_DEBUG("msg_type=%d", msg_type); */
     /* set up label and ccb_idx in message hdr */
     msg.hdr.label = label;
     msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
@@ -1726,7 +1727,7 @@
     /* verify msg type */
     if (msg_type == AVDT_MSG_TYPE_GRJ)
     {
-        AVDT_TRACE_WARNING1("Dropping msg msg_type=%d", msg_type);
+        AVDT_TRACE_WARNING("Dropping msg msg_type=%d", msg_type);
         ok = FALSE;
     }
     /* check for general reject */
@@ -1748,7 +1749,7 @@
         msg.hdr.sig_id = sig;
         if ((sig == 0) || (sig > AVDT_SIG_MAX))
         {
-            AVDT_TRACE_WARNING2("Dropping msg sig=%d msg_type:%d", sig, msg_type);
+            AVDT_TRACE_WARNING("Dropping msg sig=%d msg_type:%d", sig, msg_type);
             ok = FALSE;
 
             /* send a general reject */
@@ -1813,7 +1814,7 @@
         /* if parsing failed */
         if (err != 0)
         {
-            AVDT_TRACE_WARNING2("Parsing failed sig=%d err=0x%x", sig, err);
+            AVDT_TRACE_WARNING("Parsing failed sig=%d err=0x%x", sig, err);
 
             /* if its a rsp or rej, drop it; if its a cmd, send a rej;
             ** note special case for abort; never send abort reject
@@ -1850,7 +1851,7 @@
             else
             {
                 ok = FALSE;
-                AVDT_TRACE_WARNING2("Cmd not found for rsp sig=%d label=%d", sig, label);
+                AVDT_TRACE_WARNING("Cmd not found for rsp sig=%d label=%d", sig, label);
             }
         }
     }
diff --git a/stack/avdt/avdt_scb.c b/stack/avdt/avdt_scb.c
index d0c9e0f..8eb5cc2 100644
--- a/stack/avdt/avdt_scb.c
+++ b/stack/avdt/avdt_scb.c
@@ -529,7 +529,7 @@
     int                 i;
 
 #if AVDT_DEBUG == TRUE
-    AVDT_TRACE_EVENT4("SCB hdl=%d event=%d/%s state=%s", avdt_scb_to_hdl(p_scb), event, avdt_scb_evt_str[event], avdt_scb_st_str[p_scb->state]);
+    AVDT_TRACE_EVENT("SCB hdl=%d event=%d/%s state=%s", avdt_scb_to_hdl(p_scb), event, avdt_scb_evt_str[event], avdt_scb_st_str[p_scb->state]);
 #endif
     BTTRC_AVDT_SCB_EVENT(event, p_scb->state);
 
@@ -601,6 +601,13 @@
             memset(p_scb,0,sizeof(tAVDT_SCB));
             p_scb->allocated = TRUE;
             p_scb->p_ccb = NULL;
+
+            /* initialize sink as activated */
+            if (p_cs->tsep == AVDT_TSEP_SNK)
+            {
+                p_scb->sink_activated = TRUE;
+            }
+
             memcpy(&p_scb->cs, p_cs, sizeof(tAVDT_CS));
 #if AVDT_MULTIPLEXING == TRUE
             /* initialize fragments gueue */
@@ -618,7 +625,7 @@
             }
 #endif
             p_scb->timer_entry.param = (UINT32) p_scb;
-            AVDT_TRACE_DEBUG2("avdt_scb_alloc hdl=%d, psc_mask:0x%x", i+1, p_cs->cfg.psc_mask);
+            AVDT_TRACE_DEBUG("avdt_scb_alloc hdl=%d, psc_mask:0x%x", i+1, p_cs->cfg.psc_mask);
             break;
         }
     }
@@ -627,7 +634,7 @@
     {
         /* out of ccbs */
         p_scb = NULL;
-        AVDT_TRACE_WARNING0("Out of scbs");
+        AVDT_TRACE_WARNING("Out of scbs");
     }
 
     return p_scb;
@@ -650,7 +657,7 @@
 #endif
     UNUSED(p_data);
 
-    AVDT_TRACE_DEBUG1("avdt_scb_dealloc hdl=%d", avdt_scb_to_hdl(p_scb));
+    AVDT_TRACE_DEBUG("avdt_scb_dealloc hdl=%d", avdt_scb_to_hdl(p_scb));
     btu_stop_timer(&p_scb->timer_entry);
 
 #if AVDT_MULTIPLEXING == TRUE
@@ -701,13 +708,13 @@
         if (!p_scb->allocated)
         {
             p_scb = NULL;
-            AVDT_TRACE_WARNING1("scb hdl %d not allocated", hdl);
+            AVDT_TRACE_WARNING("scb hdl %d not allocated", hdl);
         }
     }
     else
     {
         p_scb = NULL;
-        AVDT_TRACE_WARNING1("scb hdl %d out of range", hdl);
+        AVDT_TRACE_WARNING("scb hdl %d out of range", hdl);
     }
     return p_scb;
 }
@@ -730,7 +737,7 @@
     UINT8       chk_state;
     UINT8       ret = 0;
 
-    AVDT_TRACE_DEBUG1("avdt_scb_verify state %d", state);
+    AVDT_TRACE_DEBUG("avdt_scb_verify state %d", state);
     /* set nonsupported command mask */
     /* translate public state into private state */
     nsc_mask = 0;
@@ -770,7 +777,7 @@
     {
         ret = p_seid[i];
     }
-    AVDT_TRACE_DEBUG3("avdt_scb_verify state %d, nsc_mask0x%x, ret: %d",
+    AVDT_TRACE_DEBUG("avdt_scb_verify state %d, nsc_mask0x%x, ret: %d",
         chk_state, nsc_mask, ret);
     return ret;
 }
diff --git a/stack/avdt/avdt_scb_act.c b/stack/avdt/avdt_scb_act.c
index 75242ac..72dd3cd 100644
--- a/stack/avdt/avdt_scb_act.c
+++ b/stack/avdt/avdt_scb_act.c
@@ -285,7 +285,7 @@
     /* do sanity check */
     if ((offset > p_data->p_pkt->len) || ((pad_len + offset) > p_data->p_pkt->len))
     {
-        AVDT_TRACE_WARNING0("Got bad media packet");
+        AVDT_TRACE_WARNING("Got bad media packet");
         GKI_freebuf(p_data->p_pkt);
     }
     /* adjust offset and length and send it up */
@@ -340,7 +340,7 @@
     AVDT_REPORT_TYPE    pt;
     tAVDT_REPORT_DATA   report, *p_rpt;
 
-    AVDT_TRACE_DEBUG0( "avdt_scb_hdl_report");
+    AVDT_TRACE_DEBUG( "avdt_scb_hdl_report");
     if(p_scb->cs.p_report_cback)
     {
         p_rpt = &report;
@@ -377,14 +377,14 @@
             }
             else
             {
-                AVDT_TRACE_WARNING5( " - SDES SSRC=0x%08x sc=%d %d len=%d %s",
+                AVDT_TRACE_WARNING( " - SDES SSRC=0x%08x sc=%d %d len=%d %s",
                     ssrc, o_cc, *p, *(p+1), p+2);
                 result = AVDT_BUSY;
             }
             break;
 
         default:
-            AVDT_TRACE_ERROR1( "Bad Report pkt - packet type: %d", pt);
+            AVDT_TRACE_ERROR( "Bad Report pkt - packet type: %d", pt);
             result = AVDT_BAD_PARAMS;
         }
 
@@ -435,7 +435,7 @@
     {
         if (p_end - p < 4) /* length check. maximum length of AL header = 4 */
         {
-            AVDT_TRACE_WARNING2("p_end: 0x%x - p:0x%x < 4", p_end, p);
+            AVDT_TRACE_WARNING("p_end: 0x%x - p:0x%x < 4", p_end, p);
             break;
         }
 
@@ -485,14 +485,14 @@
             else
 #endif
             {
-                AVDT_TRACE_WARNING2("bad tsid: %d, mux_tsid_media:%d", al_tsid, p_scb->curr_cfg.mux_tsid_media);
+                AVDT_TRACE_WARNING("bad tsid: %d, mux_tsid_media:%d", al_tsid, p_scb->curr_cfg.mux_tsid_media);
                 break;
             }
         }
         /* check are buffer for assembling and related callback set */
         else if ((p_scb->p_media_buf == NULL) || (p_scb->cs.p_media_cback == NULL))
         {
-            AVDT_TRACE_WARNING0("NULL p_media_buf or p_media_cback");
+            AVDT_TRACE_WARNING("NULL p_media_buf or p_media_cback");
             break;
         }
 
@@ -500,7 +500,7 @@
         /* it is media fragment beginning */
         if(!al_frag) /* is it first fragment of original media packet */
         {
-            AVDT_TRACE_DEBUG2("al:%d media:%d",
+            AVDT_TRACE_DEBUG("al:%d media:%d",
                 al_len, p_scb->media_buf_len);
 
             p_scb->frag_off = 0;
@@ -508,31 +508,31 @@
             /* length check: minimum length of media header is 12 */
             if (p_scb->frag_org_len < 12)
             {
-                AVDT_TRACE_WARNING1("bad al_len: %d(<12)", al_len);
+                AVDT_TRACE_WARNING("bad al_len: %d(<12)", al_len);
                 break;
             }
             /* check that data fit into buffer */
             if (al_len > p_scb->media_buf_len)
             {
-                AVDT_TRACE_WARNING2("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
+                AVDT_TRACE_WARNING("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
                 break;
             }
             /* make sure it is the last fragment in l2cap packet */
             if (p + al_len < p_end)
             {
-                AVDT_TRACE_WARNING2("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
+                AVDT_TRACE_WARNING("bad al_len: %d(>%d)", al_len, p_scb->media_buf_len);
                 break;
             }
         }
         else
         {
-            AVDT_TRACE_DEBUG4("al:%d media:%d frag_org_len:%d frag_off:%d",
+            AVDT_TRACE_DEBUG("al:%d media:%d frag_org_len:%d frag_off:%d",
                 al_len, p_scb->media_buf_len, p_scb->frag_org_len, p_scb->frag_off);
 
             /* check that remaining length from AL header equals to original len - length of already received fragments */
             if(al_len != p_scb->frag_org_len - p_scb->frag_off)
             {
-                AVDT_TRACE_WARNING4("al_len:%d != (frag_org_len:%d - frag_off:%d) %d",
+                AVDT_TRACE_WARNING("al_len:%d != (frag_org_len:%d - frag_off:%d) %d",
                     al_len, p_scb->frag_org_len, p_scb->frag_off,
                     (p_scb->frag_org_len- p_scb->frag_off));
                 break;
@@ -541,19 +541,19 @@
             /* do sanity check */
             if (p_scb->frag_off == 0)
             {
-                AVDT_TRACE_WARNING0("frag_off=0");
+                AVDT_TRACE_WARNING("frag_off=0");
                 break;
             }
         }
         /* do common sanity check */
         if((p_scb->frag_org_len <= p_scb->frag_off) || (p_scb->frag_org_len >= p_scb->media_buf_len))
         {
-            AVDT_TRACE_WARNING3("common sanity frag_off:%d frag_org_len:%d media_buf_len:%d",
+            AVDT_TRACE_WARNING("common sanity frag_off:%d frag_org_len:%d media_buf_len:%d",
                 p_scb->frag_off, p_scb->frag_org_len, p_scb->media_buf_len);
             break;
         }
 
-        AVDT_TRACE_DEBUG4("Received fragment org_len=%d off=%d al_len=%d frag_len=%d",
+        AVDT_TRACE_DEBUG("Received fragment org_len=%d off=%d al_len=%d frag_len=%d",
             p_scb->frag_org_len, p_scb->frag_off, al_len, frag_len);
 
         /* copy fragment into buffer */
@@ -581,7 +581,7 @@
             {
                 if(p_scb->p_media_buf + p_scb->frag_off - p_payload < 4)
                 {
-                    AVDT_TRACE_WARNING3("length check frag_off:%d p_media_buf:%d p_payload:%d",
+                    AVDT_TRACE_WARNING("length check frag_off:%d p_media_buf:%d p_payload:%d",
                         p_scb->frag_off, p_scb->p_media_buf, p_payload);
                     break;/* length check */
                 }
@@ -592,7 +592,7 @@
 
             if(p_payload >= p_scb->p_media_buf + p_scb->frag_off)
             {
-                AVDT_TRACE_WARNING3("length check2 frag_off:%d p_media_buf:%d p_payload:%d",
+                AVDT_TRACE_WARNING("length check2 frag_off:%d p_media_buf:%d p_payload:%d",
                     p_scb->frag_off, p_scb->p_media_buf, p_payload);
                 break;/* length check */
             }
@@ -608,7 +608,7 @@
             /* payload length */
             payload_len = (UINT32)(p_scb->p_media_buf + p_scb->frag_off - pad_len - p_payload);
 
-            AVDT_TRACE_DEBUG2("Received last fragment header=%d len=%d",
+            AVDT_TRACE_DEBUG("Received last fragment header=%d len=%d",
                 p_payload - p_scb->p_media_buf,payload_len);
 
             /* send total media packet up */
@@ -622,7 +622,7 @@
 
     if(p < p_end)
     {
-        AVDT_TRACE_WARNING0("*** Got bad media packet");
+        AVDT_TRACE_WARNING("*** Got bad media packet");
     }
     GKI_freebuf(p_data->p_pkt);
 }
@@ -678,7 +678,7 @@
     UNUSED(p_scb);
 
     GKI_freebuf(p_data->p_pkt);
-    AVDT_TRACE_WARNING0("Dropped incoming media packet");
+    AVDT_TRACE_ERROR(" avdt_scb_drop_pkt Dropped incoming media packet");
 }
 
 /*******************************************************************************
@@ -826,7 +826,7 @@
             p_scb->peer_seid = p_data->msg.config_cmd.int_seid;
             memcpy(&p_scb->req_cfg, p_cfg, sizeof(tAVDT_CFG));
             /* call app callback */
-            (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb),
+            (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), /* handle of scb- which is same as sep handle of bta_av_cb.p_scb*/
                                       p_scb->p_ccb ? p_scb->p_ccb->peer_addr : NULL,
                                       AVDT_CONFIG_IND_EVT,
                                       (tAVDT_CTRL *) &p_data->msg.config_cmd);
@@ -1153,7 +1153,7 @@
     event = (p_scb->role == AVDT_OPEN_INT) ? AVDT_OPEN_CFM_EVT : AVDT_OPEN_IND_EVT;
     p_data->open.hdr.err_code = 0;
 
-    AVDT_TRACE_DEBUG3("psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x",
+    AVDT_TRACE_DEBUG("psc_mask: cfg: 0x%x, req:0x%x, cur: 0x%x",
         p_scb->cs.cfg.psc_mask, p_scb->req_cfg.psc_mask, p_scb->curr_cfg.psc_mask);
 #if AVDT_REPORTING == TRUE
     if(p_scb->curr_cfg.psc_mask & AVDT_PSC_REPORT)
@@ -1223,7 +1223,7 @@
         GKI_freebuf(p_scb->p_pkt);
 
         /* this shouldn't be happening */
-        AVDT_TRACE_WARNING0("Dropped media packet; congested");
+        AVDT_TRACE_WARNING("Dropped media packet; congested");
     }
 
     /* build a media packet */
@@ -1272,7 +1272,7 @@
             GKI_freebuf(p_frag);
 
         /* this shouldn't be happening */
-        AVDT_TRACE_WARNING0("*** Dropped media packet; congested");
+        AVDT_TRACE_WARNING("*** Dropped media packet; congested");
     }
 
     /* build a media fragments */
@@ -1420,7 +1420,7 @@
 #if AVDT_MULTIPLEXING == TRUE
     BT_HDR          *p_frag;
 
-    AVDT_TRACE_WARNING2("avdt_scb_snd_stream_close c:%d, off:%d",
+    AVDT_TRACE_WARNING("avdt_scb_snd_stream_close c:%d, off:%d",
         p_scb->frag_q.count, p_scb->frag_off);
     /* clean fragments queue */
     while((p_frag = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
@@ -1870,7 +1870,7 @@
          GKI_freebuf(p_frag);
 #endif
 
-    AVDT_TRACE_WARNING0("Dropped media packet");
+    AVDT_TRACE_WARNING("Dropped media packet");
 
     /* we need to call callback to keep data flow going */
     (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT,
@@ -1915,7 +1915,7 @@
         GKI_freebuf(p_scb->p_pkt);
         p_scb->p_pkt = NULL;
 
-        AVDT_TRACE_DEBUG0("Dropped stored media packet");
+        AVDT_TRACE_DEBUG("Dropped stored media packet");
 
         /* we need to call callback to keep data flow going */
         (*p_scb->cs.p_ctrl_cback)(avdt_scb_to_hdl(p_scb), NULL, AVDT_WRITE_CFM_EVT,
@@ -1924,7 +1924,7 @@
 #if AVDT_MULTIPLEXING == TRUE
     else if(!GKI_queue_is_empty (&p_scb->frag_q))
     {
-        AVDT_TRACE_DEBUG0("Dropped fragments queue");
+        AVDT_TRACE_DEBUG("Dropped fragments queue");
         /* clean fragments queue */
         while((p_frag = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
              GKI_freebuf(p_frag);
@@ -1978,24 +1978,24 @@
         else
         {
 #if 0
-            AVDT_TRACE_DEBUG1("num_q=%d",
+            AVDT_TRACE_DEBUG("num_q=%d",
                 L2CA_FlushChannel(avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_scb->p_ccb)][avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb)].lcid),
                                   L2CAP_FLUSH_CHANS_GET);
 #endif
             while((p_pkt = (BT_HDR*)GKI_dequeue (&p_scb->frag_q)) != NULL)
             {
                 sent = TRUE;
-                AVDT_TRACE_DEBUG1("Send fragment len=%d",p_pkt->len);
+                AVDT_TRACE_DEBUG("Send fragment len=%d",p_pkt->len);
                 /* fragments queue contains fragment to send */
                 res = avdt_ad_write_req(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb, p_pkt);
                 if(AVDT_AD_CONGESTED == res)
                 {
                     p_scb->cong = TRUE;
-                    AVDT_TRACE_DEBUG0("avdt/l2c congested!!");
+                    AVDT_TRACE_DEBUG("avdt/l2c congested!!");
                     break;/* exit loop if channel became congested */
             }
             }
-            AVDT_TRACE_DEBUG2("res=%d left=%d",res, p_scb->frag_off);
+            AVDT_TRACE_DEBUG("res=%d left=%d",res, p_scb->frag_off);
 
             if(p_scb->frag_off)
             {
@@ -2052,7 +2052,14 @@
 {
     UNUSED(p_data);
 
-    p_scb->in_use = FALSE;
+    if ((p_scb->cs.tsep == AVDT_TSEP_SNK) && (!p_scb->sink_activated))
+    {
+        p_scb->in_use = TRUE;
+    }
+    else
+    {
+        p_scb->in_use = FALSE;
+    }
     p_scb->p_ccb = NULL;
     p_scb->peer_seid = 0;
 }
@@ -2097,7 +2104,7 @@
     else
     {
         num_frag = L2CA_FlushChannel(lcid, L2CAP_FLUSH_CHANS_GET);
-        AVDT_TRACE_DEBUG2("num_q=%d lcid=%d", num_frag, lcid);
+        AVDT_TRACE_DEBUG("num_q=%d lcid=%d", num_frag, lcid);
         if(num_frag >= AVDT_MAX_FRAG_COUNT)
         {
             num_frag = 0;
@@ -2111,7 +2118,7 @@
     /* look up transport channel table entry to get peer mtu */
     p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_MEDIA, p_scb->p_ccb, p_scb);
     buf_size = p_tbl->peer_mtu + BT_HDR_SIZE;
-    AVDT_TRACE_DEBUG3("peer_mtu: %d, buf_size: %d num_frag=%d",
+    AVDT_TRACE_DEBUG("peer_mtu: %d, buf_size: %d num_frag=%d",
         p_tbl->peer_mtu, buf_size, num_frag);
 
     if(buf_size > AVDT_DATA_POOL_SIZE)
@@ -2124,7 +2131,7 @@
         /* allocate buffer for fragment */
         if(NULL == (p_frag = (BT_HDR*)GKI_getbuf(buf_size)))
         {
-            AVDT_TRACE_WARNING1("avdt_scb_queue_frags len=%d(out of GKI buffers)",*p_data_len);
+            AVDT_TRACE_WARNING("avdt_scb_queue_frags len=%d(out of GKI buffers)",*p_data_len);
             break;
         }
         /* fill fragment by chunk of media payload */
@@ -2139,7 +2146,7 @@
         memcpy((UINT8*)(p_frag+1) + p_frag->offset, *pp_data, p_frag->len);
         *pp_data += p_frag->len;
         *p_data_len -= p_frag->len;
-        AVDT_TRACE_DEBUG1("Prepared fragment len=%d", p_frag->len);
+        AVDT_TRACE_DEBUG("Prepared fragment len=%d", p_frag->len);
 
         if(al_hdr)
         {
diff --git a/stack/avrc/avrc_api.c b/stack/avrc/avrc_api.c
old mode 100755
new mode 100644
index c572f94..04f59a0
--- a/stack/avrc/avrc_api.c
+++ b/stack/avrc/avrc_api.c
@@ -128,7 +128,7 @@
     UINT8   *p_data, *p_orig_data;
     UINT8   rsp_type;
 
-    AVRC_TRACE_DEBUG0 ("avrc_prep_end_frag" );
+    AVRC_TRACE_DEBUG ("avrc_prep_end_frag" );
     p_fcb = &avrc_cb.fcb[handle];
 
     /* The response type of the end fragment should be the same as the the PDU of "End Fragment
@@ -172,7 +172,7 @@
     p_fcb = &avrc_cb.fcb[handle];
     p_pkt = p_fcb->p_fmsg;
 
-    AVRC_TRACE_DEBUG1 ("avrc_send_continue_frag len(%d) / AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
+    AVRC_TRACE_DEBUG ("avrc_send_continue_frag len(%d) / AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
     if (p_pkt->len > AVRC_MAX_CTRL_DATA_LEN)
     {
         p_pkt_old = p_fcb->p_fmsg;
@@ -202,7 +202,7 @@
             p_pkt = p_fcb->p_fmsg;
             p_fcb->p_fmsg = NULL;
             p_fcb->frag_enabled = FALSE;
-            AVRC_TRACE_ERROR0 ("AVRC_MsgReq no buffers for fragmentation - send internal error" );
+            AVRC_TRACE_ERROR ("AVRC_MsgReq no buffers for fragmentation - send internal error" );
             p_data = (UINT8 *)(p_pkt+1) + p_pkt->offset;
             *p_data++ = AVRC_PDU_REQUEST_CONTINUATION_RSP;
             *p_data++ = 0;
@@ -250,7 +250,7 @@
     if (pkt_type != AVRC_PKT_SINGLE)
     {
         /* reject - commands can only be in single packets at AVRCP level */
-        AVRC_TRACE_ERROR1 ("commands must be in single packet pdu:0x%x", *p_data );
+        AVRC_TRACE_ERROR ("commands must be in single packet pdu:0x%x", *p_data );
         /* use the current GKI buffer to send the reject */
         status = AVRC_STS_BAD_CMD;
     }
@@ -291,7 +291,7 @@
                 else
                 {
                     /* the pdu id does not match - reject the command using the current GKI buffer */
-                    AVRC_TRACE_ERROR2("avrc_proc_vendor_command continue pdu: 0x%x does not match \
+                    AVRC_TRACE_ERROR("avrc_proc_vendor_command continue pdu: 0x%x does not match \
                     current re-assembly pdu: 0x%x",
                         *(p_data + 4), p_fcb->frag_pdu);
                     status = AVRC_STS_BAD_PARAM;
@@ -366,7 +366,7 @@
     p_data += AVRC_VENDOR_HDR_SIZE;
 
     pkt_type = *(p_data + 1) & AVRC_PKT_TYPE_MASK;
-    AVRC_TRACE_DEBUG1 ("pkt_type %d", pkt_type );
+    AVRC_TRACE_DEBUG ("pkt_type %d", pkt_type );
     p_rcb = &avrc_cb.rcb[handle];
     if (p_msg->company_id == AVRC_CO_METADATA)
     {
@@ -409,7 +409,7 @@
                 {
                     /* Unable to allocate buffer for fragmented avrc message. Reuse START
                                       buffer for reassembly (re-assembled message may fit into ACL buf) */
-                    AVRC_TRACE_DEBUG0 ("Unable to allocate buffer for fragmented avrc message, \
+                    AVRC_TRACE_DEBUG ("Unable to allocate buffer for fragmented avrc message, \
                                        reusing START buffer for reassembly");
                     p_rcb->rasm_offset = p_pkt->offset;
                     p_rcb->p_rmsg = p_pkt;
@@ -423,7 +423,7 @@
             {
                 /* Received a CONTINUE/END, but no corresponding START
                               (or previous fragmented response was dropped) */
-                AVRC_TRACE_DEBUG0 ("Received a CONTINUE/END without no corresponding START \
+                AVRC_TRACE_DEBUG ("Received a CONTINUE/END without no corresponding START \
                                    (or previous fragmented response was dropped)");
                 drop = 5;
                 GKI_freebuf(p_pkt);
@@ -439,7 +439,7 @@
                 /* verify length */
                 if ((p_rcb->p_rmsg->offset + p_pkt->len) > buf_len)
                 {
-                    AVRC_TRACE_WARNING0("Fragmented message too big! - report the partial message");
+                    AVRC_TRACE_WARNING("Fragmented message too big! - report the partial message");
                     p_pkt->len = buf_len - p_rcb->p_rmsg->offset;
                     pkt_type = AVRC_PKT_END;
                 }
@@ -463,7 +463,7 @@
                     p_data = p_msg->p_vendor_data + 1; /* skip pdu */
                     *p_data++ = AVRC_PKT_SINGLE;
                     UINT16_TO_BE_STREAM(p_data, (p_msg->vendor_len - AVRC_MIN_META_HDR_SIZE));
-                    AVRC_TRACE_DEBUG3("end frag:%d, total len:%d, offset:%d", p_pkt->len,
+                    AVRC_TRACE_DEBUG("end frag:%d, total len:%d, offset:%d", p_pkt->len,
                         p_pkt_new->len, p_pkt_new->offset);
                 }
                 else
@@ -528,7 +528,7 @@
     tAVRC_MSG   msg;
     UINT8       *p_data;
     UINT8       *p_begin;
-    BOOLEAN     drop = FALSE;
+    UINT8       drop = 0;
     BOOLEAN     free = TRUE;
     BT_HDR      *p_rsp = NULL;
     UINT8       *p_rsp_data;
@@ -563,7 +563,7 @@
     memset(&msg, 0, sizeof(tAVRC_MSG) );
     {
         msg.hdr.ctype           = p_data[0] & AVRC_CTYPE_MASK;
-        AVRC_TRACE_DEBUG4("avrc_msg_cback handle:%d, ctype:%d, offset:%d, len: %d",
+        AVRC_TRACE_DEBUG("avrc_msg_cback handle:%d, ctype:%d, offset:%d, len: %d",
                 handle, msg.hdr.ctype, p_pkt->offset, p_pkt->len);
         msg.hdr.subunit_type    = (p_data[1] & AVRC_SUBTYPE_MASK) >> AVRC_SUBTYPE_SHIFT;
         msg.hdr.subunit_id      = p_data[1] & AVRC_SUBID_MASK;
@@ -770,7 +770,7 @@
 #if (BT_USE_TRACES == TRUE)
     else
     {
-        AVRC_TRACE_WARNING5("avrc_msg_cback %s msg handle:%d, control:%d, cr:%d, opcode:x%x",
+        AVRC_TRACE_WARNING("avrc_msg_cback %s msg handle:%d, control:%d, cr:%d, opcode:x%x",
                 p_drop_msg,
                 handle, avrc_cb.ccb[handle].control, cr, opcode);
     }
@@ -905,7 +905,7 @@
         memset(&avrc_cb.rcb[*p_handle], 0, sizeof(tAVRC_RASM_CB));
 #endif
     }
-    AVRC_TRACE_DEBUG4("AVRC_Open role: %d, control:%d status:%d, handle:%d", cc.role, cc.control,
+    AVRC_TRACE_DEBUG("AVRC_Open role: %d, control:%d status:%d, handle:%d", cc.role, cc.control,
         status, *p_handle);
 
     return status;
@@ -931,7 +931,7 @@
 ******************************************************************************/
 UINT16 AVRC_Close(UINT8 handle)
 {
-    AVRC_TRACE_DEBUG1("AVRC_Close handle:%d", handle);
+    AVRC_TRACE_DEBUG("AVRC_Close handle:%d", handle);
     return AVCT_RemoveConn(handle);
 }
 
@@ -1013,7 +1013,7 @@
     {
         if (p_pkt->len > AVRC_MAX_CTRL_DATA_LEN)
         {
-            AVRC_TRACE_DEBUG1 ("p_pkt->len(%d) > AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
+            AVRC_TRACE_DEBUG ("p_pkt->len(%d) > AVRC_MAX_CTRL_DATA_LEN", p_pkt->len );
             p_pkt_new = (BT_HDR *)GKI_getbuf((UINT16)(AVRC_PACKET_LEN + AVCT_MSG_OFFSET
                 + BT_HDR_SIZE));
             if (p_pkt_new)
@@ -1040,11 +1040,11 @@
 
                 /* prepare the left over for as an end fragment */
                 avrc_prep_end_frag (handle);
-                AVRC_TRACE_DEBUG3 ("p_pkt len:%d/%d, next len:%d", p_pkt->len, len, p_fcb->p_fmsg->len );
+                AVRC_TRACE_DEBUG ("p_pkt len:%d/%d, next len:%d", p_pkt->len, len, p_fcb->p_fmsg->len );
             }
             else
             {
-                AVRC_TRACE_ERROR0 ("AVRC_MsgReq no buffers for fragmentation" );
+                AVRC_TRACE_ERROR ("AVRC_MsgReq no buffers for fragmentation" );
                 GKI_freebuf(p_pkt);
     return AVRC_NO_RESOURCES;
 }
diff --git a/stack/avrc/avrc_bld_ct.c b/stack/avrc/avrc_bld_ct.c
index 039eab8..7e23967 100644
--- a/stack/avrc/avrc_bld_ct.c
+++ b/stack/avrc/avrc_bld_ct.c
@@ -42,7 +42,7 @@
 {
     UINT8   *p_data, *p_start;
 
-    AVRC_TRACE_API0("avrc_bld_next_cmd");
+    AVRC_TRACE_API("avrc_bld_next_cmd");
 
     /* get the existing length, if any, and also the num attributes */
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
@@ -75,7 +75,7 @@
 {
     UINT8   *p_data, *p_start;
 
-    AVRC_TRACE_API0("avrc_bld_set_abs_volume_cmd");
+    AVRC_TRACE_API("avrc_bld_set_abs_volume_cmd");
     /* get the existing length, if any, and also the num attributes */
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_start + 2; /* pdu + rsvd */
@@ -100,7 +100,7 @@
 {
     UINT8   *p_data, *p_start;
 
-    AVRC_TRACE_API0("avrc_bld_vol_change");
+    AVRC_TRACE_API("avrc_bld_vol_change");
     /* get the existing length, if any, and also the num attributes */
     // Set the notify value
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
@@ -131,7 +131,7 @@
     UINT8  opcode;
 
     opcode = avrc_opcode_from_pdu(p_cmd->pdu);
-    AVRC_TRACE_API2("avrc_bld_init_cmd_buffer: pdu=%x, opcode=%x", p_cmd->pdu, opcode);
+    AVRC_TRACE_API("avrc_bld_init_cmd_buffer: pdu=%x, opcode=%x", p_cmd->pdu, opcode);
 
     switch (opcode)
     {
@@ -194,10 +194,10 @@
     BT_HDR  *p_pkt;
     BOOLEAN alloc = FALSE;
 
-    AVRC_TRACE_API2("AVRC_BldCommand: pdu=%x status=%x", p_cmd->cmd.pdu, p_cmd->cmd.status);
+    AVRC_TRACE_API("AVRC_BldCommand: pdu=%x status=%x", p_cmd->cmd.pdu, p_cmd->cmd.status);
     if (!p_cmd || !pp_pkt)
     {
-        AVRC_TRACE_API2("AVRC_BldCommand. Invalid parameters passed. p_cmd=%p, pp_pkt=%p",
+        AVRC_TRACE_API("AVRC_BldCommand. Invalid parameters passed. p_cmd=%p, pp_pkt=%p",
             p_cmd, pp_pkt);
         return AVRC_STS_BAD_PARAM;
     }
@@ -206,7 +206,7 @@
     {
         if ((*pp_pkt = avrc_bld_init_cmd_buffer(p_cmd)) == NULL)
         {
-            AVRC_TRACE_API0("AVRC_BldCommand: Failed to initialize command buffer");
+            AVRC_TRACE_API("AVRC_BldCommand: Failed to initialize command buffer");
             return AVRC_STS_INTERNAL_ERR;
         }
         alloc = TRUE;
@@ -243,7 +243,7 @@
         GKI_freebuf(p_pkt);
         *pp_pkt = NULL;
     }
-    AVRC_TRACE_API1("AVRC_BldCommand: returning %d", status);
+    AVRC_TRACE_API("AVRC_BldCommand: returning %d", status);
     return status;
 }
 #endif /* (AVRC_METADATA_INCLUDED == TRUE) */
diff --git a/stack/avrc/avrc_bld_tg.c b/stack/avrc/avrc_bld_tg.c
old mode 100755
new mode 100644
index 6fe645a..a9b1a2a
--- a/stack/avrc/avrc_bld_tg.c
+++ b/stack/avrc/avrc_bld_tg.c
@@ -49,12 +49,12 @@
 
     if (!(AVRC_IS_VALID_CAP_ID(p_rsp->capability_id)))
     {
-        AVRC_TRACE_ERROR1("avrc_bld_get_capability_rsp bad parameter. p_rsp: %x", p_rsp);
+        AVRC_TRACE_ERROR("avrc_bld_get_capability_rsp bad parameter. p_rsp: %x", p_rsp);
         status = AVRC_STS_BAD_PARAM;
         return status;
     }
 
-    AVRC_TRACE_API0("avrc_bld_get_capability_rsp");
+    AVRC_TRACE_API("avrc_bld_get_capability_rsp");
     /* get the existing length, if any, and also the num attributes */
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -122,7 +122,7 @@
     UINT16  len = 0;
     UINT8   xx;
 
-    AVRC_TRACE_API0("avrc_bld_list_app_settings_attr_rsp");
+    AVRC_TRACE_API("avrc_bld_list_app_settings_attr_rsp");
     /* get the existing length, if any, and also the num attributes */
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -174,7 +174,7 @@
     UINT8   xx;
     UINT16  len;
 
-    AVRC_TRACE_API0("avrc_bld_list_app_settings_values_rsp");
+    AVRC_TRACE_API("avrc_bld_list_app_settings_values_rsp");
 
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -226,11 +226,11 @@
 
     if (!p_rsp->p_vals)
     {
-        AVRC_TRACE_ERROR0("avrc_bld_get_cur_app_setting_value_rsp NULL parameter");
+        AVRC_TRACE_ERROR("avrc_bld_get_cur_app_setting_value_rsp NULL parameter");
         return AVRC_STS_BAD_PARAM;
     }
 
-    AVRC_TRACE_API0("avrc_bld_get_cur_app_setting_value_rsp");
+    AVRC_TRACE_API("avrc_bld_get_cur_app_setting_value_rsp");
     /* get the existing length, if any, and also the num attributes */
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -281,7 +281,7 @@
     UNUSED(p_pkt);
 
     /* nothing to be added. */
-    AVRC_TRACE_API0("avrc_bld_set_app_setting_value_rsp");
+    AVRC_TRACE_API("avrc_bld_set_app_setting_value_rsp");
     return AVRC_STS_NO_ERROR;
 }
 
@@ -306,7 +306,7 @@
 
     if (!p_rsp->p_attrs)
     {
-        AVRC_TRACE_ERROR0("avrc_bld_app_setting_text_rsp NULL parameter");
+        AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp NULL parameter");
         return AVRC_STS_BAD_PARAM;
     }
     /* get the existing length, if any, and also the num attributes */
@@ -331,7 +331,7 @@
     {
         if  (len_left < (p_rsp->p_attrs[xx].str_len + 4))
         {
-            AVRC_TRACE_ERROR3("avrc_bld_app_setting_text_rsp out of room (str_len:%d, left:%d)",
+            AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp out of room (str_len:%d, left:%d)",
                 xx, p_rsp->p_attrs[xx].str_len, len_left);
             p_rsp->num_attr = num_added;
             sts = AVRC_STS_INTERNAL_ERR;
@@ -339,7 +339,7 @@
         }
         if ( !p_rsp->p_attrs[xx].str_len || !p_rsp->p_attrs[xx].p_str )
         {
-            AVRC_TRACE_ERROR1("avrc_bld_app_setting_text_rsp NULL attr text[%d]", xx);
+            AVRC_TRACE_ERROR("avrc_bld_app_setting_text_rsp NULL attr text[%d]", xx);
             continue;
         }
         UINT8_TO_BE_STREAM(p_data, p_rsp->p_attrs[xx].attr_id);
@@ -370,7 +370,7 @@
 static tAVRC_STS avrc_bld_get_app_setting_attr_text_rsp (tAVRC_GET_APP_ATTR_TXT_RSP *p_rsp,
     BT_HDR *p_pkt)
 {
-    AVRC_TRACE_API0("avrc_bld_get_app_setting_attr_text_rsp");
+    AVRC_TRACE_API("avrc_bld_get_app_setting_attr_text_rsp");
     return avrc_bld_app_setting_text_rsp(p_rsp, p_pkt);
 }
 
@@ -388,7 +388,7 @@
 static tAVRC_STS avrc_bld_get_app_setting_value_text_rsp (tAVRC_GET_APP_ATTR_TXT_RSP *p_rsp,
     BT_HDR *p_pkt)
 {
-    AVRC_TRACE_API0("avrc_bld_get_app_setting_value_text_rsp");
+    AVRC_TRACE_API("avrc_bld_get_app_setting_value_text_rsp");
     return avrc_bld_app_setting_text_rsp(p_rsp, p_pkt);
 }
 
@@ -409,7 +409,7 @@
     UNUSED(p_pkt);
 
     /* nothing to be added. */
-    AVRC_TRACE_API0("avrc_bld_inform_charset_rsp");
+    AVRC_TRACE_API("avrc_bld_inform_charset_rsp");
     return AVRC_STS_NO_ERROR;
 }
 
@@ -430,7 +430,7 @@
     UNUSED(p_pkt);
 
     /* nothing to be added. */
-    AVRC_TRACE_API0("avrc_bld_inform_battery_status_rsp");
+    AVRC_TRACE_API("avrc_bld_inform_battery_status_rsp");
     return AVRC_STS_NO_ERROR;
 }
 
@@ -451,10 +451,10 @@
     UINT16  len;
     UINT8   xx;
 
-    AVRC_TRACE_API0("avrc_bld_get_elem_attrs_rsp");
+    AVRC_TRACE_API("avrc_bld_get_elem_attrs_rsp");
     if (!p_rsp->p_attrs)
     {
-        AVRC_TRACE_ERROR0("avrc_bld_get_elem_attrs_rsp NULL parameter");
+        AVRC_TRACE_ERROR("avrc_bld_get_elem_attrs_rsp NULL parameter");
         return AVRC_STS_BAD_PARAM;
     }
 
@@ -479,7 +479,7 @@
     {
         if (!AVRC_IS_VALID_MEDIA_ATTRIBUTE(p_rsp->p_attrs[xx].attr_id))
         {
-            AVRC_TRACE_ERROR2("avrc_bld_get_elem_attrs_rsp invalid attr id[%d]: %d", xx, p_rsp->p_attrs[xx].attr_id);
+            AVRC_TRACE_ERROR("avrc_bld_get_elem_attrs_rsp invalid attr id[%d]: %d", xx, p_rsp->p_attrs[xx].attr_id);
             continue;
         }
         if ( !p_rsp->p_attrs[xx].name.p_str )
@@ -513,7 +513,7 @@
 {
     UINT8   *p_data, *p_start;
 
-    AVRC_TRACE_API0("avrc_bld_get_play_status_rsp");
+    AVRC_TRACE_API("avrc_bld_get_play_status_rsp");
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_start + 2;
 
@@ -545,7 +545,7 @@
     UINT8   xx;
     tAVRC_STS status = AVRC_STS_NO_ERROR;
 
-    AVRC_TRACE_API0("avrc_bld_notify_rsp");
+    AVRC_TRACE_API("avrc_bld_notify_rsp");
 
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_len = p_start + 2; /* pdu + rsvd */
@@ -564,7 +564,7 @@
         }
         else
         {
-            AVRC_TRACE_ERROR0("bad play state");
+            AVRC_TRACE_ERROR("bad play state");
             status = AVRC_STS_BAD_PARAM;
         }
         break;
@@ -592,7 +592,7 @@
         }
         else
         {
-            AVRC_TRACE_ERROR0("bad battery status");
+            AVRC_TRACE_ERROR("bad battery status");
             status = AVRC_STS_BAD_PARAM;
         }
         break;
@@ -605,7 +605,7 @@
         }
         else
         {
-            AVRC_TRACE_ERROR0("bad system status");
+            AVRC_TRACE_ERROR("bad system status");
             status = AVRC_STS_BAD_PARAM;
         }
         break;
@@ -628,7 +628,7 @@
                 }
                 else
                 {
-                    AVRC_TRACE_ERROR0("bad player app seeting attribute or value");
+                    AVRC_TRACE_ERROR("bad player app seeting attribute or value");
                     status = AVRC_STS_BAD_PARAM;
                     break;
                 }
@@ -641,7 +641,7 @@
 
     default:
         status = AVRC_STS_BAD_PARAM;
-        AVRC_TRACE_ERROR0("unknown event_id");
+        AVRC_TRACE_ERROR("unknown event_id");
     }
 
     UINT16_TO_BE_STREAM(p_len, len);
@@ -667,7 +667,7 @@
     UNUSED(p_pkt);
 
     /* nothing to be added. */
-    AVRC_TRACE_API0("avrc_bld_next_rsp");
+    AVRC_TRACE_API("avrc_bld_next_rsp");
     return AVRC_STS_NO_ERROR;
 }
 
@@ -688,11 +688,11 @@
 
     if (!AVRC_IS_VALID_GROUP(navi_id))
     {
-        AVRC_TRACE_ERROR1("avrc_bld_group_navigation_rsp bad navigation op id: %d", navi_id);
+        AVRC_TRACE_ERROR("avrc_bld_group_navigation_rsp bad navigation op id: %d", navi_id);
         return AVRC_STS_BAD_PARAM;
     }
 
-    AVRC_TRACE_API0("avrc_bld_group_navigation_rsp");
+    AVRC_TRACE_API("avrc_bld_group_navigation_rsp");
     p_data = (UINT8 *)(p_pkt+1) + p_pkt->offset;
     UINT16_TO_BE_STREAM(p_data, navi_id);
     p_pkt->len = 2;
@@ -713,11 +713,11 @@
 {
     UINT8 *p_data, *p_start;
 
-    AVRC_TRACE_API2("avrc_bld_rejected_rsp: status=%d, pdu:x%x", p_rsp->status, p_rsp->pdu);
+    AVRC_TRACE_API("avrc_bld_rejected_rsp: status=%d, pdu:x%x", p_rsp->status, p_rsp->pdu);
 
     p_start = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     p_data = p_start + 2;
-    AVRC_TRACE_DEBUG1("pdu:x%x", *p_start);
+    AVRC_TRACE_DEBUG("pdu:x%x", *p_start);
 
     UINT16_TO_BE_STREAM(p_data, 1);
     UINT8_TO_BE_STREAM(p_data, p_rsp->status);
@@ -742,13 +742,13 @@
     BT_HDR *p_pkt=NULL;
     UINT8  opcode = avrc_opcode_from_pdu(p_rsp->pdu);
 
-    AVRC_TRACE_API3("avrc_bld_init_rsp_buffer: pdu=%x, opcode=%x/%x", p_rsp->pdu, opcode,
+    AVRC_TRACE_API("avrc_bld_init_rsp_buffer: pdu=%x, opcode=%x/%x", p_rsp->pdu, opcode,
         p_rsp->rsp.opcode);
     if (opcode != p_rsp->rsp.opcode && p_rsp->rsp.status != AVRC_STS_NO_ERROR &&
         avrc_is_valid_opcode(p_rsp->rsp.opcode))
     {
         opcode = p_rsp->rsp.opcode;
-        AVRC_TRACE_API1("opcode=%x", opcode);
+        AVRC_TRACE_API("opcode=%x", opcode);
     }
 
     switch (opcode)
@@ -817,7 +817,7 @@
 
     if (!p_rsp || !pp_pkt)
     {
-        AVRC_TRACE_API2("AVRC_BldResponse. Invalid parameters passed. p_rsp=%p, pp_pkt=%p",
+        AVRC_TRACE_API("AVRC_BldResponse. Invalid parameters passed. p_rsp=%p, pp_pkt=%p",
             p_rsp, pp_pkt);
         return AVRC_STS_BAD_PARAM;
     }
@@ -826,7 +826,7 @@
     {
         if ((*pp_pkt = avrc_bld_init_rsp_buffer(p_rsp)) == NULL)
         {
-            AVRC_TRACE_API0("AVRC_BldResponse: Failed to initialize response buffer");
+            AVRC_TRACE_API("AVRC_BldResponse: Failed to initialize response buffer");
             return AVRC_STS_INTERNAL_ERR;
         }
         alloc = TRUE;
@@ -834,7 +834,7 @@
     status = AVRC_STS_NO_ERROR;
     p_pkt = *pp_pkt;
 
-    AVRC_TRACE_API2("AVRC_BldResponse: pdu=%x status=%x", p_rsp->rsp.pdu, p_rsp->rsp.status);
+    AVRC_TRACE_API("AVRC_BldResponse: pdu=%x status=%x", p_rsp->rsp.pdu, p_rsp->rsp.status);
     if (p_rsp->rsp.status != AVRC_STS_NO_ERROR)
     {
         return( avrc_bld_rejected_rsp(&p_rsp->rsp, p_pkt) );
@@ -909,7 +909,7 @@
         GKI_freebuf(p_pkt);
         *pp_pkt = NULL;
     }
-    AVRC_TRACE_API1("AVRC_BldResponse: returning %d", status);
+    AVRC_TRACE_API("AVRC_BldResponse: returning %d", status);
     return status;
 }
 
diff --git a/stack/avrc/avrc_int.h b/stack/avrc/avrc_int.h
old mode 100755
new mode 100644
diff --git a/stack/avrc/avrc_opt.c b/stack/avrc/avrc_opt.c
old mode 100755
new mode 100644
diff --git a/stack/avrc/avrc_pars_ct.c b/stack/avrc/avrc_pars_ct.c
old mode 100755
new mode 100644
index f3b4af5..143ce81
--- a/stack/avrc/avrc_pars_ct.c
+++ b/stack/avrc/avrc_pars_ct.c
@@ -58,7 +58,7 @@
     BE_STREAM_TO_UINT8 (p_result->pdu, p);
     p++; /* skip the reserved/packe_type byte */
     BE_STREAM_TO_UINT16 (len, p);
-    AVRC_TRACE_DEBUG4("avrc_pars_vendor_rsp() ctype:0x%x pdu:0x%x, len:%d/0x%x", p_msg->hdr.ctype, p_result->pdu, len, len);
+    AVRC_TRACE_DEBUG("avrc_pars_vendor_rsp() ctype:0x%x pdu:0x%x, len:%d/0x%x", p_msg->hdr.ctype, p_result->pdu, len, len);
     if (p_msg->hdr.ctype == AVRC_RSP_REJ)
     {
         p_result->rsp.status = *p;
@@ -92,7 +92,7 @@
             p_result->reg_notif.event_id=eventid;
             BE_STREAM_TO_UINT8 (p_result->reg_notif.param.volume, p);
         }
-        AVRC_TRACE_DEBUG2("avrc_pars_vendor_rsp PDU reg notif response:event %x, volume %x",eventid,
+        AVRC_TRACE_DEBUG("avrc_pars_vendor_rsp PDU reg notif response:event %x, volume %x",eventid,
             p_result->reg_notif.param.volume);
 #endif /* (AVRC_ADV_CTRL_INCLUDED == TRUE) */
         break;
@@ -138,7 +138,7 @@
             break;
 
         default:
-            AVRC_TRACE_ERROR1("AVRC_ParsResponse() unknown opcode:0x%x", p_msg->hdr.opcode);
+            AVRC_TRACE_ERROR("AVRC_ParsResponse() unknown opcode:0x%x", p_msg->hdr.opcode);
             break;
         }
         p_result->rsp.opcode = p_msg->hdr.opcode;
diff --git a/stack/avrc/avrc_pars_tg.c b/stack/avrc/avrc_pars_tg.c
old mode 100755
new mode 100644
index d3d5262..4a603d3
--- a/stack/avrc/avrc_pars_tg.c
+++ b/stack/avrc/avrc_pars_tg.c
@@ -52,10 +52,10 @@
     UINT16  size_needed;
 
     p_result->pdu = *p++;
-    AVRC_TRACE_DEBUG1("avrc_pars_vendor_cmd() pdu:0x%x", p_result->pdu);
+    AVRC_TRACE_DEBUG("avrc_pars_vendor_cmd() pdu:0x%x", p_result->pdu);
     if (!AVRC_IsValidAvcType (p_result->pdu, p_msg->hdr.ctype))
     {
-        AVRC_TRACE_DEBUG0("avrc_pars_vendor_cmd() detects wrong AV/C type!");
+        AVRC_TRACE_DEBUG("avrc_pars_vendor_cmd() detects wrong AV/C type!");
         status = AVRC_STS_BAD_CMD;
     }
 
@@ -132,14 +132,14 @@
             }
             if (xx != p_result->set_app_val.num_val)
             {
-                AVRC_TRACE_ERROR2("AVRC_PDU_SET_PLAYER_APP_VALUE not enough room:%d orig num_val:%d",
+                AVRC_TRACE_ERROR("AVRC_PDU_SET_PLAYER_APP_VALUE not enough room:%d orig num_val:%d",
                     xx, p_result->set_app_val.num_val);
                 p_result->set_app_val.num_val = xx;
             }
         }
         else
         {
-            AVRC_TRACE_ERROR0("AVRC_PDU_SET_PLAYER_APP_VALUE NULL decode buffer or bad len");
+            AVRC_TRACE_ERROR("AVRC_PDU_SET_PLAYER_APP_VALUE NULL decode buffer or bad len");
             status = AVRC_STS_INTERNAL_ERR;
         }
         break;
@@ -301,13 +301,13 @@
             break;
 
         default:
-            AVRC_TRACE_ERROR1("AVRC_ParsCommand() unknown opcode:0x%x", p_msg->hdr.opcode);
+            AVRC_TRACE_ERROR("AVRC_ParsCommand() unknown opcode:0x%x", p_msg->hdr.opcode);
             break;
         }
         p_result->cmd.opcode = p_msg->hdr.opcode;
         p_result->cmd.status = status;
     }
-    AVRC_TRACE_DEBUG1("AVRC_ParsCommand() return status:0x%x", status);
+    AVRC_TRACE_DEBUG("AVRC_ParsCommand() return status:0x%x", status);
     return status;
 }
 
diff --git a/stack/avrc/avrc_sdp.c b/stack/avrc/avrc_sdp.c
old mode 100755
new mode 100644
index a6325e1..f08b7c9
--- a/stack/avrc/avrc_sdp.c
+++ b/stack/avrc/avrc_sdp.c
@@ -81,7 +81,7 @@
 ******************************************************************************/
 static void avrc_sdp_cback(UINT16 status)
 {
-    AVRC_TRACE_API1("avrc_sdp_cback status: %d", status);
+    AVRC_TRACE_API("avrc_sdp_cback status: %d", status);
 
     /* reset service_uuid, so can start another find service */
     avrc_cb.service_uuid = 0;
@@ -141,7 +141,7 @@
                                    ATTR_ID_SUPPORTED_FEATURES,
                                    ATTR_ID_PROVIDER_NAME};
 
-    AVRC_TRACE_API1("AVRC_FindService uuid: %x", service_uuid);
+    AVRC_TRACE_API("AVRC_FindService uuid: %x", service_uuid);
     if( (service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL) ||
         p_db == NULL || p_db->p_db == NULL || p_cback == NULL)
         return AVRC_BAD_PARAM;
@@ -220,7 +220,7 @@
     UINT16      class_list[2];
 
 
-    AVRC_TRACE_API1("AVRC_AddRecord uuid: %x", service_uuid);
+    AVRC_TRACE_API("AVRC_AddRecord uuid: %x", service_uuid);
 
     if( service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL )
         return AVRC_BAD_PARAM;
diff --git a/stack/avrc/avrc_utils.c b/stack/avrc/avrc_utils.c
old mode 100755
new mode 100644
index 01254fa..432ecc0
--- a/stack/avrc/avrc_utils.c
+++ b/stack/avrc/avrc_utils.c
@@ -118,7 +118,7 @@
        result = TRUE;
 
     if (!result)
-        AVRC_TRACE_ERROR2(
+        AVRC_TRACE_ERROR(
             "avrc_is_valid_player_attrib_value() found not matching attrib(x%x)-value(x%x) pair!",
             attrib, value);
 
diff --git a/stack/bnep/bnep_api.c b/stack/bnep/bnep_api.c
index fbbf179..b1d8c7c 100644
--- a/stack/bnep/bnep_api.c
+++ b/stack/bnep/bnep_api.c
@@ -140,7 +140,7 @@
     UINT16          cid;
     tBNEP_CONN      *p_bcb = bnepu_find_bcb_by_bd_addr (p_rem_bda);
 
-    BNEP_TRACE_API6 ("BNEP_Connect()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+    BNEP_TRACE_API ("BNEP_Connect()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
                      p_rem_bda[0], p_rem_bda[1], p_rem_bda[2],
                      p_rem_bda[3], p_rem_bda[4], p_rem_bda[5]);
 
@@ -181,7 +181,7 @@
         /* Transition to the next appropriate state, waiting for connection confirm. */
         p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
 
-        BNEP_TRACE_API1 ("BNEP initiating security procedures for src uuid 0x%x",
+        BNEP_TRACE_API ("BNEP initiating security procedures for src uuid 0x%x",
             p_bcb->src_uuid.uu.uuid16);
 
 #if (defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) && BNEP_DO_AUTH_FOR_ROLE_SWITCH == TRUE)
@@ -206,7 +206,7 @@
         }
         else
         {
-            BNEP_TRACE_ERROR0 ("BNEP - Originate failed");
+            BNEP_TRACE_ERROR ("BNEP - Originate failed");
             if (bnep_cb.p_conn_state_cb)
                 (*bnep_cb.p_conn_state_cb) (p_bcb->handle, p_bcb->rem_bda, BNEP_CONN_FAILED, FALSE);
             bnepu_release_bcb (p_bcb);
@@ -251,7 +251,7 @@
         (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)))
         return (BNEP_WRONG_STATE);
 
-    BNEP_TRACE_API2 ("BNEP_ConnectResp()  for handle %d, responce %d", handle, resp);
+    BNEP_TRACE_API ("BNEP_ConnectResp()  for handle %d, responce %d", handle, resp);
 
     /* Form appropriate responce based on profile responce */
     if      (resp == BNEP_CONN_FAILED_SRC_UUID)   resp_code = BNEP_SETUP_INVALID_SRC_UUID;
@@ -327,7 +327,7 @@
     if (p_bcb->con_state == BNEP_STATE_IDLE)
         return (BNEP_WRONG_HANDLE);
 
-    BNEP_TRACE_API1 ("BNEP_Disconnect()  for handle %d", handle);
+    BNEP_TRACE_API ("BNEP_Disconnect()  for handle %d", handle);
 
     L2CA_DisconnectReq (p_bcb->l2cap_cid);
 
@@ -378,7 +378,7 @@
     /* Check MTU size */
     if (p_buf->len > BNEP_MTU_SIZE)
     {
-        BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE);
+        BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", p_buf->len, BNEP_MTU_SIZE);
         GKI_freebuf (p_buf);
         return (BNEP_MTU_EXCEDED);
     }
@@ -485,7 +485,7 @@
     /* Check MTU size. Consider the possibility of having extension headers */
     if (len > BNEP_MTU_SIZE)
     {
-        BNEP_TRACE_ERROR2 ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE);
+        BNEP_TRACE_ERROR ("BNEP_Write() length %d exceeded MTU %d", len, BNEP_MTU_SIZE);
         return (BNEP_MTU_EXCEDED);
     }
 
@@ -544,7 +544,7 @@
     /* Get a buffer to copy teh data into */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP_Write() not able to get buffer");
+        BNEP_TRACE_ERROR ("BNEP_Write() not able to get buffer");
         return (BNEP_NO_RESOURCES);
     }
 
diff --git a/stack/bnep/bnep_int.h b/stack/bnep/bnep_int.h
index 528c809..0c435ef 100644
--- a/stack/bnep/bnep_int.h
+++ b/stack/bnep/bnep_int.h
@@ -234,9 +234,12 @@
 extern void        bnep_send_conn_responce (tBNEP_CONN *p_bcb, UINT16 resp_code);
 extern void        bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len);
 extern void        bnep_process_setup_conn_responce (tBNEP_CONN *p_bcb, UINT8 *p_setup);
-extern UINT8       *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *len, BOOLEAN is_ext);
-extern void        bnep_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 result);
-extern tBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb, BD_ADDR p_dest_addr, UINT16 protocol, BOOLEAN fw_ext_present, UINT8 *p_data);
+extern UINT8       *bnep_process_control_packet (tBNEP_CONN *p_bcb, UINT8 *p, UINT16 *len,
+                                                        BOOLEAN is_ext);
+extern void        bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+                                                    void *p_ref_data, UINT8 result);
+extern tBNEP_RESULT bnep_is_packet_allowed (tBNEP_CONN *p_bcb, BD_ADDR p_dest_addr, UINT16 protocol,
+                                                    BOOLEAN fw_ext_present, UINT8 *p_data);
 extern UINT32      bnep_get_uuid32 (tBT_UUID *src_uuid);
 extern void        bnep_dump_status (void);
 
diff --git a/stack/bnep/bnep_main.c b/stack/bnep/bnep_main.c
index 45d3b14..62fa316 100644
--- a/stack/bnep/bnep_main.c
+++ b/stack/bnep/bnep_main.c
@@ -99,7 +99,7 @@
     /* Now, register with L2CAP */
     if (!L2CA_Register (BT_PSM_BNEP, &bnep_cb.reg_info))
     {
-        BNEP_TRACE_ERROR0 ("BNEP - Registration failed");
+        BNEP_TRACE_ERROR ("BNEP - Registration failed");
         return BNEP_SECURITY_FAIL;
     }
 
@@ -147,7 +147,7 @@
     /* Start timer waiting for config setup */
     btu_start_timer (&p_bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT);
 
-    BNEP_TRACE_EVENT1("BNEP - Rcvd L2CAP conn ind, CID: 0x%x", p_bcb->l2cap_cid);
+    BNEP_TRACE_EVENT("BNEP - Rcvd L2CAP conn ind, CID: 0x%x", p_bcb->l2cap_cid);
 
 }
 
@@ -170,7 +170,7 @@
     /* Find CCB based on CID */
     if ((bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
         return;
     }
 
@@ -186,11 +186,11 @@
         /* Start timer waiting for config results */
         btu_start_timer (&bcb->conn_tle, BTU_TTYPE_BNEP, BNEP_CONN_TIMEOUT);
 
-        BNEP_TRACE_EVENT1 ("BNEP - got conn cnf, sent cfg req, CID: 0x%x", bcb->l2cap_cid);
+        BNEP_TRACE_EVENT ("BNEP - got conn cnf, sent cfg req, CID: 0x%x", bcb->l2cap_cid);
     }
     else
     {
-        BNEP_TRACE_WARNING2 ("BNEP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result, bcb->l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result, bcb->l2cap_cid);
 
         /* Tell the upper layer, if he has a callback */
         if (bnep_cb.p_conn_state_cb &&
@@ -221,11 +221,11 @@
     /* Find CCB based on CID */
     if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    BNEP_TRACE_EVENT1 ("BNEP - Rcvd cfg ind, CID: 0x%x", l2cap_cid);
+    BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind, CID: 0x%x", l2cap_cid);
 
     /* Remember the remote MTU size */
     if ((!p_cfg->mtu_present) || (p_cfg->mtu < BNEP_MIN_MTU_SIZE))
@@ -253,7 +253,7 @@
 
     if (result != L2CAP_CFG_OK)
     {
-        BNEP_TRACE_EVENT2 ("BNEP - Rcvd cfg ind with bad MTU %d, CID: 0x%x", mtu, l2cap_cid);
+        BNEP_TRACE_EVENT ("BNEP - Rcvd cfg ind with bad MTU %d, CID: 0x%x", mtu, l2cap_cid);
         return;
     }
 
@@ -291,12 +291,12 @@
 {
     tBNEP_CONN    *p_bcb;
 
-    BNEP_TRACE_EVENT2 ("BNEP - Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
+    BNEP_TRACE_EVENT ("BNEP - Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
 
     /* Find CCB based on CID */
     if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
@@ -356,11 +356,11 @@
     /* Find CCB based on CID */
     if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    BNEP_TRACE_EVENT1 ("BNEP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+    BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
 
     /* Tell the user if he has a callback */
     if (p_bcb->con_state == BNEP_STATE_CONNECTED)
@@ -391,7 +391,7 @@
 *******************************************************************************/
 static void bnep_disconnect_cfm (UINT16 l2cap_cid, UINT16 result)
 {
-    BNEP_TRACE_EVENT2 ("BNEP - Rcvd L2CAP disc cfm, CID: 0x%x, Result 0x%x", l2cap_cid, result);
+    BNEP_TRACE_EVENT ("BNEP - Rcvd L2CAP disc cfm, CID: 0x%x, Result 0x%x", l2cap_cid, result);
 }
 
 
@@ -411,7 +411,7 @@
     /* Find BCB based on CID */
     if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP cong, unknown CID: 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP cong, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
@@ -476,7 +476,7 @@
     /* Find CCB based on CID */
     if ((p_bcb = bnepu_find_bcb_by_cid (l2cap_cid)) == NULL)
     {
-        BNEP_TRACE_WARNING1 ("BNEP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+        BNEP_TRACE_WARNING ("BNEP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
         GKI_freebuf (p_buf);
         return;
     }
@@ -487,7 +487,7 @@
     type &= 0x7f;
     if ((rem_len <= bnep_frame_hdr_sizes[type]) || (rem_len > BNEP_MTU_SIZE))
     {
-        BNEP_TRACE_EVENT2 ("BNEP - rcvd frame, bad len: %d  type: 0x%02x", p_buf->len, type);
+        BNEP_TRACE_EVENT ("BNEP - rcvd frame, bad len: %d  type: 0x%02x", p_buf->len, type);
         GKI_freebuf (p_buf);
         return;
     }
@@ -498,7 +498,7 @@
         (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)) &&
         (type != BNEP_FRAME_CONTROL))
     {
-        BNEP_TRACE_WARNING2 ("BNEP - Ignored L2CAP data while in state: %d, CID: 0x%x",
+        BNEP_TRACE_WARNING ("BNEP - Ignored L2CAP data while in state: %d, CID: 0x%x",
                             p_bcb->con_state, l2cap_cid);
 
         if (extension_present)
@@ -537,12 +537,12 @@
 
     if (type > BNEP_FRAME_COMPRESSED_ETHERNET_DEST_ONLY)
     {
-        BNEP_TRACE_EVENT1 ("BNEP - rcvd frame, unknown type: 0x%02x", type);
+        BNEP_TRACE_EVENT ("BNEP - rcvd frame, unknown type: 0x%02x", type);
         GKI_freebuf (p_buf);
         return;
     }
 
-    BNEP_TRACE_DEBUG3 ("BNEP - rcv frame, type: %d len: %d Ext: %d", type, p_buf->len, extension_present);
+    BNEP_TRACE_DEBUG ("BNEP - rcv frame, type: %d len: %d Ext: %d", type, p_buf->len, extension_present);
 
     /* Initialize addresses to 'not supplied' */
     p_src_addr = p_dst_addr = NULL;
@@ -622,7 +622,7 @@
         /* if unknown extension present stop processing */
         if (ext_type)
         {
-            BNEP_TRACE_EVENT1 ("Data extension type 0x%x found", ext_type);
+            BNEP_TRACE_EVENT ("Data extension type 0x%x found", ext_type);
             break;
         }
 
@@ -689,12 +689,12 @@
 
     p_bcb = (tBNEP_CONN *)p_tle->param;
 
-    BNEP_TRACE_EVENT4 ("BNEP - CCB timeout in state: %d  CID: 0x%x flags %x, re_transmit %d",
+    BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d  CID: 0x%x flags %x, re_transmit %d",
                        p_bcb->con_state, p_bcb->l2cap_cid, p_bcb->con_flags, p_bcb->re_transmits);
 
     if (p_bcb->con_state == BNEP_STATE_CONN_SETUP)
     {
-        BNEP_TRACE_EVENT2 ("BNEP - CCB timeout in state: %d  CID: 0x%x",
+        BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d  CID: 0x%x",
                            p_bcb->con_state, p_bcb->l2cap_cid);
 
         if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
@@ -723,7 +723,7 @@
     }
     else if (p_bcb->con_state != BNEP_STATE_CONNECTED)
     {
-        BNEP_TRACE_EVENT2 ("BNEP - CCB timeout in state: %d  CID: 0x%x",
+        BNEP_TRACE_EVENT ("BNEP - CCB timeout in state: %d  CID: 0x%x",
                            p_bcb->con_state, p_bcb->l2cap_cid);
 
         L2CA_DisconnectReq (p_bcb->l2cap_cid);
diff --git a/stack/bnep/bnep_utils.c b/stack/bnep/bnep_utils.c
index 0a8fd6d..92061d0 100644
--- a/stack/bnep/bnep_utils.c
+++ b/stack/bnep/bnep_utils.c
@@ -173,10 +173,10 @@
     BT_HDR  *p_buf;
     UINT8   *p, *p_start;
 
-    BNEP_TRACE_DEBUG1 ("BNEP sending setup req with dst uuid %x", p_bcb->dst_uuid.uu.uuid16);
+    BNEP_TRACE_DEBUG ("BNEP sending setup req with dst uuid %x", p_bcb->dst_uuid.uu.uuid16);
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - not able to send connection request");
+        BNEP_TRACE_ERROR ("BNEP - not able to send connection request");
         return;
     }
 
@@ -231,10 +231,10 @@
     BT_HDR  *p_buf;
     UINT8   *p;
 
-    BNEP_TRACE_EVENT1 ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid);
+    BNEP_TRACE_EVENT ("BNEP - bnep_send_conn_responce for CID: 0x%x", p_bcb->l2cap_cid);
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - not able to send connection response");
+        BNEP_TRACE_ERROR ("BNEP - not able to send connection response");
         return;
     }
 
@@ -272,11 +272,11 @@
     UINT8       *p;
     UINT16      xx;
 
-    BNEP_TRACE_DEBUG0 ("BNEP sending peer our filters");
+    BNEP_TRACE_DEBUG ("BNEP sending peer our filters");
 
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - no buffer send filters");
+        BNEP_TRACE_ERROR ("BNEP - no buffer send filters");
         return;
     }
 
@@ -324,11 +324,11 @@
     UINT8       *p;
     UINT16      xx;
 
-    BNEP_TRACE_DEBUG0 ("BNEP sending peer our multicast filters");
+    BNEP_TRACE_DEBUG ("BNEP sending peer our multicast filters");
 
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - no buffer to send multicast filters");
+        BNEP_TRACE_ERROR ("BNEP - no buffer to send multicast filters");
         return;
     }
 
@@ -376,10 +376,10 @@
     BT_HDR  *p_buf;
     UINT8   *p;
 
-    BNEP_TRACE_DEBUG0 ("BNEP sending filter response");
+    BNEP_TRACE_DEBUG ("BNEP sending filter response");
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - no buffer filter rsp");
+        BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp");
         return;
     }
 
@@ -414,10 +414,10 @@
     BT_HDR  *p_buf;
     UINT8   *p;
 
-    BNEP_TRACE_EVENT2 ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code);
+    BNEP_TRACE_EVENT ("BNEP - bnep_send_command_not_understood for CID: 0x%x, cmd 0x%x", p_bcb->l2cap_cid, cmd_code);
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - not able to send connection response");
+        BNEP_TRACE_ERROR ("BNEP - not able to send connection response");
         return;
     }
 
@@ -452,12 +452,12 @@
 *******************************************************************************/
 void bnepu_check_send_packet (tBNEP_CONN *p_bcb, BT_HDR *p_buf)
 {
-    BNEP_TRACE_EVENT1 ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid);
+    BNEP_TRACE_EVENT ("BNEP - bnepu_check_send_packet for CID: 0x%x", p_bcb->l2cap_cid);
     if (p_bcb->con_flags & BNEP_FLAGS_L2CAP_CONGESTED)
     {
         if (p_bcb->xmit_q.count >= BNEP_MAX_XMITQ_DEPTH)
         {
-            BNEP_TRACE_EVENT1 ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid);
+            BNEP_TRACE_EVENT ("BNEP - congested, dropping buf, CID: 0x%x", p_bcb->l2cap_cid);
 
             GKI_freebuf (p_buf);
         }
@@ -584,13 +584,13 @@
 *******************************************************************************/
 void bnep_process_setup_conn_req (tBNEP_CONN *p_bcb, UINT8 *p_setup, UINT8 len)
 {
-    BNEP_TRACE_EVENT1 ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid);
+    BNEP_TRACE_EVENT ("BNEP - bnep_process_setup_conn_req for CID: 0x%x", p_bcb->l2cap_cid);
 
     if (p_bcb->con_state != BNEP_STATE_CONN_SETUP &&
         p_bcb->con_state != BNEP_STATE_SEC_CHECKING &&
         p_bcb->con_state != BNEP_STATE_CONNECTED)
     {
-        BNEP_TRACE_ERROR1 ("BNEP - setup request in bad state %d", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - setup request in bad state %d", p_bcb->con_state);
         bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
         return;
     }
@@ -598,7 +598,7 @@
     /* Check if we already initiated security check or if waiting for user responce */
     if (p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)
     {
-        BNEP_TRACE_EVENT0 ("BNEP - Duplicate Setup message received while doing security check");
+        BNEP_TRACE_EVENT ("BNEP - Duplicate Setup message received while doing security check");
         return;
     }
 
@@ -607,7 +607,7 @@
         (!(p_bcb->con_flags & BNEP_FLAGS_SETUP_RCVD)) &&
         (p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
     {
-        BNEP_TRACE_ERROR1 ("BNEP - setup request when we are originator", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - setup request when we are originator", p_bcb->con_state);
         bnep_send_conn_responce (p_bcb, BNEP_SETUP_CONN_NOT_ALLOWED);
         return;
     }
@@ -651,7 +651,7 @@
 #endif
     else
     {
-        BNEP_TRACE_ERROR1 ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len);
+        BNEP_TRACE_ERROR ("BNEP - Bad UID len %d in ConnReq", p_bcb->dst_uuid.len);
         bnep_send_conn_responce (p_bcb, BNEP_SETUP_INVALID_UUID_SIZE);
         return;
     }
@@ -659,7 +659,7 @@
     p_bcb->con_state = BNEP_STATE_SEC_CHECKING;
     p_bcb->con_flags |= BNEP_FLAGS_SETUP_RCVD;
 
-    BNEP_TRACE_EVENT1 ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16);
+    BNEP_TRACE_EVENT ("BNEP initiating security check for incoming call for uuid 0x%x", p_bcb->src_uuid.uu.uuid16);
 #if (!defined (BNEP_DO_AUTH_FOR_ROLE_SWITCH) || BNEP_DO_AUTH_FOR_ROLE_SWITCH == FALSE)
     if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
         bnep_sec_check_complete (p_bcb->rem_bda, p_bcb, BTM_SUCCESS);
@@ -689,19 +689,19 @@
     tBNEP_RESULT    resp;
     UINT16          resp_code;
 
-    BNEP_TRACE_DEBUG0 ("BNEP received setup responce");
+    BNEP_TRACE_DEBUG ("BNEP received setup responce");
     /* The state should be either SETUP or CONNECTED */
     if (p_bcb->con_state != BNEP_STATE_CONN_SETUP)
     {
         /* Should we disconnect ? */
-        BNEP_TRACE_ERROR1 ("BNEP - setup response in bad state %d", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - setup response in bad state %d", p_bcb->con_state);
         return;
     }
 
     /* Check if we are the originator */
     if (!(p_bcb->con_flags & BNEP_FLAGS_IS_ORIG))
     {
-        BNEP_TRACE_ERROR1 ("BNEP - setup response when we are not originator", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - setup response when we are not originator", p_bcb->con_state);
         return;
     }
 
@@ -732,7 +732,7 @@
     {
         if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
         {
-            BNEP_TRACE_EVENT1 ("BNEP - role change response is %d", resp_code);
+            BNEP_TRACE_EVENT ("BNEP - role change response is %d", resp_code);
 
             /* Restore the earlier BNEP status */
             p_bcb->con_state = BNEP_STATE_CONNECTED;
@@ -752,7 +752,7 @@
         }
         else
         {
-            BNEP_TRACE_ERROR1 ("BNEP - setup response %d is not OK", resp_code);
+            BNEP_TRACE_ERROR ("BNEP - setup response %d is not OK", resp_code);
 
             L2CA_DisconnectReq (p_bcb->l2cap_cid);
 
@@ -796,12 +796,12 @@
     control_type = *p++;
     *rem_len = *rem_len - 1;
 
-    BNEP_TRACE_EVENT3 ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type);
+    BNEP_TRACE_EVENT ("BNEP processing control packet rem_len %d, is_ext %d, ctrl_type %d", *rem_len, is_ext, control_type);
 
     switch (control_type)
     {
     case BNEP_CONTROL_COMMAND_NOT_UNDERSTOOD:
-        BNEP_TRACE_ERROR1 ("BNEP Received Cmd not understood for ctl pkt type: %d", *p);
+        BNEP_TRACE_ERROR ("BNEP Received Cmd not understood for ctl pkt type: %d", *p);
         p++;
         *rem_len = *rem_len - 1;
         break;
@@ -811,7 +811,7 @@
         if (*rem_len < ((2 * len) + 1))
         {
             bad_pkt = TRUE;
-            BNEP_TRACE_ERROR0 ("BNEP Received Setup message with bad length");
+            BNEP_TRACE_ERROR ("BNEP Received Setup message with bad length");
             break;
         }
         if (!is_ext)
@@ -832,7 +832,7 @@
         if (*rem_len < (len + 2))
         {
             bad_pkt = TRUE;
-            BNEP_TRACE_ERROR0 ("BNEP Received Filter set message with bad length");
+            BNEP_TRACE_ERROR ("BNEP Received Filter set message with bad length");
             break;
         }
         bnepu_process_peer_filter_set (p_bcb, p, len);
@@ -851,7 +851,7 @@
         if (*rem_len < (len + 2))
         {
             bad_pkt = TRUE;
-            BNEP_TRACE_ERROR0 ("BNEP Received Multicast Filter Set message with bad length");
+            BNEP_TRACE_ERROR ("BNEP Received Multicast Filter Set message with bad length");
             break;
         }
         bnepu_process_peer_multicast_filter_set (p_bcb, p, len);
@@ -866,7 +866,7 @@
         break;
 
     default :
-        BNEP_TRACE_ERROR1 ("BNEP - bad ctl pkt type: %d", control_type);
+        BNEP_TRACE_ERROR ("BNEP - bad ctl pkt type: %d", control_type);
         bnep_send_command_not_understood (p_bcb, control_type);
         if (is_ext)
         {
@@ -878,7 +878,7 @@
 
     if (bad_pkt)
     {
-        BNEP_TRACE_ERROR1 ("BNEP - bad ctl pkt length: %d", *rem_len);
+        BNEP_TRACE_ERROR ("BNEP - bad ctl pkt length: %d", *rem_len);
         *rem_len = 0;
         return NULL;
     }
@@ -909,15 +909,15 @@
     if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
         (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
     {
-        BNEP_TRACE_DEBUG0 ("BNEP received filter set from peer when there is no connection");
+        BNEP_TRACE_DEBUG ("BNEP received filter set from peer when there is no connection");
         return;
     }
 
-    BNEP_TRACE_DEBUG0 ("BNEP received filter set from peer");
+    BNEP_TRACE_DEBUG ("BNEP received filter set from peer");
     /* Check for length not a multiple of 4 */
     if (len & 3)
     {
-        BNEP_TRACE_EVENT1 ("BNEP - bad filter len: %d", len);
+        BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
         bnepu_send_peer_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
         return;
     }
@@ -986,19 +986,19 @@
     UINT16          resp_code;
     tBNEP_RESULT    result;
 
-    BNEP_TRACE_DEBUG0 ("BNEP received filter responce");
+    BNEP_TRACE_DEBUG ("BNEP received filter responce");
     /* The state should be  CONNECTED */
     if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
         (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
     {
-        BNEP_TRACE_ERROR1 ("BNEP - filter response in bad state %d", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - filter response in bad state %d", p_bcb->con_state);
         return;
     }
 
     /* Check if we are the originator */
     if (!(p_bcb->con_flags & BNEP_FLAGS_FILTER_RESP_PEND))
     {
-        BNEP_TRACE_ERROR0 ("BNEP - filter response when not expecting");
+        BNEP_TRACE_ERROR ("BNEP - filter response when not expecting");
         return;
     }
 
@@ -1038,19 +1038,19 @@
     UINT16          resp_code;
     tBNEP_RESULT    result;
 
-    BNEP_TRACE_DEBUG0 ("BNEP received multicast filter responce");
+    BNEP_TRACE_DEBUG ("BNEP received multicast filter responce");
     /* The state should be  CONNECTED */
     if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
         (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
     {
-        BNEP_TRACE_ERROR1 ("BNEP - multicast filter response in bad state %d", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP - multicast filter response in bad state %d", p_bcb->con_state);
         return;
     }
 
     /* Check if we are the originator */
     if (!(p_bcb->con_flags & BNEP_FLAGS_MULTI_RESP_PEND))
     {
-        BNEP_TRACE_ERROR0 ("BNEP - multicast filter response when not expecting");
+        BNEP_TRACE_ERROR ("BNEP - multicast filter response when not expecting");
         return;
     }
 
@@ -1095,20 +1095,20 @@
     if ((p_bcb->con_state != BNEP_STATE_CONNECTED) &&
         (!(p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)))
     {
-        BNEP_TRACE_DEBUG0 ("BNEP received multicast filter set from peer when there is no connection");
+        BNEP_TRACE_DEBUG ("BNEP received multicast filter set from peer when there is no connection");
         return;
     }
 
     if (len % 12)
     {
-        BNEP_TRACE_EVENT1 ("BNEP - bad filter len: %d", len);
+        BNEP_TRACE_EVENT ("BNEP - bad filter len: %d", len);
         bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_BAD_RANGE);
         return;
     }
 
     if (len > (BNEP_MAX_MULTI_FILTERS * 2 * BD_ADDR_LEN))
     {
-        BNEP_TRACE_EVENT0 ("BNEP - Too many filters");
+        BNEP_TRACE_EVENT ("BNEP - Too many filters");
         bnepu_send_peer_multicast_filter_rsp (p_bcb, BNEP_FILTER_CRL_MAX_REACHED);
         return;
     }
@@ -1149,7 +1149,7 @@
         }
     }
 
-    BNEP_TRACE_EVENT1 ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters);
+    BNEP_TRACE_EVENT ("BNEP multicast filters %d", p_bcb->rcvd_mcast_filters);
     bnepu_send_peer_multicast_filter_rsp (p_bcb, resp_code);
 
     if (bnep_cb.p_mfilter_ind_cb)
@@ -1174,10 +1174,10 @@
     BT_HDR  *p_buf;
     UINT8   *p;
 
-    BNEP_TRACE_DEBUG1 ("BNEP sending multicast filter response %d", response_code);
+    BNEP_TRACE_DEBUG ("BNEP sending multicast filter response %d", response_code);
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (BNEP_POOL_ID)) == NULL)
     {
-        BNEP_TRACE_ERROR0 ("BNEP - no buffer filter rsp");
+        BNEP_TRACE_ERROR ("BNEP - no buffer filter rsp");
         return;
     }
 
@@ -1209,14 +1209,16 @@
 ** Returns          void
 **
 *******************************************************************************/
-void bnep_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 result)
+void bnep_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+                                    void *p_ref_data, UINT8 result)
 {
     tBNEP_CONN      *p_bcb = (tBNEP_CONN *)p_ref_data;
     UINT16          resp_code = BNEP_SETUP_CONN_OK;
     BOOLEAN         is_role_change;
     UNUSED(bd_addr);
+    UNUSED(trasnport);
 
-    BNEP_TRACE_EVENT1 ("BNEP security callback returned result %d", result);
+    BNEP_TRACE_EVENT ("BNEP security callback returned result %d", result);
     if (p_bcb->con_flags & BNEP_FLAGS_CONN_COMPLETED)
         is_role_change = TRUE;
     else
@@ -1225,7 +1227,7 @@
     /* check if the port is still waiting for security to complete */
     if (p_bcb->con_state != BNEP_STATE_SEC_CHECKING)
     {
-        BNEP_TRACE_ERROR1 ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state);
+        BNEP_TRACE_ERROR ("BNEP Connection in wrong state %d when security is completed", p_bcb->con_state);
         return;
     }
 
@@ -1351,7 +1353,7 @@
 
         if (i == p_bcb->rcvd_num_filters)
         {
-            BNEP_TRACE_DEBUG1 ("Ignoring protocol 0x%x in BNEP data write", proto);
+            BNEP_TRACE_DEBUG ("Ignoring protocol 0x%x in BNEP data write", proto);
             return BNEP_IGNORE_CMD;
         }
     }
@@ -1382,7 +1384,7 @@
         */
         if ((p_bcb->rcvd_mcast_filters == 0xFFFF) || (i == p_bcb->rcvd_mcast_filters))
         {
-            BNEP_TRACE_DEBUG6 ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write",
+            BNEP_TRACE_DEBUG ("Ignoring multicast address %x.%x.%x.%x.%x.%x in BNEP data write",
                 p_dest_addr[0], p_dest_addr[1], p_dest_addr[2],
                 p_dest_addr[3], p_dest_addr[4], p_dest_addr[5]);
             return BNEP_IGNORE_CMD;
@@ -1442,10 +1444,10 @@
     char            buff[200];
     tBNEP_CONN     *p_bcb;
 
-    BNEP_TRACE_DEBUG6 ("BNEP my BD Addr %x.%x.%x.%x.%x.%x",
+    BNEP_TRACE_DEBUG ("BNEP my BD Addr %x.%x.%x.%x.%x.%x",
         bnep_cb.my_bda[0], bnep_cb.my_bda[1], bnep_cb.my_bda[2],
         bnep_cb.my_bda[3], bnep_cb.my_bda[4], bnep_cb.my_bda[5]);
-    BNEP_TRACE_DEBUG3 ("profile registered %d, trace %d, got_my_bd_addr %d",
+    BNEP_TRACE_DEBUG ("profile registered %d, trace %d, got_my_bd_addr %d",
         bnep_cb.profile_registered, bnep_cb.trace_level, bnep_cb.got_my_bd_addr);
 
     for (i = 0, p_bcb = bnep_cb.bcb; i < BNEP_MAX_CONNECTIONS; i++, p_bcb++)
@@ -1457,7 +1459,7 @@
             p_bcb->rem_bda[0], p_bcb->rem_bda[1], p_bcb->rem_bda[2],
             p_bcb->rem_bda[3], p_bcb->rem_bda[4], p_bcb->rem_bda[5]);
 
-        BNEP_TRACE_DEBUG0 (buff);
+        BNEP_TRACE_DEBUG (buff);
     }
 #endif
 }
diff --git a/stack/btm/btm_acl.c b/stack/btm/btm_acl.c
index 49ace6e..fa742e5 100644
--- a/stack/btm/btm_acl.c
+++ b/stack/btm/btm_acl.c
@@ -40,7 +40,6 @@
 #include "bd.h"
 #include "bt_utils.h"
 
-static void btm_establish_continue (tACL_CONN *p_acl_cb);
 static void btm_read_remote_features (UINT16 handle);
 static void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number);
 static void btm_process_remote_ext_features_page (tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec,
@@ -51,52 +50,6 @@
 
 /*******************************************************************************
 **
-** Function         btm_save_remote_device_role
-**
-** Description      This function is to save remote device role
-**
-** Returns          void
-**
-*******************************************************************************/
-static void btm_save_remote_device_role(BD_ADDR bd_addr, UINT8 role)
-{
-    UINT8 i, j;
-    if (role == BTM_ROLE_UNDEFINED) return;
-
-    for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
-        if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
-            (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
-            break;
-        }
-    }
-
-    if (i < BTM_ROLE_DEVICE_NUM) {
-        UINT8 end;
-        if (i < btm_cb.front) {
-            for (j = i; j > 0; j--) {
-                bdcpy(btm_cb.previous_connected_remote_addr[j],
-                    btm_cb.previous_connected_remote_addr[j-1]);
-            }
-            bdcpy(btm_cb.previous_connected_remote_addr[0],
-                btm_cb.previous_connected_remote_addr[BTM_ROLE_DEVICE_NUM-1]);
-            end = BTM_ROLE_DEVICE_NUM-1;
-        } else {
-            end = i;
-        }
-
-        for (j = end; j > btm_cb.front; j--) {
-            bdcpy(btm_cb.previous_connected_remote_addr[j],
-                btm_cb.previous_connected_remote_addr[j-1]);
-        }
-    }
-
-    bdcpy(btm_cb.previous_connected_remote_addr[btm_cb.front], bd_addr);
-    btm_cb.previous_connected_role[btm_cb.front] = role;
-    btm_cb.front = (btm_cb.front + 1) % BTM_ROLE_DEVICE_NUM;
-}
-
-/*******************************************************************************
-**
 ** Function         btm_acl_init
 **
 ** Description      This function is called at BTM startup to initialize
@@ -106,7 +59,7 @@
 *******************************************************************************/
 void btm_acl_init (void)
 {
-    BTM_TRACE_DEBUG0 ("btm_acl_init");
+    BTM_TRACE_DEBUG ("btm_acl_init");
 #if 0  /* cleared in btm_init; put back in if called from anywhere else! */
     memset (&btm_cb.acl_db, 0, sizeof (btm_cb.acl_db));
 #if RFCOMM_INCLUDED == TRUE
@@ -131,11 +84,14 @@
 **
 ** Description      This function returns the FIRST acl_db entry for the passed BDA.
 **
+** Parameters      bda : BD address of the remote device
+**                 transport : Physical transport used for ACL connection (BR/EDR or LE)
+**
 ** Returns          Returns pointer to the ACL DB for the requested BDA if found.
 **                  NULL if not found.
 **
 *******************************************************************************/
-tACL_CONN *btm_bda_to_acl (BD_ADDR bda)
+tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport)
 {
     tACL_CONN   *p = &btm_cb.acl_db[0];
     UINT16       xx;
@@ -143,9 +99,13 @@
     {
         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
         {
-            if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN)))
+            if ((p->in_use) && (!memcmp (p->remote_addr, bda, BD_ADDR_LEN))
+#if BLE_INCLUDED == TRUE
+                && p->transport == transport
+#endif
+                )
             {
-                BTM_TRACE_DEBUG0 ("btm_bda_to_acl found");
+                BTM_TRACE_DEBUG ("btm_bda_to_acl found");
                 return(p);
             }
         }
@@ -168,7 +128,7 @@
 {
     tACL_CONN   *p = &btm_cb.acl_db[0];
     UINT8       xx;
-    BTM_TRACE_DEBUG0 ("btm_handle_to_acl_index");
+    BTM_TRACE_DEBUG ("btm_handle_to_acl_index");
     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
     {
         if ((p->in_use) && (p->hci_handle == hci_handle))
@@ -181,7 +141,7 @@
     return(xx);
 }
 
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
 /*******************************************************************************
 **
 ** Function         btm_ble_get_acl_remote_addr
@@ -200,7 +160,7 @@
 
     if (p_dev_rec == NULL)
     {
-        BTM_TRACE_ERROR0("btm_ble_get_acl_remote_addr can not find device with matching address");
+        BTM_TRACE_ERROR("btm_ble_get_acl_remote_addr can not find device with matching address");
         return FALSE;
     }
 
@@ -222,7 +182,7 @@
         break;
 
     default:
-        BTM_TRACE_ERROR1("Unknown active address: %d", p_dev_rec->ble.active_addr_type);
+        BTM_TRACE_ERROR("Unknown active address: %d", p_dev_rec->ble.active_addr_type);
         st = FALSE;
         break;
     }
@@ -247,26 +207,25 @@
 **
 *******************************************************************************/
 void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
-                      UINT16 hci_handle, UINT8 link_role, UINT8 is_le_link)
+                      UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport)
 {
     tBTM_SEC_DEV_REC *p_dev_rec = NULL;
     UINT8             yy;
     tACL_CONN        *p;
     UINT8             xx;
 
-    BTM_TRACE_DEBUG3 ("btm_acl_created hci_handle=%d link_role=%d  is_le_link=%d",
-                      hci_handle,link_role, is_le_link);
+    BTM_TRACE_DEBUG ("btm_acl_created hci_handle=%d link_role=%d  transport=%d",
+                      hci_handle,link_role, transport);
     /* Ensure we don't have duplicates */
-    p = btm_bda_to_acl(bda);
+    p = btm_bda_to_acl(bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         p->hci_handle = hci_handle;
         p->link_role  = link_role;
-        btm_save_remote_device_role(bda, link_role);
 #if BLE_INCLUDED == TRUE
-        p->is_le_link = is_le_link;
+        p->transport = transport;
 #endif
-        BTM_TRACE_DEBUG6 ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+        BTM_TRACE_DEBUG ("Duplicate btm_acl_created: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
         BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy);
         return;
@@ -280,18 +239,25 @@
             p->in_use            = TRUE;
             p->hci_handle        = hci_handle;
             p->link_role         = link_role;
-            btm_save_remote_device_role(bda, link_role);
             p->link_up_issued    = FALSE;
 
 #if BLE_INCLUDED == TRUE
-            p->is_le_link        = is_le_link;
-
-            if (is_le_link)
+            p->transport = transport;
+            if (transport == BT_TRANSPORT_LE)
             {
-                p->conn_addr_type = BLE_ADDR_PUBLIC;
-                BTM_GetLocalDeviceAddr(p->conn_addr);
+#if BLE_PRIVACY_SPT == TRUE
+                if (btm_cb.ble_ctr_cb.privacy)
+                {
+                    p->conn_addr_type = btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type;
+                    memcpy(p->conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
+                }
+                else
+#endif
+                {
+                    p->conn_addr_type = BLE_ADDR_PUBLIC;
+                    BTM_GetLocalDeviceAddr(p->conn_addr);
+                }
             }
-
 #endif
             p->restore_pkt_types = 0;   /* Only exists while SCO is active */
             p->switch_role_state = BTM_ACL_SWKEY_STATE_IDLE;
@@ -311,7 +277,7 @@
                 memcpy (p->remote_name, bdn, BTM_MAX_REM_BD_NAME_LEN);
 
             /* if BR/EDR do something more */
-            if (!is_le_link)
+            if (transport == BT_TRANSPORT_BR_EDR)
             {
                 btsnd_hcic_read_rmt_clk_offset (p->hci_handle);
                 btsnd_hcic_rmt_ver_req (p->hci_handle);
@@ -321,11 +287,11 @@
 #if (BLE_INCLUDED == TRUE)
             if (p_dev_rec )
             {
-                BTM_TRACE_DEBUG1 ("device_type=0x%x", p_dev_rec->device_type);
+                BTM_TRACE_DEBUG ("device_type=0x%x", p_dev_rec->device_type);
             }
 #endif
 
-            if (p_dev_rec && !is_le_link)
+            if (p_dev_rec && !(transport == BT_TRANSPORT_LE))
             {
                 /* If remote features already known, copy them and continue connection setup */
                 if ((p_dev_rec->num_read_pages) &&
@@ -353,20 +319,22 @@
 
 #if (BLE_INCLUDED == TRUE)
             /* If here, features are not known yet */
-            if (p_dev_rec && is_le_link)
+            if (p_dev_rec && transport == BT_TRANSPORT_LE)
             {
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
                 btm_ble_get_acl_remote_addr (p_dev_rec, p->active_remote_addr,
                     &p->active_remote_addr_type);
 #endif
-                btm_establish_continue(p);
 
-#if (!defined(BTA_SKIP_BLE_READ_REMOTE_FEAT) || BTA_SKIP_BLE_READ_REMOTE_FEAT == FALSE)
-                if (link_role == HCI_ROLE_MASTER)
+                if (HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(btm_cb.devcb.local_le_features)
+                    || link_role == HCI_ROLE_MASTER)
                 {
                     btsnd_hcic_ble_read_remote_feat(p->hci_handle);
                 }
-#endif
+                else
+                {
+                    btm_establish_continue(p);
+                }
             }
             else
 #endif
@@ -394,7 +362,7 @@
 void btm_acl_report_role_change (UINT8 hci_status, BD_ADDR bda)
 {
     tBTM_ROLE_SWITCH_CMPL   ref_data;
-    BTM_TRACE_DEBUG0 ("btm_acl_report_role_change");
+    BTM_TRACE_DEBUG ("btm_acl_report_role_change");
     if (btm_cb.devcb.p_switch_role_cb
         && (bda && (0 == memcmp(btm_cb.devcb.switch_role_ref_data.remote_bd_addr, bda, BD_ADDR_LEN))))
     {
@@ -417,7 +385,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void btm_acl_removed (BD_ADDR bda)
+void btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport)
 {
     tACL_CONN   *p;
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -427,8 +395,8 @@
     tBTM_SEC_DEV_REC *p_dev_rec=NULL;
 #endif
 
-    BTM_TRACE_DEBUG0 ("btm_acl_removed");
-    p = btm_bda_to_acl(bda);
+    BTM_TRACE_DEBUG ("btm_acl_removed");
+    p = btm_bda_to_acl(bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         p->in_use = FALSE;
@@ -447,54 +415,61 @@
             {
                 evt_data.event = BTM_BL_DISCN_EVT;
                 evt_data.discn.p_bda = bda;
-
+#if BLE_INCLUDED == TRUE
+                evt_data.discn.handle = p->hci_handle;
+                evt_data.discn.transport = p->transport;
+#endif
                 (*btm_cb.p_bl_changed_cb)(&evt_data);
             }
 
             btm_acl_update_busy_level (BTM_BLI_ACL_DOWN_EVT);
 #else
             if (btm_cb.p_acl_changed_cb)
+#if BLE_INCLUDED == TRUE
+                (*btm_cb.p_acl_changed_cb) (bda, NULL, NULL, NULL, FALSE, p->hci_handle, p->transport);
+#else
                 (*btm_cb.p_acl_changed_cb) (bda, NULL, NULL, NULL, FALSE);
 #endif
+#endif
         }
 
 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
 
-        BTM_TRACE_DEBUG4 ("acl hci_handle=%d is_le_link=%d connectable_mode=0x%0x link_role=%d",
+        BTM_TRACE_DEBUG ("acl hci_handle=%d transport=%d connectable_mode=0x%0x link_role=%d",
                           p->hci_handle,
-                          p->is_le_link,
+                          p->transport,
                           btm_cb.ble_ctr_cb.inq_var.connectable_mode,
                           p->link_role);
 
         p_dev_rec = btm_find_dev(bda);
         if ( p_dev_rec)
         {
-            BTM_TRACE_DEBUG1("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
-            if (p->is_le_link)
+            BTM_TRACE_DEBUG("before update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+            if (p->transport == BT_TRANSPORT_LE)
             {
-                BTM_TRACE_DEBUG0("LE link down");
-                p_dev_rec->sec_flags &= ~(BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
-                if ( (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) == 0)
+                BTM_TRACE_DEBUG("LE link down");
+                p_dev_rec->sec_flags &= ~(BTM_SEC_LE_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+                if ( (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN) == 0)
                 {
-                    BTM_TRACE_DEBUG0("Not Bonded");
-                    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHENTICATED | BTM_SEC_LINK_KEY_AUTHED);
+                    BTM_TRACE_DEBUG("Not Bonded");
+                    p_dev_rec->sec_flags &= ~(BTM_SEC_LE_LINK_KEY_AUTHED | BTM_SEC_LE_AUTHENTICATED);
                 }
                 else
                 {
-                    BTM_TRACE_DEBUG0("Bonded");
+                    BTM_TRACE_DEBUG("Bonded");
                 }
             }
             else
             {
-                BTM_TRACE_DEBUG0("Bletooth link down");
+                BTM_TRACE_DEBUG("Bletooth link down");
                 p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED
                                         | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
             }
-            BTM_TRACE_DEBUG1("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+            BTM_TRACE_DEBUG("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
         }
         else
         {
-            BTM_TRACE_ERROR0("Device not found");
+            BTM_TRACE_ERROR("Device not found");
 
         }
 #endif
@@ -518,12 +493,12 @@
 {
     tACL_CONN   *p = &btm_cb.acl_db[0];
     UINT16      xx;
-    BTM_TRACE_DEBUG0 ("btm_acl_device_down");
+    BTM_TRACE_DEBUG ("btm_acl_device_down");
     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
     {
         if (p->in_use)
         {
-            BTM_TRACE_DEBUG1 ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
+            BTM_TRACE_DEBUG ("hci_handle=%d HCI_ERR_HW_FAILURE ",p->hci_handle );
             l2c_link_hci_disc_comp (p->hci_handle, HCI_ERR_HW_FAILURE);
         }
     }
@@ -544,46 +519,47 @@
 {
     tBTM_BL_UPDATE_DATA  evt;
     UINT8 busy_level;
-    BTM_TRACE_DEBUG0 ("btm_acl_update_busy_level");
+    BTM_TRACE_DEBUG ("btm_acl_update_busy_level");
+    BOOLEAN old_inquiry_state = btm_cb.is_inquiry;
     switch (event)
     {
         case BTM_BLI_ACL_UP_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_ACL_UP_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_ACL_UP_EVT");
             btm_cb.num_acl++;
             break;
         case BTM_BLI_ACL_DOWN_EVT:
             if (btm_cb.num_acl)
             {
                 btm_cb.num_acl--;
-                BTM_TRACE_DEBUG1 ("BTM_BLI_ACL_DOWN_EVT", btm_cb.num_acl);
+                BTM_TRACE_DEBUG ("BTM_BLI_ACL_DOWN_EVT", btm_cb.num_acl);
             }
             else
             {
-                BTM_TRACE_ERROR0 ("BTM_BLI_ACL_DOWN_EVT issued, but num_acl already zero !!!");
+                BTM_TRACE_ERROR ("BTM_BLI_ACL_DOWN_EVT issued, but num_acl already zero !!!");
             }
             break;
         case BTM_BLI_PAGE_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_PAGE_EVT");
             btm_cb.is_paging = TRUE;
             evt.busy_level_flags= BTM_BL_PAGING_STARTED;
             break;
         case BTM_BLI_PAGE_DONE_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_PAGE_DONE_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_PAGE_DONE_EVT");
             btm_cb.is_paging = FALSE;
             evt.busy_level_flags = BTM_BL_PAGING_COMPLETE;
             break;
         case BTM_BLI_INQ_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_INQ_EVT");
             btm_cb.is_inquiry = TRUE;
             evt.busy_level_flags = BTM_BL_INQUIRY_STARTED;
             break;
         case BTM_BLI_INQ_CANCEL_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_CANCEL_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_INQ_CANCEL_EVT");
             btm_cb.is_inquiry = FALSE;
             evt.busy_level_flags = BTM_BL_INQUIRY_CANCELLED;
             break;
         case BTM_BLI_INQ_DONE_EVT:
-            BTM_TRACE_DEBUG0 ("BTM_BLI_INQ_DONE_EVT");
+            BTM_TRACE_DEBUG ("BTM_BLI_INQ_DONE_EVT");
             btm_cb.is_inquiry = FALSE;
             evt.busy_level_flags = BTM_BL_INQUIRY_COMPLETE;
             break;
@@ -594,7 +570,7 @@
     else
         busy_level = (UINT8)btm_cb.num_acl;
 
-    if (busy_level != btm_cb.busy_level)
+    if ((busy_level != btm_cb.busy_level) ||(old_inquiry_state != btm_cb.is_inquiry))
     {
         evt.event         = BTM_BL_UPDATE_EVT;
         evt.busy_level    = busy_level;
@@ -622,8 +598,8 @@
 tBTM_STATUS BTM_GetRole (BD_ADDR remote_bd_addr, UINT8 *p_role)
 {
     tACL_CONN   *p;
-    BTM_TRACE_DEBUG0 ("BTM_GetRole");
-    if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+    BTM_TRACE_DEBUG ("BTM_GetRole");
+    if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
         *p_role = BTM_ROLE_UNDEFINED;
         return(BTM_UNKNOWN_ADDR);
@@ -667,7 +643,7 @@
 #if (BT_USE_TRACES == TRUE)
     BD_ADDR_PTR  p_bda;
 #endif
-    BTM_TRACE_API6 ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+    BTM_TRACE_API ("BTM_SwitchRole BDA: %02x-%02x-%02x-%02x-%02x-%02x",
                     remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2],
                     remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]);
 
@@ -679,14 +655,14 @@
     {
 #if (BT_USE_TRACES == TRUE)
         p_bda = btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
-        BTM_TRACE_DEBUG6 ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
+        BTM_TRACE_DEBUG ("Role switch on other device is in progress 0x%02x%02x%02x%02x%02x%02x",
                           p_bda[0], p_bda[1], p_bda[2],
                           p_bda[3], p_bda[4], p_bda[5]);
 #endif
         return(BTM_BUSY);
     }
 
-    if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+    if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
         return(BTM_UNKNOWN_ADDR);
 
     /* Finished if already in desired role */
@@ -704,7 +680,7 @@
     /* Ignore role switch request if the previous request was not completed */
     if (p->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
     {
-        BTM_TRACE_DEBUG1 ("BTM_SwitchRole busy: %d",
+        BTM_TRACE_DEBUG ("BTM_SwitchRole busy: %d",
                           p->switch_role_state);
         return(BTM_BUSY);
     }
@@ -810,14 +786,14 @@
     tBTM_PM_MODE pwr_mode;
     tBTM_PM_PWR_MD settings;
 #endif
-    BTM_TRACE_DEBUG0 ("BTM_ChangeLinkKey");
-    if ((p = btm_bda_to_acl(remote_bd_addr)) == NULL)
+    BTM_TRACE_DEBUG ("BTM_ChangeLinkKey");
+    if ((p = btm_bda_to_acl(remote_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
         return(BTM_UNKNOWN_ADDR);
 
     /* Ignore change link key request if the previsous request has not completed */
     if (p->change_key_state != BTM_ACL_SWKEY_STATE_IDLE)
     {
-        BTM_TRACE_DEBUG0 ("Link key change request declined since the previous request"
+        BTM_TRACE_DEBUG ("Link key change request declined since the previous request"
                           " for this device has not completed ");
         return(BTM_BUSY);
     }
@@ -894,7 +870,7 @@
     tBTM_CHANGE_KEY_CMPL *p_data;
     tACL_CONN            *p;
     UINT8                xx;
-    BTM_TRACE_DEBUG0 ("btm_acl_link_key_change");
+    BTM_TRACE_DEBUG ("btm_acl_link_key_change");
     /* Look up the connection by handle and set the current mode */
     xx = btm_handle_to_acl_index(handle);
 
@@ -941,7 +917,7 @@
         btm_cb.devcb.p_chg_link_key_cb = NULL;
     }
 
-    BTM_TRACE_ERROR2("Change Link Key Complete Event: Handle 0x%02x, HCI Status 0x%02x",
+    BTM_TRACE_ERROR("Change Link Key Complete Event: Handle 0x%02x, HCI Status 0x%02x",
                      handle, p_data->hci_status);
 }
 
@@ -966,7 +942,7 @@
     tBTM_BL_ROLE_CHG_DATA   evt;
 #endif
 
-    BTM_TRACE_DEBUG3 ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
+    BTM_TRACE_DEBUG ("btm_acl_encrypt_change handle=%d status=%d encr_enabl=%d",
                       handle, status, encr_enable);
     xx = btm_handle_to_acl_index(handle);
     /* don't assume that we can never get a bad hci_handle */
@@ -1022,7 +998,7 @@
             evt.hci_status  = btm_cb.devcb.switch_role_ref_data.hci_status;
             (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
 
-            BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
+            BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
                              evt.new_role, evt.hci_status, p->switch_role_state);
         }
 #endif
@@ -1033,10 +1009,10 @@
         {
             if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
             {
-                BTM_TRACE_WARNING0("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
+                BTM_TRACE_WARNING("btm_acl_encrypt_change -> Issuing delayed HCI_Disconnect!!!");
                 btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
             }
-            BTM_TRACE_ERROR2("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
+            BTM_TRACE_ERROR("btm_acl_encrypt_change: tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
                 (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
             p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
         }
@@ -1095,8 +1071,8 @@
 {
     tACL_CONN   *p;
     UINT8       *localFeatures = BTM_ReadLocalFeatures();
-    BTM_TRACE_DEBUG0 ("BTM_SetLinkPolicy");
-/*    BTM_TRACE_API1 ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
+    BTM_TRACE_DEBUG ("BTM_SetLinkPolicy");
+/*    BTM_TRACE_API ("BTM_SetLinkPolicy: requested settings: 0x%04x", *settings ); */
 
     /* First, check if hold mode is supported */
     if (*settings != HCI_DISABLE_ALL_LM_MODES)
@@ -1104,28 +1080,27 @@
         if ( (*settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)) )
         {
             *settings &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH);
-            BTM_TRACE_API1 ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
+            BTM_TRACE_API ("BTM_SetLinkPolicy switch not supported (settings: 0x%04x)", *settings );
         }
         if ( (*settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)) )
         {
             *settings &= (~HCI_ENABLE_HOLD_MODE);
-            BTM_TRACE_API1 ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
+            BTM_TRACE_API ("BTM_SetLinkPolicy hold not supported (settings: 0x%04x)", *settings );
         }
         if ( (*settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)) )
         {
             *settings &= (~HCI_ENABLE_SNIFF_MODE);
-            BTM_TRACE_API1 ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
+            BTM_TRACE_API ("BTM_SetLinkPolicy sniff not supported (settings: 0x%04x)", *settings );
         }
         if ( (*settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)) )
         {
             *settings &= (~HCI_ENABLE_PARK_MODE);
-            BTM_TRACE_API1 ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
+            BTM_TRACE_API ("BTM_SetLinkPolicy park not supported (settings: 0x%04x)", *settings );
         }
     }
 
-    if ((p = btm_bda_to_acl(remote_bda)) != NULL)
-        return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ?
-                                                BTM_CMD_STARTED : BTM_NO_RESOURCES);
+    if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
+        return(btsnd_hcic_write_policy_set (p->hci_handle, *settings) ? BTM_CMD_STARTED : BTM_NO_RESOURCES);
 
     /* If here, no BD Addr found */
     return(BTM_UNKNOWN_ADDR);
@@ -1145,29 +1120,29 @@
 {
     UINT8 *localFeatures = BTM_ReadLocalFeatures();
 
-    BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
+    BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x", settings);
 
     if((settings & HCI_ENABLE_MASTER_SLAVE_SWITCH) && (!HCI_SWITCH_SUPPORTED(localFeatures)))
     {
         settings &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
-        BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
+        BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy switch not supported (settings: 0x%04x)", settings);
     }
     if ((settings & HCI_ENABLE_HOLD_MODE) && (!HCI_HOLD_MODE_SUPPORTED(localFeatures)))
     {
         settings &= ~HCI_ENABLE_HOLD_MODE;
-        BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
+        BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy hold not supported (settings: 0x%04x)", settings);
     }
     if ((settings & HCI_ENABLE_SNIFF_MODE) && (!HCI_SNIFF_MODE_SUPPORTED(localFeatures)))
     {
         settings &= ~HCI_ENABLE_SNIFF_MODE;
-        BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
+        BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy sniff not supported (settings: 0x%04x)", settings);
     }
     if ((settings & HCI_ENABLE_PARK_MODE) && (!HCI_PARK_MODE_SUPPORTED(localFeatures)))
     {
         settings &= ~HCI_ENABLE_PARK_MODE;
-        BTM_TRACE_DEBUG1("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
+        BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy park not supported (settings: 0x%04x)", settings);
     }
-    BTM_TRACE_DEBUG1("Set DefaultLinkPolicy:0x%04x", settings);
+    BTM_TRACE_DEBUG("Set DefaultLinkPolicy:0x%04x", settings);
 
     btm_cb.btm_def_link_policy = settings;
 
@@ -1191,7 +1166,7 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_API6 ("BTM_ReadLinkPolicy: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_ReadLinkPolicy: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
@@ -1199,7 +1174,7 @@
     if (btm_cb.devcb.p_rlinkp_cmpl_cb)
         return(BTM_BUSY);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         btu_start_timer (&btm_cb.devcb.rlinkp_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
@@ -1237,7 +1212,7 @@
     UINT16                   handle;
     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
     UINT16                   index;
-    BTM_TRACE_DEBUG0 ("btm_read_link_policy_complete");
+    BTM_TRACE_DEBUG ("btm_read_link_policy_complete");
     btu_stop_timer (&btm_cb.devcb.rlinkp_timer);
 
     /* If there was a callback address for read local version, call it */
@@ -1289,7 +1264,7 @@
     UINT8             status;
     UINT16            handle;
     int               xx;
-    BTM_TRACE_DEBUG0 ("btm_read_remote_version_complete");
+    BTM_TRACE_DEBUG ("btm_read_remote_version_complete");
     STREAM_TO_UINT8  (status, p);
     if (status == HCI_SUCCESS)
     {
@@ -1326,7 +1301,7 @@
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_handle (handle);
     UINT8               page_idx;
 
-    BTM_TRACE_DEBUG0 ("btm_process_remote_ext_features");
+    BTM_TRACE_DEBUG ("btm_process_remote_ext_features");
 
     /* Make sure we have the record to save remote features information */
     if (p_dev_rec == NULL)
@@ -1400,7 +1375,7 @@
             p_dev_rec->sm4 = BTM_SM4_KNOWN;
         }
 
-        BTM_TRACE_API4 ("ext_features_complt page_num:%d f[0]:x%02x, sm4:%x, pend:%d",
+        BTM_TRACE_API ("ext_features_complt page_num:%d f[0]:x%02x, sm4:%x, pend:%d",
                         HCI_EXT_FEATURES_PAGE_1, *(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_1]),
                         p_dev_rec->sm4, req_pend);
 
@@ -1415,7 +1390,7 @@
         break;
 
     default:
-        BTM_TRACE_ERROR1("btm_process_remote_ext_features_page page=%d unexpected", page_idx);
+        BTM_TRACE_ERROR("btm_process_remote_ext_features_page page=%d unexpected", page_idx);
         break;
     }
 }
@@ -1436,11 +1411,11 @@
     UINT8       acl_idx;
     tACL_CONN   *p_acl_cb;
 
-    BTM_TRACE_DEBUG1("btm_read_remote_features() handle: %d", handle);
+    BTM_TRACE_DEBUG("btm_read_remote_features() handle: %d", handle);
 
     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
     {
-        BTM_TRACE_ERROR1("btm_read_remote_features handle=%d invalid", handle);
+        BTM_TRACE_ERROR("btm_read_remote_features handle=%d invalid", handle);
         return;
     }
 
@@ -1465,7 +1440,7 @@
 *******************************************************************************/
 void btm_read_remote_ext_features (UINT16 handle, UINT8 page_number)
 {
-    BTM_TRACE_DEBUG2("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
+    BTM_TRACE_DEBUG("btm_read_remote_ext_features() handle: %d page: %d", handle, page_number);
 
     btsnd_hcic_rmt_ext_features(handle, page_number);
 }
@@ -1488,12 +1463,12 @@
     UINT16            handle;
     UINT8            acl_idx;
 
-    BTM_TRACE_DEBUG0 ("btm_read_remote_features_complete");
+    BTM_TRACE_DEBUG ("btm_read_remote_features_complete");
     STREAM_TO_UINT8  (status, p);
 
     if (status != HCI_SUCCESS)
     {
-        BTM_TRACE_ERROR1 ("btm_read_remote_features_complete failed (status 0x%02x)", status);
+        BTM_TRACE_ERROR ("btm_read_remote_features_complete failed (status 0x%02x)", status);
         return;
     }
 
@@ -1501,7 +1476,7 @@
 
     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
         {
-        BTM_TRACE_ERROR1("btm_read_remote_features_complete handle=%d invalid", handle);
+        BTM_TRACE_ERROR("btm_read_remote_features_complete handle=%d invalid", handle);
         return;
                 }
 
@@ -1517,7 +1492,7 @@
         /* if the remote controller has extended features and local controller supports
         ** HCI_Read_Remote_Extended_Features command then start reading these feature starting
         ** with extended features page 1 */
-        BTM_TRACE_DEBUG0 ("Start reading remote extended features");
+        BTM_TRACE_DEBUG ("Start reading remote extended features");
         btm_read_remote_ext_features(handle, HCI_EXT_FEATURES_PAGE_1);
         return;
     }
@@ -1547,7 +1522,7 @@
     UINT16      handle;
     UINT8       acl_idx;
 
-    BTM_TRACE_DEBUG0 ("btm_read_remote_ext_features_complete");
+    BTM_TRACE_DEBUG ("btm_read_remote_ext_features_complete");
 
     STREAM_TO_UINT8  (status, p);
     STREAM_TO_UINT16 (handle, p);
@@ -1557,13 +1532,13 @@
     /* Validate parameters */
     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
     {
-        BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete handle=%d invalid", handle);
+        BTM_TRACE_ERROR("btm_read_remote_ext_features_complete handle=%d invalid", handle);
         return;
     }
 
     if (max_page > HCI_EXT_FEATURES_PAGE_MAX)
     {
-        BTM_TRACE_ERROR1("btm_read_remote_ext_features_complete page=%d unknown", max_page);
+        BTM_TRACE_ERROR("btm_read_remote_ext_features_complete page=%d unknown", max_page);
         return;
     }
 
@@ -1577,13 +1552,13 @@
     if ((page_num < max_page) && (page_num < HCI_EXT_FEATURES_PAGE_MAX))
     {
         page_num++;
-        BTM_TRACE_DEBUG1("BTM reads next remote extended features page (%d)", page_num);
+        BTM_TRACE_DEBUG("BTM reads next remote extended features page (%d)", page_num);
         btm_read_remote_ext_features (handle, page_num);
         return;
     }
 
     /* Reading of remote feature pages is complete */
-    BTM_TRACE_DEBUG1("BTM reached last remote extended features page (%d)", page_num);
+    BTM_TRACE_DEBUG("BTM reached last remote extended features page (%d)", page_num);
 
     /* Process the pages */
     btm_process_remote_ext_features (p_acl_cb, (UINT8) (page_num + 1));
@@ -1607,12 +1582,12 @@
     tACL_CONN   *p_acl_cb;
     UINT8       acl_idx;
 
-    BTM_TRACE_WARNING2 ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
+    BTM_TRACE_WARNING ("btm_read_remote_ext_features_failed (status 0x%02x) for handle %d",
                          status, handle);
 
     if ((acl_idx = btm_handle_to_acl_index(handle)) >= MAX_L2CAP_LINKS)
     {
-        BTM_TRACE_ERROR1("btm_read_remote_ext_features_failed handle=%d invalid", handle);
+        BTM_TRACE_ERROR("btm_read_remote_ext_features_failed handle=%d invalid", handle);
         return;
     }
 
@@ -1635,50 +1610,65 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void btm_establish_continue (tACL_CONN *p_acl_cb)
+void btm_establish_continue (tACL_CONN *p_acl_cb)
 {
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
-    tBTM_BL_EVENT_DATA  evt_data;
+        tBTM_BL_EVENT_DATA  evt_data;
 #endif
-    BTM_TRACE_DEBUG0 ("btm_establish_continue");
+        BTM_TRACE_DEBUG ("btm_establish_continue");
 #if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
-    if (!p_acl_cb->is_le_link)
+        if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR)
 #endif
-    {
-        /* For now there are a some devices that do not like sending */
-        /* commands events and data at the same time. */
-        /* Set the packet types to the default allowed by the device */
-        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
+        {
+            /* For now there are a some devices that do not like sending */
+            /* commands events and data at the same time. */
+            /* Set the packet types to the default allowed by the device */
+            btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
 
-        if (btm_cb.btm_def_link_policy)
-            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
-    }
+            if (btm_cb.btm_def_link_policy)
+                BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
+        }
 #endif
-    p_acl_cb->link_up_issued = TRUE;
+        p_acl_cb->link_up_issued = TRUE;
 
-    /* If anyone cares, tell him database changed */
+        /* If anyone cares, tell him database changed */
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
-    if (btm_cb.p_bl_changed_cb)
-    {
-        evt_data.event = BTM_BL_CONN_EVT;
-        evt_data.conn.p_bda = p_acl_cb->remote_addr;
-        evt_data.conn.p_bdn = p_acl_cb->remote_name;
-        evt_data.conn.p_dc  = p_acl_cb->remote_dc;
-        evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
-
-
-        (*btm_cb.p_bl_changed_cb)(&evt_data);
-    }
-    btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
-#else
-    if (btm_cb.p_acl_changed_cb)
-        (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
-                                    p_acl_cb->remote_dc,
-                                    p_acl_cb->remote_name,
-                                    p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
-                                    TRUE);
+        if (btm_cb.p_bl_changed_cb)
+        {
+            evt_data.event = BTM_BL_CONN_EVT;
+            evt_data.conn.p_bda = p_acl_cb->remote_addr;
+            evt_data.conn.p_bdn = p_acl_cb->remote_name;
+            evt_data.conn.p_dc  = p_acl_cb->remote_dc;
+            evt_data.conn.p_features = p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0];
+#if BLE_INCLUDED == TRUE
+            evt_data.conn.handle = p_acl_cb->hci_handle;
+            evt_data.conn.transport = p_acl_cb->transport;
 #endif
+
+            (*btm_cb.p_bl_changed_cb)(&evt_data);
+        }
+        btm_acl_update_busy_level (BTM_BLI_ACL_UP_EVT);
+#else
+        if (btm_cb.p_acl_changed_cb)
+#if BLE_INCLUDED == TRUE
+            (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
+                                        p_acl_cb->remote_dc,
+                                        p_acl_cb->remote_name,
+                                        p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
+                                        TRUE,
+                                        p_acl_cb->hci_handle,
+                                        p_acl_cb->transport);
+#else
+            (*btm_cb.p_acl_changed_cb) (p_acl_cb->remote_addr,
+                                        p_acl_cb->remote_dc,
+                                        p_acl_cb->remote_name,
+                                        p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0],
+                                        TRUE);
+#endif
+
+#endif
+
 }
 
 
@@ -1694,7 +1684,7 @@
 *******************************************************************************/
 void BTM_SetDefaultLinkSuperTout (UINT16 timeout)
 {
-    BTM_TRACE_DEBUG0 ("BTM_SetDefaultLinkSuperTout");
+    BTM_TRACE_DEBUG ("BTM_SetDefaultLinkSuperTout");
     btm_cb.btm_def_link_super_tout = timeout;
 }
 
@@ -1709,9 +1699,9 @@
 *******************************************************************************/
 tBTM_STATUS BTM_GetLinkSuperTout (BD_ADDR remote_bda, UINT16 *p_timeout)
 {
-    tACL_CONN   *p = btm_bda_to_acl(remote_bda);
+    tACL_CONN   *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
 
-    BTM_TRACE_DEBUG0 ("BTM_GetLinkSuperTout");
+    BTM_TRACE_DEBUG ("BTM_GetLinkSuperTout");
     if (p != (tACL_CONN *)NULL)
     {
         *p_timeout = p->link_super_tout;
@@ -1733,9 +1723,9 @@
 *******************************************************************************/
 tBTM_STATUS BTM_SetLinkSuperTout (BD_ADDR remote_bda, UINT16 timeout)
 {
-    tACL_CONN   *p = btm_bda_to_acl(remote_bda);
+    tACL_CONN   *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
 
-    BTM_TRACE_DEBUG0 ("BTM_SetLinkSuperTout");
+    BTM_TRACE_DEBUG ("BTM_SetLinkSuperTout");
     if (p != (tACL_CONN *)NULL)
     {
         p->link_super_tout = timeout;
@@ -1768,7 +1758,7 @@
 *******************************************************************************/
 void BTM_RegForLstoEvt (tBTM_LSTO_CBACK *p_cback)
 {
-    BTM_TRACE_DEBUG0 ("BTM_RegForLstoEvt");
+    BTM_TRACE_DEBUG ("BTM_RegForLstoEvt");
     btm_cb.p_lsto_cback = p_cback;
 }
 
@@ -1785,7 +1775,7 @@
 {
     UINT8 xx;
 
-    BTM_TRACE_DEBUG0 ("btm_proc_lsto_evt");
+    BTM_TRACE_DEBUG ("btm_proc_lsto_evt");
     if (btm_cb.p_lsto_cback)
     {
         /* Look up the connection by handle and set the current mode */
@@ -1815,12 +1805,12 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_DEBUG0 ("BTM_SetHoldMode");
+    BTM_TRACE_DEBUG ("BTM_SetHoldMode");
     /* First, check if hold mode is supported */
     if (!HCI_HOLD_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
         return(BTM_MODE_UNSUPPORTED);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         /* If the connection is in park or sniff mode, forget about holding it */
@@ -1853,12 +1843,12 @@
                               UINT16 attempt, UINT16 timeout)
 {
     tACL_CONN   *p;
-    BTM_TRACE_DEBUG0 ("BTM_SetSniffMode");
+    BTM_TRACE_DEBUG ("BTM_SetSniffMode");
     /* First, check if sniff mode is supported */
     if (!HCI_SNIFF_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
         return(BTM_MODE_UNSUPPORTED);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         /* If the connection is in park mode, forget about sniffing it */
@@ -1892,8 +1882,8 @@
 *******************************************************************************/
 tBTM_STATUS BTM_CancelSniffMode (BD_ADDR remote_bda)
 {
-    tACL_CONN   *p = btm_bda_to_acl(remote_bda);
-    BTM_TRACE_DEBUG0 ("BTM_CancelSniffMode ");
+    tACL_CONN   *p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_CancelSniffMode ");
     if (p == (tACL_CONN *)NULL)
         return(BTM_UNKNOWN_ADDR);
 
@@ -1923,12 +1913,12 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_DEBUG0 ("BTM_SetParkMode");
+    BTM_TRACE_DEBUG ("BTM_SetParkMode");
     /* First, check if park mode is supported */
     if (!HCI_PARK_MODE_SUPPORTED(BTM_ReadLocalFeatures()))
         return(BTM_MODE_UNSUPPORTED);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         /* If the connection is in sniff mode, forget about parking it */
@@ -1965,8 +1955,8 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_DEBUG0 ("BTM_CancelParkMode");
-    p = btm_bda_to_acl(remote_bda);
+    BTM_TRACE_DEBUG ("BTM_CancelParkMode");
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         /* If the connection is not in park mode, cannot cancel */
@@ -1998,9 +1988,9 @@
 tBTM_STATUS BTM_SetPacketTypes (BD_ADDR remote_bda, UINT16 pkt_types)
 {
     tACL_CONN   *p;
-    BTM_TRACE_DEBUG0 ("BTM_SetPacketTypes");
+    BTM_TRACE_DEBUG ("BTM_SetPacketTypes");
 
-    if ((p = btm_bda_to_acl(remote_bda)) != NULL)
+    if ((p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
         return(btm_set_packet_types (p, pkt_types));
 
     /* If here, no BD Addr found */
@@ -2022,8 +2012,8 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_DEBUG0 ("BTM_ReadPacketTypes");
-    p = btm_bda_to_acl(remote_bda);
+    BTM_TRACE_DEBUG ("BTM_ReadPacketTypes");
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         return(p->pkt_types_mask);
@@ -2059,11 +2049,11 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_API6 ("BTM_ReadAclMode: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_ReadAclMode: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         *p_mode = p->mode;
@@ -2091,11 +2081,11 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_API6 ("BTM_ReadClockOffset: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_ReadClockOffset: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
-    if ( (p = btm_bda_to_acl(remote_bda)) != NULL)
+    if ( (p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR)) != NULL)
         return(p->clock_offset);
 
     /* If here, no BD Addr found */
@@ -2112,15 +2102,15 @@
 ** Returns          TRUE if connection is up, else FALSE.
 **
 *******************************************************************************/
-BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda)
+BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport)
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_API6 ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_IsAclConnectionUp: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         return(TRUE);
@@ -2147,7 +2137,7 @@
 #else
     tACL_CONN   *p = &btm_cb.acl_db[0];
     UINT16      xx, yy;
-    BTM_TRACE_DEBUG0 ("BTM_GetNumAclLinks");
+    BTM_TRACE_DEBUG ("BTM_GetNumAclLinks");
     for (xx = yy = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
     {
         if (p->in_use)
@@ -2160,6 +2150,34 @@
 
 /*******************************************************************************
 **
+** Function         BTM_GetNumLeLinks
+**
+** Description      This function is called to count the number of
+**                   LE ACL links that are active.
+**
+** Returns          UINT16  Number of active LE links
+**
+*******************************************************************************/
+UINT16 BTM_GetNumLeLinks (void)
+{
+    UINT16 yy = 0;
+
+#if BLE_INCLUDED == TRUE
+    tACL_CONN   *p = &btm_cb.acl_db[0];
+    UINT16      xx;
+    BTM_TRACE_DEBUG ("BTM_GetNumLeLinks");
+    for (xx = yy = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
+    {
+        if  ((p->in_use) &&(p->transport == BT_TRANSPORT_LE))
+            yy++;
+    }
+#endif
+
+    return(yy);
+}
+
+/*******************************************************************************
+**
 ** Function         btm_get_acl_disc_reason_code
 **
 ** Description      This function is called to get the disconnection reason code
@@ -2171,7 +2189,7 @@
 UINT16 btm_get_acl_disc_reason_code (void)
 {
     UINT8 res = btm_cb.acl_disc_reason;
-    BTM_TRACE_DEBUG0 ("btm_get_acl_disc_reason_code");
+    BTM_TRACE_DEBUG ("btm_get_acl_disc_reason_code");
     return(res);
 }
 
@@ -2186,11 +2204,11 @@
 ** Returns          the handle of the connection, or 0xFFFF if none.
 **
 *******************************************************************************/
-UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda)
+UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport)
 {
     tACL_CONN   *p;
-    BTM_TRACE_DEBUG0 ("BTM_GetHCIConnHandle");
-    p = btm_bda_to_acl(remote_bda);
+    BTM_TRACE_DEBUG ("BTM_GetHCIConnHandle");
+    p = btm_bda_to_acl(remote_bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         return(p->hci_handle);
@@ -2219,10 +2237,10 @@
 {
     tACL_CONN        *p;
     UINT8             xx;
-    BTM_TRACE_DEBUG0 ("btm_process_mode_change");
+    BTM_TRACE_DEBUG ("btm_process_mode_change");
     if (hci_status != HCI_SUCCESS)
     {
-        BTM_TRACE_WARNING1 ("BTM: HCI Mode Change Error Status: 0x%02x", hci_status);
+        BTM_TRACE_WARNING ("BTM: HCI Mode Change Error Status: 0x%02x", hci_status);
     }
 
     /* Look up the connection by handle and set the current mode */
@@ -2258,7 +2276,7 @@
 void btm_process_clk_off_comp_evt (UINT16 hci_handle, UINT16 clock_offset)
 {
     UINT8      xx;
-    BTM_TRACE_DEBUG0 ("btm_process_clk_off_comp_evt");
+    BTM_TRACE_DEBUG ("btm_process_clk_off_comp_evt");
     /* Look up the connection by handle and set the current mode */
     if ((xx = btm_handle_to_acl_index(hci_handle)) < MAX_L2CAP_LINKS)
         btm_cb.acl_db[xx].clock_offset = clock_offset;
@@ -2280,14 +2298,14 @@
 {
     UINT8                   *p_bda = (bd_addr) ? bd_addr :
                                         btm_cb.devcb.switch_role_ref_data.remote_bd_addr;
-    tACL_CONN               *p = btm_bda_to_acl(p_bda);
+    tACL_CONN               *p = btm_bda_to_acl(p_bda, BT_TRANSPORT_BR_EDR);
     tBTM_ROLE_SWITCH_CMPL   *p_data = &btm_cb.devcb.switch_role_ref_data;
     tBTM_SEC_DEV_REC        *p_dev_rec;
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
     tBTM_BL_ROLE_CHG_DATA   evt;
 #endif
 
-    BTM_TRACE_DEBUG0 ("btm_acl_role_changed");
+    BTM_TRACE_DEBUG ("btm_acl_role_changed");
     /* Ignore any stray events */
     if (p == NULL)
     {
@@ -2306,7 +2324,7 @@
 
         /* Update cached value */
         p->link_role = new_role;
-        btm_save_remote_device_role(p_bda, new_role);
+
         /* Reload LSTO: link supervision timeout is reset in the LM after a role switch */
         if (new_role == BTM_ROLE_MASTER)
         {
@@ -2365,7 +2383,7 @@
         (*btm_cb.p_bl_changed_cb)((tBTM_BL_EVENT_DATA *)&evt);
     }
 
-    BTM_TRACE_DEBUG3("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
+    BTM_TRACE_DEBUG("Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d",
                      p_data->role, p_data->hci_status, p->switch_role_state);
 #endif
 
@@ -2375,10 +2393,10 @@
     {
         if (p_dev_rec->rs_disc_pending == BTM_SEC_DISC_PENDING)
         {
-            BTM_TRACE_WARNING0("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
+            BTM_TRACE_WARNING("btm_acl_role_changed -> Issuing delayed HCI_Disconnect!!!");
             btsnd_hcic_disconnect(p_dev_rec->hci_handle, HCI_ERR_PEER_USER);
         }
-        BTM_TRACE_ERROR2("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
+        BTM_TRACE_ERROR("tBTM_SEC_DEV:0x%x rs_disc_pending=%d",
                          (UINT32)p_dev_rec, p_dev_rec->rs_disc_pending);
         p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
     }
@@ -2401,7 +2419,7 @@
 UINT8 BTM_AllocateSCN(void)
 {
     UINT8   x;
-    BTM_TRACE_DEBUG0 ("BTM_AllocateSCN");
+    BTM_TRACE_DEBUG ("BTM_AllocateSCN");
 
     // stack reserves scn 1 for HFP, HSP we still do the correct way
     for (x = 1; x < BTM_MAX_SCN; x++)
@@ -2457,7 +2475,7 @@
 *******************************************************************************/
 BOOLEAN BTM_FreeSCN(UINT8 scn)
 {
-    BTM_TRACE_DEBUG0 ("BTM_FreeSCN ");
+    BTM_TRACE_DEBUG ("BTM_FreeSCN ");
     if (scn <= BTM_MAX_SCN)
     {
         btm_cb.btm_scn[scn-1] = FALSE;
@@ -2496,7 +2514,7 @@
 {
     UINT32 timer_type = p_tle->param;
 
-    BTM_TRACE_DEBUG0 ("btm_acl_timeout");
+    BTM_TRACE_DEBUG ("btm_acl_timeout");
     if (timer_type == TT_DEV_RLNKP)
     {
         tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb;
@@ -2526,7 +2544,7 @@
 tBTM_STATUS btm_set_packet_types (tACL_CONN *p, UINT16 pkt_types)
 {
     UINT16 temp_pkt_types;
-    BTM_TRACE_DEBUG0 ("btm_set_packet_types");
+    BTM_TRACE_DEBUG ("btm_set_packet_types");
     /* Save in the ACL control blocks, types that we support */
     temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK &
                       btm_cb.btm_acl_pkt_types_supported);
@@ -2545,7 +2563,7 @@
     /* Exclude packet types not supported by the peer */
     btm_acl_chk_peer_pkt_type_support (p, &temp_pkt_types);
 
-    BTM_TRACE_DEBUG1 ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
+    BTM_TRACE_DEBUG ("SetPacketType Mask -> 0x%04x", temp_pkt_types);
 
     if (!btsnd_hcic_change_conn_type (p->hci_handle, temp_pkt_types))
     {
@@ -2567,10 +2585,10 @@
 *******************************************************************************/
 UINT16 btm_get_max_packet_size (BD_ADDR addr)
 {
-    tACL_CONN   *p = btm_bda_to_acl(addr);
+    tACL_CONN   *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
     UINT16      pkt_types = 0;
     UINT16      pkt_size = 0;
-    BTM_TRACE_DEBUG0 ("btm_get_max_packet_size");
+    BTM_TRACE_DEBUG ("btm_get_max_packet_size");
     if (p != NULL)
     {
         pkt_types = p->pkt_types_mask;
@@ -2625,8 +2643,8 @@
 tBTM_STATUS BTM_ReadRemoteVersion (BD_ADDR addr, UINT8 *lmp_version,
                                    UINT16 *manufacturer, UINT16 *lmp_sub_version)
 {
-    tACL_CONN        *p = btm_bda_to_acl(addr);
-    BTM_TRACE_DEBUG0 ("BTM_ReadRemoteVersion");
+    tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_ReadRemoteVersion");
     if (p == NULL)
         return(BTM_UNKNOWN_ADDR);
 
@@ -2651,8 +2669,8 @@
 *******************************************************************************/
 UINT8 *BTM_ReadRemoteFeatures (BD_ADDR addr)
 {
-    tACL_CONN        *p = btm_bda_to_acl(addr);
-    BTM_TRACE_DEBUG0 ("BTM_ReadRemoteFeatures");
+    tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_ReadRemoteFeatures");
     if (p == NULL)
     {
         return(NULL);
@@ -2671,8 +2689,8 @@
 *******************************************************************************/
 UINT8 *BTM_ReadRemoteExtendedFeatures (BD_ADDR addr, UINT8 page_number)
 {
-    tACL_CONN        *p = btm_bda_to_acl(addr);
-    BTM_TRACE_DEBUG0 ("BTM_ReadRemoteExtendedFeatures");
+    tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_ReadRemoteExtendedFeatures");
     if (p == NULL)
     {
         return(NULL);
@@ -2680,7 +2698,7 @@
 
     if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
     {
-        BTM_TRACE_ERROR1("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
+        BTM_TRACE_ERROR("Warning: BTM_ReadRemoteExtendedFeatures page %d unknown", page_number);
         return NULL;
     }
 
@@ -2696,8 +2714,8 @@
 *******************************************************************************/
 UINT8 BTM_ReadNumberRemoteFeaturesPages (BD_ADDR addr)
 {
-    tACL_CONN        *p = btm_bda_to_acl(addr);
-    BTM_TRACE_DEBUG0 ("BTM_ReadNumberRemoteFeaturesPages");
+    tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_ReadNumberRemoteFeaturesPages");
     if (p == NULL)
     {
         return(0);
@@ -2715,8 +2733,8 @@
 *******************************************************************************/
 UINT8 *BTM_ReadAllRemoteFeatures (BD_ADDR addr)
 {
-    tACL_CONN        *p = btm_bda_to_acl(addr);
-    BTM_TRACE_DEBUG0 ("BTM_ReadAllRemoteFeatures");
+    tACL_CONN        *p = btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
+    BTM_TRACE_DEBUG ("BTM_ReadAllRemoteFeatures");
     if (p == NULL)
     {
         return(NULL);
@@ -2739,7 +2757,7 @@
 tBTM_STATUS BTM_RegBusyLevelNotif (tBTM_BL_CHANGE_CB *p_cb, UINT8 *p_level,
                                    tBTM_BL_EVENT_MASK evt_mask)
 {
-    BTM_TRACE_DEBUG0 ("BTM_RegBusyLevelNotif");
+    BTM_TRACE_DEBUG ("BTM_RegBusyLevelNotif");
     if (p_level)
         *p_level = btm_cb.busy_level;
 
@@ -2765,7 +2783,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_AclRegisterForChanges (tBTM_ACL_DB_CHANGE_CB *p_cb)
 {
-    BTM_TRACE_DEBUG0 ("BTM_AclRegisterForChanges");
+    BTM_TRACE_DEBUG ("BTM_AclRegisterForChanges");
     if (!p_cb)
         btm_cb.p_acl_changed_cb = NULL;
     else if (btm_cb.p_acl_changed_cb)
@@ -2790,7 +2808,7 @@
 {
     tACL_CONN   *p = &btm_cb.acl_db[0];
 
-    BTM_TRACE_API6 ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_SetQoS: BdAddr: %02x%02x%02x%02x%02x%02x",
                     bd[0], bd[1], bd[2],
                     bd[3], bd[4], bd[5]);
 
@@ -2798,7 +2816,7 @@
     if (btm_cb.devcb.p_qossu_cmpl_cb)
         return(BTM_BUSY);
 
-    if ( (p = btm_bda_to_acl(bd)) != NULL)
+    if ( (p = btm_bda_to_acl(bd, BT_TRANSPORT_BR_EDR)) != NULL)
     {
         btu_start_timer (&btm_cb.devcb.qossu_timer, BTU_TTYPE_BTM_ACL, BTM_DEV_REPLY_TIMEOUT);
         btm_cb.devcb.p_qossu_cmpl_cb = p_cb;
@@ -2833,7 +2851,7 @@
 {
     tBTM_CMPL_CB            *p_cb = btm_cb.devcb.p_qossu_cmpl_cb;
     tBTM_QOS_SETUP_CMPL     qossu;
-    BTM_TRACE_DEBUG0 ("btm_qos_setup_complete");
+    BTM_TRACE_DEBUG ("btm_qos_setup_complete");
     btu_stop_timer (&btm_cb.devcb.qossu_timer);
 
     btm_cb.devcb.p_qossu_cmpl_cb = NULL;
@@ -2852,7 +2870,7 @@
             qossu.flow.latency = p_flow->latency;
             qossu.flow.delay_variation = p_flow->delay_variation;
         }
-        BTM_TRACE_DEBUG1 ("BTM: p_flow->delay_variation: 0x%02x",
+        BTM_TRACE_DEBUG ("BTM: p_flow->delay_variation: 0x%02x",
                           qossu.flow.delay_variation);
         (*p_cb)(&qossu);
     }
@@ -2873,8 +2891,12 @@
 tBTM_STATUS BTM_ReadRSSI (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
 {
     tACL_CONN   *p;
-
-    BTM_TRACE_API6 ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+    tBT_DEVICE_TYPE dev_type;
+    tBLE_ADDR_TYPE  addr_type;
+#endif
+    BTM_TRACE_API ("BTM_ReadRSSI: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
@@ -2882,7 +2904,13 @@
     if (btm_cb.devcb.p_rssi_cmpl_cb)
         return(BTM_BUSY);
 
-    p = btm_bda_to_acl(remote_bda);
+#if BLE_INCLUDED == TRUE
+    BTM_ReadDevInfo(remote_bda, &dev_type, &addr_type);
+    if (dev_type == BT_DEVICE_TYPE_BLE)
+        transport = BT_TRANSPORT_LE;
+#endif
+
+    p = btm_bda_to_acl(remote_bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         btu_start_timer (&btm_cb.devcb.rssi_timer, BTU_TTYPE_BTM_ACL,
@@ -2919,7 +2947,7 @@
 {
     tACL_CONN   *p;
 
-    BTM_TRACE_API6 ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_ReadLinkQuality: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
@@ -2927,7 +2955,7 @@
     if (btm_cb.devcb.p_lnk_qual_cmpl_cb)
         return(BTM_BUSY);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
     if (p != (tACL_CONN *)NULL)
     {
         btu_start_timer (&btm_cb.devcb.lnk_quality_timer, BTU_TTYPE_BTM_ACL,
@@ -2960,14 +2988,14 @@
 ** Returns          BTM_CMD_STARTED if successfully initiated or error code
 **
 *******************************************************************************/
-tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
+tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb)
 {
     tACL_CONN   *p;
     BOOLEAN     ret;
 #define BTM_READ_RSSI_TYPE_CUR  0x00
 #define BTM_READ_RSSI_TYPE_MAX  0X01
 
-    BTM_TRACE_API6 ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+    BTM_TRACE_API ("BTM_ReadTxPower: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                     remote_bda[0], remote_bda[1], remote_bda[2],
                     remote_bda[3], remote_bda[4], remote_bda[5]);
 
@@ -2975,7 +3003,7 @@
     if (btm_cb.devcb.p_tx_power_cmpl_cb)
         return(BTM_BUSY);
 
-    p = btm_bda_to_acl(remote_bda);
+    p = btm_bda_to_acl(remote_bda, transport);
     if (p != (tACL_CONN *)NULL)
     {
         btu_start_timer (&btm_cb.devcb.tx_power_timer, BTU_TTYPE_BTM_ACL,
@@ -2984,7 +3012,7 @@
         btm_cb.devcb.p_tx_power_cmpl_cb = p_cb;
 
 #if BLE_INCLUDED == TRUE
-        if (p->is_le_link)
+        if (p->transport == BT_TRANSPORT_LE)
         {
             memcpy(btm_cb.devcb.read_tx_pwr_addr, remote_bda, BD_ADDR_LEN);
             ret = btsnd_hcic_ble_read_adv_chnl_tx_power();
@@ -3024,7 +3052,7 @@
     UINT16                   handle;
     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
     UINT16                   index;
-    BTM_TRACE_DEBUG0 ("btm_read_tx_power_complete");
+    BTM_TRACE_DEBUG ("btm_read_tx_power_complete");
     btu_stop_timer (&btm_cb.devcb.tx_power_timer);
 
     /* If there was a callback registered for read rssi, call it */
@@ -3060,7 +3088,7 @@
                 memcpy(results.rem_bda, btm_cb.devcb.read_tx_pwr_addr, BD_ADDR_LEN);
             }
 #endif
-            BTM_TRACE_DEBUG2 ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
+            BTM_TRACE_DEBUG ("BTM TX power Complete: tx_power %d, hci status 0x%02x",
                                   results.tx_power, results.hci_status);
         }
         else
@@ -3087,7 +3115,7 @@
     UINT16                   handle;
     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
     UINT16                   index;
-    BTM_TRACE_DEBUG0 ("btm_read_rssi_complete");
+    BTM_TRACE_DEBUG ("btm_read_rssi_complete");
     btu_stop_timer (&btm_cb.devcb.rssi_timer);
 
     /* If there was a callback registered for read rssi, call it */
@@ -3104,7 +3132,7 @@
             STREAM_TO_UINT16 (handle, p);
 
             STREAM_TO_UINT8 (results.rssi, p);
-            BTM_TRACE_DEBUG2 ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
+            BTM_TRACE_DEBUG ("BTM RSSI Complete: rssi %d, hci status 0x%02x",
                               results.rssi, results.hci_status);
 
             /* Search through the list of active channels for the correct BD Addr */
@@ -3141,7 +3169,7 @@
     UINT16                   handle;
     tACL_CONN               *p_acl_cb = &btm_cb.acl_db[0];
     UINT16                   index;
-    BTM_TRACE_DEBUG0 ("btm_read_link_quality_complete");
+    BTM_TRACE_DEBUG ("btm_read_link_quality_complete");
     btu_stop_timer (&btm_cb.devcb.lnk_quality_timer);
 
     /* If there was a callback registered for read rssi, call it */
@@ -3158,7 +3186,7 @@
             STREAM_TO_UINT16 (handle, p);
 
             STREAM_TO_UINT8 (results.link_quality, p);
-            BTM_TRACE_DEBUG2 ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
+            BTM_TRACE_DEBUG ("BTM Link Quality Complete: Link Quality %d, hci status 0x%02x",
                               results.link_quality, results.hci_status);
 
             /* Search through the list of active channels for the correct BD Addr */
@@ -3187,12 +3215,12 @@
 ** Returns          BTM_SUCCESS if successfully initiated, otherwise BTM_NO_RESOURCES.
 **
 *******************************************************************************/
-tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr)
+tBTM_STATUS btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport)
 {
-    UINT16  hci_handle = BTM_GetHCIConnHandle(bd_addr);
+    UINT16  hci_handle = BTM_GetHCIConnHandle(bd_addr, transport);
     tBTM_STATUS status = BTM_SUCCESS;
 
-    BTM_TRACE_DEBUG0 ("btm_remove_acl");
+    BTM_TRACE_DEBUG ("btm_remove_acl");
 #if BTM_DISC_DURING_RS == TRUE
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
 
@@ -3204,7 +3232,8 @@
     else    /* otherwise can disconnect right away */
 #endif
     {
-        if (hci_handle != 0xFFFF)
+        if (hci_handle != 0xFFFF && p_dev_rec &&
+             p_dev_rec->sec_state!= BTM_SEC_STATE_DISCONNECTING)
         {
             if (!btsnd_hcic_disconnect (hci_handle, HCI_ERR_PEER_USER))
                 status = BTM_NO_RESOURCES;
@@ -3229,7 +3258,7 @@
 *******************************************************************************/
 UINT8 BTM_SetTraceLevel (UINT8 new_level)
 {
-    BTM_TRACE_DEBUG0 ("BTM_SetTraceLevel");
+    BTM_TRACE_DEBUG ("BTM_SetTraceLevel");
     if (new_level != 0xFF)
         btm_cb.trace_level = new_level;
 
@@ -3252,7 +3281,7 @@
 {
     BOOLEAN sw_ok = TRUE;
     BOOLEAN chlk_ok = TRUE;
-    BTM_TRACE_DEBUG0 ("btm_cont_rswitch_or_chglinkkey ");
+    BTM_TRACE_DEBUG ("btm_cont_rswitch_or_chglinkkey ");
     /* Check to see if encryption needs to be turned off if pending
        change of link key or role switch */
     if (p->switch_role_state == BTM_ACL_SWKEY_STATE_MODE_CHANGE ||
@@ -3334,7 +3363,7 @@
     BT_HDR  *p_buf;
     UINT8   *pp;
     BD_ADDR bda;
-    BTM_TRACE_DEBUG0 ("btm_acl_resubmit_page");
+    BTM_TRACE_DEBUG ("btm_acl_resubmit_page");
     /* If there were other page request schedule can start the next one */
     if ((p_buf = (BT_HDR *)GKI_dequeue (&btm_cb.page_queue)) != NULL)
     {
@@ -3365,7 +3394,7 @@
 void  btm_acl_reset_paging (void)
 {
     BT_HDR *p;
-    BTM_TRACE_DEBUG0 ("btm_acl_reset_paging");
+    BTM_TRACE_DEBUG ("btm_acl_reset_paging");
     /* If we sent reset we are definitely not paging any more */
     while ((p = (BT_HDR *)GKI_dequeue(&btm_cb.page_queue)) != NULL)
         GKI_freebuf (p);
@@ -3382,7 +3411,7 @@
 *******************************************************************************/
 void  btm_acl_set_discing (BOOLEAN discing)
 {
-    BTM_TRACE_DEBUG0 ("btm_acl_set_discing");
+    BTM_TRACE_DEBUG ("btm_acl_set_discing");
     btm_cb.discing = discing;
 }
 
@@ -3397,7 +3426,7 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_DEBUG4 ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
+    BTM_TRACE_DEBUG ("btm_acl_paging discing:%d, paging:%d BDA: %06x%06x",
                       btm_cb.discing, btm_cb.paging,
                       (bda[0]<<16) + (bda[1]<<8) + bda[2], (bda[3]<<16) + (bda[4] << 8) + bda[5]);
     if (btm_cb.discing)
@@ -3409,7 +3438,7 @@
     {
         if (!BTM_ACL_IS_CONNECTED (bda))
         {
-            BTM_TRACE_DEBUG2 ("connecting_bda: %06x%06x",
+            BTM_TRACE_DEBUG ("connecting_bda: %06x%06x",
                               (btm_cb.connecting_bda[0]<<16) + (btm_cb.connecting_bda[1]<<8) +
                                btm_cb.connecting_bda[2],
                               (btm_cb.connecting_bda[3]<<16) + (btm_cb.connecting_bda[4] << 8) +
@@ -3458,11 +3487,16 @@
     /* Report possible collision to the upper layer. */
     if (btm_cb.p_bl_changed_cb)
     {
-        BTM_TRACE_DEBUG6 ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
+        BTM_TRACE_DEBUG ("btm_acl_notif_conn_collision: RemBdAddr: %02x%02x%02x%02x%02x%02x",
                           bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
 
         evt_data.event = BTM_BL_COLLISION_EVT;
         evt_data.conn.p_bda = bda;
+
+#if BLE_INCLUDED == TRUE
+        evt_data.conn.transport = BT_TRANSPORT_BR_EDR;
+        evt_data.conn.handle = BTM_INVALID_HCI_HANDLE;
+#endif
         (*btm_cb.p_bl_changed_cb)(&evt_data);
         return TRUE;
     }
diff --git a/stack/btm/btm_ble.c b/stack/btm/btm_ble.c
index 5b61b76..58d3971 100644
--- a/stack/btm/btm_ble.c
+++ b/stack/btm/btm_ble.c
@@ -35,19 +35,17 @@
 #include "btm_ble_api.h"
 #include "smp_api.h"
 #include "l2c_int.h"
-#if (defined BLE_BRCM_INCLUDED && BLE_BRCM_INCLUDED == TRUE)
-#include "brcm_ble.h"
-#endif
 #include "gap_api.h"
 #include "bt_utils.h"
 
+#include "vendor_ble.h"
+
 #if SMP_INCLUDED == TRUE
 extern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature);
 extern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable);
 extern BOOLEAN smp_proc_ltk_request(BD_ADDR bda);
 #endif
 extern void gatt_notify_enc_cmpl(BD_ADDR bd_addr);
-
 /*******************************************************************************/
 /* External Function to be called by other modules                             */
 /*******************************************************************************/
@@ -74,12 +72,12 @@
     UINT8               i = 0;
     tBTM_INQ_INFO      *p_info=NULL;
 
-    BTM_TRACE_DEBUG1 ("BTM_SecAddBleDevice dev_type=0x%x", dev_type);
+    BTM_TRACE_DEBUG ("BTM_SecAddBleDevice dev_type=0x%x", dev_type);
     p_dev_rec = btm_find_dev (bd_addr);
 
     if (!p_dev_rec)
     {
-        BTM_TRACE_DEBUG0("Add a new device");
+        BTM_TRACE_DEBUG("Add a new device");
 
         /* There is no device record, allocate one.
          * If we can not find an empty spot for this one, let it fail. */
@@ -87,14 +85,15 @@
         {
             if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
             {
-                BTM_TRACE_DEBUG1 ("allocate a new dev rec idx=0x%x ", i );
+                BTM_TRACE_DEBUG ("allocate a new dev rec idx=0x%x ", i );
                 p_dev_rec = &btm_cb.sec_dev_rec[i];
 
                 /* Mark this record as in use and initialize */
                 memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
                 p_dev_rec->sec_flags = BTM_SEC_IN_USE;
                 memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
-                p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+                p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
+                p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE);
 
                 /* update conn params, use default value for background connection params */
                 p_dev_rec->conn_params.min_conn_int     =
@@ -102,7 +101,7 @@
                 p_dev_rec->conn_params.supervision_tout =
                 p_dev_rec->conn_params.slave_latency    = BTM_BLE_CONN_PARAM_UNDEF;
 
-                BTM_TRACE_DEBUG1 ("hci_handl=0x%x ",  p_dev_rec->hci_handle );
+                BTM_TRACE_DEBUG ("hci_handl=0x%x ",  p_dev_rec->ble_hci_handle );
                 break;
             }
         }
@@ -112,7 +111,7 @@
     }
     else
     {
-        BTM_TRACE_DEBUG0("Device already exist");
+        BTM_TRACE_DEBUG("Device already exist");
     }
 
     memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
@@ -125,7 +124,7 @@
     }
     p_dev_rec->device_type = dev_type;
     p_dev_rec->ble.ble_addr_type = addr_type;
-    BTM_TRACE_DEBUG3 ("p_dev_rec->device_type =0x%x  addr_type=0x%x sec_flags=0x%x",
+    BTM_TRACE_DEBUG ("p_dev_rec->device_type =0x%x  addr_type=0x%x sec_flags=0x%x",
                       dev_type,  addr_type, p_dev_rec->sec_flags);
 
     /* sync up with the Inq Data base*/
@@ -134,7 +133,7 @@
     {
         p_info->results.ble_addr_type = p_dev_rec->ble.ble_addr_type ;
         p_info->results.device_type = p_dev_rec->device_type;
-        BTM_TRACE_DEBUG2 ("InqDb  device_type =0x%x  addr_type=0x%x",
+        BTM_TRACE_DEBUG ("InqDb  device_type =0x%x  addr_type=0x%x",
                           p_info->results.device_type, p_info->results.ble_addr_type);
     }
 
@@ -160,21 +159,21 @@
 {
 #if SMP_INCLUDED == TRUE
     tBTM_SEC_DEV_REC  *p_dev_rec;
-    BTM_TRACE_DEBUG0 ("BTM_SecAddBleKey");
+    BTM_TRACE_DEBUG ("BTM_SecAddBleKey");
     p_dev_rec = btm_find_dev (bd_addr);
     if (!p_dev_rec || !p_le_key ||
         (key_type != BTM_LE_KEY_PENC && key_type != BTM_LE_KEY_PID &&
          key_type != BTM_LE_KEY_PCSRK && key_type != BTM_LE_KEY_LENC &&
          key_type != BTM_LE_KEY_LCSRK))
     {
-        BTM_TRACE_WARNING3 ("BTM_SecAddBleKey()  Wrong Type, or No Device record \
+        BTM_TRACE_WARNING ("BTM_SecAddBleKey()  Wrong Type, or No Device record \
                         for bdaddr: %08x%04x, Type: %d",
                             (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                             (bd_addr[4]<<8)+bd_addr[5], key_type);
         return(FALSE);
     }
 
-    BTM_TRACE_DEBUG3 ("BTM_SecAddLeKey()  BDA: %08x%04x, Type: 0x%02x",
+    BTM_TRACE_DEBUG ("BTM_SecAddLeKey()  BDA: %08x%04x, Type: 0x%02x",
                       (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                       (bd_addr[4]<<8)+bd_addr[5], key_type);
 
@@ -206,7 +205,7 @@
 void BTM_BleLoadLocalKeys(UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
 {
     tBTM_DEVCB *p_devcb = &btm_cb.devcb;
-    BTM_TRACE_DEBUG0 ("BTM_BleLoadLocalKeys");
+    BTM_TRACE_DEBUG ("BTM_BleLoadLocalKeys");
     if (p_key != NULL)
     {
         switch (key_type)
@@ -220,7 +219,7 @@
                 break;
 
             default:
-                BTM_TRACE_ERROR1("unknow local key type: %d", key_type);
+                BTM_TRACE_ERROR("unknow local key type: %d", key_type);
                 break;
         }
     }
@@ -239,7 +238,7 @@
 *******************************************************************************/
 void BTM_GetDeviceEncRoot (BT_OCTET16 er)
 {
-    BTM_TRACE_DEBUG0 ("BTM_GetDeviceEncRoot");
+    BTM_TRACE_DEBUG ("BTM_GetDeviceEncRoot");
 
     memcpy (er, btm_cb.devcb.er, BT_OCTET16_LEN);
 }
@@ -257,7 +256,7 @@
 *******************************************************************************/
 void BTM_GetDeviceIDRoot (BT_OCTET16 irk)
 {
-    BTM_TRACE_DEBUG0 ("BTM_GetDeviceIDRoot ");
+    BTM_TRACE_DEBUG ("BTM_GetDeviceIDRoot ");
 
     memcpy (irk, btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN);
 }
@@ -274,7 +273,7 @@
 *******************************************************************************/
 void BTM_GetDeviceDHK (BT_OCTET16 dhk)
 {
-    BTM_TRACE_DEBUG0 ("BTM_GetDeviceDHK");
+    BTM_TRACE_DEBUG ("BTM_GetDeviceDHK");
     memcpy (dhk, btm_cb.devcb.id_keys.dhk, BT_OCTET16_LEN);
 }
 
@@ -290,17 +289,17 @@
 *******************************************************************************/
 void BTM_ReadConnectionAddr (BD_ADDR remote_bda, BD_ADDR local_conn_addr, tBLE_ADDR_TYPE *p_addr_type)
 {
-    tACL_CONN       *p_acl = btm_bda_to_acl(remote_bda);
+    tACL_CONN       *p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_LE);
 
     if (p_acl == NULL)
     {
-        BTM_TRACE_ERROR0("No connection exist!");
+        BTM_TRACE_ERROR("No connection exist!");
         return;
     }
     memcpy(local_conn_addr, p_acl->conn_addr, BD_ADDR_LEN);
     * p_addr_type = p_acl->conn_addr_type;
 
-    BTM_TRACE_DEBUG2 ("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
+    BTM_TRACE_DEBUG ("BTM_ReadConnectionAddr address type: %d addr: 0x%02x",
                     p_acl->conn_addr_type, p_acl->conn_addr[0]);
 }
 
@@ -316,10 +315,11 @@
 *******************************************************************************/
 BOOLEAN BTM_IsBleConnection (UINT16 conn_handle)
 {
+#if (BLE_INCLUDED == TRUE)
     UINT8                xx;
     tACL_CONN            *p;
 
-    BTM_TRACE_API1 ("BTM_IsBleConnection: conn_handle: %d", conn_handle);
+    BTM_TRACE_API ("BTM_IsBleConnection: conn_handle: %d", conn_handle);
 
     xx = btm_handle_to_acl_index (conn_handle);
     if (xx >= MAX_L2CAP_LINKS)
@@ -327,7 +327,10 @@
 
     p = &btm_cb.acl_db[xx];
 
-    return(p->is_le_link);
+    return (p->transport == BT_TRANSPORT_LE);
+#else
+    return FALSE;
+#endif
 }
 
 /*******************************************************************************
@@ -335,27 +338,33 @@
 ** Function         BTM_ReadRemoteConnectionAddr
 **
 ** Description      This function is read the remote device address currently used
-**                  .
 **
-** Returns          void
+** Parameters     pseudo_addr: pseudo random address available
+**                conn_addr:connection address used
+**                p_addr_type : BD Address type, Public or Random of the address used
+**
+** Returns          BOOLEAN , TRUE if connection to remote device exists, else FALSE
 **
 *******************************************************************************/
-BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr, tBLE_ADDR_TYPE *p_addr_type)
+BOOLEAN BTM_ReadRemoteConnectionAddr(BD_ADDR pseudo_addr, BD_ADDR conn_addr,
+                                               tBLE_ADDR_TYPE *p_addr_type)
 {
-    BOOLEAN         st = TRUE;
-    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_addr);
-#if BTM_BLE_PRIVACY_SPT == TRUE
-    tACL_CONN       *p = btm_bda_to_acl (pseudo_addr);
+ BOOLEAN         st = TRUE;
+#if (BLE_PRIVACY_SPT == TRUE)
+    tACL_CONN       *p = btm_bda_to_acl (pseudo_addr, BT_TRANSPORT_LE);
 
     if (p == NULL)
     {
-        BTM_TRACE_ERROR0("BTM_ReadRemoteConnectionAddr can not find matching address");
+        BTM_TRACE_ERROR("BTM_ReadRemoteConnectionAddr can not find connection"
+                        " with matching address");
         return FALSE;
     }
 
     memcpy(conn_addr, p->active_remote_addr, BD_ADDR_LEN);
     *p_addr_type = p->active_remote_addr_type;
 #else
+    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_addr);
+
     memcpy(conn_addr, pseudo_addr, BD_ADDR_LEN);
     if (p_dev_rec != NULL)
     {
@@ -363,6 +372,7 @@
     }
 #endif
     return st;
+
 }
 /*******************************************************************************
 **
@@ -381,7 +391,7 @@
 {
 #if SMP_INCLUDED == TRUE
     tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
-    BTM_TRACE_DEBUG0 ("BTM_SecurityGrant");
+    BTM_TRACE_DEBUG ("BTM_SecurityGrant");
     SMP_SecurityGrant(bd_addr, res_smp);
 #endif
 }
@@ -408,12 +418,12 @@
 
     if (p_dev_rec == NULL)
     {
-        BTM_TRACE_ERROR0("Passkey reply to Unknown device");
+        BTM_TRACE_ERROR("Passkey reply to Unknown device");
         return;
     }
 
-    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
-    BTM_TRACE_DEBUG0 ("BTM_BlePasskeyReply");
+    p_dev_rec->sec_flags   |= BTM_SEC_LE_LINK_KEY_AUTHED;
+    BTM_TRACE_DEBUG ("BTM_BlePasskeyReply");
     SMP_PasskeyReply(bd_addr, res_smp, passkey);
 #endif
 }
@@ -436,15 +446,15 @@
     tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
 
-    BTM_TRACE_DEBUG0 ("BTM_BleOobDataReply");
+    BTM_TRACE_DEBUG ("BTM_BleOobDataReply");
 
     if (p_dev_rec == NULL)
     {
-        BTM_TRACE_ERROR0("BTM_BleOobDataReply() to Unknown device");
+        BTM_TRACE_ERROR("BTM_BleOobDataReply() to Unknown device");
         return;
     }
 
-    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+    p_dev_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
     SMP_OobDataReply(bd_addr, res_smp, len, p_data);
 #endif
 }
@@ -491,7 +501,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("Illegal Connection Scan Parameters");
+        BTM_TRACE_ERROR("Illegal Connection Scan Parameters");
     }
 #endif
 }
@@ -519,7 +529,7 @@
 {
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
 
-    BTM_TRACE_API4 ("BTM_BleSetPrefConnParams min: %u  max: %u  latency: %u  \
+    BTM_TRACE_API ("BTM_BleSetPrefConnParams min: %u  max: %u  latency: %u  \
                     tout: %u",
                     min_conn_int, max_conn_int, slave_latency, supervision_tout);
 
@@ -551,19 +561,19 @@
                 if (supervision_tout != BTM_BLE_CONN_PARAM_UNDEF)
                     p_dev_rec->conn_params.supervision_tout = supervision_tout;
                 else
-                    p_dev_rec->conn_params.slave_latency = BTM_BLE_CONN_TIMEOUT_DEF;
+                    p_dev_rec->conn_params.supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF;
 
             }
 
         }
         else
         {
-            BTM_TRACE_ERROR0("Unknown Device, setting rejected");
+            BTM_TRACE_ERROR("Unknown Device, setting rejected");
         }
     }
     else
     {
-        BTM_TRACE_ERROR0("Illegal Connection Parameters");
+        BTM_TRACE_ERROR("Illegal Connection Parameters");
     }
 }
 
@@ -596,7 +606,7 @@
             *p_addr_type = p_inq_info->results.ble_addr_type;
         } else {
             /* unknown device, assume BR/EDR */
-            BTM_TRACE_DEBUG0 ("btm_find_dev_type - unknown device, BR/EDR assumed");
+            BTM_TRACE_DEBUG ("btm_find_dev_type - unknown device, BR/EDR assumed");
         }
     }
     else /* there is a security device record exisitng */
@@ -612,7 +622,7 @@
 
     }
 
-    BTM_TRACE_DEBUG2 ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type);
+    BTM_TRACE_DEBUG ("btm_find_dev_type - device_type = %d addr_type = %d", *p_dev_type , *p_addr_type);
 }
 
 /*******************************************************************************
@@ -631,7 +641,7 @@
 
      if (btsnd_hcic_ble_receiver_test(rx_freq) == FALSE)
      {
-          BTM_TRACE_ERROR1("%s: Unable to Trigger LE receiver test", __FUNCTION__);
+          BTM_TRACE_ERROR("%s: Unable to Trigger LE receiver test", __FUNCTION__);
      }
 }
 
@@ -653,7 +663,7 @@
      btm_cb.devcb.p_le_test_cmd_cmpl_cb = p_cmd_cmpl_cback;
      if (btsnd_hcic_ble_transmitter_test(tx_freq, test_data_len, packet_payload) == FALSE)
      {
-          BTM_TRACE_ERROR1("%s: Unable to Trigger LE transmitter test", __FUNCTION__);
+          BTM_TRACE_ERROR("%s: Unable to Trigger LE transmitter test", __FUNCTION__);
      }
 }
 
@@ -672,7 +682,7 @@
 
      if (btsnd_hcic_ble_test_end() == FALSE)
      {
-          BTM_TRACE_ERROR1("%s: Unable to End the LE TX/RX test", __FUNCTION__);
+          BTM_TRACE_ERROR("%s: Unable to End the LE TX/RX test", __FUNCTION__);
      }
 }
 
@@ -694,24 +704,6 @@
 
 /*******************************************************************************
 **
-** Function         BTM_IsBleLink
-**
-** Description      This function is to check the link type is BLE or BR/EDR.
-**
-** Returns          TRUE if BLE link; FALSE if BR/EDR.
-**
-*******************************************************************************/
-BOOLEAN BTM_IsBleLink (BD_ADDR bd_addr)
-{
-    tACL_CONN         *p;
-    BTM_TRACE_DEBUG0 ("BTM_IsBleLink");
-    if ((p = btm_bda_to_acl(bd_addr)) != NULL)
-        return p->is_le_link;
-    else
-        return FALSE;
-}
-/*******************************************************************************
-**
 ** Function         BTM_UseLeLink
 **
 ** Description      This function is to select the underneath physical link to use.
@@ -726,9 +718,13 @@
     tBLE_ADDR_TYPE      addr_type;
     BOOLEAN             use_le = FALSE;
 
-    if ((p = btm_bda_to_acl(bd_addr)) != NULL)
+    if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR)) != NULL)
     {
-        use_le = (p->is_le_link);
+        return use_le;
+    }
+    else if ((p = btm_bda_to_acl(bd_addr, BT_TRANSPORT_LE)) != NULL)
+    {
+        use_le = TRUE;
     }
     else
     {
@@ -753,7 +749,7 @@
     tBTM_RAND_ENC   params;
     UINT8           *p_dest = params.param_buf;
 
-    BTM_TRACE_DEBUG0 ("btm_ble_rand_enc_complete");
+    BTM_TRACE_DEBUG ("btm_ble_rand_enc_complete");
 
     memset(&params, 0, sizeof(tBTM_RAND_ENC));
 
@@ -794,7 +790,7 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_DEBUG1 ("btm_ble_increment_sign_ctr is_local=%d", is_local);
+    BTM_TRACE_DEBUG ("btm_ble_increment_sign_ctr is_local=%d", is_local);
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
     {
@@ -802,7 +798,7 @@
             p_dev_rec->ble.keys.local_counter++;
         else
             p_dev_rec->ble.keys.counter++;
-        BTM_TRACE_DEBUG3 ("is_local=%d local sign counter=%d peer sign counter=%d",
+        BTM_TRACE_DEBUG ("is_local=%d local sign counter=%d peer sign counter=%d",
                           is_local,
                           p_dev_rec->ble.keys.local_counter,
                           p_dev_rec->ble.keys.counter);
@@ -823,7 +819,7 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_DEBUG0 ("btm_ble_get_enc_key_type");
+    BTM_TRACE_DEBUG ("btm_ble_get_enc_key_type");
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
     {
@@ -845,13 +841,14 @@
 {
     tBTM_SEC_DEV_REC   *p_dev_rec;
     BOOLEAN            status = FALSE;
-    BTM_TRACE_DEBUG0 ("btm_get_local_div");
+    BTM_TRACE_DEBUG ("btm_get_local_div");
 
-    BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+    BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                      bd_addr[0],bd_addr[1],
                      bd_addr[2],bd_addr[3],
                      bd_addr[4],bd_addr[5]);
 
+    *p_div = 0;
     p_dev_rec = btm_find_dev (bd_addr);
 
     if (p_dev_rec && p_dev_rec->ble.keys.div)
@@ -859,7 +856,7 @@
         status = TRUE;
         *p_div = p_dev_rec->ble.keys.div;
     }
-    BTM_TRACE_DEBUG2 ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div);
+    BTM_TRACE_DEBUG ("btm_get_local_div status=%d (1-OK) DIV=0x%x", status, *p_div);
     return status;
 }
 
@@ -883,10 +880,10 @@
     tBTM_LE_EVT_DATA    cb_data;
     UINT8 i;
 
-    BTM_TRACE_DEBUG2 ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application);
+    BTM_TRACE_DEBUG ("btm_sec_save_le_key key_type=0x%x pass_to_application=%d",key_type, pass_to_application);
     /* Store the updated key in the device database */
 
-    BTM_TRACE_DEBUG6("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
+    BTM_TRACE_DEBUG("bd_addr:%02x-%02x-%02x-%02x-%02x-%02x",
                      bd_addr[0],bd_addr[1],
                      bd_addr[2],bd_addr[3],
                      bd_addr[4],bd_addr[5]);
@@ -902,12 +899,12 @@
                 p_rec->ble.keys.ediv = p_keys->penc_key.ediv;
                 p_rec->ble.keys.key_size = p_keys->penc_key.key_size;
                 p_rec->ble.key_type |= BTM_LE_KEY_PENC;
-                p_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
+                p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_KNOWN;
                 if (p_keys->penc_key.sec_level == SMP_SEC_AUTHENTICATED)
-                    p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+                    p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
                 else
-                    p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
-                BTM_TRACE_DEBUG3("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
+                    p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
+                BTM_TRACE_DEBUG("BTM_LE_KEY_PENC key_type=0x%x sec_flags=0x%x sec_leve=0x%x",
                                  p_rec->ble.key_type,
                                  p_rec->sec_flags,
                                  p_rec->ble.keys.sec_level);
@@ -923,7 +920,7 @@
                 memcpy(p_rec->ble.static_addr, p_keys->pid_key.static_addr, BD_ADDR_LEN);
                 p_rec->ble.static_addr_type = p_keys->pid_key.addr_type;
                 p_rec->ble.key_type |= BTM_LE_KEY_PID;
-                BTM_TRACE_DEBUG1("BTM_LE_KEY_PID key_type=0x%x save peer IRK",  p_rec->ble.key_type);
+                BTM_TRACE_DEBUG("BTM_LE_KEY_PID key_type=0x%x save peer IRK",  p_rec->ble.key_type);
                 break;
 
             case BTM_LE_KEY_PCSRK:
@@ -931,13 +928,13 @@
                 p_rec->ble.keys.srk_sec_level = p_keys->pcsrk_key.sec_level;
                 p_rec->ble.keys.counter  = p_keys->pcsrk_key.counter;
                 p_rec->ble.key_type |= BTM_LE_KEY_PCSRK;
-                p_rec->sec_flags |=  BTM_SEC_LINK_KEY_KNOWN;
+                p_rec->sec_flags |=  BTM_SEC_LE_LINK_KEY_KNOWN;
                 if ( p_keys->pcsrk_key.sec_level== SMP_SEC_AUTHENTICATED)
-                    p_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+                    p_rec->sec_flags |= BTM_SEC_LE_LINK_KEY_AUTHED;
                 else
-                    p_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
+                    p_rec->sec_flags &= ~BTM_SEC_LE_LINK_KEY_AUTHED;
 
-                BTM_TRACE_DEBUG4("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d",
+                BTM_TRACE_DEBUG("BTM_LE_KEY_PCSRK key_type=0x%x sec_flags=0x%x sec_level=0x%x peer_counter=%d",
                                  p_rec->ble.key_type,
                                  p_rec->sec_flags,
                                  p_rec->ble.keys.srk_sec_level,
@@ -950,7 +947,7 @@
                 p_rec->ble.keys.key_size = p_keys->lenc_key.key_size;
                 p_rec->ble.key_type |= BTM_LE_KEY_LENC;
 
-                BTM_TRACE_DEBUG4("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x",
+                BTM_TRACE_DEBUG("BTM_LE_KEY_LENC key_type=0x%x DIV=0x%x key_size=0x%x sec_level=0x%x",
                                  p_rec->ble.key_type,
                                  p_rec->ble.keys.div,
                                  p_rec->ble.keys.key_size,
@@ -962,7 +959,7 @@
                 p_rec->ble.keys.local_csrk_sec_level = p_keys->lcsrk_key.sec_level;
                 p_rec->ble.keys.local_counter  = p_keys->lcsrk_key.counter;
                 p_rec->ble.key_type |= BTM_LE_KEY_LCSRK;
-                BTM_TRACE_DEBUG4("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d",
+                BTM_TRACE_DEBUG("BTM_LE_KEY_LCSRK key_type=0x%x DIV=0x%x scrk_sec_level=0x%x local_counter=%d",
                                  p_rec->ble.key_type,
                                  p_rec->ble.keys.div,
                                  p_rec->ble.keys.local_csrk_sec_level,
@@ -970,11 +967,11 @@
                 break;
 
             default:
-                BTM_TRACE_WARNING1("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type);
+                BTM_TRACE_WARNING("btm_sec_save_le_key (Bad key_type 0x%02x)", key_type);
                 return;
         }
 
-        BTM_TRACE_DEBUG3 ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type,
+        BTM_TRACE_DEBUG ("BLE key type 0x%02x updated for BDA: %08x%04x (btm_sec_save_le_key)", key_type,
                           (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                           (bd_addr[4]<<8)+bd_addr[5]);
 
@@ -989,13 +986,13 @@
         return;
     }
 
-    BTM_TRACE_WARNING3 ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type,
+    BTM_TRACE_WARNING ("BLE key type 0x%02x called for Unknown BDA or type: %08x%04x !! (btm_sec_save_le_key)", key_type,
                         (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                         (bd_addr[4]<<8)+bd_addr[5]);
 
     if (p_rec)
     {
-        BTM_TRACE_DEBUG1 ("sec_flags=0x%x", p_rec->sec_flags);
+        BTM_TRACE_DEBUG ("sec_flags=0x%x", p_rec->sec_flags);
     }
 }
 
@@ -1012,7 +1009,7 @@
 {
     tBTM_SEC_DEV_REC *p_rec;
 
-    BTM_TRACE_DEBUG1("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size);
+    BTM_TRACE_DEBUG("btm_ble_update_sec_key_size enc_key_size = %d", enc_key_size);
 
     if ((p_rec = btm_find_dev (bd_addr)) != NULL )
     {
@@ -1055,11 +1052,11 @@
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
     UINT8 req_sec_level = BTM_LE_SEC_NONE, cur_sec_level = BTM_LE_SEC_NONE;
 
-    BTM_TRACE_DEBUG1 ("btm_ble_link_sec_check auth_req =0x%x", auth_req);
+    BTM_TRACE_DEBUG ("btm_ble_link_sec_check auth_req =0x%x", auth_req);
 
     if (p_dev_rec == NULL)
     {
-        BTM_TRACE_ERROR0 ("btm_ble_link_sec_check received for unknown device");
+        BTM_TRACE_ERROR ("btm_ble_link_sec_check received for unknown device");
         return;
     }
 
@@ -1078,12 +1075,12 @@
             req_sec_level = BTM_LE_SEC_AUTHENTICATED;
         }
 
-        BTM_TRACE_DEBUG1 ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
+        BTM_TRACE_DEBUG ("dev_rec sec_flags=0x%x", p_dev_rec->sec_flags);
 
         /* currently encrpted  */
-        if (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
+        if (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)
         {
-            if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
+            if (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
                 cur_sec_level = BTM_LE_SEC_AUTHENTICATED;
             else
                 cur_sec_level = BTM_LE_SEC_UNAUTHENTICATE;
@@ -1120,7 +1117,7 @@
         }
     }
 
-    BTM_TRACE_DEBUG3("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
+    BTM_TRACE_DEBUG("cur_sec_level=%d req_sec_level=%d sec_req_act=%d",
                      cur_sec_level,
                      req_sec_level,
                      *p_sec_req_act);
@@ -1148,11 +1145,11 @@
 
     if (p_rec == NULL)
     {
-        BTM_TRACE_WARNING1 ("btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
+        BTM_TRACE_WARNING ("btm_ble_set_encryption (NULL device record!! sec_act=0x%x", sec_act);
         return(BTM_WRONG_MODE);
     }
 
-    BTM_TRACE_DEBUG2 ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master);
+    BTM_TRACE_DEBUG ("btm_ble_set_encryption sec_act=0x%x role_master=%d", sec_act, p_rec->role_master);
 
     if (sec_act == BTM_BLE_SEC_ENCRYPT_MITM)
     {
@@ -1165,7 +1162,7 @@
             if (link_role == BTM_ROLE_MASTER)
             {
                 if(p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) {
-                    BTM_TRACE_DEBUG0 ("State is already encrypting::");
+                    BTM_TRACE_DEBUG ("State is already encrypting::");
                     cmd = BTM_CMD_STARTED;
                 }
                 else {
@@ -1191,7 +1188,7 @@
             break;
 
         default:
-            cmd = BTM_SUCCESS;
+            cmd = BTM_WRONG_MODE;
             break;
     }
     return cmd;
@@ -1214,7 +1211,7 @@
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
     BT_OCTET8 dummy_stk = {0};
 
-    BTM_TRACE_DEBUG0 ("btm_ble_ltk_request");
+    BTM_TRACE_DEBUG ("btm_ble_ltk_request");
 
     p_cb->ediv = ediv;
 
@@ -1235,40 +1232,48 @@
 ** Description      This function is called to start LE encryption.
 **
 **
-** Returns          void
+** Returns          BTM_SUCCESS if encryption was started successfully
 **
 *******************************************************************************/
-BOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk)
+tBTM_STATUS btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk)
 {
     tBTM_CB *p_cb = &btm_cb;
     tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (bda);
     BT_OCTET8    dummy_rand = {0};
-    BOOLEAN     rt = FALSE;
+    tBTM_STATUS  rt = BTM_NO_RESOURCES;
 
-    BTM_TRACE_DEBUG0 ("btm_ble_start_encrypt");
+    BTM_TRACE_DEBUG ("btm_ble_start_encrypt");
 
-    if (!p_rec ||
-        (p_rec && p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING))
-        return FALSE;
+    if (!p_rec )
+    {
+        BTM_TRACE_ERROR("Link is not active, can not encrypt!");
+        return BTM_WRONG_MODE;
+    }
 
-    p_cb->enc_handle = p_rec->hci_handle;
+    if (p_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
+    {
+        BTM_TRACE_WARNING("Link Encryption is active, Busy!");
+        return BTM_BUSY;
+    }
+
+    p_cb->enc_handle = p_rec->ble_hci_handle;
 
     if (use_stk)
     {
-        if (btsnd_hcic_ble_start_enc(p_rec->hci_handle, dummy_rand, 0, stk))
-            rt = TRUE;
+        if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, dummy_rand, 0, stk))
+            rt = BTM_CMD_STARTED;
     }
     else if (p_rec->ble.key_type & BTM_LE_KEY_PENC)
     {
-        if (btsnd_hcic_ble_start_enc(p_rec->hci_handle, p_rec->ble.keys.rand,
+        if (btsnd_hcic_ble_start_enc(p_rec->ble_hci_handle, p_rec->ble.keys.rand,
                                       p_rec->ble.keys.ediv, p_rec->ble.keys.ltk))
-            rt = TRUE;
+            rt = BTM_CMD_STARTED;
     }
     else
     {
-        BTM_TRACE_ERROR0("No key available to encrypt the link");
+        BTM_TRACE_ERROR("No key available to encrypt the link");
     }
-    if (rt)
+    if (rt == BTM_CMD_STARTED)
     {
         if (p_rec->sec_state == BTM_SEC_STATE_IDLE)
             p_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
@@ -1293,17 +1298,17 @@
 
     if (!p_dev_rec)
     {
-        BTM_TRACE_WARNING1 ("btm_ble_link_encrypted (No Device Found!) encr_enable=%d", encr_enable);
+        BTM_TRACE_WARNING ("btm_ble_link_encrypted (No Device Found!) encr_enable=%d", encr_enable);
         return;
     }
 
-    BTM_TRACE_DEBUG1 ("btm_ble_link_encrypted encr_enable=%d", encr_enable);
+    BTM_TRACE_DEBUG ("btm_ble_link_encrypted encr_enable=%d", encr_enable);
 
     enc_cback = (p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING);
 
     smp_link_encrypted(bd_addr, encr_enable);
 
-    BTM_TRACE_DEBUG1(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
+    BTM_TRACE_DEBUG(" p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags);
 
     if (encr_enable && p_dev_rec->enc_key_size == 0)
         p_dev_rec->enc_key_size = p_dev_rec->ble.keys.key_size;
@@ -1312,9 +1317,9 @@
     if (p_dev_rec->p_callback && enc_cback)
     {
         if (encr_enable)
-            btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS);
+            btm_sec_dev_rec_cback_event(p_dev_rec, BTM_SUCCESS, TRUE);
         else if (p_dev_rec->role_master)
-            btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING);
+            btm_sec_dev_rec_cback_event(p_dev_rec, BTM_ERR_PROCESSING, TRUE);
 
     }
     /* to notify GATT to send data if any request is pending */
@@ -1328,7 +1333,7 @@
 static void btm_enc_proc_ltk(tSMP_ENC *p)
 {
     UINT8   i;
-    BTM_TRACE_DEBUG0 ("btm_enc_proc_ltk");
+    BTM_TRACE_DEBUG ("btm_enc_proc_ltk");
     if (p && p->param_len == BT_OCTET16_LEN)
     {
         for (i = 0; i < (BT_OCTET16_LEN - btm_cb.key_size); i ++)
@@ -1349,7 +1354,7 @@
     tSMP_ENC output;
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_DEBUG0 ("btm_enc_proc_slave_y");
+    BTM_TRACE_DEBUG ("btm_enc_proc_slave_y");
     if (p != NULL)
     {
         STREAM_TO_UINT16(y, pp);
@@ -1360,14 +1365,14 @@
         if ( p_dev_rec &&
              p_dev_rec->ble.keys.div == div )
         {
-            BTM_TRACE_DEBUG0 ("LTK request OK");
+            BTM_TRACE_DEBUG ("LTK request OK");
             /* calculating LTK , LTK = E er(div) */
             SMP_Encrypt(p_cb->devcb.er, BT_OCTET16_LEN, (UINT8 *)&div, 2, &output);
             btm_enc_proc_ltk(&output);
         }
         else
         {
-            BTM_TRACE_DEBUG0 ("LTK request failed - send negative reply");
+            BTM_TRACE_DEBUG ("LTK request failed - send negative reply");
             btsnd_hcic_ble_ltk_req_neg_reply(p_cb->enc_handle);
             if (p_dev_rec)
                 btm_ble_link_encrypted(p_dev_rec->bd_addr, 0);
@@ -1394,15 +1399,15 @@
 
     if (p_rec == NULL)
     {
-        BTM_TRACE_ERROR0("btm_ble_ltk_request_reply received for unknown device");
+        BTM_TRACE_ERROR("btm_ble_ltk_request_reply received for unknown device");
         return;
     }
 
-    BTM_TRACE_DEBUG0 ("btm_ble_ltk_request_reply");
-    p_cb->enc_handle = p_rec->hci_handle;
+    BTM_TRACE_DEBUG ("btm_ble_ltk_request_reply");
+    p_cb->enc_handle = p_rec->ble_hci_handle;
     p_cb->key_size = p_rec->ble.keys.key_size;
 
-    BTM_TRACE_ERROR1("key size = %d", p_rec->ble.keys.key_size);
+    BTM_TRACE_ERROR("key size = %d", p_rec->ble.keys.key_size);
     if (use_stk)
     {
         btsnd_hcic_ble_ltk_req_reply(btm_cb.enc_handle, stk);
@@ -1428,7 +1433,7 @@
 UINT8 btm_ble_io_capabilities_req(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_LE_IO_REQ *p_data)
 {
     UINT8           callback_rc = BTM_SUCCESS;
-    BTM_TRACE_DEBUG0 ("btm_ble_io_capabilities_req");
+    BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req");
     if (btm_cb.api.p_le_callback)
     {
         /* the callback function implementation may change the IO capability... */
@@ -1440,11 +1445,25 @@
     if (callback_rc == BTM_SUCCESS)
 #endif
     {
+#if BTM_BLE_CONFORMANCE_TESTING == TRUE
+        if (btm_cb.devcb.keep_rfu_in_auth_req)
+        {
+            BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req keep_rfu_in_auth_req = %u",
+                btm_cb.devcb.keep_rfu_in_auth_req);
+            p_data->auth_req &= BTM_LE_AUTH_REQ_MASK_KEEP_RFU;
+            btm_cb.devcb.keep_rfu_in_auth_req = FALSE;
+        }
+        else
+        {   /* default */
+            p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
+        }
+#else
         p_data->auth_req &= BTM_LE_AUTH_REQ_MASK;
+#endif
 
-        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d",
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 1: p_dev_rec->security_required = %d auth_req:%d",
                           p_dev_rec->security_required, p_data->auth_req);
-        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)",
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 2: i_keys=0x%x r_keys=0x%x (bit 0-LTK 1-IRK 2-CSRK)",
                           p_data->init_keys,
                           p_data->resp_keys);
 
@@ -1454,30 +1473,30 @@
 
         if (!(p_data->auth_req & SMP_AUTH_BOND))
         {
-            BTM_TRACE_DEBUG0("Non bonding: No keys should be exchanged");
+            BTM_TRACE_DEBUG("Non bonding: No keys should be exchanged");
             p_data->init_keys = 0;
             p_data->resp_keys = 0;
         }
 
-        BTM_TRACE_DEBUG1 ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req);
-        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 3: auth_req:%d", p_data->auth_req);
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 4: i_keys=0x%x r_keys=0x%x",
                           p_data->init_keys,
                           p_data->resp_keys);
 
-        BTM_TRACE_DEBUG2 ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 5: p_data->io_cap = %d auth_req:%d",
                           p_data->io_cap, p_data->auth_req);
 
         /* remove MITM protection requirement if IO cap does not allow it */
         if ((p_data->io_cap == BTM_IO_CAP_NONE) && p_data->oob_data == SMP_OOB_NONE)
             p_data->auth_req &= ~BTM_LE_AUTH_REQ_MITM;
 
-        BTM_TRACE_DEBUG3 ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d",
+        BTM_TRACE_DEBUG ("btm_ble_io_capabilities_req 6: IO_CAP:%d oob_data:%d auth_req:%d",
                           p_data->io_cap, p_data->oob_data, p_data->auth_req);
     }
     return callback_rc;
 }
 
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
 /*******************************************************************************
 **
 ** Function         btm_ble_resolve_random_addr_on_conn_cmpl
@@ -1508,11 +1527,11 @@
 
     handle = HCID_GET_HANDLE (handle);
 
-    BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr_master_cmpl");
+    BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_master_cmpl");
 
     if (match_rec)
     {
-        BTM_TRACE_ERROR0("Random match");
+        BTM_TRACE_ERROR("Random match");
         match = TRUE;
         match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
         memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
@@ -1520,7 +1539,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("Random unmatch");
+        BTM_TRACE_ERROR("Random unmatch");
     }
 
     btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type, match);
@@ -1549,23 +1568,23 @@
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     UNUSED(addr_matched);
 
-    BTM_TRACE_EVENT0 ("btm_ble_connected");
+    BTM_TRACE_EVENT ("btm_ble_connected");
 
     /* Commenting out trace due to obf/compilation problems.
     */
 #if (BT_USE_TRACES == TRUE)
     if (p_dev_rec)
     {
-        BTM_TRACE_EVENT4 ("Security Manager: btm_sec_connected :  handle:%d  enc_mode:%d  bda:%x RName:%s",
+        BTM_TRACE_EVENT ("Security Manager: btm_ble_connected :  handle:%d  enc_mode:%d  bda:%x RName:%s",
                           handle,  enc_mode,
                           (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
                           p_dev_rec->sec_bd_name);
 
-        BTM_TRACE_DEBUG1 ("btm_ble_connected sec_flags=0x%x",p_dev_rec->sec_flags);
+        BTM_TRACE_DEBUG ("btm_ble_connected sec_flags=0x%x",p_dev_rec->sec_flags);
     }
     else
     {
-        BTM_TRACE_EVENT3 ("Security Manager: btm_sec_connected:   handle:%d  enc_mode:%d  bda:%x ",
+        BTM_TRACE_EVENT ("Security Manager: btm_ble_connected:   handle:%d  enc_mode:%d  bda:%x ",
                           handle,  enc_mode,
                           (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
     }
@@ -1583,14 +1602,14 @@
 
     /* update device information */
     p_dev_rec->device_type |= BT_DEVICE_TYPE_BLE;
-    p_dev_rec->hci_handle = handle;
+    p_dev_rec->ble_hci_handle = handle;
     p_dev_rec->ble.ble_addr_type = addr_type;
 
     p_dev_rec->role_master = FALSE;
     if (role == HCI_ROLE_MASTER)
         p_dev_rec->role_master = TRUE;
 
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
     if (!addr_matched)
         p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_PSEUDO;
 
@@ -1613,12 +1632,12 @@
 ******************************************************************************/
 void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len)
 {
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
     UINT8       *p_data = p;
 #endif
     UINT8       role, status, bda_type;
     UINT16      handle;
-    BD_ADDR     bda;
+    BD_ADDR     bda = {0};
     UINT16      conn_interval, conn_latency, conn_timeout;
     BOOLEAN     match = FALSE;
     UNUSED(evt_len);
@@ -1631,10 +1650,14 @@
 
     if (status == 0)
     {
-#if (BTM_BLE_PRIVACY_SPT == TRUE )
+#if (BLE_PRIVACY_SPT == TRUE )
+
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            match = btm_public_addr_to_random_pseudo (bda, &bda_type);
+
         /* possiblly receive connection complete with resolvable random on
            slave role while the device has been paired */
-        if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+        if (!match && /*role == HCI_ROLE_SLAVE && */BTM_BLE_IS_RESOLVE_BDA(bda))
         {
             btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data);
         }
@@ -1655,9 +1678,9 @@
     {
         role = HCI_ROLE_UNKNOWN;
 
-        if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT)
+        if (status != HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT)
         {
-            btm_ble_dir_adv_tout();
+            btm_ble_set_conn_st(BLE_CONN_IDLE);
         }
         /* this is to work around broadcom firmware problem to handle
          * unsolicited command complete event for HCI_LE_Create_Connection_Cancel
@@ -1679,13 +1702,25 @@
             }
         }
     }
-
     btm_ble_set_conn_st(BLE_CONN_IDLE);
-
-    btm_ble_update_mode_operation(role, bda, TRUE);
+    btm_ble_update_mode_operation(role, bda, status);
 }
 
 /*****************************************************************************
+** Function btm_ble_create_ll_conn_complete
+**
+** Description LE connection complete.
+**
+******************************************************************************/
+void btm_ble_create_ll_conn_complete (UINT8 status)
+{
+    if (status != 0)
+    {
+        btm_ble_set_conn_st(BLE_CONN_IDLE);
+        btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, NULL, status);
+    }
+}
+/*****************************************************************************
 **  Function        btm_proc_smp_cback
 **
 **  Description     This function is the SMP callback handler.
@@ -1696,7 +1731,7 @@
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (bd_addr);
     UINT8 res = 0;
 
-    BTM_TRACE_DEBUG1 ("btm_proc_smp_cback event = %d", event);
+    BTM_TRACE_DEBUG ("btm_proc_smp_cback event = %d", event);
 
     if (p_dev_rec != NULL)
     {
@@ -1709,33 +1744,35 @@
             case SMP_PASSKEY_REQ_EVT:
             case SMP_PASSKEY_NOTIF_EVT:
             case SMP_OOB_REQ_EVT:
-                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
+                p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
+
             case SMP_SEC_REQUEST_EVT:
                 memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
                 p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
+                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
                 /* fall through */
             case SMP_COMPLT_EVT:
                 if (btm_cb.api.p_le_callback)
                 {
                     /* the callback function implementation may change the IO capability... */
-                    BTM_TRACE_DEBUG1 ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback );
+                    BTM_TRACE_DEBUG ("btm_cb.api.p_le_callback=0x%x", btm_cb.api.p_le_callback );
                    (*btm_cb.api.p_le_callback) (event, bd_addr, (tBTM_LE_EVT_DATA *)p_data);
                 }
 
                 if (event == SMP_COMPLT_EVT)
                 {
-                    BTM_TRACE_DEBUG2 ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags );
+                    BTM_TRACE_DEBUG ("evt=SMP_COMPLT_EVT before update sec_level=0x%x sec_flags=0x%x", p_data->cmplt.sec_level , p_dev_rec->sec_flags );
 
                     res = (p_data->cmplt.reason == SMP_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING;
 
-                    BTM_TRACE_DEBUG3 ("after update result=%d sec_level=0x%x sec_flags=0x%x",
+                    BTM_TRACE_DEBUG ("after update result=%d sec_level=0x%x sec_flags=0x%x",
                                       res, p_data->cmplt.sec_level , p_dev_rec->sec_flags );
 
-                    btm_sec_dev_rec_cback_event(p_dev_rec, res);
+                    btm_sec_dev_rec_cback_event(p_dev_rec, res, TRUE);
 
                     if (p_data->cmplt.is_pair_cancel && btm_cb.api.p_bond_cancel_cmpl_callback )
                     {
-                        BTM_TRACE_DEBUG0 ("Pairing Cancel completed");
+                        BTM_TRACE_DEBUG ("Pairing Cancel completed");
                         (*btm_cb.api.p_bond_cancel_cmpl_callback)(BTM_SUCCESS);
                     }
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
@@ -1743,25 +1780,25 @@
                     {
                         if (!btm_cb.devcb.no_disc_if_pair_fail && p_data->cmplt.reason != SMP_CONN_TOUT)
                         {
-                            BTM_TRACE_DEBUG0 ("Pairing failed - Remove ACL");
-                            btm_remove_acl(bd_addr);
+                            BTM_TRACE_DEBUG ("Pairing failed - Remove ACL");
+                            btm_remove_acl(bd_addr, BT_TRANSPORT_LE);
                         }
                         else
                         {
-                            BTM_TRACE_DEBUG0 ("Pairing failed - Not Removing ACL");
+                            BTM_TRACE_DEBUG ("Pairing failed - Not Removing ACL");
                             p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
                         }
                     }
 #else
                     if (res != BTM_SUCCESS && p_data->cmplt.reason != SMP_CONN_TOUT)
-                        btm_remove_acl(bd_addr);
+                        btm_remove_acl(bd_addr, BT_TRANSPORT_LE);
 #endif
 
-                    BTM_TRACE_DEBUG3 ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
+                    BTM_TRACE_DEBUG ("btm_cb pairing_state=%x pairing_flags=%x pin_code_len=%x",
                                       btm_cb.pairing_state,
                                       btm_cb.pairing_flags,
                                       btm_cb.pin_code_len  );
-                    BTM_TRACE_DEBUG6 ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x",
+                    BTM_TRACE_DEBUG ("btm_cb.pairing_bda %02x:%02x:%02x:%02x:%02x:%02x",
                                       btm_cb.pairing_bda[0], btm_cb.pairing_bda[1], btm_cb.pairing_bda[2],
                                       btm_cb.pairing_bda[3], btm_cb.pairing_bda[4], btm_cb.pairing_bda[5]);
 
@@ -1772,7 +1809,7 @@
                 break;
 
             default:
-                BTM_TRACE_DEBUG1 ("unknown event = %d", event);
+                BTM_TRACE_DEBUG ("unknown event = %d", event);
                 break;
 
 
@@ -1780,7 +1817,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("btm_proc_smp_cback received for unknown device");
+        BTM_TRACE_ERROR("btm_proc_smp_cback received for unknown device");
     }
 
     return 0;
@@ -1820,16 +1857,16 @@
     tSMP_ENC    output;
     BT_OCTET16  local_csrk;
 
-    BTM_TRACE_DEBUG0 ("BTM_BleDataSignature");
+    BTM_TRACE_DEBUG ("BTM_BleDataSignature");
     if (p_rec == NULL)
     {
-        BTM_TRACE_ERROR0("data signing can not be done from unknow device");
+        BTM_TRACE_ERROR("data signing can not be done from unknow device");
     }
     else
     {
         if ((p_buf = (UINT8 *)GKI_getbuf((UINT16)(len + 4))) != NULL)
         {
-            BTM_TRACE_DEBUG0("Start to generate Local CSRK");
+            BTM_TRACE_DEBUG("Start to generate Local CSRK");
             pp = p_buf;
             /* prepare plain text */
             if (p_text)
@@ -1841,7 +1878,7 @@
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
             if ( btm_cb.devcb.enable_test_local_sign_cntr)
             {
-                BTM_TRACE_DEBUG1 ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr);
+                BTM_TRACE_DEBUG ("Use Test local counter value from script counter_val=%d", btm_cb.devcb.test_local_sign_cntr);
                 UINT32_TO_STREAM(pp, btm_cb.devcb.test_local_sign_cntr);
             }
             else
@@ -1854,7 +1891,7 @@
             /* compute local csrk */
             if (btm_get_local_div(bd_addr, &div))
             {
-                BTM_TRACE_DEBUG1 ("compute_csrk div=%x", div);
+                BTM_TRACE_DEBUG ("compute_csrk div=%x", div);
                 BTM_GetDeviceEncRoot(er);
 
                 /* CSRK = d1(ER, DIV, 1) */
@@ -1863,11 +1900,11 @@
 
                 if (!SMP_Encrypt(er, BT_OCTET16_LEN, temp, 4, &output))
                 {
-                    BTM_TRACE_ERROR0("Local CSRK generation failed ");
+                    BTM_TRACE_ERROR("Local CSRK generation failed ");
                 }
                 else
                 {
-                    BTM_TRACE_DEBUG0("local CSRK generation success");
+                    BTM_TRACE_DEBUG("local CSRK generation success");
                     memcpy((void *)local_csrk, output.param_buf, BT_OCTET16_LEN);
 
 
@@ -1891,15 +1928,15 @@
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
                         if ( btm_cb.devcb.enable_test_mac_val)
                         {
-                            BTM_TRACE_DEBUG0 ("Use MAC value from script");
+                            BTM_TRACE_DEBUG ("Use MAC value from script");
                             memcpy(p_mac, btm_cb.devcb.test_mac, BTM_CMAC_TLEN_SIZE);
                         }
 #endif
                     }
-                    BTM_TRACE_DEBUG1("BTM_BleDataSignature p_mac = %d", p_mac);
-                    BTM_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
+                    BTM_TRACE_DEBUG("BTM_BleDataSignature p_mac = %d", p_mac);
+                    BTM_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
                                      *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
-                    BTM_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
+                    BTM_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
                                      *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
 
                     GKI_freebuf(p_buf);
@@ -1936,19 +1973,19 @@
 
     if (p_rec == NULL || (p_rec && !(p_rec->ble.key_type & BTM_LE_KEY_PCSRK)))
     {
-        BTM_TRACE_ERROR0("can not verify signature for unknown device");
+        BTM_TRACE_ERROR("can not verify signature for unknown device");
     }
     else if (counter < p_rec->ble.keys.counter)
     {
-        BTM_TRACE_ERROR0("signature received with out dated sign counter");
+        BTM_TRACE_ERROR("signature received with out dated sign counter");
     }
     else if (p_orig == NULL)
     {
-        BTM_TRACE_ERROR0("No signature to verify");
+        BTM_TRACE_ERROR("No signature to verify");
     }
     else
     {
-        BTM_TRACE_DEBUG2 ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter);
+        BTM_TRACE_DEBUG ("BTM_BleVerifySignature rcv_cnt=%d >= expected_cnt=%d", counter, p_rec->ble.keys.counter);
 
         if (AES_CMAC(p_rec->ble.keys.csrk, p_orig, len, BTM_CMAC_TLEN_SIZE, p_mac))
         {
@@ -1980,24 +2017,24 @@
 {
     tBTM_BLE_LOCAL_KEYS *p_locak_keys = NULL;
 
-    BTM_TRACE_DEBUG1 ("btm_notify_new_key key_type=%d", key_type);
+    BTM_TRACE_DEBUG ("btm_notify_new_key key_type=%d", key_type);
 
     if (btm_cb.api.p_le_key_callback)
     {
         switch (key_type)
         {
             case BTM_BLE_KEY_TYPE_ID:
-                BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ID");
+                BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ID");
                 p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.id_keys;
                 break;
 
             case BTM_BLE_KEY_TYPE_ER:
-                BTM_TRACE_DEBUG0 ("BTM_BLE_KEY_TYPE_ER");
+                BTM_TRACE_DEBUG ("BTM_BLE_KEY_TYPE_ER");
                 p_locak_keys = (tBTM_BLE_LOCAL_KEYS *)&btm_cb.devcb.er;
                 break;
 
             default:
-                BTM_TRACE_ERROR1("unknown key type: %d", key_type);
+                BTM_TRACE_ERROR("unknown key type: %d", key_type);
                 break;
         }
         if (p_locak_keys != NULL)
@@ -2017,7 +2054,7 @@
 *******************************************************************************/
 static void btm_ble_process_er2(tBTM_RAND_ENC *p)
 {
-    BTM_TRACE_DEBUG0 ("btm_ble_process_er2");
+    BTM_TRACE_DEBUG ("btm_ble_process_er2");
 
     if (p &&p->opcode == HCI_BLE_RAND)
     {
@@ -2026,7 +2063,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("Generating ER2 exception.");
+        BTM_TRACE_ERROR("Generating ER2 exception.");
         memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
     }
 }
@@ -2043,7 +2080,7 @@
 *******************************************************************************/
 static void btm_ble_process_er(tBTM_RAND_ENC *p)
 {
-    BTM_TRACE_DEBUG0 ("btm_ble_process_er");
+    BTM_TRACE_DEBUG ("btm_ble_process_er");
 
     if (p &&p->opcode == HCI_BLE_RAND)
     {
@@ -2052,12 +2089,12 @@
         if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er2))
         {
             memset(&btm_cb.devcb.er, 0, sizeof(BT_OCTET16));
-            BTM_TRACE_ERROR0("Generating ER2 failed.");
+            BTM_TRACE_ERROR("Generating ER2 failed.");
         }
     }
     else
     {
-        BTM_TRACE_ERROR0("Generating ER1 exception.");
+        BTM_TRACE_ERROR("Generating ER1 exception.");
     }
 }
 
@@ -2073,7 +2110,7 @@
 *******************************************************************************/
 static void btm_ble_process_irk(tSMP_ENC *p)
 {
-    BTM_TRACE_DEBUG0 ("btm_ble_process_irk");
+    BTM_TRACE_DEBUG ("btm_ble_process_irk");
     if (p &&p->opcode == HCI_BLE_ENCRYPT)
     {
         memcpy(btm_cb.devcb.id_keys.irk, p->param_buf, BT_OCTET16_LEN);
@@ -2081,13 +2118,13 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("Generating IRK exception.");
+        BTM_TRACE_ERROR("Generating IRK exception.");
     }
 
     /* proceed generate ER */
     if (!btsnd_hcic_ble_rand((void *)btm_ble_process_er))
     {
-        BTM_TRACE_ERROR0("Generating ER failed.");
+        BTM_TRACE_ERROR("Generating ER failed.");
     }
 }
 
@@ -2108,12 +2145,12 @@
     UINT8 btm_ble_irk_pt = 0x01;
     tSMP_ENC output;
 
-    BTM_TRACE_DEBUG0 ("btm_ble_process_dhk");
+    BTM_TRACE_DEBUG ("btm_ble_process_dhk");
 
     if (p && p->opcode == HCI_BLE_ENCRYPT)
     {
         memcpy(btm_cb.devcb.id_keys.dhk, p->param_buf, BT_OCTET16_LEN);
-        BTM_TRACE_DEBUG0("BLE DHK generated.");
+        BTM_TRACE_DEBUG("BLE DHK generated.");
 
         /* IRK = D1(IR, 1) */
         if (!SMP_Encrypt(btm_cb.devcb.id_keys.ir, BT_OCTET16_LEN, &btm_ble_irk_pt,
@@ -2152,7 +2189,7 @@
     UINT8 btm_ble_dhk_pt = 0x03;
     tSMP_ENC output;
 
-    BTM_TRACE_DEBUG0 ("btm_ble_process_ir2");
+    BTM_TRACE_DEBUG ("btm_ble_process_ir2");
 
     if (p && p->opcode == HCI_BLE_RAND)
     {
@@ -2165,7 +2202,7 @@
                     1, &output);
         btm_ble_process_dhk(&output);
 
-        BTM_TRACE_DEBUG0("BLE IR generated.");
+        BTM_TRACE_DEBUG("BLE IR generated.");
     }
     else
     {
@@ -2187,7 +2224,7 @@
 *******************************************************************************/
 static void btm_ble_process_ir(tBTM_RAND_ENC *p)
 {
-    BTM_TRACE_DEBUG0 ("btm_ble_process_ir");
+    BTM_TRACE_DEBUG ("btm_ble_process_ir");
 
     if (p && p->opcode == HCI_BLE_RAND)
     {
@@ -2196,7 +2233,7 @@
 
         if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir2))
         {
-            BTM_TRACE_ERROR0("Generating IR2 failed.");
+            BTM_TRACE_ERROR("Generating IR2 failed.");
             memset(&btm_cb.devcb.id_keys, 0, sizeof(tBTM_BLE_LOCAL_ID_KEYS));
         }
     }
@@ -2213,12 +2250,12 @@
 *******************************************************************************/
 void btm_ble_reset_id( void )
 {
-    BTM_TRACE_DEBUG0 ("btm_ble_reset_id");
+    BTM_TRACE_DEBUG ("btm_ble_reset_id");
 
     /* regenrate Identity Root*/
     if (!btsnd_hcic_ble_rand((void *)btm_ble_process_ir))
     {
-        BTM_TRACE_DEBUG0("Generating IR failed.");
+        BTM_TRACE_DEBUG("Generating IR failed.");
     }
 }
 
@@ -2235,7 +2272,7 @@
 *******************************************************************************/
 void btm_ble_set_no_disc_if_pair_fail(BOOLEAN disable_disc )
 {
-    BTM_TRACE_DEBUG1 ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc);
+    BTM_TRACE_DEBUG ("btm_ble_set_disc_enable_if_pair_fail disable_disc=%d", disable_disc);
     btm_cb.devcb.no_disc_if_pair_fail = disable_disc;
 }
 
@@ -2250,7 +2287,7 @@
 *******************************************************************************/
 void btm_ble_set_test_mac_value(BOOLEAN enable, UINT8 *p_test_mac_val )
 {
-    BTM_TRACE_DEBUG1 ("btm_ble_set_test_mac_value enable=%d", enable);
+    BTM_TRACE_DEBUG ("btm_ble_set_test_mac_value enable=%d", enable);
     btm_cb.devcb.enable_test_mac_val = enable;
     memcpy(btm_cb.devcb.test_mac, p_test_mac_val, BT_OCTET8_LEN);
 }
@@ -2266,7 +2303,7 @@
 *******************************************************************************/
 void btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr )
 {
-    BTM_TRACE_DEBUG2 ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
+    BTM_TRACE_DEBUG ("btm_ble_set_test_local_sign_cntr_value enable=%d local_sign_cntr=%d",
                       enable, test_local_sign_cntr);
     btm_cb.devcb.enable_test_local_sign_cntr = enable;
     btm_cb.devcb.test_local_sign_cntr =  test_local_sign_cntr;
@@ -2286,7 +2323,7 @@
     tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     BOOLEAN     adv_mode = btm_cb.ble_ctr_cb.inq_var.adv_mode ;
 
-    BTM_TRACE_DEBUG0 ("btm_set_random_address");
+    BTM_TRACE_DEBUG ("btm_set_random_address");
 
     if (adv_mode  == BTM_BLE_ADV_ENABLE)
         btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE);
@@ -2299,6 +2336,23 @@
 
 
 }
+
+/*******************************************************************************
+**
+** Function         btm_ble_set_keep_rfu_in_auth_req
+**
+** Description      This function indicates if RFU bits have to be kept as is
+**                  (by default they have to be set to 0 by the sender).
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_set_keep_rfu_in_auth_req(BOOLEAN keep_rfu)
+{
+    BTM_TRACE_DEBUG ("btm_ble_set_keep_rfu_in_auth_req keep_rfus=%d", keep_rfu);
+    btm_cb.devcb.keep_rfu_in_auth_req = keep_rfu;
+}
+
 #endif /* BTM_BLE_CONFORMANCE_TESTING */
 
 #endif /* BLE_INCLUDED */
diff --git a/stack/btm/btm_ble_addr.c b/stack/btm/btm_ble_addr.c
index 3c646e9..e560ee7 100644
--- a/stack/btm/btm_ble_addr.c
+++ b/stack/btm/btm_ble_addr.c
@@ -33,8 +33,8 @@
 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
 #include "btm_ble_int.h"
 #include "smp_api.h"
-#define BTM_BLE_PRIVATE_ADDR_INT    900           /* 15 minutes minimum for
-                                                   random address refreshing */
+
+#include "vendor_ble.h"
 
 /*******************************************************************************
 **
@@ -49,7 +49,7 @@
 static void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p)
 {
     tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
-    BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_cmpl");
+    BTM_TRACE_EVENT ("btm_gen_resolve_paddr_cmpl");
 
     if (p)
     {
@@ -63,15 +63,19 @@
         p_cb->own_addr_type = BLE_ADDR_RANDOM;
 
         /* start a periodical timer to refresh random addr */
-        btu_stop_timer(&p_cb->raddr_timer_ent);
-        btu_start_timer (&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+        btu_stop_timer_oneshot(&p_cb->raddr_timer_ent);
+#if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
+        btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+                         btm_cb.ble_ctr_cb.rpa_tout);
+#else
+        btu_start_timer_oneshot(&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
                          BTM_BLE_PRIVATE_ADDR_INT);
-
+#endif
     }
     else
     {
         /* random address set failure */
-        BTM_TRACE_DEBUG0("set random address failed");
+        BTM_TRACE_DEBUG("set random address failed");
     }
 }
 /*******************************************************************************
@@ -84,13 +88,13 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p)
+void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p)
 {
 #if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
     tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tSMP_ENC    output;
 
-    BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_low");
+    BTM_TRACE_EVENT ("btm_gen_resolve_paddr_low");
     if (p)
     {
         p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK);
@@ -121,11 +125,11 @@
 ** Returns          void
 **
 *******************************************************************************/
-void btm_gen_resolvable_private_addr (void)
+void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback)
 {
-    BTM_TRACE_EVENT0 ("btm_gen_resolvable_private_addr");
+    BTM_TRACE_EVENT ("btm_gen_resolvable_private_addr");
     /* generate 3B rand as BD LSB, SRK with it, get BD MSB */
-    if (!btsnd_hcic_ble_rand((void *)btm_gen_resolve_paddr_low))
+    if (!btsnd_hcic_ble_rand((void *)p_cmd_cplt_cback))
         btm_gen_resolve_paddr_cmpl(NULL);
 }
 /*******************************************************************************
@@ -146,7 +150,7 @@
     UINT8   *pp;
     BD_ADDR     static_random;
 
-    BTM_TRACE_EVENT0 ("btm_gen_non_resolve_paddr_cmpl");
+    BTM_TRACE_EVENT ("btm_gen_non_resolve_paddr_cmpl");
 
     p_cb->p_generate_cback = NULL;
     if (p)
@@ -163,7 +167,7 @@
     }
     else
     {
-        BTM_TRACE_DEBUG0("btm_gen_non_resolvable_private_addr failed");
+        BTM_TRACE_DEBUG("btm_gen_non_resolvable_private_addr failed");
         if (p_cback)
             (* p_cback)(NULL, p_data);
     }
@@ -182,7 +186,7 @@
 {
     tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
 
-    BTM_TRACE_EVENT0 ("btm_gen_non_resolvable_private_addr");
+    BTM_TRACE_EVENT ("btm_gen_non_resolvable_private_addr");
 
     if (p_mgnt_cb->p_generate_cback != NULL)
         return;
@@ -214,7 +218,7 @@
     tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tBTM_SEC_DEV_REC    *p_dev_rec = NULL;
 
-    BTM_TRACE_EVENT1 ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index);
+    BTM_TRACE_EVENT ("btm_ble_resolve_address_cmpl p_mgnt_cb->index = %d", p_mgnt_cb->index);
 
     if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS)
     {
@@ -239,7 +243,7 @@
 {
     tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     UINT8    comp[3];
-    BTM_TRACE_EVENT0 ("btm_ble_proc_resolve_x");
+    BTM_TRACE_EVENT ("btm_ble_proc_resolve_x");
     /* compare the hash with 3 LSB of bd address */
     comp[0] = p_mgnt_cb->random_bda[5];
     comp[1] = p_mgnt_cb->random_bda[4];
@@ -250,7 +254,7 @@
         if (!memcmp(p->param_buf, &comp[0], 3))
         {
             /* match is found */
-            BTM_TRACE_EVENT0 ("match is found");
+            BTM_TRACE_EVENT ("match is found");
             btm_ble_resolve_address_cmpl();
             return TRUE;
         }
@@ -281,15 +285,15 @@
     rand[1] = p_mgnt_cb->random_bda[1];
     rand[2] = p_mgnt_cb->random_bda[0];
 
-    BTM_TRACE_EVENT1("btm_ble_match_random_bda rec_index = %d", rec_index);
+    BTM_TRACE_EVENT("btm_ble_match_random_bda rec_index = %d", rec_index);
 
     if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS)
     {
         p_dev_rec = &btm_cb.sec_dev_rec[rec_index];
 
-        BTM_TRACE_DEBUG2("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type);
+        BTM_TRACE_DEBUG("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type);
 
-        if ((p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) &&
+        if ((p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) &&
             (p_dev_rec->ble.key_type & BTM_LE_KEY_PID))
         {
             /* generate X = E irk(R0, R1, R2) and R is random address 3 LSO */
@@ -325,7 +329,7 @@
 {
     tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
 
-    BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr");
+    BTM_TRACE_EVENT ("btm_ble_resolve_random_addr");
     if ( !p_mgnt_cb->busy)
     {
         p_mgnt_cb->p = p;
@@ -342,7 +346,7 @@
                 /* atch found or went through the list */
                 break;
             }
-	        p_mgnt_cb->index ++;
+            p_mgnt_cb->index ++;
         }
     }
     else
@@ -362,7 +366,7 @@
 tBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr)
 {
     tBTM_SEC_DEV_REC    *p_dev_rec = NULL;
-    BTM_TRACE_EVENT0 ("btm_ble_map_bda_to_conn_bda");
+    BTM_TRACE_EVENT ("btm_ble_map_bda_to_conn_bda");
     if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL &&
         p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
     {
@@ -376,6 +380,148 @@
         return BLE_ADDR_PUBLIC;
 }
 
+/*******************************************************************************
+**
+** Function         btm_find_dev_by_public_static_addr
+**
+** Description      find the security record whose LE static address is matching
+**
+*******************************************************************************/
+tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
+{
+    UINT8               i;
+    tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
+#if BLE_PRIVACY_SPT == TRUE
+    for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
+    {
+        if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
+            BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr))
+        {
+            if ( memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) == 0)
+            {
+                p_dev_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
+                /* found the match */
+                return p_dev_rec;
+            }
+        }
+    }
+#endif
+    return NULL;
+}
+
+/*******************************************************************************
+**
+** Function         btm_public_addr_to_random_pseudo
+**
+** Description      This function map a static BD address to a pseudo random address
+**                  in security database.
+**
+*******************************************************************************/
+BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_public_static_addr(bd_addr);
+
+    BTM_TRACE_EVENT ("btm_public_addr_to_random_pseudo");
+
+    /* evt reported on static address, map static address to random pseudo */
+    if (p_dev_rec  != NULL &&
+        /* static address is not static address */
+        memcmp(p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN) != 0)
+        /* update current random */
+        btm_ble_read_irk_entry(p_dev_rec->ble.static_addr);
+    if (p_dev_rec != NULL)
+    {
+        /* assign the orginal random to be the current report address */
+        memcpy(bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
+        /* always be a resolvable random if a match is found */
+        *p_addr_type = BLE_ADDR_RANDOM;
+
+        BTM_TRACE_ERROR("matched a public/reconnect address and map to random pseudo");
+
+        return TRUE;
+    }
+#endif
+    return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         btm_random_pseudo_to_public
+**
+** Description      This function map a random pseudo address to a public address
+**                  random_pseudo is input and output parameter
+**
+*******************************************************************************/
+BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (random_pseudo);
+
+    if (p_dev_rec != NULL)
+    {
+        if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
+            BTM_BLE_IS_RESOLVE_BDA(p_dev_rec->bd_addr) &&
+            (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0)
+        {
+            BTM_TRACE_EVENT ("btm_random_pseudo_to_public found the puclic static address!");
+            * p_static_addr_type = p_dev_rec->ble.static_addr_type;
+            memcpy(random_pseudo, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
+            return TRUE;
+        }
+    }
+#endif
+    return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_refresh_rra
+**
+** Description      This function refresh the currently used RRA into security
+**                  database and set active connection address.
+**
+*******************************************************************************/
+void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_SEC_DEV_REC    *p_sec_rec = btm_find_dev_by_public_static_addr(static_bda);
+    tACL_CONN           *p_acl = btm_bda_to_acl (p_sec_rec->bd_addr, BT_TRANSPORT_LE);
+    UINT8               rra_dummy = FALSE;
+    BD_ADDR             dummy_bda = {0};
+
+    BTM_TRACE_ERROR("btm_ble_refresh_rra");
+
+    if (memcmp(dummy_bda, rra, BD_ADDR_LEN) == 0)
+        rra_dummy = TRUE;
+
+    /* connection refresh RRA */
+    if (p_acl != NULL /* && memcmp(p_acl->active_remote_addr, dummy_bda, BD_ADDR_LEN) == 0 */)
+    {
+        /* use static address, rra is empty */
+        if (rra_dummy)
+        {
+            p_acl->active_remote_addr_type = p_sec_rec->ble.static_addr_type;
+            memcpy(p_acl->active_remote_addr, p_sec_rec->ble.static_addr, BD_ADDR_LEN);
+        }
+        else
+        {
+            p_acl->active_remote_addr_type = BLE_ADDR_RANDOM;
+            memcpy(p_acl->active_remote_addr, rra, BD_ADDR_LEN);
+        }
+    }
+    /* update security record here, in adv event or connection complete process */
+    if (p_sec_rec != NULL)
+    {
+        memcpy(p_sec_rec->ble.cur_rand_addr, rra, BD_ADDR_LEN);
+        p_sec_rec->ble.active_addr_type = rra_dummy ? BTM_BLE_ADDR_STATIC: BTM_BLE_ADDR_RRA;
+    }
+    else
+    {
+        BTM_TRACE_ERROR("No matching known device in record");
+    }
+#endif
+}
 #endif
 
 
diff --git a/stack/btm/btm_ble_adv_filter.c b/stack/btm/btm_ble_adv_filter.c
new file mode 100644
index 0000000..0784b02
--- /dev/null
+++ b/stack/btm/btm_ble_adv_filter.c
@@ -0,0 +1,1326 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014  Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+#include "vendor_ble.h"
+
+#define BTM_BLE_ADV_FILT_META_HDR_LENGTH 3
+#define BTM_BLE_ADV_FILT_FEAT_SELN_LEN 13
+
+#define BTM_BLE_PF_BIT_TO_MASK(x)          (UINT16)(1 << (x))
+
+
+tBTM_BLE_ADV_FILTER_CB btm_ble_adv_filt_cb;
+tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+static const BD_ADDR     na_bda= {0};
+
+static UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
+                                  UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, UINT8 num_available);
+
+#define BTM_BLE_SET_SCAN_PF_OPCODE(x, y) (((x)<<4)|y)
+#define BTM_BLE_GET_SCAN_PF_SUBCODE(x)    ((x) >> 4)
+#define BTM_BLE_GET_SCAN_PF_ACTION(x)    ((x) & 0x0f)
+#define BTM_BLE_INVALID_COUNTER     0xff
+
+
+/* length of each multi adv sub command */
+#define BTM_BLE_ADV_FILTER_ENB_LEN                       3
+
+/* length of each batch scan command */
+#define BTM_BLE_ADV_FILTER_CLEAR_LEN            3
+#define BTM_BLE_ADV_FILTER_LEN     2
+
+#define BTM_BLE_ADV_FILT_CB_EVT_MASK       0xF0
+#define BTM_BLE_ADV_FILT_SUBCODE_MASK      0x0F
+
+/*******************************************************************************
+**
+** Function         btm_ble_obtain_vsc_details
+**
+** Description      This function obtains the VSC details
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_obtain_vsc_details()
+{
+    tBTM_STATUS st = BTM_SUCCESS;
+
+#if BLE_VND_INCLUDED == TRUE
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    if (0 == cmn_ble_vsc_cb.max_filter)
+    {
+        st = BTM_MODE_UNSUPPORTED;
+        return st;
+    }
+#else
+    cmn_ble_vsc_cb.max_filter = BTM_BLE_MAX_FILTER_COUNTER;
+#endif
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_advfilt_enq_op_q
+**
+** Description      enqueue an adv filter operation in q to check command complete
+**                  status
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_advfilt_enq_op_q(UINT8 action, UINT8 ocf, tBTM_BLE_FILT_CB_EVT cb_evt,
+                              tBTM_BLE_REF_VALUE ref, tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                              tBTM_BLE_PF_PARAM_CBACK  *p_filt_param_cback)
+{
+    btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = (action |(ocf << 4));
+    btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref;
+    btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt;
+    btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] = p_cmpl_cback;
+    btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx]
+        = p_filt_param_cback;
+    BTM_TRACE_DEBUG("btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, cback:%x",
+        btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], action,
+        ocf, cb_evt, p_cmpl_cback);
+    btm_ble_adv_filt_cb.op_q.next_idx = (btm_ble_adv_filt_cb.op_q.next_idx + 1)
+                    % BTM_BLE_PF_TYPE_MAX;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_advfilt_deq_op_q
+**
+** Description      dequeue an adv filter operation from q when command complete
+**                  is received
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_advfilt_deq_op_q(UINT8 *p_action,UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT *p_cb_evt,
+                              tBTM_BLE_REF_VALUE *p_ref, tBTM_BLE_PF_CFG_CBACK ** p_cmpl_cback,
+                              tBTM_BLE_PF_PARAM_CBACK  **p_filt_param_cback)
+{
+    *p_ocf = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >> 4);
+    *p_action = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx]
+                & BTM_BLE_ADV_FILT_SUBCODE_MASK);
+    *p_ref = btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx];
+    *p_cb_evt = btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx];
+    *p_cmpl_cback = btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
+    *p_filt_param_cback =
+        btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
+
+    btm_ble_adv_filt_cb.op_q.pending_idx = (btm_ble_adv_filt_cb.op_q.pending_idx + 1)
+        % BTM_BLE_PF_TYPE_MAX;
+    BTM_TRACE_DEBUG("btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x",
+        *p_ocf,*p_action, *p_ref, *p_cb_evt);
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_condtype_to_ocf
+**
+** Description      Convert cond_type to OCF
+**
+** Returns          Returns ocf value
+**
+*******************************************************************************/
+UINT8 btm_ble_condtype_to_ocf(UINT8 cond_type)
+{
+    UINT8 ocf = 0;
+
+    switch(cond_type)
+    {
+        case BTM_BLE_PF_ADDR_FILTER:
+          ocf = BTM_BLE_META_PF_ADDR;
+          break;
+        case BTM_BLE_PF_SRVC_UUID:
+          ocf = BTM_BLE_META_PF_UUID;
+          break;
+        case BTM_BLE_PF_SRVC_SOL_UUID:
+           ocf = BTM_BLE_META_PF_SOL_UUID;
+           break;
+        case BTM_BLE_PF_LOCAL_NAME:
+           ocf = BTM_BLE_META_PF_LOCAL_NAME;
+           break;
+        case BTM_BLE_PF_MANU_DATA:
+           ocf = BTM_BLE_META_PF_MANU_DATA;
+           break;
+        case BTM_BLE_PF_SRVC_DATA_PATTERN:
+           ocf = BTM_BLE_META_PF_SRVC_DATA;
+           break;
+        case BTM_BLE_PF_TYPE_ALL:
+           ocf = BTM_BLE_META_PF_ALL;
+           break;
+        default:
+           ocf = BTM_BLE_PF_TYPE_MAX;
+           break;
+    }
+    return ocf;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_ocf_to_condtype
+**
+** Description      Convert OCF to cond type
+**
+** Returns          Returns condtype value
+**
+*******************************************************************************/
+UINT8 btm_ble_ocf_to_condtype(UINT8 ocf)
+{
+    UINT8 cond_type = 0;
+
+    switch(ocf)
+    {
+        case BTM_BLE_META_PF_FEAT_SEL:
+           cond_type = BTM_BLE_META_PF_FEAT_SEL;
+           break;
+        case BTM_BLE_META_PF_ADDR:
+          cond_type = BTM_BLE_PF_ADDR_FILTER;
+          break;
+        case BTM_BLE_META_PF_UUID:
+          cond_type = BTM_BLE_PF_SRVC_UUID;
+          break;
+        case BTM_BLE_META_PF_SOL_UUID:
+           cond_type = BTM_BLE_PF_SRVC_SOL_UUID;
+           break;
+        case BTM_BLE_META_PF_LOCAL_NAME:
+           cond_type = BTM_BLE_PF_LOCAL_NAME;
+           break;
+        case BTM_BLE_META_PF_MANU_DATA:
+           cond_type = BTM_BLE_PF_MANU_DATA;
+           break;
+        case BTM_BLE_META_PF_SRVC_DATA:
+           cond_type = BTM_BLE_PF_SRVC_DATA_PATTERN;
+           break;
+        case BTM_BLE_META_PF_ALL:
+           cond_type = BTM_BLE_PF_TYPE_ALL;
+           break;
+        default:
+           cond_type = BTM_BLE_PF_TYPE_MAX;
+           break;
+    }
+    return cond_type;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_scan_pf_cmpl_cback
+**
+** Description      the BTM BLE customer feature VSC complete callback for ADV PF filtering
+**
+** Returns          pointer to the counter if found; NULL otherwise.
+**
+*******************************************************************************/
+void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
+{
+    UINT8  status = 0;
+    UINT8  *p = p_params->p_param_buf, op_subcode = 0, action = 0xff;
+    UINT16  evt_len = p_params->param_len;
+    UINT8   ocf = BTM_BLE_META_PF_ALL, cond_type = 0;
+    UINT8   num_avail = 0, cb_evt = 0;
+    tBTM_BLE_REF_VALUE ref_value = 0;
+    tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback = NULL;
+    tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback = NULL;
+
+    if (evt_len < 3 || evt_len > 4)
+    {
+        BTM_TRACE_ERROR("cannot interpret APCF callback status = %d, length = %d", status, evt_len);
+        btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
+                                 &p_filt_param_cback);
+        return;
+    }
+
+    btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
+                             &p_filt_param_cback);
+
+    STREAM_TO_UINT8(status, p);
+    STREAM_TO_UINT8(op_subcode, p);
+    STREAM_TO_UINT8(action, p);
+
+    /* Ignore the event, if it is not the same one expected */
+    if (3 == evt_len)
+    {
+        if(ocf != op_subcode)
+        {
+             BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, %d",
+                                        ocf, op_subcode, action, evt_len, ref_value, status);
+             return;
+        }
+        else
+        {
+            if(NULL != btm_ble_adv_filt_cb.p_filt_stat_cback)
+               btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value);
+            BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d",
+                                         ocf, action, status, ref_value);
+            return;
+        }
+    }
+
+    if (4 == evt_len && ocf != op_subcode)
+    {
+        BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d",
+                                ocf, op_subcode, action, status, ref_value);
+        return;
+    }
+
+    STREAM_TO_UINT8(num_avail, p);
+    switch (op_subcode)
+    {
+        case BTM_BLE_META_PF_ADDR:
+        case BTM_BLE_META_PF_UUID:
+        case BTM_BLE_META_PF_SOL_UUID:
+        case BTM_BLE_META_PF_LOCAL_NAME:
+        case BTM_BLE_META_PF_MANU_DATA:
+        case BTM_BLE_META_PF_SRVC_DATA:
+           cond_type = btm_ble_ocf_to_condtype(ocf);
+           BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", op_subcode,
+                                        ocf, action, status, ref_value, num_avail);
+           if (HCI_SUCCESS == status)
+           {
+               if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0)
+                   btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
+               else
+                   btm_ble_cs_update_pf_counter(action, cond_type,
+                            &btm_ble_adv_filt_cb.cur_filter_target, num_avail);
+           }
+
+           /* send ADV PF operation complete */
+           btm_ble_adv_filt_cb.op_type = 0;
+           break;
+
+        case BTM_BLE_META_PF_FEAT_SEL:
+            BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d",
+                                action, status, ref_value, num_avail);
+            break;
+
+        default:
+            BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", op_subcode);
+            break;
+    }
+
+    switch(cb_evt)
+    {
+        BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d", cb_evt);
+        case BTM_BLE_FILT_CFG:
+            if(NULL != p_scan_cfg_cback)
+               p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value);
+            break;
+        case BTM_BLE_FILT_ADV_PARAM:
+            if(NULL != p_filt_param_cback)
+               p_filt_param_cback(action, num_avail, ref_value, status);
+            break;
+        default:
+            break;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_find_addr_filter_counter
+**
+** Description      find the per bd address ADV payload filter counter by BD_ADDR.
+**
+** Returns          pointer to the counter if found; NULL otherwise.
+**
+*******************************************************************************/
+tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
+{
+    UINT8               i;
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+
+    if (p_le_bda == NULL)
+        return &btm_ble_adv_filt_cb.p_addr_filter_count[0];
+
+    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+    {
+        if (p_addr_filter->in_use &&
+            memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
+        {
+            return p_addr_filter;
+        }
+    }
+    return NULL;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_alloc_addr_filter_counter
+**
+** Description      allocate the per device adv payload filter counter.
+**
+** Returns          pointer to the counter if allocation succeed; NULL otherwise.
+**
+*******************************************************************************/
+tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
+{
+    UINT8               i;
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+
+    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+    {
+        if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
+        {
+            memcpy(p_addr_filter->bd_addr, bd_addr, BD_ADDR_LEN);
+            p_addr_filter->in_use = TRUE;
+            return p_addr_filter;
+        }
+    }
+    return NULL;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_dealloc_addr_filter_counter
+**
+** Description      de-allocate the per device adv payload filter counter.
+**
+** Returns          TRUE if deallocation succeed; FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
+{
+    UINT8               i;
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
+    BOOLEAN             found = FALSE;
+
+    if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr)
+        memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
+
+    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
+    {
+        if ((p_addr_filter->in_use) && (NULL == p_bd_addr ||
+            (NULL != p_bd_addr &&
+            memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)))
+        {
+            found = TRUE;
+            memset(p_addr_filter, 0, sizeof(tBTM_BLE_PF_COUNT));
+
+            if (NULL != p_bd_addr) break;
+        }
+    }
+    return found;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_update_pf_local_name
+**
+** Description      this function update(add,delete or clear) the adv lcoal name filtering condition.
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
+                                         tBTM_BLE_PF_FILT_INDEX filt_index,
+                                         tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+    tBTM_BLE_PF_LOCAL_NAME_COND *p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name;
+    UINT8       param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+                *p = param,
+                len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+
+    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+    UINT8_TO_STREAM(p, BTM_BLE_META_PF_LOCAL_NAME);
+    UINT8_TO_STREAM(p, action);
+
+    /* Filter index */
+    UINT8_TO_STREAM(p, filt_index);
+
+    if (BTM_BLE_SCAN_COND_ADD == action ||
+        BTM_BLE_SCAN_COND_DELETE == action)
+    {
+        if (NULL == p_local_name)
+            return st;
+
+        if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX)
+            p_local_name->data_len = BTM_BLE_PF_STR_LEN_MAX;
+
+        ARRAY_TO_STREAM(p, p_local_name->p_data, p_local_name->data_len);
+        len += p_local_name->data_len;
+    }
+
+    /* send local name filter */
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                              len,
+                              param,
+                              btm_ble_scan_pf_cmpl_cback))
+            != BTM_NO_RESOURCES)
+    {
+        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Local Name PF filter update failed");
+    }
+
+    return st;
+}
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_update_srvc_data_change
+**
+** Description      this function update(add/remove) service data change filter.
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action,
+                                       tBTM_BLE_PF_FILT_INDEX filt_index,
+                                       tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+    tBLE_BD_ADDR   *p_bd_addr = p_cond ? &p_cond->target_addr : NULL;
+    UINT8           num_avail = (action == BTM_BLE_SCAN_COND_ADD) ? 0 : 1;
+
+    if (btm_ble_cs_update_pf_counter (action, BTM_BLE_PF_SRVC_DATA, p_bd_addr, num_avail)
+                    != BTM_BLE_INVALID_COUNTER)
+        st = BTM_SUCCESS;
+
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_update_pf_manu_data
+**
+** Description      this function update(add,delete or clear) the adv manufacturer
+**                  data filtering condition.
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
+                                        tBTM_BLE_PF_FILT_INDEX filt_index,
+                                        tBTM_BLE_PF_COND_PARAM *p_data,
+                                        tBTM_BLE_PF_COND_TYPE cond_type,
+                                        tBTM_BLE_FILT_CB_EVT cb_evt,
+                                        tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_BLE_PF_MANU_COND *p_manu_data = (p_data == NULL) ? NULL : &p_data->manu_data;
+    tBTM_BLE_PF_SRVC_PATTERN_COND *p_srvc_data = (p_data == NULL) ? NULL : &p_data->srvc_data;
+
+    UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+          *p = param,
+          len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+
+    if (NULL == p_data)
+        return st;
+
+    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX
+                    + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+    if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+    {
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA);
+    }
+    else
+    {
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_MANU_DATA);
+    }
+
+    UINT8_TO_STREAM(p, action);
+
+    /* Filter index */
+    UINT8_TO_STREAM(p, filt_index);
+
+    if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action)
+    {
+        if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+        {
+            if (NULL == p_srvc_data)
+                return st;
+            if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
+                p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
+
+            if (p_srvc_data->data_len > 0)
+            {
+                ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
+                len += (p_srvc_data->data_len);
+                ARRAY_TO_STREAM(p, p_srvc_data->p_pattern_mask, p_srvc_data->data_len);
+            }
+
+            len += (p_srvc_data->data_len);
+            BTM_TRACE_DEBUG("Service data length: %d", len);
+        }
+        else
+        {
+            if (NULL == p_manu_data)
+            {
+                BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data");
+                return st;
+            }
+            BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d",
+                                    p_manu_data->data_len);
+            if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
+                p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
+
+            UINT16_TO_STREAM(p, p_manu_data->company_id);
+            if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
+            {
+                ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
+                len += (p_manu_data->data_len + 2);
+            }
+            else
+                len += 2;
+
+            if (p_manu_data->company_id_mask != 0)
+            {
+                UINT16_TO_STREAM (p, p_manu_data->company_id_mask);
+            }
+            else
+            {
+                memset(p, 0xff, 2);
+                p += 2;
+            }
+            len += 2;
+
+            if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
+            {
+                ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
+                len += (p_manu_data->data_len);
+            }
+
+            BTM_TRACE_DEBUG("Manuf data length: %d", len);
+        }
+    }
+
+    /* send manufacturer*/
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                              len,
+                              param,
+                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+    {
+        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+    }
+    else
+    {
+        BTM_TRACE_ERROR("manufacturer data PF filter update failed");
+    }
+
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_cs_update_pf_counter
+**
+** Description      this function is to update the adv data payload filter counter
+**
+** Returns          current number of the counter; BTM_BLE_INVALID_COUNTER if
+**                  counter update failed.
+**
+*******************************************************************************/
+UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
+                                  UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr,
+                                  UINT8 num_available)
+{
+    tBTM_BLE_PF_COUNT   *p_addr_filter = NULL;
+    UINT8               *p_counter = NULL;
+
+    btm_ble_obtain_vsc_details();
+
+    if (cond_type > BTM_BLE_PF_TYPE_ALL)
+    {
+        BTM_TRACE_ERROR("unknown PF filter condition type %d", cond_type);
+        return BTM_BLE_INVALID_COUNTER;
+    }
+
+    /* for these three types of filter, always generic */
+    if (BTM_BLE_PF_ADDR_FILTER == cond_type ||
+        BTM_BLE_PF_MANU_DATA == cond_type ||
+        BTM_BLE_PF_LOCAL_NAME == cond_type ||
+        BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
+        p_bd_addr = NULL;
+
+    if ((p_addr_filter = btm_ble_find_addr_filter_counter(p_bd_addr)) == NULL &&
+        BTM_BLE_SCAN_COND_ADD == action)
+    {
+        p_addr_filter = btm_ble_alloc_addr_filter_counter(p_bd_addr->bda);
+    }
+
+    if (NULL != p_addr_filter)
+    {
+        /* all filter just cleared */
+        if ((BTM_BLE_PF_TYPE_ALL == cond_type && BTM_BLE_SCAN_COND_CLEAR == action) ||
+            /* or bd address filter been deleted */
+            (BTM_BLE_PF_ADDR_FILTER == cond_type &&
+             (BTM_BLE_SCAN_COND_DELETE == action || BTM_BLE_SCAN_COND_CLEAR == action)))
+        {
+            btm_ble_dealloc_addr_filter_counter(p_bd_addr, cond_type);
+        }
+        /* if not feature selection, update new addition/reduction of the filter counter */
+        else if (cond_type != BTM_BLE_PF_TYPE_ALL)
+        {
+            p_counter = p_addr_filter->pf_counter;
+            if (num_available > 0)
+                p_counter[cond_type] += 1;
+
+            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d",
+                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available);
+            return p_counter[cond_type];
+        }
+    }
+    else
+    {
+        BTM_TRACE_ERROR("no matching filter counter found");
+    }
+    /* no matching filter located and updated */
+    return BTM_BLE_INVALID_COUNTER;
+}
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_update_addr_filter
+**
+** Description      this function update(add,delete or clear) the address filter of adv.
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
+                                       tBTM_BLE_PF_FILT_INDEX filt_index,
+                                       tBTM_BLE_PF_COND_PARAM *p_cond)
+{
+    UINT8       param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+                * p= param;
+    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+    tBLE_BD_ADDR *p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr;
+
+    memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+    UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
+    UINT8_TO_STREAM(p, action);
+
+    /* Filter index */
+    UINT8_TO_STREAM(p, filt_index);
+
+    if (BTM_BLE_SCAN_COND_ADD == action ||
+        BTM_BLE_SCAN_COND_DELETE == action)
+    {
+        if (NULL == p_addr)
+            return st;
+
+        BDADDR_TO_STREAM(p, p_addr->bda);
+        UINT8_TO_STREAM(p, p_addr->type);
+    }
+    /* send address filter */
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                              (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
+                              param,
+                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+    {
+        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Broadcaster Address Filter Update failed");
+    }
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_update_uuid_filter
+**
+** Description      this function update(add,delete or clear) service UUID filter.
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
+                                       tBTM_BLE_PF_FILT_INDEX filt_index,
+                                       tBTM_BLE_PF_COND_TYPE filter_type,
+                                       tBTM_BLE_PF_COND_PARAM *p_cond,
+                                       tBTM_BLE_FILT_CB_EVT cb_evt,
+                                       tBTM_BLE_REF_VALUE ref_value)
+{
+    UINT8       param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
+                * p= param,
+                len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
+    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
+    tBTM_BLE_PF_UUID_COND *p_uuid_cond;
+    UINT8           evt_type;
+
+    memset(param, 0, BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
+
+    if (BTM_BLE_PF_SRVC_UUID == filter_type)
+    {
+        evt_type = BTM_BLE_META_PF_UUID;
+        p_uuid_cond = p_cond ? &p_cond->srvc_uuid : NULL;
+    }
+    else
+    {
+        evt_type = BTM_BLE_META_PF_SOL_UUID;
+        p_uuid_cond = p_cond ? &p_cond->solicitate_uuid : NULL;
+    }
+
+    if (NULL == p_uuid_cond && action != BTM_BLE_SCAN_COND_CLEAR)
+    {
+        BTM_TRACE_ERROR("Illegal param for add/delete UUID filter");
+        return st;
+    }
+
+    /* need to add address filter first, if adding per bda UUID filter without address filter */
+    if (BTM_BLE_SCAN_COND_ADD == action && NULL != p_uuid_cond &&
+        p_uuid_cond->p_target_addr &&
+        btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL)
+    {
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
+        UINT8_TO_STREAM(p, action);
+
+        /* Filter index */
+        UINT8_TO_STREAM(p, filt_index);
+
+        BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
+        UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
+
+        /* send address filter */
+        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                                  (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
+                                  param,
+                                  btm_ble_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES)
+        {
+            BTM_TRACE_ERROR("Update Address filter into controller failed.");
+            return st;
+        }
+
+        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_ADDR, cb_evt, ref_value, NULL, NULL);
+        BTM_TRACE_DEBUG("Updated Address filter");
+    }
+
+    p = param;
+    UINT8_TO_STREAM(p, evt_type);
+    UINT8_TO_STREAM(p, action);
+
+    /* Filter index */
+    UINT8_TO_STREAM(p, filt_index);
+
+    if ((BTM_BLE_SCAN_COND_ADD == action ||
+        BTM_BLE_SCAN_COND_DELETE == action) &&
+        NULL != p_uuid_cond)
+    {
+        if (p_uuid_cond->uuid.len == LEN_UUID_16)
+        {
+            UINT16_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid16);
+            len += LEN_UUID_16;
+        }
+        else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
+        {
+            UINT32_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid32);
+            len += LEN_UUID_32;
+        }
+        else if (p_uuid_cond->uuid.len == LEN_UUID_128)
+        {
+            ARRAY_TO_STREAM (p, p_uuid_cond->uuid.uu.uuid128, LEN_UUID_128);
+            len += LEN_UUID_128;
+        }
+        else
+        {
+            BTM_TRACE_ERROR("illegal UUID length: %d", p_uuid_cond->uuid.len);
+            return BTM_ILLEGAL_VALUE;
+        }
+
+        if (NULL != p_uuid_cond->p_uuid_mask)
+        {
+            if (p_uuid_cond->uuid.len == LEN_UUID_16)
+            {
+                UINT16_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid16_mask);
+                len += LEN_UUID_16;
+            }
+            else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
+            {
+                UINT32_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid32_mask);
+                len += LEN_UUID_32;
+            }
+            else if (p_uuid_cond->uuid.len == LEN_UUID_128)
+            {
+                ARRAY_TO_STREAM (p, p_uuid_cond->p_uuid_mask->uuid128_mask, LEN_UUID_128);
+                len += LEN_UUID_128;
+            }
+        }
+        else
+        {
+            memset(p, 0xff, p_uuid_cond->uuid.len);
+            len += p_uuid_cond->uuid.len;
+        }
+        BTM_TRACE_DEBUG("btm_ble_update_uuid_filter : %d, %d, %d, %d", filter_type, evt_type,
+                        p_uuid_cond->uuid.len, len);
+    }
+
+    /* send UUID filter update */
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                              len,
+                              param,
+                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
+    {
+        if (p_uuid_cond && p_uuid_cond->p_target_addr)
+            memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr,
+                    sizeof(tBLE_BD_ADDR));
+        else
+            memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+    }
+    else
+    {
+        BTM_TRACE_ERROR("UUID filter udpating failed");
+    }
+
+    return st;
+}
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_clear_scan_pf_filter
+**
+** Description      clear all adv payload filter by de-select all the adv pf feature bits
+**
+**
+** Returns          BTM_SUCCESS if sucessful,
+**                  BTM_ILLEGAL_VALUE if paramter is not valid.
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
+                                       tBTM_BLE_PF_FILT_INDEX filt_index,
+                                       tBTM_BLE_PF_COND_PARAM *p_cond,
+                                       tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                                       tBTM_BLE_FILT_CB_EVT cb_evt,
+                                       tBTM_BLE_REF_VALUE ref_value)
+{
+    tBLE_BD_ADDR *p_target = (p_cond == NULL)? NULL : &p_cond->target_addr;
+    tBTM_BLE_PF_COUNT *p_bda_filter;
+    tBTM_STATUS     st = BTM_WRONG_MODE;
+    UINT8           param[20], *p;
+
+    if (BTM_BLE_SCAN_COND_CLEAR != action)
+    {
+        BTM_TRACE_ERROR("unable to perform action:%d for generic adv filter type", action);
+        return BTM_ILLEGAL_VALUE;
+    }
+
+    p = param;
+    memset(param, 0, 20);
+
+    p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
+
+    if (NULL == p_bda_filter ||
+        /* not a generic filter */
+        (p_target != NULL && p_bda_filter))
+    {
+        BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!");
+        return st;
+    }
+
+    /* clear the general filter entry */
+    if (NULL == p_target)
+    {
+        /* clear manufactuer data filter */
+        st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+                                    BTM_BLE_PF_MANU_DATA, cb_evt, ref_value);
+        if(BTM_CMD_STARTED == st)
+           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt,
+                                    ref_value, NULL, NULL);
+
+        /* clear local name filter */
+        st = btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
+        if(BTM_CMD_STARTED == st)
+           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt,
+                                    ref_value, NULL, NULL);
+
+        /* update the counter for service data */
+        st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
+
+        /* clear UUID filter */
+        st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+                                   BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, ref_value);
+        if(BTM_CMD_STARTED == st)
+           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, NULL, NULL);
+
+        st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
+                                   BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, ref_value);
+        if(BTM_CMD_STARTED == st)
+           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt,
+                                    ref_value, NULL, NULL);
+
+        /* clear service data filter */
+        st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
+                                    BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, ref_value);
+        if(BTM_CMD_STARTED == st)
+           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt,
+                                    ref_value, NULL, NULL);
+    }
+
+    /* select feature based on control block settings */
+    UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+    UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
+
+    /* Filter index */
+    UINT8_TO_STREAM(p, filt_index);
+
+    /* set PCF selection */
+    UINT32_TO_STREAM(p, BTM_BLE_PF_SELECT_NONE);
+    /* set logic condition as OR as default */
+    UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
+
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                               (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
+                                param,
+                                btm_ble_scan_pf_cmpl_cback))
+            != BTM_NO_RESOURCES)
+    {
+        if (p_target)
+            memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
+        else
+            memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
+    }
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleAdvFilterParamSetup
+**
+** Description      This function is called to setup the adv data payload filter
+**                  condition.
+**
+** Parameters       action - Type of action to be performed
+**                       filt_index - Filter index
+**                       p_filt_params - Filter parameters
+**                       p_target - Target device
+**                       p_cmpl_back - Callback pointer
+**                       ref_value - reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_index,
+                                tBTM_BLE_PF_FILT_PARAMS *p_filt_params,
+                                tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+                                tBTM_BLE_REF_VALUE ref_value)
+{
+    UINT8           param[20], *p;
+    tBTM_STATUS     st = BTM_WRONG_MODE;
+    tBTM_BLE_PF_COUNT *p_bda_filter = NULL;
+    UINT8 len =0;
+
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+        return st;
+
+    p = param;
+    memset(param, 0, 20);
+    BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup");
+
+    if (BTM_BLE_SCAN_COND_ADD == action)
+    {
+        p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
+        if (NULL == p_bda_filter)
+        {
+           BTM_TRACE_ERROR("BD Address not found!");
+           return st;
+        }
+
+        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln);
+        /* select feature based on control block settings */
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
+
+        /* Filter index */
+        UINT8_TO_STREAM(p, filt_index);
+
+        /* set PCF selection */
+        UINT16_TO_STREAM(p, p_filt_params->feat_seln);
+        /* set logic type */
+        UINT16_TO_STREAM(p, p_filt_params->logic_type);
+        /* set logic condition */
+        UINT8_TO_STREAM(p, p_filt_params->filt_logic_type);
+        /* set RSSI high threshold */
+        UINT8_TO_STREAM(p, p_filt_params->rssi_high_thres);
+        /* set delivery mode */
+        UINT8_TO_STREAM(p, p_filt_params->dely_mode);
+
+        if (0x01 == p_filt_params->dely_mode)
+        {
+            /* set onfound timeout */
+            UINT16_TO_STREAM(p, p_filt_params->found_timeout);
+            /* set onfound timeout count*/
+            UINT8_TO_STREAM(p, p_filt_params->found_timeout_cnt);
+            /* set RSSI low threshold */
+            UINT8_TO_STREAM(p, p_filt_params->rssi_low_thres);
+            /* set onlost timeout */
+            UINT16_TO_STREAM(p, p_filt_params->lost_timeout);
+        }
+
+        len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN;
+
+        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                                (UINT8)len,
+                                 param,
+                                 btm_ble_scan_pf_cmpl_cback))
+               == BTM_NO_RESOURCES)
+        {
+            return st;
+        }
+        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM,
+                                 ref_value, NULL, p_cmpl_cback);
+    }
+    else
+    if (BTM_BLE_SCAN_COND_DELETE == action)
+    {
+        /* select feature based on control block settings */
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_DELETE);
+        /* Filter index */
+        UINT8_TO_STREAM(p, filt_index);
+
+        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                                (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH),
+                                 param,
+                                 btm_ble_scan_pf_cmpl_cback))
+               == BTM_NO_RESOURCES)
+        {
+            return st;
+        }
+        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,  BTM_BLE_FILT_ADV_PARAM,
+                                 ref_value, NULL, p_cmpl_cback);
+    }
+    else
+    if (BTM_BLE_SCAN_COND_CLEAR == action)
+    {
+        /* Deallocate all filters here */
+        btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
+
+        /* select feature based on control block settings */
+        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
+        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
+
+        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                                (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH-1),
+                                 param,
+                                 btm_ble_scan_pf_cmpl_cback))
+               == BTM_NO_RESOURCES)
+        {
+            return st;
+        }
+        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,  BTM_BLE_FILT_ADV_PARAM,
+                                 ref_value, NULL, p_cmpl_cback);
+    }
+
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleEnableDisableFilterFeature
+**
+** Description      This function is called to enable / disable the APCF feature
+**
+** Parameters  enable the generic scan condition.
+**                  enable: enable or disable the filter condition
+**                  p_stat_cback - Status callback pointer
+**                  ref_value   - Ref value
+** Returns          void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
+                                     tBTM_BLE_PF_STATUS_CBACK *p_stat_cback,
+                                     tBTM_BLE_REF_VALUE ref_value)
+{
+    UINT8           param[20], *p;
+    tBTM_STATUS     st = BTM_WRONG_MODE;
+
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+       return st;
+
+    p = param;
+    memset(param, 0, 20);
+
+    /* enable the content filter in controller */
+    p = param;
+    UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
+    /* enable adv data payload filtering */
+    UINT8_TO_STREAM(p, enable);
+
+    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
+                              BTM_BLE_PCF_ENABLE_LEN, param,
+                              btm_ble_scan_pf_cmpl_cback)) == BTM_CMD_STARTED)
+    {
+         btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback;
+         btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, BTM_BLE_FILT_ENABLE_DISABLE,
+                                  ref_value, NULL, NULL);
+    }
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleCfgFilterCondition
+**
+** Description      This function is called to configure the adv data payload filter
+**                  condition.
+**
+** Parameters       action: to read/write/clear
+**                  cond_type: filter condition type.
+**                  filt_index - Filter index
+**                  p_cond: filter condition parameter
+**                  p_cmpl_cback  - Config callback pointer
+**                  ref_value - Reference value
+**
+** Returns          void
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+                                      tBTM_BLE_PF_COND_TYPE cond_type,
+                                      tBTM_BLE_PF_FILT_INDEX filt_index,
+                                      tBTM_BLE_PF_COND_PARAM *p_cond,
+                                      tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                                      tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     st = BTM_ILLEGAL_VALUE;
+    UINT8 ocf = 0;
+    BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action,
+                        cond_type, filt_index);
+
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+        return st;
+
+    switch (cond_type)
+    {
+        /* write service data filter */
+        case BTM_BLE_PF_SRVC_DATA_PATTERN:
+        /* write manufacturer data filter */
+        case BTM_BLE_PF_MANU_DATA:
+            st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, ref_value);
+            break;
+
+        /* write local name filter */
+        case BTM_BLE_PF_LOCAL_NAME:
+            st = btm_ble_update_pf_local_name(action, filt_index, p_cond);
+            break;
+
+        /* filter on advertiser address */
+        case BTM_BLE_PF_ADDR_FILTER:
+            st = btm_ble_update_addr_filter(action, filt_index, p_cond);
+            break;
+
+        /* filter on service/solicitated UUID */
+        case BTM_BLE_PF_SRVC_UUID:
+        case BTM_BLE_PF_SRVC_SOL_UUID:
+            st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, ref_value);
+            break;
+
+        case BTM_BLE_PF_SRVC_DATA:
+            st = btm_ble_update_srvc_data_change(action, filt_index, p_cond);
+            break;
+
+        case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */
+            st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, p_cmpl_cback,
+                                              0, ref_value);
+            break;
+
+        default:
+            BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type);
+            break;
+    }
+
+    if(BTM_CMD_STARTED == st && cond_type != BTM_BLE_PF_TYPE_ALL)
+    {
+       ocf = btm_ble_condtype_to_ocf(cond_type);
+       btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, p_cmpl_cback, NULL);
+    }
+    else
+    if(BTM_CMD_STARTED == st && BTM_BLE_PF_TYPE_ALL == cond_type)
+    {
+       btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG,
+                                ref_value, p_cmpl_cback, NULL);
+    }
+    return st;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_adv_filter_init
+**
+** Description      This function initializes the adv filter control block
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_init(void)
+{
+    memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+       return;
+
+    if (cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filt_cb.p_addr_filter_count =
+            (tBTM_BLE_PF_COUNT*) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter);
+    }
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_adv_filter_cleanup
+**
+** Description      This function de-initializes the adv filter control block
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_cleanup(void)
+{
+    if (btm_ble_adv_filt_cb.p_addr_filter_count)
+        GKI_freebuf (btm_ble_adv_filt_cb.p_addr_filter_count);
+}
+
+#endif
diff --git a/stack/btm/btm_ble_batchscan.c b/stack/btm/btm_ble_batchscan.c
new file mode 100644
index 0000000..7ae4b1e
--- /dev/null
+++ b/stack/btm/btm_ble_batchscan.c
@@ -0,0 +1,929 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#include <string.h>
+#include <stdio.h>
+#include <stddef.h>
+#include "bt_target.h"
+
+#include "btm_ble_api.h"
+#include "bt_types.h"
+#include "bt_utils.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "hcimsgs.h"
+
+#if (BLE_INCLUDED == TRUE)
+
+tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
+tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
+
+
+/* length of each batch scan command */
+#define BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN      4
+#define BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN    12
+#define BTM_BLE_BATCH_SCAN_ENB_DISB_LEN         2
+#define BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN     2
+
+#define BTM_BLE_BATCH_SCAN_CB_EVT_MASK       0xF0
+#define BTM_BLE_BATCH_SCAN_SUBCODE_MASK      0x0F
+
+#define BTM_BLE_TRACK_ADV_CMD_LEN               9
+
+/*******************************************************************************
+**  Local functions
+*******************************************************************************/
+void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params);
+void btm_ble_batchscan_cleanup(void);
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_filter_track_adv_vse_cback
+**
+** Description      VSE callback for batch scan, filter, and tracking events.
+**
+** Returns          None
+**
+*******************************************************************************/
+void btm_ble_batchscan_filter_track_adv_vse_cback(UINT8 len, UINT8 *p)
+{
+    UINT8   sub_event = 0, filt_index = 0, addr_type = 0, adv_state = 0;
+    BD_ADDR bd_addr;
+    STREAM_TO_UINT8(sub_event, p);
+
+    BTM_TRACE_EVENT("btm_ble_batchscan_filter_track_adv_vse_cback called with event:%x", sub_event);
+    if (HCI_VSE_SUBCODE_BLE_THRESHOLD_SUB_EVT == sub_event &&
+        NULL != ble_batchscan_cb.p_thres_cback)
+    {
+        ble_batchscan_cb.p_thres_cback(ble_batchscan_cb.ref_value);
+        return;
+    }
+
+    if (HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT == sub_event && NULL != ble_advtrack_cb.p_track_cback)
+    {
+        if (len < 10)
+            return;
+        STREAM_TO_UINT8(filt_index, p);
+        STREAM_TO_UINT8(addr_type, p);
+        STREAM_TO_BDADDR(bd_addr, p);
+        STREAM_TO_UINT8(adv_state, p);
+        BTM_TRACE_EVENT("track_adv_vse_cback called: %d, %d, %d", filt_index, addr_type, adv_state);
+        ble_advtrack_cb.p_track_cback(filt_index, addr_type, bd_addr, adv_state,
+            ble_advtrack_cb.ref_value);
+        return;
+    }
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_enq_op_q
+**
+** Description      enqueue a batchscan operation in q to check command complete
+**                  status
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_enq_op_q(UINT8 opcode, tBTM_BLE_BATCH_SCAN_STATE cur_state,
+                                          UINT8 cb_evt, tBTM_BLE_REF_VALUE ref_value)
+{
+    ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx] = (opcode |(cb_evt << 4));
+    ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx] = cur_state;
+    ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx] = ref_value;
+    BTM_TRACE_DEBUG("btm_ble_batchscan_enq_op_q: subcode:%d, Cur_state:%d, ref_value:%d",
+        ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.next_idx],
+        ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.next_idx],
+        ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.next_idx]);
+    ble_batchscan_cb.op_q.next_idx = (ble_batchscan_cb.op_q.next_idx + 1)
+                                        % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_enq_rep_q
+**
+** Description      enqueue a batchscan report operation in q to check command complete
+**                  status
+**
+** Returns          void
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_batchscan_enq_rep_q(UINT8 report_format, tBTM_BLE_REF_VALUE ref_value)
+{
+    int i = 0;
+    for (i = 0; i < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; i++)
+    {
+        if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[i])
+            return BTM_ILLEGAL_VALUE;
+    }
+
+    ble_batchscan_cb.main_rep_q.rep_mode[ble_batchscan_cb.main_rep_q.next_idx] = report_format;
+    ble_batchscan_cb.main_rep_q.ref_value[ble_batchscan_cb.main_rep_q.next_idx] = ref_value;
+    ble_batchscan_cb.main_rep_q.num_records[ble_batchscan_cb.main_rep_q.next_idx] = 0;
+    ble_batchscan_cb.main_rep_q.data_len[ble_batchscan_cb.main_rep_q.next_idx] = 0;
+    ble_batchscan_cb.main_rep_q.p_data[ble_batchscan_cb.main_rep_q.next_idx] = NULL;
+    BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_q: index:%d, rep %d, ref %d",
+            ble_batchscan_cb.main_rep_q.next_idx, report_format, ref_value);
+
+    ble_batchscan_cb.main_rep_q.next_idx = (ble_batchscan_cb.main_rep_q.next_idx + 1)
+                                            % BTM_BLE_BATCH_REP_MAIN_Q_SIZE;
+    return BTM_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_enq_rep_data
+**
+** Description      setup the data in the main report queue
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_enq_rep_data(UINT8 report_format, UINT8 num_records, UINT8 *p_data,
+                                    UINT8 data_len)
+{
+    int index = 0, len = 0;
+    UINT8 *p_orig_data = NULL, *p_app_data = NULL;
+
+    for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+    {
+        if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index])
+            break;
+    }
+
+    BTM_TRACE_DEBUG("btm_ble_batchscan_enq_rep_data: index:%d, rep %d, num %d len : %d",
+        index, report_format, num_records, data_len);
+
+    if (index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE && data_len > 0 && num_records > 0)
+    {
+        len = ble_batchscan_cb.main_rep_q.data_len[index];
+        p_orig_data = ble_batchscan_cb.main_rep_q.p_data[index];
+        if (NULL != p_orig_data)
+        {
+            p_app_data = GKI_getbuf(len + data_len);
+            memcpy(p_app_data, p_orig_data, len);
+            memcpy(p_app_data+len, p_data, data_len);
+            GKI_freebuf(p_orig_data);
+            ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
+            ble_batchscan_cb.main_rep_q.num_records[index] += num_records;
+            ble_batchscan_cb.main_rep_q.data_len[index] += data_len;
+        }
+        else
+        {
+            p_app_data = GKI_getbuf(data_len);
+            memcpy(p_app_data, p_data, data_len);
+            ble_batchscan_cb.main_rep_q.p_data[index] = p_app_data;
+            ble_batchscan_cb.main_rep_q.num_records[index] = num_records;
+            ble_batchscan_cb.main_rep_q.data_len[index] = data_len;
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_deq_rep_q
+**
+** Description      dequeue a batchscan report  in q when command complete
+**                  is received
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_deq_rep_data(UINT8 report_format, tBTM_BLE_REF_VALUE *p_ref_value,
+                                 UINT8 *p_num_records, UINT8 **p_data, UINT16 *p_data_len)
+{
+    int index = 0;
+
+    for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+    {
+        if (report_format == ble_batchscan_cb.main_rep_q.rep_mode[index])
+            break;
+    }
+
+    if (BTM_BLE_BATCH_REP_MAIN_Q_SIZE == index)
+    {
+        BTM_TRACE_ERROR("btm_ble_batchscan_deq_rep_data: rep_format:%d not found", report_format);
+        return;
+    }
+
+    *p_num_records = ble_batchscan_cb.main_rep_q.num_records[index];
+    *p_ref_value = ble_batchscan_cb.main_rep_q.ref_value[index];
+    *p_data = ble_batchscan_cb.main_rep_q.p_data[index];
+    *p_data_len = ble_batchscan_cb.main_rep_q.data_len[index];
+
+    ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
+    ble_batchscan_cb.main_rep_q.data_len[index] = 0;
+    ble_batchscan_cb.main_rep_q.rep_mode[index] = 0;
+    ble_batchscan_cb.main_rep_q.ref_value[index] = 0;
+    ble_batchscan_cb.main_rep_q.num_records[index] = 0;
+
+    BTM_TRACE_DEBUG("btm_ble_batchscan_deq_rep_data: index:%d, rep %d, num %d, data_len %d",
+        index, report_format, *p_num_records, *p_data_len);
+
+    ble_batchscan_cb.main_rep_q.pending_idx = (ble_batchscan_cb.main_rep_q.pending_idx + 1)
+                                            % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_deq_op_q
+**
+** Description      dequeue a batch scan operation from q when command complete
+**                  is received
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_deq_op_q(UINT8 *p_opcode,tBTM_BLE_BATCH_SCAN_STATE *cur_state,
+                                          UINT8 *p_cb_evt, tBTM_BLE_REF_VALUE *p_ref)
+{
+    *p_cb_evt = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx] >> 4);
+    *p_opcode = (ble_batchscan_cb.op_q.sub_code[ble_batchscan_cb.op_q.pending_idx]
+                                            & BTM_BLE_BATCH_SCAN_SUBCODE_MASK);
+    *p_ref = ble_batchscan_cb.op_q.ref_value[ble_batchscan_cb.op_q.pending_idx];
+    *cur_state = (ble_batchscan_cb.op_q.cur_state[ble_batchscan_cb.op_q.pending_idx]);
+    ble_batchscan_cb.op_q.pending_idx = (ble_batchscan_cb.op_q.pending_idx + 1)
+                                            % BTM_BLE_BATCH_SCAN_MAX;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_read_batchscan_reports
+**
+** Description      This function reads the reports from controller
+**
+** Parameters       scan_mode - The mode for which the reports are to be read out from the controller
+**                  ref_value - Reference value
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_read_batchscan_reports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                                          tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    UINT8 param[BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN], *pp;
+    pp = param;
+
+    memset(param, 0, BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN);
+
+    UINT8_TO_STREAM (pp, BTM_BLE_BATCH_SCAN_READ_RESULTS);
+    UINT8_TO_STREAM (pp, scan_mode);
+
+    if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+            BTM_BLE_BATCH_SCAN_READ_RESULTS_LEN, param, btm_ble_batchscan_vsc_cmpl_cback))
+            != BTM_CMD_STARTED)
+    {
+        BTM_TRACE_ERROR("btm_ble_read_batchscan_reports %d", status);
+        return BTM_ILLEGAL_VALUE;
+    }
+
+    if (BTM_CMD_STARTED == status)
+    {
+        /* The user needs to be provided scan read reports event */
+        btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_READ_RESULTS, ble_batchscan_cb.cur_state,
+                                   BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, ref_value);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_vsc_cmpl_cback
+**
+** Description      Batch scan VSC complete callback
+**
+** Parameters       p_params - VSC completed callback parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+    UINT8  *p = p_params->p_param_buf;
+    UINT16  len = p_params->param_len;
+    tBTM_BLE_REF_VALUE ref_value = 0;
+    int index = 0;
+
+    UINT8  status = 0, subcode = 0, opcode = 0;
+    UINT8 report_format = 0, num_records = 0, cb_evt = 0;
+    UINT16 data_len = 0;
+    tBTM_BLE_BATCH_SCAN_STATE cur_state = 0;
+    tBTM_STATUS btm_status = 0;
+    UINT8 *p_data = NULL;
+
+    if (len < 2)
+    {
+        BTM_TRACE_ERROR("wrong length for btm_ble_batch_scan_vsc_cmpl_cback");
+        btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
+        return;
+    }
+
+    STREAM_TO_UINT8(status, p);
+    STREAM_TO_UINT8(subcode, p);
+
+    btm_ble_batchscan_deq_op_q(&opcode, &cur_state, &cb_evt, &ref_value);
+
+    BTM_TRACE_DEBUG("btm_ble_batchscan op_code = %02x state = %02x cb_evt = %02x,ref_value=%d",
+        opcode, cur_state, cb_evt, ref_value);
+
+    if (opcode != subcode)
+    {
+        BTM_TRACE_ERROR("Got unexpected VSC cmpl, expected: %d got: %d",subcode,opcode);
+        return;
+    }
+
+    switch (subcode)
+    {
+        case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE:
+        {
+             if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+                 ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
+             else
+             if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+             {
+                 BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
+                 ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+             }
+
+             BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
+                                status, ble_batchscan_cb.cur_state, cb_evt);
+
+             if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+                ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+             break;
+        }
+
+        case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM status = %d, evt=%d",
+                            status, cb_evt);
+            if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+                ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+            break;
+        }
+
+        case BTM_BLE_BATCH_SCAN_SET_PARAMS:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt);
+
+            if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+            {
+                if (BTM_SUCCESS == status)
+                {
+                    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
+                }
+                else
+                {
+                    BTM_TRACE_ERROR("BTM_BLE_BATCH_SCAN_SET_PARAMS - Invalid state after disabled");
+                    ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+                }
+            }
+
+            if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+               ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+            break;
+        }
+
+        case BTM_BLE_BATCH_SCAN_READ_RESULTS:
+        {
+            if (cb_evt != 0 && NULL != ble_batchscan_cb.p_scan_rep_cback)
+            {
+                STREAM_TO_UINT8(report_format,p);
+                STREAM_TO_UINT8(num_records, p);
+                p = (uint8_t *)(p_params->p_param_buf + 4);
+                BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_READ_RESULTS status=%d,len=%d,rec=%d",
+                    status, len-4, num_records);
+
+                if (0 == num_records)
+                {
+                    btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records,
+                                                   &p_data, &data_len);
+                    if (NULL != ble_batchscan_cb.p_scan_rep_cback)
+                        ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format, num_records,
+                                                          data_len, p_data, status);
+                }
+                else
+                {
+                    if ((len-4) > 0)
+                    {
+                        btm_ble_batchscan_enq_rep_data(report_format, num_records, p, len-4);
+                        /* More records could be in the buffer and needs to be pulled out */
+                        btm_status = btm_ble_read_batchscan_reports(report_format, ref_value);
+                        if (BTM_CMD_STARTED != btm_status)
+                        {
+                            btm_ble_batchscan_deq_rep_data(report_format, &ref_value, &num_records,
+                                                           &p_data, &data_len);
+                            /* Send whatever is available, in case of a command failure */
+                            if (NULL != ble_batchscan_cb.p_scan_rep_cback && NULL != p_data)
+                                ble_batchscan_cb.p_scan_rep_cback(ref_value,report_format,
+                                                 num_records, data_len, p_data, status);
+                        }
+                    }
+                }
+            }
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    return;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_set_storage_config
+**
+** Description      This function writes the storage configuration in controller
+**
+** Parameters       batch_scan_full_max -Max storage space (in %) allocated to full scanning
+**                  batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
+**                  batch_scan_notify_threshold - Setup notification level based on total space
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_set_storage_config(UINT8 batch_scan_full_max, UINT8 batch_scan_trunc_max,
+                                       UINT8 batch_scan_notify_threshold)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    UINT8 param[BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN], *pp;
+
+    pp = param;
+    memset(param, 0, BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN);
+
+    UINT8_TO_STREAM (pp, BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM);
+    UINT8_TO_STREAM (pp, batch_scan_full_max);
+    UINT8_TO_STREAM (pp, batch_scan_trunc_max);
+    UINT8_TO_STREAM (pp, batch_scan_notify_threshold);
+
+    if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+                BTM_BLE_BATCH_SCAN_STORAGE_CFG_LEN, param,
+                btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED)
+    {
+        BTM_TRACE_ERROR("btm_ble_set_storage_config %d", status);
+        return BTM_ILLEGAL_VALUE;
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_set_batchscan_param
+**
+** Description      This function writes the batch scan params in controller
+**
+** Parameters       scan_mode -Batch scan mode
+**                  scan_interval - Scan interval
+**                  scan_window  - Scan window
+**                  discard_rule -Discard rules
+**                  addr_type - Address type
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_set_batchscan_param(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                     UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type,
+                     tBTM_BLE_DISCARD_RULE discard_rule)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    UINT8 scan_param[BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN], *pp_scan;
+
+    pp_scan = scan_param;
+    memset(scan_param, 0, BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN);
+
+    UINT8_TO_STREAM (pp_scan, BTM_BLE_BATCH_SCAN_SET_PARAMS);
+    UINT8_TO_STREAM (pp_scan, scan_mode);
+    UINT32_TO_STREAM (pp_scan, scan_window);
+    UINT32_TO_STREAM (pp_scan, scan_interval);
+    UINT8_TO_STREAM (pp_scan, addr_type);
+    UINT8_TO_STREAM (pp_scan, discard_rule);
+
+    if ((status = BTM_VendorSpecificCommand (HCI_BLE_BATCH_SCAN_OCF,
+            BTM_BLE_BATCH_SCAN_PARAM_CONFIG_LEN,
+            scan_param, btm_ble_batchscan_vsc_cmpl_cback))!= BTM_CMD_STARTED)
+    {
+        BTM_TRACE_ERROR("btm_ble_set_batchscan_param %d", status);
+        return BTM_ILLEGAL_VALUE;
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_enable_disable_batchscan
+**
+** Description      This function enables the customer specific feature in controller
+**
+** Parameters       enable_disable: true - enable, false - disable
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_enable_disable_batchscan(BOOLEAN should_enable)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    UINT8 shld_enable = 0x01;
+    UINT8 enable_param[BTM_BLE_BATCH_SCAN_ENB_DISB_LEN], *pp_enable;
+
+    if (!should_enable)
+        shld_enable = 0x00;
+
+    if (should_enable)
+    {
+        pp_enable = enable_param;
+        memset(enable_param, 0, BTM_BLE_BATCH_SCAN_ENB_DISB_LEN);
+
+        UINT8_TO_STREAM (pp_enable, BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE);
+        UINT8_TO_STREAM (pp_enable, shld_enable);
+
+        if ((status = BTM_VendorSpecificCommand(HCI_BLE_BATCH_SCAN_OCF,
+                 BTM_BLE_BATCH_SCAN_ENB_DISB_LEN, enable_param,
+                 btm_ble_batchscan_vsc_cmpl_cback)) != BTM_CMD_STARTED)
+        {
+            status = BTM_MODE_UNSUPPORTED;
+            BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status);
+            return BTM_ILLEGAL_VALUE;
+        }
+    }
+    else
+    if ((status = btm_ble_set_batchscan_param(BTM_BLE_BATCH_SCAN_MODE_DISABLE,
+                   ble_batchscan_cb.scan_interval, ble_batchscan_cb.scan_window,
+                   ble_batchscan_cb.addr_type, ble_batchscan_cb.discard_rule)) != BTM_CMD_STARTED)
+    {
+         status = BTM_MODE_UNSUPPORTED;
+         BTM_TRACE_ERROR("btm_ble_enable_disable_batchscan %d", status);
+         return BTM_ILLEGAL_VALUE;
+    }
+
+    if (should_enable)
+        ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
+    else
+        ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLE_CALLED;
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleSetStorageConfig
+**
+** Description      This function is called to write storage config params.
+**
+** Parameters:      batch_scan_full_max - Max storage space (in %) allocated to full style
+**                  batch_scan_trunc_max - Max storage space (in %) allocated to trunc style
+**                  batch_scan_notify_threshold - Setup notification level based on total space
+**                  p_setup_cback - Setup callback pointer
+**                  p_thres_cback - Threshold callback pointer
+**                  p_rep_cback - Reports callback pointer
+**                  ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_trunc_max,
+                                        UINT8 batch_scan_notify_threshold,
+                                        tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+                                        tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+                                        tBTM_BLE_SCAN_REP_CBACK* p_rep_cback,
+                                        tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_TRACE_EVENT (" BTM_BleSetStorageConfig: %d, %d, %d, %d, %d",
+        ble_batchscan_cb.cur_state, ref_value, batch_scan_full_max, batch_scan_trunc_max,
+        batch_scan_notify_threshold);
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return BTM_ILLEGAL_VALUE;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        BTM_TRACE_ERROR("Controller does not support batch scan");
+        return BTM_ERR_PROCESSING;
+    }
+
+    ble_batchscan_cb.p_setup_cback = p_setup_cback;
+    ble_batchscan_cb.p_thres_cback = p_thres_cback;
+    ble_batchscan_cb.p_scan_rep_cback = p_rep_cback;
+    ble_batchscan_cb.ref_value = ref_value;
+
+    if (batch_scan_full_max > BTM_BLE_ADV_SCAN_FULL_MAX ||
+        batch_scan_trunc_max > BTM_BLE_ADV_SCAN_TRUNC_MAX ||
+        batch_scan_notify_threshold > BTM_BLE_ADV_SCAN_THR_MAX)
+    {
+        BTM_TRACE_ERROR("Illegal set storage config params");
+        return BTM_ILLEGAL_VALUE;
+    }
+
+     if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
+         BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
+         BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
+    {
+        status = btm_ble_enable_disable_batchscan(TRUE);
+        if (BTM_CMD_STARTED != status)
+            return status;
+
+        ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
+        btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+                                    BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+    }
+
+    status = btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max,
+                                        batch_scan_notify_threshold);
+    if (BTM_CMD_STARTED != status)
+       return status;
+            /* The user needs to be provided scan config storage event */
+     btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state,
+                                   BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value);
+
+    return status;
+}
+
+
+/*******************************************************************************
+**
+** Function         BTM_BleEnableBatchScan
+**
+** Description      This function is called to configure and enable batch scanning
+**
+** Parameters:      scan_mode -Batch scan mode
+**                  scan_interval - Scan interval value
+**                  scan_window - Scan window value
+**                  discard_rule - Data discard rule
+**                  ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+            UINT32 scan_interval, UINT32 scan_window, tBLE_ADDR_TYPE addr_type,
+            tBTM_BLE_DISCARD_RULE discard_rule, tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    BTM_TRACE_EVENT (" BTM_BleEnableBatchScan: %d, %d, %d, %d, %d, %d",
+        scan_mode, scan_interval, scan_window, addr_type, discard_rule, ref_value);
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return BTM_ILLEGAL_VALUE;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        BTM_TRACE_ERROR("Controller does not support batch scan");
+        return BTM_ERR_PROCESSING;
+    }
+
+    BTM_TRACE_DEBUG("BTM_BleEnableBatchScan: %d, %x, %x, %d, %d", scan_mode, scan_interval,
+                                        scan_window, discard_rule, ble_batchscan_cb.cur_state);
+
+    /* Only 16 bits will be used for scan interval and scan window as per agreement with Google */
+    /* So the standard LE range would suffice for scan interval and scan window */
+    if ((BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) ||
+        BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
+        && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode
+        || BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode)
+        && (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule ||
+        BTM_BLE_DISCARD_LOWER_RSSI_ITEMS == discard_rule))
+    {
+        if (BTM_BLE_SCAN_INVALID_STATE == ble_batchscan_cb.cur_state ||
+            BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
+            BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
+        {
+            status = btm_ble_enable_disable_batchscan(TRUE);
+            if (BTM_CMD_STARTED != status)
+               return status;
+            btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+                                       BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+        }
+
+        ble_batchscan_cb.scan_mode = scan_mode;
+        ble_batchscan_cb.scan_interval = scan_interval;
+        ble_batchscan_cb.scan_window = scan_window;
+        ble_batchscan_cb.addr_type = addr_type;
+        ble_batchscan_cb.discard_rule = discard_rule;
+        /* This command starts batch scanning, if enabled */
+        status = btm_ble_set_batchscan_param(scan_mode, scan_interval, scan_window, addr_type,
+                    discard_rule);
+        if (BTM_CMD_STARTED != status)
+            return status;
+
+        /* The user needs to be provided scan enable event */
+        btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS, ble_batchscan_cb.cur_state,
+                                   BTM_BLE_BATCH_SCAN_ENABLE_EVT, ref_value);
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Illegal enable scan params");
+        return BTM_ILLEGAL_VALUE;
+    }
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleDisableBatchScan
+**
+** Description      This function is called to disable batch scanning
+**
+** Parameters:      ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    BTM_TRACE_EVENT (" BTM_BleDisableBatchScan");
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return BTM_ILLEGAL_VALUE;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        BTM_TRACE_ERROR("Controller does not support batch scan");
+        return BTM_ERR_PROCESSING;
+    }
+
+    status = btm_ble_enable_disable_batchscan(FALSE);
+    if (BTM_CMD_STARTED == status)
+    {
+       /* The user needs to be provided scan disable event */
+       btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_PARAMS,
+                                  BTM_BLE_SCAN_DISABLE_CALLED, BTM_BLE_BATCH_SCAN_DISABLE_EVT,
+                                  ref_value);
+    }
+
+    return status;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleReadScanReports
+**
+** Description      This function is called to start reading batch scan reports
+**
+** Parameters:      scan_mode - Batch scan mode
+**                  ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                                             tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    UINT8 read_scan_mode = 0;
+    UINT8  *p_data = NULL, report_format = 0, num_records = 0;
+    UINT16 data_len = 0;
+
+    BTM_TRACE_EVENT (" BTM_BleReadScanReports; %d, %d", scan_mode, ref_value);
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return BTM_ILLEGAL_VALUE;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        BTM_TRACE_ERROR("Controller does not support batch scan");
+        return BTM_ERR_PROCESSING;
+    }
+
+    /*  Check if the requested scan mode has already been setup by the user */
+    read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_ACTI;
+    if (0 == read_scan_mode)
+        read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
+
+    /* Check only for modes, as scan reports can be called after disabling batch scan */
+    if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode ||
+        BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode))
+    {
+        status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value);
+        if (BTM_SUCCESS == status)
+        {
+            status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
+            if (BTM_CMD_STARTED != status)
+            {
+                btm_ble_batchscan_deq_rep_data(scan_mode, &ref_value,
+                                               &num_records, &p_data, &data_len);
+            }
+        }
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Illegal read scan params: %d, %d, %d", read_scan_mode, scan_mode,
+            ble_batchscan_cb.cur_state);
+        return BTM_ILLEGAL_VALUE;
+    }
+    return status;
+}
+
+
+/*******************************************************************************
+**
+** Function         BTM_BleTrackAdvertiser
+**
+** Description      This function is called to setup the callback for tracking advertisers
+**
+** Parameters:      p_track_cback - Tracking callback pointer
+**                  ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback,
+                                        tBTM_BLE_REF_VALUE ref_value)
+{
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    BTM_TRACE_EVENT (" BTM_BleTrackAdvertiser");
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return BTM_ILLEGAL_VALUE;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 == cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        BTM_TRACE_ERROR("Controller does not support scan storage");
+        return BTM_ERR_PROCESSING;
+    }
+
+    ble_advtrack_cb.p_track_cback = p_track_cback;
+    ble_advtrack_cb.ref_value = ref_value;
+    return BTM_SUCCESS;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_init
+**
+** Description      This function initialize the batch scan control block.
+**
+** Parameters       None
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_batchscan_init(void)
+{
+    BTM_TRACE_EVENT (" btm_ble_batchscan_init");
+    memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
+    memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
+    BTM_RegisterForVSEvents(btm_ble_batchscan_filter_track_adv_vse_cback, TRUE);
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_batchscan_cleanup
+**
+** Description      This function cleans the batch scan control block.
+**
+** Parameters       None
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_batchscan_cleanup(void)
+{
+    int index = 0;
+    BTM_TRACE_EVENT (" btm_ble_batchscan_cleanup");
+
+    for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
+    {
+        if (NULL != ble_batchscan_cb.main_rep_q.p_data[index])
+            GKI_freebuf(ble_batchscan_cb.main_rep_q.p_data[index]);
+        ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
+    }
+
+    memset(&ble_batchscan_cb, 0, sizeof(tBTM_BLE_BATCH_SCAN_CB));
+    memset(&ble_advtrack_cb, 0, sizeof(tBTM_BLE_ADV_TRACK_CB));
+}
+
+#endif
diff --git a/stack/btm/btm_ble_bgconn.c b/stack/btm/btm_ble_bgconn.c
index 96d35c4..b33aa2e 100644
--- a/stack/btm/btm_ble_bgconn.c
+++ b/stack/btm/btm_ble_bgconn.c
@@ -30,6 +30,7 @@
 #include "l2c_int.h"
 #include "hcimsgs.h"
 #include "bt_utils.h"
+#include "vendor_ble.h"
 
 #ifndef BTM_BLE_SCAN_PARAM_TOUT
 #define BTM_BLE_SCAN_PARAM_TOUT      50    /* 50 seconds */
@@ -49,7 +50,7 @@
 void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy)
 {
     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
-    BTM_TRACE_EVENT0 ("btm_update_scanner_filter_policy");
+    BTM_TRACE_EVENT ("btm_update_scanner_filter_policy");
 
     p_inq->sfp = scan_policy;
     p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
@@ -57,7 +58,7 @@
     btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
                                     (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
                                     (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
-                                     BLE_ADDR_PUBLIC,
+                                     btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
                                      scan_policy);
 }
 /*******************************************************************************
@@ -66,34 +67,38 @@
 **
 ** Description      This function load the device into controller white list
 *******************************************************************************/
-BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr)
 {
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (bd_addr);
     tBLE_ADDR_TYPE  addr_type = BLE_ADDR_PUBLIC;
     BOOLEAN             started = FALSE;
     BD_ADDR             dummy_bda = {0};
     tBT_DEVICE_TYPE dev_type;
-    UNUSED(attr);
 
     if (p_dev_rec != NULL &&
-        p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
+        p_dev_rec->device_type & BT_DEVICE_TYPE_BLE)
     {
 
         if (to_add)
         {
             if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
             {
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+                /* add device into IRK list */
+                btm_ble_vendor_irk_list_load_dev(p_dev_rec);
+#endif
                 started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
             }
             if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 &&
                 memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) != 0)
             {
-                 started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr);
+                started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.static_addr_type,
+                                                         p_dev_rec->ble.static_addr);
             }
         }
         else
         {
-            if (!BTM_BLE_IS_RESOLVE_BDA(bd_addr))
+            if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
             {
                     started = btsnd_hcic_ble_remove_from_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
             }
@@ -133,7 +138,7 @@
     {
         if (p_dev_op->in_use)
         {
-            rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr, p_dev_op->attr);
+            rt = btm_add_dev_to_controller(p_dev_op->to_add, p_dev_op->bd_addr);
             memset(p_dev_op, 0, sizeof(tBTM_BLE_WL_OP));
         }
         else
@@ -147,7 +152,7 @@
 **
 ** Description      enqueue the pending whitelist device operation(loading or removing).
 *******************************************************************************/
-void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr)
 {
     tBTM_BLE_WL_OP *p_dev_op = btm_cb.ble_ctr_cb.wl_op_q;
     UINT8   i = 0;
@@ -157,7 +162,6 @@
         if (p_dev_op->in_use && !memcmp(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN))
         {
             p_dev_op->to_add = to_add;
-            p_dev_op->attr = attr;
             return;
         }
         else if (!p_dev_op->in_use)
@@ -167,12 +171,11 @@
     {
         p_dev_op->in_use = TRUE;
         p_dev_op->to_add = to_add;
-        p_dev_op->attr  = attr;
         memcpy(p_dev_op->bd_addr, bd_addr, BD_ADDR_LEN);
     }
     else
     {
-        BTM_TRACE_ERROR0("max pending WL operation reached, discard");
+        BTM_TRACE_ERROR("max pending WL operation reached, discard");
     }
     return;
 }
@@ -182,29 +185,28 @@
 **
 ** Description      This function adds a device into white list.
 *******************************************************************************/
-BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
+BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr)
 {
     /* look up the sec device record, and find the address */
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
-    BOOLEAN     started = FALSE;
     UINT8       wl_state = p_cb->wl_state;
 
     if ((to_add && p_cb->num_empty_filter == 0) ||
         (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries))
     {
-        BTM_TRACE_ERROR1("WL full or empty, unable to update to WL. num_entry available: %d",
+        BTM_TRACE_ERROR("WL full or empty, unable to update to WL. num_entry available: %d",
                           p_cb->num_empty_filter);
-        return started;
+        return FALSE;
     }
 
     btm_suspend_wl_activity(wl_state);
 
     /* enq pending WL device operation */
-    btm_enq_wl_dev_operation(to_add, bd_addr, attr);
+    btm_enq_wl_dev_operation(to_add, bd_addr);
 
     btm_resume_wl_activity(wl_state);
 
-    return started;
+    return TRUE;
 }
 /*******************************************************************************
 **
@@ -214,8 +216,9 @@
 *******************************************************************************/
 void btm_ble_clear_white_list (void)
 {
-    BTM_TRACE_EVENT0 ("btm_ble_clear_white_list");
+    BTM_TRACE_EVENT ("btm_ble_clear_white_list");
     btsnd_hcic_ble_clear_white_list();
+    memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM));
 }
 
 /*******************************************************************************
@@ -230,7 +233,7 @@
     UINT8       status;
     UNUSED(evt_len);
 
-    BTM_TRACE_EVENT0 ("btm_ble_clear_white_list_complete");
+    BTM_TRACE_EVENT ("btm_ble_clear_white_list_complete");
     STREAM_TO_UINT8  (status, p_data);
 
     if (status == HCI_SUCCESS)
@@ -246,7 +249,7 @@
 void btm_ble_add_2_white_list_complete(UINT8 status)
 {
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
-    BTM_TRACE_EVENT0 ("btm_ble_add_2_white_list_complete");
+    BTM_TRACE_EVENT ("btm_ble_add_2_white_list_complete");
 
     if (status == HCI_SUCCESS)
     {
@@ -255,16 +258,16 @@
 }
 /*******************************************************************************
 **
-** Function         btm_ble_add_2_white_list_complete
+** Function         btm_ble_remove_from_white_list_complete
 **
-** Description      This function read the current white list size.
+** Description      This function remove the white list element complete.
 *******************************************************************************/
 void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len)
 {
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     UNUSED(evt_len);
 
-    BTM_TRACE_EVENT0 ("btm_ble_remove_from_white_list_complete");
+    BTM_TRACE_EVENT ("btm_ble_remove_from_white_list_complete");
     if (*p == HCI_SUCCESS)
     {
         p_cb->num_empty_filter ++;
@@ -284,7 +287,7 @@
     for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM; i ++)
     {
         if (p_cb->bg_dev_list[i].in_use &&
-            !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr))
+            !BTM_IsAclConnectionUp(p_cb->bg_dev_list[i].bd_addr, BT_TRANSPORT_LE))
         {
             count ++;
         }
@@ -298,19 +301,18 @@
 **
 ** Description      This function update the local background connection device list.
 *******************************************************************************/
-BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 *p_attr_tag)
+BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr)
 {
     tBTM_BLE_CB             *p_cb = &btm_cb.ble_ctr_cb;
     tBTM_LE_BG_CONN_DEV     *p_bg_dev = &p_cb->bg_dev_list[0], *p_next, *p_cur;
     UINT8                   i, j;
     BOOLEAN             ret = FALSE;
-    UNUSED(p_attr_tag);
 
-    BTM_TRACE_EVENT0 ("btm_update_bg_conn_list");
+    BTM_TRACE_EVENT ("btm_update_bg_conn_list");
 
     if ((to_add && (p_cb->bg_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0)))
     {
-        BTM_TRACE_DEBUG1("num_empty_filter = %d", p_cb->num_empty_filter);
+        BTM_TRACE_DEBUG("num_empty_filter = %d", p_cb->num_empty_filter);
         return ret;
     }
 
@@ -324,15 +326,19 @@
                 p_cb->bg_dev_num --;
                 p_cur = p_bg_dev;
                 p_next = p_bg_dev + 1;
-                for (j = i + 1 ;j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use ; j ++, p_cur ++, p_next ++ )
+                for (j = i + 1; j < BTM_BLE_MAX_BG_CONN_DEV_NUM && p_next->in_use;
+                     j ++, p_cur ++, p_next ++)
+                {
                     memcpy(p_cur, p_next, sizeof(tBTM_LE_BG_CONN_DEV));
+                    memset(p_next, 0, sizeof(tBTM_LE_BG_CONN_DEV));
+                }
             }
             ret = TRUE;
             break;
         }
         else if (!p_bg_dev->in_use && to_add)
         {
-            BTM_TRACE_DEBUG0("add new WL entry in bg_dev_list");
+            BTM_TRACE_DEBUG("add new WL entry in bg_dev_list");
 
             memcpy(p_bg_dev->bd_addr, bd_addr, BD_ADDR_LEN);
             p_bg_dev->in_use = TRUE;
@@ -363,15 +369,17 @@
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     BD_ADDR dummy_bda = {0};
     BOOLEAN exec = TRUE;
-    UINT8  own_addr_type = BLE_ADDR_PUBLIC;
     UINT16 scan_int, scan_win;
 
     if (start)
     {
-        if (p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0)
+        if ( p_cb->conn_state == BLE_CONN_IDLE )
         {
-            btm_execute_wl_dev_operation();
-
+            exec = btm_execute_wl_dev_operation();
+        }
+        if ((p_cb->conn_state == BLE_CONN_IDLE && btm_ble_count_unconn_dev_in_whitelist() > 0)
+            && btm_ble_topology_check(BTM_BLE_STATE_INIT))
+        {
             scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_INT_1 : p_cb->scan_int;
             scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_SLOW_WIN_1 : p_cb->scan_win;
 
@@ -380,7 +388,9 @@
                                                 0x01,                   /* UINT8 white_list     */
                                                 BLE_ADDR_PUBLIC,        /* UINT8 addr_type_peer */
                                                 dummy_bda,              /* BD_ADDR bda_peer     */
-                                                own_addr_type,         /* UINT8 addr_type_own, not allow random address for central  */
+                                                p_cb->addr_mgnt_cb.own_addr_type,
+                                                   /* UINT8 addr_type_own,
+                                                   not allow random address for central  */
                                                 BTM_BLE_CONN_INT_MIN_DEF,   /* UINT16 conn_int_min  */
                                                 BTM_BLE_CONN_INT_MAX_DEF,   /* UINT16 conn_int_max  */
                                                 BTM_BLE_CONN_SLAVE_LATENCY_DEF,  /* UINT16 conn_latency  */
@@ -394,7 +404,7 @@
             else
             {
                 btm_ble_set_conn_st (BLE_BG_CONN);
-
+                p_cb->wl_state |= BTM_BLE_WL_INIT;
             }
         }
         else
@@ -407,13 +417,18 @@
         if (p_cb->conn_state == BLE_BG_CONN)
         {
             btsnd_hcic_ble_create_conn_cancel();
-            btm_ble_set_conn_st (BLE_CONN_CANCEL); 
+            btm_ble_set_conn_st (BLE_CONN_CANCEL);
+            p_cb->wl_state |= BTM_BLE_WL_INIT;
 
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+            if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+                btm_ble_vendor_disable_irk_list();
+#endif
         }
         else
         {
 #if 0
-            BTM_TRACE_ERROR1("conn_st = %d, not in auto conn state, can not stop.", p_cb->conn_state);
+            BTM_TRACE_ERROR("conn_st = %d, not in auto conn state, can not stop.", p_cb->conn_state);
             exec = FALSE;
 #endif
         }
@@ -439,33 +454,34 @@
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     UINT16 scan_int, scan_win;
 
-    BTM_TRACE_EVENT0 ("btm_ble_start_select_conn");
+    BTM_TRACE_EVENT ("btm_ble_start_select_conn");
 
     scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
     scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
 
     if (start)
     {
-        if (btm_cb.btm_inq_vars.inq_active == BTM_INQUIRY_INACTIVE)
+        if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity))
         {
             if (p_select_cback != NULL)
                 btm_cb.ble_ctr_cb.p_select_cback = p_select_cback;
 
+            btm_execute_wl_dev_operation();
+
             btm_update_scanner_filter_policy(SP_ADV_WL);
             btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_PASS;
 
             if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS,  /* use passive scan by default */
                                                 scan_int, /* scan interval */
                                                 scan_win,    /* scan window */
-                                                BLE_ADDR_PUBLIC,         /* own device, DUMO always use public */
+                                                p_cb->addr_mgnt_cb.own_addr_type,
                                                 SP_ADV_WL)              /* process advertising packets only from devices in the White List */
                 )
                 return FALSE;
 
-            if (p_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE
-                )
+            if (!btm_ble_topology_check(BTM_BLE_STATE_PASSIVE_SCAN))
             {
-                BTM_TRACE_ERROR0("peripheral device cannot initiate a selective connection");
+                BTM_TRACE_ERROR("peripheral device cannot initiate passive scan for a selective connection");
                 return FALSE;
             }
             else if (p_cb->bg_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 )
@@ -475,26 +491,30 @@
                     return FALSE;
 
                 /* mark up inquiry status flag */
-                btm_cb.btm_inq_vars.inq_active |= BTM_LE_SELECT_CONN_ACTIVE;
-                p_cb->inq_var.proc_mode = BTM_BLE_SELECT_SCAN;
-                p_cb->conn_state                = BLE_BG_CONN;
+                p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE;
+                p_cb->wl_state |= BTM_BLE_WL_SCAN;
             }
         }
         else
         {
-            BTM_TRACE_ERROR0("scan active, can not start selective connection procedure");
+            BTM_TRACE_ERROR("scan active, can not start selective connection procedure");
             return FALSE;
         }
     }
     else /* disable selective connection mode */
     {
-        btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_SELECT_CONN_ACTIVE;
-        btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
+        p_cb->scan_activity &= ~BTM_LE_SELECT_CONN_ACTIVE;
+        p_cb->p_select_cback = NULL;
 
-        btm_update_scanner_filter_policy(SP_ADV_ALL);
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            btm_ble_vendor_disable_irk_list();
+#endif
+        p_cb->wl_state |= BTM_BLE_WL_SCAN;
+
         /* stop scanning */
-            if (!btsnd_hcic_ble_set_scan_enable(FALSE, TRUE)) /* duplicate filtering enabled */
-                return FALSE;
+        if (!BTM_BLE_IS_SCAN_ACTIVE(p_cb->scan_activity))
+            btm_ble_stop_scan(); /* duplicate filtering enabled */
         btm_update_scanner_filter_policy(SP_ADV_ALL);
     }
     return TRUE;
@@ -514,12 +534,12 @@
 *******************************************************************************/
 void btm_ble_initiate_select_conn(BD_ADDR bda)
 {
-    BTM_TRACE_EVENT0 ("btm_ble_initiate_select_conn");
+    BTM_TRACE_EVENT ("btm_ble_initiate_select_conn");
 
     /* use direct connection procedure to initiate connection */
     if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda))
     {
-        BTM_TRACE_ERROR0("btm_ble_initiate_select_conn failed");
+        BTM_TRACE_ERROR("btm_ble_initiate_select_conn failed");
     }
 }
 /*******************************************************************************
@@ -537,7 +557,7 @@
 void btm_ble_suspend_bg_conn(void)
 {
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
-    BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_conn");
+    BTM_TRACE_EVENT ("btm_ble_suspend_bg_conn");
 
     if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO)
     {
@@ -569,7 +589,7 @@
     }
     if (wl_state & BTM_BLE_WL_ADV)
     {
-        btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_DISABLE);
+        btm_ble_stop_adv();
     }
 
 }
@@ -588,7 +608,7 @@
 
     if (wl_state & BTM_BLE_WL_ADV)
     {
-        btsnd_hcic_ble_set_adv_enable(BTM_BLE_ADV_ENABLE);
+       btm_ble_start_adv();
     }
 
 }
@@ -645,6 +665,13 @@
 void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st)
 {
     btm_cb.ble_ctr_cb.conn_state = new_st;
+    if (new_st == BLE_BG_CONN || new_st == BLE_DIR_CONN) {
+        btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_INIT;
+        btm_ble_set_topology_mask(BTM_BLE_STATE_INIT_BIT);
+    } else {
+        btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_INIT;
+        btm_ble_clear_topology_mask(BTM_BLE_STATE_INIT_BIT);
+    }
 }
 
 /*******************************************************************************
@@ -689,6 +716,7 @@
 
     return rt;
 }
+
 #endif
 
 
diff --git a/stack/btm/btm_ble_cont_energy.c b/stack/btm/btm_ble_cont_energy.c
new file mode 100644
index 0000000..0da6cf0
--- /dev/null
+++ b/stack/btm/btm_ble_cont_energy.c
@@ -0,0 +1,111 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014  Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+
+tBTM_BLE_ENERGY_INFO_CB ble_energy_info_cb;
+
+/*******************************************************************************
+**
+** Function         btm_ble_cont_energy_cmpl_cback
+**
+** Description      Controller VSC complete callback
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_cont_energy_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+    UINT8  *p = p_params->p_param_buf;
+    UINT16  len = p_params->param_len;
+    UINT8  status = 0;
+    UINT32 total_tx_time = 0, total_rx_time = 0, total_idle_time = 0, total_energy_used = 0;
+
+    if (len < 17)
+    {
+        BTM_TRACE_ERROR("wrong length for btm_ble_cont_energy_cmpl_cback");
+        return;
+    }
+
+    STREAM_TO_UINT8(status, p);
+    STREAM_TO_UINT32(total_tx_time, p);
+    STREAM_TO_UINT32(total_rx_time, p);
+    STREAM_TO_UINT32(total_idle_time, p);
+    STREAM_TO_UINT32(total_energy_used, p);
+
+    BTM_TRACE_DEBUG("energy_info status=%d,tx_t=%ld, rx_t=%ld, ener_used=%ld, idle_t=%ld",
+        status, total_tx_time, total_rx_time, total_energy_used, total_idle_time);
+
+    if (NULL != ble_energy_info_cb.p_ener_cback)
+        ble_energy_info_cb.p_ener_cback(total_tx_time, total_rx_time, total_idle_time,
+                          total_energy_used, status);
+
+    return;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleGetEnergyInfo
+**
+** Description      This function obtains the energy info
+**
+** Parameters      p_ener_cback - Callback pointer
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback)
+{
+    tBTM_STATUS status = BTM_ILLEGAL_VALUE;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    BTM_TRACE_EVENT("BTM_BleGetEnergyInfo");
+
+    if (0 == cmn_ble_vsc_cb.energy_support)
+    {
+        BTM_TRACE_ERROR("Controller does not support get energy info");
+        return BTM_ERR_PROCESSING;
+    }
+
+    ble_energy_info_cb.p_ener_cback = p_ener_cback;
+    if ((status = BTM_VendorSpecificCommand (HCI_BLE_ENERGY_INFO_OCF, 0, NULL,
+                   btm_ble_cont_energy_cmpl_cback)) != BTM_CMD_STARTED)
+    {
+        BTM_TRACE_ERROR("BTM_BleGetEnergyInfo status: %d", status);
+        return BTM_ILLEGAL_VALUE;
+    }
+
+    return status;
+}
+
+#endif
+
diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c
index 54f1b55..a6f095f 100644
--- a/stack/btm/btm_ble_gap.c
+++ b/stack/btm/btm_ble_gap.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2008-2012 Broadcom Corporation
+ *  Copyright (C) 2008-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -28,14 +28,22 @@
 
 #include "bt_types.h"
 #include "bt_utils.h"
-#include "btu.h"
 #include "btm_int.h"
+#include "btm_ble_api.h"
+#include "btu.h"
 #include "hcimsgs.h"
 #if (GAP_INCLUDED == TRUE)
 #include "gap_api.h"
 #endif
-#if (BLE_INCLUDED == TRUE)
+
+#if BLE_INCLUDED == TRUE
+#include "l2c_int.h"
+#include "vendor_ble.h"
+
 #include "gattdefs.h"
+#include "gatt_int.h"
+
+#include "btm_ble_int.h"
 
 #define BTM_BLE_NAME_SHORT                  0x01
 #define BTM_BLE_NAME_CMPL                   0x02
@@ -44,37 +52,172 @@
 #define BTM_BLE_POLICY_UNKNOWN              0xff
 
 #define BTM_EXT_BLE_RMT_NAME_TIMEOUT        30
+#define MIN_ADV_LENGTH                       2
+
+static tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+static tBTM_BLE_CTRL_FEATURES_CBACK    *p_ctrl_le_feature_rd_cmpl_cback = NULL;
 
 /*******************************************************************************
 **  Local functions
 *******************************************************************************/
 static void btm_ble_update_adv_flag(UINT8 flag);
 static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
-static UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data);
+UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+                              tBTM_BLE_ADV_DATA *p_data);
 static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
                                      BD_ADDR_PTR p_addr_ptr,
                                      tBLE_ADDR_TYPE *p_init_addr_type,
                                      tBLE_ADDR_TYPE *p_own_addr_type);
-static BOOLEAN btm_ble_start_adv(void);
-static tBTM_STATUS btm_ble_stop_adv(void);
+static void btm_ble_stop_observe(void);
 
+#define BTM_BLE_INQ_RESULT          0x01
+#define BTM_BLE_OBS_RESULT          0x02
+#define BTM_BLE_SEL_CONN_RESULT     0x04
 
-
-/*******************************************************************************
-**
-** Function         BTM_BleReset
-**
-** Description      This function is called to reset ULP controller.
-**
-** Parameters       None.
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTM_BleReset(void)
+/* LE states combo bit to check */
+const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] =
 {
-    btsnd_hcic_ble_reset();
-}
+    {/* single state support */
+        {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF},  /* conn_adv */
+        {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
+        {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
+        {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
+        {0, 0},                   /* todo: lo du dir adv, not covered ? */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF},   /*  passive scan */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF},  /*   active scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF}   /* scanable adv */
+    },
+    {    /* conn_adv =0 */
+        {0, 0},                                                                           /* conn_adv */
+        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* init: 32 */
+        {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* master: 35 */
+        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
+        {0, 0},                                                                           /* lo du dir adv */
+        {0, 0},                                                                            /* hi duty dir adv */
+        {0, 0},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF},   /*  passive scan */
+        {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF},  /*   active scan */
+        {0, 0}   /* scanable adv */
+    },
+    {   /* init */
+        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* conn_adv: 32 */
+        {0, 0},                                                                             /* init */
+        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
+        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* lo du dir adv 34 */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF},     /* hi duty dir adv 33 */
+        {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF},  /*  non connectable adv */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF},   /* passive scan */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF},  /*  active scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}   /* scanable adv */
+
+    },
+    {   /* master */
+        {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* conn_adv: 35 */
+        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* init 28 */
+        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
+        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* slave: 32 */
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF},  /* lo duty cycle adv 37 */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF},   /* hi duty cycle adv 36 */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF},  /*  non connectable adv */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF},   /*  passive scan */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF},  /*   active scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}   /*  scanable adv */
+
+    },
+    { /* slave */
+        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
+        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
+        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
+        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF},        /* slave: 38,*/
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF},  /* lo duty cycle adv 40 */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF},   /* hi duty cycle adv 39 */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* passive scan */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},  /*  active scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}   /* scanable adv */
+
+    },
+    { /* lo duty cycle adv */
+        {0, 0}, /* conn_adv: 38,*/
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
+        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
+        {0, 0},  /* lo duty cycle adv 40 */
+        {0, 0},   /* hi duty cycle adv 39 */
+        {0, 0},  /*  non connectable adv */
+        {0, 0},   /* TODO: passive scan, not covered? */
+        {0, 0},  /* TODO:  active scan, not covered? */
+        {0, 0}   /*  scanable adv */
+    },
+    { /* hi duty cycle adv */
+        {0, 0}, /* conn_adv: 38,*/
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF},   /* slave: 39*/
+        {0, 0},  /* lo duty cycle adv 40 */
+        {0, 0},   /* hi duty cycle adv 39 */
+        {0, 0},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF},   /* passive scan */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF},  /* active scan */
+        {0, 0}   /* scanable adv */
+    },
+    { /* non connectable adv */
+        {0, 0}, /* conn_adv: */
+        {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init  */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master  */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},   /* slave: */
+        {0, 0},  /* lo duty cycle adv */
+        {0, 0},   /* hi duty cycle adv */
+        {0, 0},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},   /* passive scan */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
+        {0, 0}   /* scanable adv */
+    },
+    { /* passive scan */
+        {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init  */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master  */
+        {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* slave: */
+        {0, 0},  /* lo duty cycle adv */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF},   /* hi duty cycle adv */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},  /*  non connectable adv */
+        {0, 0},   /* passive scan */
+        {0, 0},  /* active scan */
+         {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}   /* scanable adv */
+    },
+    { /* active scan */
+        {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init  */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master  */
+        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},   /* slave: */
+        {0, 0},  /* lo duty cycle adv */
+        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF},   /* hi duty cycle adv */
+        {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  non connectable adv */
+        {0, 0},   /* TODO: passive scan */
+        {0, 0},  /* TODO:  active scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}   /*  scanable adv */
+    },
+    { /* scanable adv */
+        {0, 0}, /* conn_adv: */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init  */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master  */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF},   /* slave: */
+        {0, 0},  /* lo duty cycle adv */
+        {0, 0},   /* hi duty cycle adv */
+        {0, 0},  /* non connectable adv */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF},   /*  passive scan */
+        {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
+        {0, 0}   /* scanable adv */
+    }
+
+};
+/* check LE combo state supported */
+#define BTM_LE_STATES_SUPPORTED(x, y, z)      ((x)[(z)] & (y))
+
+
 /*******************************************************************************
 **
 ** Function         BTM_BleUpdateAdvWhitelist
@@ -109,7 +252,7 @@
     BD_ADDR          p_addr_ptr= {0};
     UINT8            adv_mode = p_cb->adv_mode;
 
-    BTM_TRACE_EVENT0 ("BTM_BleUpdateAdvFilterPolicy");
+    BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy");
 
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return;
@@ -122,10 +265,13 @@
         btm_ble_stop_adv ();
 
         if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
-            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &p_cb->adv_addr_type);
+            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
+                                                              &p_cb->adv_addr_type);
 
-        btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
-                                         p_cb->adv_interval_max,
+        btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
+                                         BTM_BLE_GAP_ADV_SLOW_INT),
+                                         (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
+                                         BTM_BLE_GAP_ADV_SLOW_INT),
                                          p_cb->evt_type,
                                          p_cb->adv_addr_type,
                                          init_addr_type,
@@ -155,9 +301,9 @@
                            tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
 {
     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
-    tBTM_STATUS     status = BTM_NO_RESOURCES;
+    tBTM_STATUS     status = BTM_WRONG_MODE;
 
-    BTM_TRACE_EVENT1 ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
+    BTM_TRACE_EVENT ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
 
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return BTM_ILLEGAL_VALUE;
@@ -165,63 +311,54 @@
     if (start)
     {
         /* shared inquiry database, do not allow observe if any inquiry is active */
-        if (btm_cb.btm_inq_vars.inq_active || p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
+        if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
         {
-            /*check if an interleave scan is already in progress*/
-            if(btm_cb.btm_inq_vars.scan_type == INQ_GENERAL
-                && btm_cb.btm_inq_vars.p_inq_results_cb != NULL)
-            {
-                BTM_TRACE_EVENT0 ("BTM_BleObserve general inq in progress, redirecting the results");
-                btm_cb.btm_inq_vars.p_inq_ble_results_cb = p_results_cb;
-                btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = p_cmpl_cb;
-                return BTM_SUCCESS;
-            }
-            else
-                return BTM_BUSY;
+            BTM_TRACE_ERROR("Observe Already Active");
+            return status;
         }
-        btm_cb.btm_inq_vars.scan_type = INQ_LE_OBSERVE;
-        btm_cb.btm_inq_vars.p_inq_ble_results_cb = p_results_cb;
-        btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = p_cmpl_cb;
-        p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
 
-        /* allow config scanning type */
-        if (btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
+        btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
+        btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
+        status = BTM_CMD_STARTED;
+
+        /* scan is not started */
+        if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+        {
+            p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
+            /* allow config scanning type */
+            btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
                                             (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
                                             (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
-                                            BLE_ADDR_PUBLIC,
-                                            BTM_BLE_DEFAULT_SFP)) /* assume observe always not using white list */
-        {
-            /* start scan, disable duplicate filtering */
-            if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
-            {
-                status = BTM_SUCCESS;
-                p_inq->proc_mode = BTM_BLE_OBSERVE;
-                btm_cb.btm_inq_vars.inq_active |= BTM_LE_OBSERVE_ACTIVE;
+                                            btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
+                                            BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
 
-                if (duration != 0)
-                {
-                    /* start inquiry timer */
-                    btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
-                }
-            }
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+            /* enable IRK list */
+            btm_ble_vendor_irk_list_known_dev (TRUE);
+#endif
+            status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
+        }
+        if (status == BTM_CMD_STARTED)
+        {
+            btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
+
+            if (duration != 0)
+                /* start observer timer */
+                btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
         }
     }
-    else/*start = 0*/
+    else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
     {
-        if(btm_cb.btm_inq_vars.scan_type == INQ_GENERAL)
-        {
-            //Dont stop the scan. Just nullify the cbs
-            btm_cb.btm_inq_vars.p_inq_ble_results_cb = NULL;
-            btm_cb.btm_inq_vars.p_inq_ble_cmpl_cb = NULL;
-        }
-        else if (p_inq->proc_mode == BTM_BLE_OBSERVE)
-        {
-            btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_OBSERVE_ACTIVE;
-            btm_ble_stop_scan();
-        }
+        status = BTM_CMD_STARTED;
+        btm_ble_stop_observe();
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Observe not active");
     }
 
     return status;
+
 }
 
 /*******************************************************************************
@@ -255,8 +392,10 @@
     if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
     {
         /* update adv params */
-        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
-                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
+                                              BTM_BLE_GAP_ADV_INT),
+                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
+                                              BTM_BLE_GAP_ADV_INT),
                                               evt_type,
                                               p_addr_cb->own_addr_type,
                                               p_cb->direct_bda.type,
@@ -270,21 +409,139 @@
 
         status = btm_ble_start_adv ();
     }
-    else if (!start && p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+    else if (!start)
     {
         status = btm_ble_stop_adv();
     }
     else
     {
         status = BTM_WRONG_MODE;
-        BTM_TRACE_ERROR2("Can not %s Broadcast, device %s in Broadcast mode",
-            (start ? "Start" : "Stop"), (start ? "alerady" :"not"));
+        BTM_TRACE_ERROR("Can not %s Broadcast, device %s in Broadcast mode",
+            (start ? "Start" : "Stop"), (start ? "already" :"not"));
     }
     return status;
 }
 
 /*******************************************************************************
 **
+** Function         btm_vsc_brcm_features_complete
+**
+** Description      Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
+{
+#if BLE_VND_INCLUDED == TRUE
+    UINT8  status = 0xFF, *p;
+
+    BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
+
+    /* Check status of command complete event */
+    if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
+    {
+        p = p_vcs_cplt_params->p_param_buf;
+        STREAM_TO_UINT8  (status, p);
+    }
+
+    if (status == HCI_SUCCESS)
+    {
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
+        STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.filter_support, p);
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.max_filter, p);
+        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.energy_support, p);
+        btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
+    }
+
+    BTM_TRACE_DEBUG("btm_ble_vnd_cap_vsc_cmpl_cback: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d",
+         status, btm_ble_vendor_cb.irk_avail_size, btm_cb.cmn_ble_vsc_cb.adv_inst_max,
+         btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support);
+
+    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+        btm_ble_multi_adv_init();
+
+    if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filter_init();
+    }
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0)
+    {
+        btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
+    }
+
+    if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+        btm_ble_batchscan_init();
+
+    if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
+        p_ctrl_le_feature_rd_cmpl_cback(status);
+
+#else
+    UNUSED(p_vcs_cplt_params);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleGetVendorCapabilities
+**
+** Description      This function reads local LE features
+**
+** Parameters       p_cmn_vsc_cb : Locala LE capability structure
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
+{
+    BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
+
+    if (NULL != p_cmn_vsc_cb)
+    {
+        *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
+    }
+}
+
+/******************************************************************************
+**
+** Function         BTM_BleReadControllerFeatures
+**
+** Description      Reads BLE specific controller features
+**
+** Parameters:      tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK  *p_vsc_cback)
+{
+    if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read)
+        return;
+
+#if BLE_VND_INCLUDED == TRUE
+    BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
+
+    p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
+    if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
+                                    0,
+                                    NULL,
+                                    btm_ble_vendor_capability_vsc_cmpl_cback)
+                                    != BTM_CMD_STARTED)
+    {
+        BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
+    }
+#else
+    UNUSED(p_vsc_cback);
+#endif
+    return ;
+}
+
+/*******************************************************************************
+**
 ** Function         BTM_RegisterScanReqEvt
 **
 ** Description      This function is called to register a scan request callback
@@ -309,7 +566,59 @@
 #endif
 }
 
-#if BTM_BLE_PRIVACY_SPT == TRUE
+/*******************************************************************************
+**
+** Function         BTM_BleConfigPrivacy
+**
+** Description      This function is called to enable or disable the privacy in
+**                   LE channel of the local device.
+**
+** Parameters       enable: TRUE to enable it; FALSE to disable it.
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTM_BleConfigPrivacy(BOOLEAN enable)
+{
+    tBTM_BLE_CB     *p_cb = &btm_cb.ble_ctr_cb;
+
+    BTM_TRACE_EVENT (" BTM_BleConfigPrivacy");
+
+    if (p_cb->privacy != enable)
+    {
+        p_cb->privacy = enable;
+
+        if (p_cb->privacy)
+        {
+            /* generate resolvable private address */
+            btm_gen_resolvable_private_addr((void*)btm_gen_resolve_paddr_low);
+        }
+        else /* if privacy disabled, always use public address */
+        {
+            p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
+        }
+
+        if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+            btm_ble_multi_adv_enb_privacy(p_cb->privacy);
+    }
+}
+
+/*******************************************************************************
+**
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount()
+{
+    return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ?
+        btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX;
+}
+
+#if BLE_PRIVACY_SPT == TRUE
 /*******************************************************************************
 **
 ** Function         btm_ble_resolve_random_addr_on_adv
@@ -327,7 +636,7 @@
     UINT8       *pp = (UINT8 *)p + 1;
     UINT8           evt_type;
 
-    BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr_on_adv ");
+    BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
 
     STREAM_TO_UINT8    (evt_type, pp);
     STREAM_TO_UINT8    (addr_type, pp);
@@ -335,7 +644,7 @@
 
     if (match_rec)
     {
-        BTM_TRACE_ERROR0("Random match");
+        BTM_TRACE_ERROR("Random match");
         match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
         memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
         memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
@@ -343,7 +652,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR0("Random unmatch");
+        BTM_TRACE_ERROR("Random unmatch");
     }
 
     btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
@@ -354,6 +663,24 @@
 
 /*******************************************************************************
 **
+** Function         BTM_BleLocalPrivacyEnabled
+**
+** Description        Checks if local device supports private address
+**
+** Returns          Return TRUE if local privacy is enabled else FALSE
+**
+*******************************************************************************/
+BOOLEAN BTM_BleLocalPrivacyEnabled()
+{
+#if BLE_PRIVACY_SPT == TRUE
+    return btm_cb.ble_ctr_cb.privacy;
+#else
+    return false;
+#endif
+}
+
+/*******************************************************************************
+**
 ** Function         BTM_BleSetBgConnType
 **
 ** Description      This function is called to set BLE connectable mode for a
@@ -371,7 +698,7 @@
 {
     BOOLEAN started = TRUE;
 
-    BTM_TRACE_EVENT0 ("BTM_BleSetBgConnType ");
+    BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return FALSE;
 
@@ -404,7 +731,7 @@
                 break;
 
             default:
-                BTM_TRACE_ERROR1("invalid bg connection type : %d ", bg_conn_type);
+                BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
                 started = FALSE;
                 break;
         }
@@ -417,6 +744,26 @@
 
 /*******************************************************************************
 **
+** Function         BTM_BleClearBgConnDev
+**
+** Description      This function is called to clear the whitelist,
+**                  end any pending whitelist connections,
+*                   and reset the local bg device list.
+**
+** Parameters       void
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTM_BleClearBgConnDev(void)
+{
+    btm_ble_start_auto_conn(FALSE);
+    btm_ble_clear_white_list();
+    gatt_reset_bgdev_list();
+}
+
+/*******************************************************************************
+**
 ** Function         BTM_BleUpdateBgConnDev
 **
 ** Description      This function is called to add or remove a device into/from
@@ -433,13 +780,12 @@
 BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda)
 {
     BOOLEAN ret = TRUE;
-    UINT8   dev_wl_type = 0;
-    BTM_TRACE_EVENT0 (" BTM_BleUpdateBgConnDev");
+    BTM_TRACE_EVENT (" BTM_BleUpdateBgConnDev");
 
     /* update white list */
-    ret = btm_update_bg_conn_list(add_remove, remote_bda, &dev_wl_type);
+    ret = btm_update_bg_conn_list(add_remove, remote_bda);
 
-    btm_update_dev_to_white_list(add_remove, remote_bda, dev_wl_type);
+    btm_update_dev_to_white_list(add_remove, remote_bda);
 
     return ret;
 }
@@ -461,7 +807,7 @@
 {
     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
 
-    BTM_TRACE_EVENT1 ("BTM_BleSetConnMode is_directed = %d ", is_directed);
+    BTM_TRACE_EVENT ("BTM_BleSetConnMode is_directed = %d ", is_directed);
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return BTM_ILLEGAL_VALUE;
 
@@ -486,11 +832,13 @@
 {
     UINT8 evt_type;
 
+    UNUSED(p_own_addr_type);
+
     if ( p_cb->directed_conn)
     {
         /*  direct adv mode does not have privacy if privacy
-            is not enabled or no reconn addr config */
-        *p_own_addr_type   = BLE_ADDR_PUBLIC;
+        is not enabled or no reconn addr config */
+
         *p_init_addr_type  = p_cb->direct_bda.type;
          memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
         evt_type = BTM_BLE_CONNECT_DIR_EVT;
@@ -498,6 +846,14 @@
     else /* undirect adv mode */
     {
         evt_type = BTM_BLE_CONNECT_EVT;
+
+        /* may need to reset random address if privacy is enabled */
+        if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
+            !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
+        {
+            /* need to generate RRA and update random addresss in controller */
+            btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+        }
     }
 
     return evt_type;
@@ -530,7 +886,7 @@
     tBLE_ADDR_TYPE   own_addr_type = p_addr_cb->own_addr_type;
     UINT8            adv_mode = p_cb->adv_mode;
 
-    BTM_TRACE_EVENT0 ("BTM_BleSetAdvParams");
+    BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
 
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return BTM_ILLEGAL_VALUE;
@@ -550,7 +906,7 @@
         memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
     }
 
-    BTM_TRACE_EVENT0 ("update params for an active adv");
+    BTM_TRACE_EVENT ("update params for an active adv");
 
     btm_ble_stop_adv();
 
@@ -592,7 +948,7 @@
 {
     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
 
-    BTM_TRACE_EVENT0 ("BTM_BleReadAdvParams ");
+    BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return ;
 
@@ -625,7 +981,7 @@
 {
     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
 
-    BTM_TRACE_EVENT0 (" BTM_BleSetScanParams");
+    BTM_TRACE_EVENT (" BTM_BleSetScanParams");
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return ;
 
@@ -643,7 +999,7 @@
     }
     else
     {
-        BTM_TRACE_ERROR2("Illegal params: scan_interval = %d scan_window = %d",
+        BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d",
                         scan_interval, scan_window);
     }
 
@@ -666,7 +1022,7 @@
     UINT8   rsp_data[BTM_BLE_AD_DATA_LEN],
             *p = rsp_data;
 
-    BTM_TRACE_EVENT0 (" BTM_BleWriteScanRsp");
+    BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
 
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return BTM_ILLEGAL_VALUE;
@@ -704,9 +1060,9 @@
 {
     tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
     UINT8  *p;
-    UINT16   mask = data_mask;
+    tBTM_BLE_AD_MASK   mask = data_mask;
 
-    BTM_TRACE_EVENT0 ("BTM_BleWriteAdvData ");
+    BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
 
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return BTM_ILLEGAL_VALUE;
@@ -719,9 +1075,9 @@
 
     p_cb_data->p_pad = p;
 
-    if (data_mask != 0)
+    if (mask != 0)
     {
-        BTM_TRACE_ERROR0("Partial data write into ADV");
+        BTM_TRACE_ERROR("Partial data write into ADV");
     }
 
     p_cb_data->data_mask &= ~mask;
@@ -752,7 +1108,7 @@
     UINT8 *p = p_adv;
     UINT8 length;
     UINT8 adv_type;
-    BTM_TRACE_API1("BTM_CheckAdvData type=0x%02X", type);
+    BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
 
     STREAM_TO_UINT8(length, p);
 
@@ -780,16 +1136,17 @@
 **
 ** Description      This function is called build the adv data and rsp data.
 *******************************************************************************/
-static UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data)
+UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+                              tBTM_BLE_ADV_DATA *p_data)
 {
-    UINT16 data_mask = *p_data_mask;
+    UINT32 data_mask = *p_data_mask;
     UINT8   *p = *p_dst,
     *p_flag = NULL;
     UINT16  len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
     UINT8   i = 0;
     tBTM_BLE_PROP_ELEM      *p_elem;
 
-    BTM_TRACE_EVENT0 (" btm_ble_build_adv_data");
+    BTM_TRACE_EVENT (" btm_ble_build_adv_data");
 
     /* build the adv data structure and build the data string */
     if (data_mask)
@@ -797,7 +1154,7 @@
         /* flags */
         if (data_mask & BTM_BLE_AD_BIT_FLAGS)
         {
-            *p++ = 2;
+            *p++ = MIN_ADV_LENGTH;
             *p++ = BTM_BLE_AD_TYPE_FLAG;
             p_flag = p;
             if (p_data)
@@ -821,13 +1178,13 @@
         }
         /* device name */
 #if BTM_MAX_LOC_BD_NAME_LEN > 0
-        if (len > 2 && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
         {
-            if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - 2))
+            if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH))
             {
-                *p++ = len - 2 + 1;
+                *p++ = len - MIN_ADV_LENGTH + 1;
                 *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
-                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - 2);
+                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
             }
             else
             {
@@ -836,61 +1193,181 @@
                 *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
                 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
             }
-            len -= (cp_len + 2);
+            len -= (cp_len + MIN_ADV_LENGTH);
             data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
         }
 #endif
         /* manufacturer data */
-        if (len > 2 && data_mask & BTM_BLE_AD_BIT_MANU &&
-            p_data && p_data->manu.len != 0 && p_data->manu.p_val)
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
+            p_data && p_data->p_manu &&
+            p_data->p_manu->len != 0 && p_data->p_manu->p_val)
         {
-            if (p_data->manu.len > (len - 2))
-                cp_len = len - 2;
+            if (p_data->p_manu->len > (len - MIN_ADV_LENGTH))
+                cp_len = len - MIN_ADV_LENGTH;
             else
-                cp_len = p_data->manu.len;
+                cp_len = p_data->p_manu->len;
 
             *p++ = cp_len + 1;
             *p++ = BTM_BLE_AD_TYPE_MANU;
-            ARRAY_TO_STREAM(p, p_data->manu.p_val, cp_len);
+            ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
 
-            len -= (cp_len + 2);
+            len -= (cp_len + MIN_ADV_LENGTH);
             data_mask &= ~BTM_BLE_AD_BIT_MANU;
         }
         /* TX power */
-        if (len > 2 && data_mask & BTM_BLE_AD_BIT_TX_PWR)
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR)
         {
-            *p++ = 2;
+            *p++ = MIN_ADV_LENGTH;
             *p++ = BTM_BLE_AD_TYPE_TX_PWR;
-            *p++ = btm_cb.ble_ctr_cb.inq_var.tx_power;
+            if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX)
+                p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
+            *p++ = btm_ble_map_adv_tx_power(p_data->tx_power);
             len -= 3;
-
             data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
         }
-        /* services */
-        if (len > 2 && data_mask & BTM_BLE_AD_BIT_SERVICE &&
-            p_data && p_data->services.num_service != 0 &&
-            p_data->services.p_uuid)
+        /* 16 bits services */
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
+            p_data && p_data->p_services &&
+            p_data->p_services->num_service != 0 &&
+            p_data->p_services->p_uuid)
         {
-            if (p_data->services.num_service * 2 > (len - 2))
+            if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH))
             {
-                cp_len = (len - 2)/2;
-                *p ++ = 1 + cp_len * 2;
+                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16;
+                *p ++ = 1 + cp_len * LEN_UUID_16;
                 *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
             }
             else
             {
-                cp_len = p_data->services.num_service;
-                *p++ = 1 + cp_len * 2;
+                cp_len = p_data->p_services->num_service;
+                *p++ = 1 + cp_len * LEN_UUID_16;
                 *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
             }
             for (i = 0; i < cp_len; i ++)
             {
-                UINT16_TO_STREAM(p, *(p_data->services.p_uuid + i));
+                UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
             }
 
-            len -= (cp_len * 2 + 2);
+            len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
             data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
         }
+        /* 32 bits service uuid */
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
+            p_data && p_data->p_service_32b &&
+            p_data->p_service_32b->num_service != 0 &&
+            p_data->p_service_32b->p_uuid)
+        {
+            if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
+            {
+                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
+                *p ++ = 1 + cp_len * LEN_UUID_32;
+                *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
+            }
+            else
+            {
+                cp_len = p_data->p_service_32b->num_service;
+                *p++ = 1 + cp_len * LEN_UUID_32;
+                *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
+            }
+            for (i = 0; i < cp_len; i ++)
+            {
+                UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
+            }
+
+            len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
+            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
+        }
+        /* 128 bits services */
+        if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
+            p_data && p_data->p_services_128b)
+        {
+            *p ++ = 1 + MAX_UUID_SIZE;
+            if (!p_data->p_services_128b->list_cmpl)
+                *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
+            else
+                *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
+
+            ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
+
+            len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
+            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
+        }
+        /* 32 bits Service Solicitation UUIDs */
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
+            p_data && p_data->p_sol_service_32b &&
+            p_data->p_sol_service_32b->num_service != 0 &&
+            p_data->p_sol_service_32b->p_uuid)
+        {
+            if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
+            {
+                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
+                *p ++ = 1 + cp_len * LEN_UUID_32;
+            }
+            else
+            {
+                cp_len = p_data->p_sol_service_32b->num_service;
+                *p++ = 1 + cp_len * LEN_UUID_32;
+            }
+
+            *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
+            for (i = 0; i < cp_len; i ++)
+            {
+                UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
+            }
+
+            len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
+            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
+        }
+        /* 128 bits Solicitation services UUID */
+        if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
+            p_data && p_data->p_sol_service_128b)
+        {
+            *p ++ = 1 + MAX_UUID_SIZE;
+            *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
+            ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
+            len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
+            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
+        }
+        /* 16bits/32bits/128bits Service Data */
+        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
+            p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val)
+        {
+            if (len  > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH))
+            {
+                if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH))
+                    cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len;
+                else
+                    cp_len = p_data->p_service_data->len;
+
+                *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
+                if (p_data->p_service_data->service_uuid.len == LEN_UUID_16)
+                {
+                    *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
+                    UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
+                }
+                else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32)
+                {
+                    *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
+                    UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
+                }
+                else
+                {
+                    *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
+                    ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
+                                    LEN_UUID_128);
+                }
+
+                ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
+
+                len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
+                data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
+            }
+            else
+            {
+                BTM_TRACE_WARNING("service data does not fit");
+            }
+        }
+
         if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
             p_data)
         {
@@ -907,17 +1384,18 @@
             {
                 p_elem = p_data->p_proprietary->p_elem  + i;
 
-                if (len >= (2 + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2) + value length */
+                if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
+                                                          + value length */
                 {
                     *p ++ = p_elem->len + 1; /* Uuid len + value length */
                     *p ++ = p_elem->adv_type;
                     ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
 
-                    len -= (2 + p_elem->len);
+                    len -= (MIN_ADV_LENGTH + p_elem->len);
                 }
                 else
                 {
-                    BTM_TRACE_WARNING0("data exceed max adv packet length");
+                    BTM_TRACE_WARNING("data exceed max adv packet length");
                     break;
                 }
             }
@@ -930,16 +1408,108 @@
 
     return p_flag;
 }
+/*******************************************************************************
+**
+** Function         btm_ble_select_adv_interval
+**
+** Description      select adv interval based on device mode
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
+{
+    if (p_cb->adv_interval_min && p_cb->adv_interval_max)
+    {
+        *p_adv_int_min = p_cb->adv_interval_min;
+        *p_adv_int_max = p_cb->adv_interval_max;
+    }
+    else
+    {
+        switch (evt_type)
+        {
+        case BTM_BLE_CONNECT_EVT:
+            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
+            break;
 
+        case BTM_BLE_NON_CONNECT_EVT:
+        case BTM_BLE_DISCOVER_EVT:
+            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
+            break;
+        /* connectable directed event */
+        case BTM_BLE_CONNECT_DIR_EVT:
+            *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
+            *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
+            break;
+
+        default:
+            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
+            break;
+        }
+    }
+    return;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_set_adv_flag
+**
+** Description      Set adv flag in adv data.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
+{
+    UINT8 flag = 0, old_flag = 0;
+    tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
+
+    if (p_adv_data->p_flags != NULL)
+        flag = old_flag = *(p_adv_data->p_flags);
+
+    /* BR/EDR non-discoverable , non-connectable */
+    if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
+        (connect_mode & BTM_CONNECTABLE_MASK) == 0)
+        flag |= BTM_BLE_BREDR_NOT_SPT;
+    else
+        flag &= ~BTM_BLE_BREDR_NOT_SPT;
+
+    /* if local controller support, mark both controller and host support in flag */
+    if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
+        flag |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
+    else
+        flag &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
+
+    BTM_TRACE_DEBUG("disc_mode %04x", disc_mode);
+    /* update discoverable flag */
+    if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE)
+    {
+        flag &= ~BTM_BLE_GEN_DISC_FLAG;
+        flag |= BTM_BLE_LIMIT_DISC_FLAG ;
+    }
+    else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE)
+    {
+        flag |= BTM_BLE_GEN_DISC_FLAG;
+        flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
+    }
+    else /* remove all discoverable flags */
+    {
+        flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG);
+    }
+
+    if (flag != old_flag)
+    {
+        btm_ble_update_adv_flag(flag);
+    }
+}
 /*******************************************************************************
 **
 ** Function         btm_ble_set_discoverability
 **
 ** Description      This function is called to set BLE discoverable mode.
 **
-** Parameters:      mode: discoverability mode.
+** Parameters:      combined_mode: discoverability mode.
 **
-** Returns          void
+** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
 **
 *******************************************************************************/
 tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
@@ -947,7 +1517,6 @@
     tBTM_LE_RANDOM_CB   *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tBTM_BLE_INQ_CB     *p_cb = &btm_cb.ble_ctr_cb.inq_var;
     UINT16              mode = (combined_mode &  BTM_BLE_DISCOVERABLE_MASK);
-    UINT8               flag = 0;
     UINT8               new_mode = BTM_BLE_ADV_ENABLE;
     UINT8               evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
                                    ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
@@ -955,64 +1524,37 @@
     tBTM_STATUS         status = BTM_SUCCESS;
     BD_ADDR             p_addr_ptr= {0};
     tBLE_ADDR_TYPE      init_addr_type = BLE_ADDR_PUBLIC,
-                        own_addr_type = p_addr_cb->own_addr_type;;
+                        own_addr_type = p_addr_cb->own_addr_type;
+    UINT16              adv_int_min, adv_int_max;
 
-    BTM_TRACE_EVENT2 ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+    BTM_TRACE_EVENT ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
 
     /*** Check mode parameter ***/
     if (mode > BTM_BLE_MAX_DISCOVERABLE)
         return(BTM_ILLEGAL_VALUE);
 
-    p_cb->br_edr_supported_flag |= (combined_mode & BTM_DISCOVERABLE_MASK);
-    p_cb->discoverable_mode = mode;
+    btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
 
-    if (!p_cb->br_edr_supported_flag)
-    {
-        flag = BTM_BLE_BREDR_NOT_SPT;
-        BTM_TRACE_DEBUG1("btm_ble_set_discoverability (BREDR not sup)flag=0x%x",flag);
-    }
+    evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
 
-    BTM_TRACE_DEBUG1 ("br_edr_supported=0x%x", p_cb->br_edr_supported_flag);
+    if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE)
+        new_mode = BTM_BLE_ADV_DISABLE;
 
-    if (mode == BTM_BLE_LIMITED_DISCOVERABLE || mode == BTM_BLE_GENERAL_DISCOVERABLE)
-    {
-        BTM_TRACE_EVENT0 ("mode == BTM_BLE_LIMITED_DISCOVERABLE ");
-        /* write ADV data with limited disc flag */
-        if (mode == BTM_BLE_LIMITED_DISCOVERABLE)
-            flag |= BTM_BLE_LIMIT_DISC_FLAG ;
-        else
-            flag |= BTM_BLE_GEN_DISC_FLAG;
-    }
-    else  /* non-discoverable */
-    {
-        BTM_TRACE_EVENT0 ("mode == BTM_BLE_NON_DISCOVERABLE ");
+    btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
 
-        if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE)
-        {
-            p_cb->br_edr_supported_flag = 0;
-
-            BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode if no scan rsp ");
-            if (!p_cb->scan_rsp )
-	            new_mode = BTM_BLE_ADV_DISABLE;
-
-        }
-        else
-        {
-            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
-        }
-    }
-    btm_ble_update_adv_flag(flag);
+    btu_stop_timer(&p_cb->fast_adv_timer);
 
     /* update adv params if start advertising */
-    BTM_TRACE_EVENT2 ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
+    BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
+
     if (new_mode == BTM_BLE_ADV_ENABLE &&
-        (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type))
+        (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type || !p_cb->fast_adv_on))
     {
         btm_ble_stop_adv();
 
         /* update adv params */
-        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
-                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+        if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
+                                              adv_int_max,
                                               evt_type,
                                               own_addr_type,
                                               init_addr_type,
@@ -1036,11 +1578,18 @@
         else
             status = btm_ble_stop_adv();
     }
+    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+    {
+        p_cb->fast_adv_on = TRUE;
+        /* start initial GAP mode adv timer */
+        btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
+                          BTM_BLE_GAP_FAST_ADV_TOUT);
+    }
 
     /* set up stop advertising timer */
     if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
     {
-        BTM_TRACE_EVENT1 ("start timer for limited disc mode duration=%d (30 secs)", BTM_BLE_GAP_LIM_TOUT);
+        BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
         /* start Tgap(lim_timeout) */
         btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
                          BTM_BLE_GAP_LIM_TOUT);
@@ -1054,9 +1603,9 @@
 **
 ** Description      This function is called to set BLE connectability mode.
 **
-** Parameters:      mode: connectability mode.
+** Parameters:      combined_mode: connectability mode.
 **
-** Returns          void
+** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
 **
 *******************************************************************************/
 tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
@@ -1064,57 +1613,39 @@
     tBTM_LE_RANDOM_CB       *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
     UINT16                  mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
-    UINT8                   cur_flag = 0;
-    UINT8                   cur_br_edr_not_sup_flag;
-    UINT8                   new_flag;
     UINT8                   new_mode = BTM_BLE_ADV_ENABLE;
     UINT8                   evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
     tBTM_STATUS             status = BTM_SUCCESS;
     BD_ADDR                 p_addr_ptr =  {0};
     tBLE_ADDR_TYPE          init_addr_type = BLE_ADDR_PUBLIC,
                             own_addr_type = p_addr_cb->own_addr_type;
+    UINT16                  adv_int_min, adv_int_max;
 
-    BTM_TRACE_EVENT2 ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+    BTM_TRACE_EVENT ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
+
     /*** Check mode parameter ***/
     if (mode > BTM_BLE_MAX_CONNECTABLE)
         return(BTM_ILLEGAL_VALUE);
-    if (btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags)
-        cur_flag = *btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags ;
-    cur_br_edr_not_sup_flag = (cur_flag & ((UINT8) BTM_BLE_BREDR_NOT_SPT));
 
-    p_cb->br_edr_supported_flag |= ((combined_mode & BTM_CONNECTABLE_MASK) << 4);
-    if (p_cb->br_edr_supported_flag && cur_br_edr_not_sup_flag)
-    {
-        new_flag = cur_flag & ((UINT8) (~BTM_BLE_BREDR_NOT_SPT));
-        BTM_TRACE_EVENT2 ("new flag=0x%x cur flag=0x%x",new_flag,  cur_flag);
-        btm_ble_update_adv_flag(new_flag);
-    }
     p_cb->connectable_mode = mode;
 
-    if (mode == BTM_BLE_NON_CONNECTABLE)
-    {
-        if (p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
-        {
-            p_cb->br_edr_supported_flag = 0;
-            BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode with no scan rsp");
-            if(!p_cb->scan_rsp)
-	            new_mode = BTM_BLE_ADV_DISABLE;
+    btm_ble_set_adv_flag (combined_mode,  btm_cb.btm_inq_vars.discoverable_mode);
 
-        }
-    }
-    else /* connectable */
-    {
-        evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
-    }
+    evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
 
+    if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
+        new_mode = BTM_BLE_ADV_DISABLE;
+
+    btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
+
+    btu_stop_timer(&p_cb->fast_adv_timer);
     /* update adv params if needed */
-    if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type)
-        && new_mode == BTM_BLE_ADV_ENABLE)
+    if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type || !p_cb->fast_adv_on))
     {
         btm_ble_stop_adv();
 
-        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
-                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
+        if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
+                                              adv_int_max,
                                               evt_type,
                                               own_addr_type,
                                               init_addr_type,
@@ -1132,24 +1663,22 @@
     /* update advertising mode */
     if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
     {
-        if (btsnd_hcic_ble_set_adv_enable (new_mode))
-        {
-            status = BTM_SUCCESS;
-
-            p_cb->adv_mode = new_mode;
-
-            if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE &&
-                p_cb->afp != AP_SCAN_CONN_ALL)
-                btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
-            else
-                btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
-
-        }
+        if (new_mode == BTM_BLE_ADV_ENABLE)
+            status = btm_ble_start_adv();
+        else
+            status = btm_ble_stop_adv();
     }
-
+    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+    {
+        p_cb->fast_adv_on = TRUE;
+        /* start initial GAP mode adv timer */
+        btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
+                             BTM_BLE_GAP_FAST_ADV_TOUT);
+    }
     return status;
 }
 
+
 /*******************************************************************************
 **
 ** Function         btm_ble_start_inquiry
@@ -1171,24 +1700,37 @@
 *******************************************************************************/
 tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
 {
-    tBTM_STATUS status = BTM_NO_RESOURCES;
-    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
+    tBTM_STATUS status = BTM_CMD_STARTED;
+    tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
+    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
 
-    BTM_TRACE_DEBUG2("btm_ble_start_inquiry: mode = %02x inq_active = %d", mode, btm_cb.btm_inq_vars.inq_active);
+    BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
 
-    if (p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
+    /* if selective connection is active, or inquiry is already active, reject it */
+    if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
+        BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity))
     {
-        BTM_TRACE_ERROR0("LE scan is active, can not start inquiry");
+        BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
         return(BTM_BUSY);
     }
 
-    btm_update_scanner_filter_policy(SP_ADV_ALL);
-
-    /* start scan, already enable duplicate filtering */
-    if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
+    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
     {
-        status = BTM_CMD_STARTED;
-        p_inq->proc_mode = mode;
+        btm_update_scanner_filter_policy(SP_ADV_ALL);
+
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+        /* enable IRK list */
+        btm_ble_vendor_irk_list_known_dev (TRUE);
+#endif
+        status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
+    }
+
+    if (status == BTM_CMD_STARTED)
+    {
+        p_inq->inq_active |= mode;
+        p_ble_cb->scan_activity |= mode;
+
+        BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
 
         if (duration != 0)
         {
@@ -1198,6 +1740,7 @@
     }
 
     return status;
+
 }
 
 /*******************************************************************************
@@ -1215,6 +1758,10 @@
     BD_NAME bd_name;
 
     memset(bd_name, 0, (BD_NAME_LEN + 1));
+    if (length > BD_NAME_LEN)
+    {
+        length = BD_NAME_LEN;
+    }
     memcpy((UINT8*)bd_name, p_name, length);
 
     if ((!status) || (length==0))
@@ -1249,7 +1796,7 @@
         p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
         p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
     {
-        BTM_TRACE_DEBUG0("name request to non-connectable device failed.");
+        BTM_TRACE_DEBUG("name request to non-connectable device failed.");
         return BTM_ERR_PROCESSING;
     }
 
@@ -1314,11 +1861,11 @@
     tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
     UINT8   *p;
 
-    BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag new=0x%x", flag);
+    BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
 
     if (p_adv_data->p_flags != NULL)
     {
-        BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag old=0x%x",   *p_adv_data->p_flags);
+        BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x",   *p_adv_data->p_flags);
         *p_adv_data->p_flags = flag;
     }
     else /* no FLAGS in ADV data*/
@@ -1361,17 +1908,17 @@
     UINT8   *p_cur = p_data;
     UINT8   ad_len, ad_type, ad_flag;
 
-    BTM_TRACE_EVENT0 (" btm_ble_parse_adv_data");
+    BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
 
     while (len > 0)
     {
-        BTM_TRACE_DEBUG1("btm_ble_parse_adv_data: len = %d", len);
+        BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
         if ((ad_len = *p_cur ++) == 0)
             break;
 
         ad_type = *p_cur ++;
 
-        BTM_TRACE_DEBUG2("     ad_type = %02x ad_len = %d", ad_type, ad_len);
+        BTM_TRACE_DEBUG("     ad_type = %02x ad_len = %d", ad_type, ad_len);
 
         switch (ad_type)
         {
@@ -1387,7 +1934,7 @@
                     p_info->remote_name[ad_len] = 0;
                     p_adv_data->p_remote_name = p_info->remote_name;
                     p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
-                    BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
+                    BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
                 }
                 p_cur += (ad_len -1);
 
@@ -1397,7 +1944,7 @@
                 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
                 ad_flag = *p_cur ++;
                 p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
-                BTM_TRACE_DEBUG3("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
+                BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
                                  (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
                                  (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
                                  (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
@@ -1406,7 +1953,7 @@
             case BTM_BLE_AD_TYPE_TX_PWR:
                 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
                 p_adv_data->tx_power_level = (INT8)*p_cur ++;
-                BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
+                BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
                 break;
 
             case BTM_BLE_AD_TYPE_MANU:
@@ -1416,7 +1963,7 @@
                 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
                 /* need allocate memory to store UUID list */
                 p_adv_data->service.num_service = (ad_len - 1)/2;
-                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
                 p_cur += (ad_len - 1);
                 break;
 
@@ -1424,7 +1971,7 @@
                 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
                 /* need allocate memory to store UUID list */
                 p_adv_data->service.num_service = (ad_len - 1)/2;
-                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
                 p_cur += (ad_len - 1);
                 break;
 
@@ -1432,7 +1979,7 @@
                 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
                 /* need allocate memory to store UUID list */
                 p_adv_data->service.num_service = (ad_len - 1)/16;
-                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
+                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
                 p_cur += (ad_len - 1);
                 break;
 
@@ -1504,68 +2051,181 @@
 ** Returns          void
 **
 *******************************************************************************/
-BOOLEAN btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
+UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
 {
-    BOOLEAN             is_discoverable = FALSE;
-    UINT8               *p_flag, flag = 0;
+    UINT8               *p_flag, flag = 0, rt = 0;
     UINT8                data_len;
     tBTM_INQ_PARMS      *p_cond = &btm_cb.btm_inq_vars.inqparms;
+    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
 
-    STREAM_TO_UINT8    (data_len, p);
+    UNUSED(p);
 
     /* for observer, always "discoverable */
-    if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE ||
-        (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_SELECT_SCAN &&
-        btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE))
-        return TRUE;
+    if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+        rt |= BTM_BLE_OBS_RESULT;
+
+    if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
+        (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
+        rt |= BTM_BLE_SEL_CONN_RESULT;
 
     /* does not match filter condition */
     if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
         memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
     {
-        BTM_TRACE_DEBUG0("BD ADDR does not meet filter condition");
-        return FALSE;
+        BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
+        return rt;
     }
 
-    /* scan response does not include the flag */
-    if (evt_type == BTM_BLE_SCAN_RSP_EVT)
-        return FALSE;
-
-    if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
+    if (p_le_inq_cb->adv_len != 0)
     {
-        BTM_TRACE_WARNING1("ADV data too long %d. discard", data_len);
-        return FALSE;
-    }
-
-    if (data_len != 0)
-    {
-        if ((p_flag = BTM_CheckAdvData(p, BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
+        if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
+            BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
         {
             flag = * p_flag;
 
-            if ((btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_GENERAL_INQUIRY) &&
+            if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
                 (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
             {
-                BTM_TRACE_DEBUG0("Find Generable Discoverable device");
-                is_discoverable = TRUE;
+                BTM_TRACE_DEBUG("Find Generable Discoverable device");
+                rt |= BTM_BLE_INQ_RESULT;
             }
 
-            else if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_LIMITED_INQUIRY &&
+            else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
                      (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
             {
-                BTM_TRACE_DEBUG0("Find limited discoverable device");
-                is_discoverable = TRUE;
+                BTM_TRACE_DEBUG("Find limited discoverable device");
+                rt |= BTM_BLE_INQ_RESULT;
             }
-
         }
     }
+    return rt;
+}
 
-    if (!is_discoverable)
+static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
+{
+    dev_class[0] = 0;
+
+    switch (appearance)
     {
-        BTM_TRACE_ERROR1("discoverable flag not desired: %d", flag);
-    }
-
-    return is_discoverable;
+        case BTM_BLE_APPEARANCE_GENERIC_PHONE:
+            dev_class[1] = BTM_COD_MAJOR_PHONE;
+            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
+            dev_class[1] = BTM_COD_MAJOR_COMPUTER;
+            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
+        case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_THERMOMETER;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
+        case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
+        case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
+        case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
+        case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
+        case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_WALKING:
+        case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
+        case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
+        case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
+            dev_class[1] = BTM_COD_MAJOR_HEALTH;
+            dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_WATCH:
+        case BTM_BLE_APPEARANCE_SPORTS_WATCH:
+            dev_class[1] = BTM_COD_MAJOR_WEARABLE;
+            dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
+            dev_class[1] = BTM_COD_MAJOR_WEARABLE;
+            dev_class[2] = BTM_COD_MINOR_GLASSES;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
+            dev_class[1] = BTM_COD_MAJOR_IMAGING;
+            dev_class[2] = BTM_COD_MINOR_DISPLAY;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
+            dev_class[1] = BTM_COD_MAJOR_AUDIO;
+            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+            break;
+        case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
+        case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
+        case BTM_BLE_APPEARANCE_GENERIC_HID:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+            break;
+        case BTM_BLE_APPEARANCE_HID_KEYBOARD:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_KEYBOARD;
+            break;
+        case BTM_BLE_APPEARANCE_HID_MOUSE:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_POINTING;
+            break;
+        case BTM_BLE_APPEARANCE_HID_JOYSTICK:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_JOYSTICK;
+            break;
+        case BTM_BLE_APPEARANCE_HID_GAMEPAD:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_GAMEPAD;
+            break;
+        case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
+            break;
+        case BTM_BLE_APPEARANCE_HID_CARD_READER:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_CARD_READER;
+            break;
+        case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
+            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+            dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
+            break;
+        case BTM_BLE_APPEARANCE_UKNOWN:
+        case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
+        case BTM_BLE_APPEARANCE_GENERIC_TAG:
+        case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
+        case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
+        case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
+        case BTM_BLE_APPEARANCE_CYCLING_SPEED:
+        case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
+        case BTM_BLE_APPEARANCE_CYCLING_POWER:
+        case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
+        case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
+        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
+        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
+        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
+        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
+        default:
+            dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
+            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
+    };
 }
 
 /*******************************************************************************
@@ -1595,7 +2255,7 @@
 
     if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
     {
-        BTM_TRACE_WARNING1("EIR data too long %d. discard", data_len);
+        BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
         return FALSE;
     }
     btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
@@ -1612,7 +2272,7 @@
     if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
          (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
     {
-        BTM_TRACE_DEBUG1("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
+        BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
                               scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
         p_i->scan_rsp = FALSE;
         to_report = FALSE;
@@ -1638,19 +2298,31 @@
 
     if (p_le_inq_cb->adv_len != 0)
     {
-        if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
-                                         BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
+        /* Check to see the BLE device has the Appearance UUID in the advertising data.  If it does
+         * then try to convert the appearance value to a class of device value Bluedroid can use.
+         * Otherwise fall back to trying to infer if it is a HID device based on the service class.
+         */
+        p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
+        if (p_uuid16 && len == 2)
         {
-            UINT8 i;
-            for (i = 0; i + 2 <= len; i = i + 2)
+            btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
+        }
+        else
+        {
+            if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
+                                             BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
             {
-                /* if this BLE device support HID over LE, set HID Major in class of device */
-                if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
+                UINT8 i;
+                for (i = 0; i + 2 <= len; i = i + 2)
                 {
-                    p_cur->dev_class[0] = 0;
-                    p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
-                    p_cur->dev_class[2] = 0;
-                    break;
+                    /* if this BLE device support HID over LE, set HID Major in class of device */
+                    if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
+                    {
+                        p_cur->dev_class[0] = 0;
+                        p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
+                        p_cur->dev_class[2] = 0;
+                        break;
+                    }
                 }
             }
         }
@@ -1662,15 +2334,15 @@
     {
         if (p_cur->ble_addr_type != BLE_ADDR_RANDOM)
         {
-            BTM_TRACE_DEBUG0("BR/EDR NOT support bit not set, treat as DUMO");
+            BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
             p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
         } else {
-            BTM_TRACE_DEBUG0("Random address, treating device as LE only");
+            BTM_TRACE_DEBUG("Random address, treating device as LE only");
         }
     }
     else
     {
-        BTM_TRACE_DEBUG0("BR/EDR NOT SUPPORT bit set, LE only device");
+        BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
     }
 
     return to_report;
@@ -1738,49 +2410,61 @@
     BD_ADDR             bda;
     UINT8               evt_type = 0, *p = p_data;
     UINT8               addr_type = 0;
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+    UINT8               num_reports;
+    UINT8               data_len;
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
     BOOLEAN             match = FALSE;
 #endif
 
-    /* always get one device at a time */
-    p ++;
+    /* Extract the number of reports in this event. */
+    STREAM_TO_UINT8(num_reports, p);
 
-    /* Extract inquiry results */
-    STREAM_TO_UINT8    (evt_type, p);
-    STREAM_TO_UINT8    (addr_type, p);
-    STREAM_TO_BDADDR   (bda, p);
+    while (num_reports--)
+    {
+        /* Extract inquiry results */
+        STREAM_TO_UINT8    (evt_type, p);
+        STREAM_TO_UINT8    (addr_type, p);
+        STREAM_TO_BDADDR   (bda, p);
 
 #ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
-    if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
-    {
-        if (btm_cb.ble_ctr_cb.p_scan_req_cback)
-            (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
-    }
+        if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
+        {
+            if (btm_cb.ble_ctr_cb.p_scan_req_cback)
+                (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
+        }
 #endif
 
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
+    /* map address to security record */
+    btm_public_addr_to_random_pseudo(bda, &addr_type);
+    BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
+                     bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
+#endif
 
+        /* Only process the results if the inquiry is still active */
+        if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+            return;
 
-    /* Only process the results if the inquiry is still active */
-    if ((btm_cb.btm_inq_vars.inq_active & BTM_LE_SCAN_ACTIVE_MASK) == 0 &&
-        (btm_cb.ble_ctr_cb.bg_conn_type != BTM_BLE_CONN_SELECTIVE ||
-         /* or selective auto connection is active */
-         btm_cb.ble_ctr_cb.p_select_cback == NULL))
-        return;
-
-    BTM_TRACE_DEBUG6("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
+    BTM_TRACE_DEBUG("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
                                      bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
-#if (defined BTM_BLE_PRIVACY_SPT && BTM_BLE_PRIVACY_SPT == TRUE)
+#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
 #if SMP_INCLUDED == TRUE
-    /* always do RRA resolution on host */
-    if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
-    {
-        btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
-    }
-    else
+        /* always do RRA resolution on host */
+        if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+        {
+            btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
+        }
+        else
 #endif
 #endif
-    {
-        btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
+        {
+            btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
+        }
+
+        STREAM_TO_UINT8(data_len, p);
+
+        /* Advance to the next event data_len + rssi byte */
+        p += data_len + 1;
     }
 }
 
@@ -1799,13 +2483,12 @@
 static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
 {
     tINQ_DB_ENT          *p_i;
-    BOOLEAN              to_report = FALSE;
-    BOOLEAN              to_report_LE = TRUE; //var for reporting to LE observe
     tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
     tBTM_INQ_RESULTS_CB  *p_inq_results_cb = p_inq->p_inq_results_cb;
-    tBTM_INQ_RESULTS_CB  *p_inq_ble_results_cb = p_inq->p_inq_ble_results_cb;
+    tBTM_INQ_RESULTS_CB  *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
     tBTM_BLE_INQ_CB      *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
-    BTM_TRACE_DEBUG2("btm_ble_process_adv_pkt_cont: addr_type: %d, evt_type: %d", addr_type, evt_type);
+    BOOLEAN     update = TRUE;
+    UINT8       result = 0;
 
     p_i = btm_inq_db_find (bda);
 
@@ -1813,26 +2496,23 @@
     if (btm_inq_find_bdaddr(bda))
     {
         /* never been report as an LE device */
-        if ((p_i &&
+        if (p_i &&
             (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
               /* scan repsonse to be updated */
               (!p_i->scan_rsp)))
-            ||
-            btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE)
         {
-            BTM_TRACE_DEBUG0("update new BLE information ");
-            to_report = TRUE;
+            update = TRUE;
+        }
+        else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
+        {
+            update = FALSE;
         }
         else
         {
-            to_report = FALSE;
+            /* if yes, skip it */
+            return; /* assumption: one result per event */
         }
     }
-    else /* not been processed in this round */
-    {
-        to_report = TRUE;
-    }
-
     /* If existing entry, use that, else get  a new one (possibly reusing the oldest) */
     if (p_i == NULL)
     {
@@ -1842,25 +2522,22 @@
         }
         else
             return;
-
-        if (to_report && btm_ble_is_discoverable(bda, evt_type, p))
-        {
-            to_report = TRUE;
-        }
-        else
-        {
-            BTM_TRACE_ERROR0("discard adv pkt");
-            to_report = FALSE;
-        }
     }
     else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
     {
         p_inq->inq_cmpl_info.num_resp++;
     }
     /* update the LE device information in inquiry database */
-    to_report_LE = btm_ble_update_inq_result(p_i, addr_type, evt_type, p);
-    if (to_report)
-        to_report = to_report_LE;
+    if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p))
+        return;
+
+    if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0)
+    {
+        BTM_TRACE_ERROR("discard adv pkt");
+        return;
+    }
+    if (!update)
+        result &= ~BTM_BLE_INQ_RESULT;
 #if BTM_USE_INQ_RESULTS_FILTER == TRUE
     /* If the number of responses found and limited, issue a cancel inquiry */
     if (p_inq->inqparms.max_resps &&
@@ -1871,15 +2548,14 @@
             (/* assume a DUMO device, BR/EDR inquiry is always active */
              p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
         {
-            BTM_TRACE_WARNING0("INQ RES: Extra Response Received...cancelling inquiry..");
+            BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
 
             /* if is non-periodic inquiry active, cancel now */
             if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
                 (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
                 btsnd_hcic_inq_cancel();
 
-            /* stop LE scan now */
-            btm_ble_stop_scan();
+            btm_ble_stop_inquiry();
 
 #if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
             btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
@@ -1887,32 +2563,61 @@
         }
     }
 #endif
-
-    BTM_TRACE_DEBUG2("btm_ble_process_adv_pkt_cont: to_report =%d, to_report_le=%d",
-                                                               to_report, to_report_LE);
     /* background connection in selective connection mode */
     if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
     {
-        if (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE &&
-            (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
+        if (result & BTM_BLE_SEL_CONN_RESULT)
             btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
         else
         {
-            BTM_TRACE_DEBUG0("None LE device, can not initiate selective connection");
+            BTM_TRACE_DEBUG("None LE device, can not initiate selective connection");
         }
     }
-    else if (to_report || to_report_LE)
+    else
     {
-        if(p_inq_results_cb && to_report)
+        if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT))
+        {
             (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
-        if(p_inq_ble_results_cb && to_report_LE)
-            (p_inq_ble_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results,
-                                                      p_le_inq_cb->adv_data_cache);
+        }
+        if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT))
+        {
+            (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
+        }
     }
 }
 
 /*******************************************************************************
 **
+** Function         btm_ble_start_scan
+**
+** Description      Start the BLE scan.
+**
+** Returns          void
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_start_scan (UINT8 filter_enable)
+{
+    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
+    tBTM_STATUS status = BTM_CMD_STARTED;
+
+    /* start scan, disable duplicate filtering */
+    if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, filter_enable)) {
+        status = BTM_NO_RESOURCES;
+        btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
+    }
+    else
+    {
+        btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_SCAN;
+        if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI)
+            btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
+        else
+            btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
+    }
+    return status;
+}
+
+/*******************************************************************************
+**
 ** Function         btm_ble_stop_scan
 **
 ** Description      Stop the BLE scan.
@@ -1922,44 +2627,137 @@
 *******************************************************************************/
 void btm_ble_stop_scan(void)
 {
-    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
-    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
-
-    BTM_TRACE_EVENT0 ("btm_ble_stop_scan ");
-
-    btu_stop_timer (&p_cb->inq_timer_ent);
+    BTM_TRACE_EVENT ("btm_ble_stop_scan ");
 
     /* Clear the inquiry callback if set */
-    p_cb->scan_type = BTM_BLE_SCAN_MODE_NONE;
-    p_cb->proc_mode = BTM_BLE_INQUIRY_NONE;
+    btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
 
     /* stop discovery now */
     btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
 
-    /* If we have a callback registered for inquiry complete, call it */
-    BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
-                      p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
-
     btm_update_scanner_filter_policy(SP_ADV_ALL);
 
-    btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
-
+    btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
 }
+/*******************************************************************************
+**
+** Function         btm_ble_stop_inquiry
+**
+** Description      Stop the BLE Inquiry.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_stop_inquiry(void)
+{
+    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
+    tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
+
+    btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
+
+    p_ble_cb->scan_activity &=  ~BTM_BLE_INQUIRY_MASK;
+
+    /* If no more scan activity, stop LE scan now */
+    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
+        btm_ble_stop_scan();
+
+    /* If we have a callback registered for inquiry complete, call it */
+    BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
+                      p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
+
+    btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_stop_observe
+**
+** Description      Stop the BLE Observe.
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btm_ble_stop_observe(void)
+{
+    tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
+    tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
+
+    btu_stop_timer (&p_ble_cb->obs_timer_ent);
+
+    p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
+
+    p_ble_cb->p_obs_results_cb = NULL;
+    p_ble_cb->p_obs_cmpl_cb = NULL;
+
+    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
+        btm_ble_stop_scan();
+
+    if (p_obs_cb)
+        (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
+}
+/*******************************************************************************
+**
+** Function         btm_ble_adv_states_operation
+**
+** Description      Set or clear adv states in topology mask
+**
+** Returns          operation status. TRUE if sucessful, FALSE otherwise.
+**
+*******************************************************************************/
+typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
+static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
+{
+    BOOLEAN rt = FALSE;
+
+    switch (adv_evt)
+    {
+    case BTM_BLE_CONNECT_EVT:
+        rt  = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
+        break;
+
+    case  BTM_BLE_NON_CONNECT_EVT:
+        rt  = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
+        break;
+    case BTM_BLE_CONNECT_DIR_EVT:
+        rt  =  (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
+        break;
+
+    case BTM_BLE_DISCOVER_EVT:
+        rt  =  (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
+        break;
+
+    default:
+        BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
+        break;
+    }
+
+    return rt;
+}
+
 
 /*******************************************************************************
 **
 ** Function         btm_ble_start_adv
 **
-** Description      Stop the BLE advertising.
+** Description      start the BLE advertising.
 **
 ** Returns          void
 **
 *******************************************************************************/
-static tBTM_STATUS btm_ble_start_adv(void)
+tBTM_STATUS btm_ble_start_adv(void)
 {
     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
     tBTM_STATUS     rt = BTM_NO_RESOURCES;
 
+    if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type))
+        return BTM_WRONG_MODE;
+
+    if (p_cb->afp != AP_SCAN_CONN_ALL)
+    {
+        btm_execute_wl_dev_operation();
+        btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
+    }
+
     if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
     {
         if (p_cb->afp != AP_SCAN_CONN_ALL)
@@ -1968,13 +2766,13 @@
          p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
 
          rt = BTM_SUCCESS;
-     }
-     else
-     {
-         p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
-         btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
-     }
-     return rt;
+    }
+    else
+    {
+        p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
+        btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
+    }
+    return rt;
 }
 /*******************************************************************************
 **
@@ -1985,7 +2783,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-static tBTM_STATUS btm_ble_stop_adv(void)
+tBTM_STATUS btm_ble_stop_adv(void)
 {
     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
     tBTM_STATUS rt = BTM_SUCCESS;
@@ -1994,16 +2792,141 @@
     {
         if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
         {
+            p_cb->fast_adv_on = FALSE;
             p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
             btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
+
+            /* clear all adv states */
+            btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
         }
         else
             rt = BTM_NO_RESOURCES;
     }
     return rt;
-
 }
 
+
+/*******************************************************************************
+**
+** Function         btm_ble_set_topology_mask
+**
+** Description      set BLE topology mask
+**
+** Returns          TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
+{
+    BOOLEAN rt = TRUE;
+
+    request_state_mask &= BTM_BLE_STATE_ALL_MASK;
+
+    btm_cb.ble_ctr_cb.cur_states |= request_state_mask;
+
+    return rt;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_clear_topology_mask
+**
+** Description      Clear BLE topology bit mask
+**
+** Returns          TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
+{
+    request_state_mask &= BTM_BLE_STATE_ALL_MASK;
+
+    btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
+
+    return TRUE;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_update_mode_operation
+**
+** Description      This function update the GAP role operation when a link status
+**                  is updated.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status)
+{
+    tACL_CONN   *pa = &btm_cb.acl_db[0];
+    UINT16       xx;
+    UINT16       mask = BTM_BLE_STATE_ALL_CONN_MASK;
+
+    UNUSED(bd_addr);
+
+    if (link_role == HCI_ROLE_SLAVE)
+    {
+        btm_cb.ble_ctr_cb.inq_var.adv_mode  = BTM_BLE_ADV_DISABLE;
+        /* clear all adv states */
+        mask |= BTM_BLE_STATE_ALL_ADV_MASK;
+    }
+
+    btm_ble_clear_topology_mask (mask);
+
+    /* check the device link role maps */
+    for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
+    {
+        if (pa->in_use && pa->transport == BT_TRANSPORT_LE)
+        {
+            if (pa->link_role == HCI_ROLE_MASTER)
+                btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
+            else
+                btm_ble_set_topology_mask (BTM_BLE_STATE_SLAVE_BIT);
+        }
+    }
+
+    if (btm_cb.cmn_ble_vsc_cb.adv_inst_max == 0 &&
+        btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
+    {
+        btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
+    }
+
+    if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES)
+    {
+        if (!btm_send_pending_direct_conn())
+        {
+            btm_ble_resume_bg_conn();
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_start_slow_adv
+**
+** Description      Restart adv with slow adv interval
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btm_ble_start_slow_adv (void)
+{
+    tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
+    BD_ADDR                 p_addr_ptr= {0};
+
+    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
+    {
+        btm_ble_stop_adv();
+
+        btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT,
+                                         BTM_BLE_GAP_ADV_SLOW_INT,
+                                         p_cb->evt_type,
+                                         p_cb->adv_addr_type,
+                                         btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,/* slow adv
+                                         mode never goes into directed adv */
+                                         p_addr_ptr,
+                                         p_cb->adv_chnl_map,
+                                         p_cb->afp);
+
+        btm_ble_start_adv();
+    }
+}
 /*******************************************************************************
 **
 ** Function         btm_ble_timeout
@@ -2015,27 +2938,48 @@
 *******************************************************************************/
 void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
 {
+    BTM_TRACE_EVENT ("btm_ble_timeout");
+
     switch (p_tle->event)
     {
+        case BTU_TTYPE_BLE_OBSERVE:
+            btm_ble_stop_observe();
+            break;
+
         case BTU_TTYPE_BLE_INQUIRY:
-            btm_ble_stop_scan();
+            btm_ble_stop_inquiry();
             break;
 
         case BTU_TTYPE_BLE_GAP_LIM_DISC:
             /* lim_timeout expiried, limited discovery should exit now */
-            btm_ble_update_adv_flag(BTM_BLE_NON_LIMIT_DISC_FLAG);
-
-            btm_ble_stop_adv();
+            btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
+            btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
             break;
 
         case BTU_TTYPE_BLE_RANDOM_ADDR:
             if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
             {
-                /* refresh the random addr */
-                btm_gen_resolvable_private_addr();
+                if (NULL == (void *)(p_tle->param))
+                {
+                    /* refresh the random addr */
+                    btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+                }
+                else
+                {
+                    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+                       btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
+                }
             }
             break;
 
+        case BTU_TTYPE_BLE_GAP_FAST_ADV:
+            /* fast adv is completed, fall back to slow adv interval */
+            btm_ble_start_slow_adv();
+            break;
+
+        default:
+            break;
+
     }
 }
 
@@ -2054,24 +2998,31 @@
 void btm_ble_read_remote_features_complete(UINT8 *p)
 {
     tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
-    UINT8             status;
     UINT16            handle;
+    UINT8             status;
     int               xx;
 
-    BTM_TRACE_EVENT0 ("btm_ble_read_remote_features_complete ");
+    BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
 
-    STREAM_TO_UINT8  (status, p);
-    STREAM_TO_UINT16 (handle, p);
-
-    /* Look up the connection by handle and copy features */
-    for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
+    STREAM_TO_UINT8(status, p);
+    /* if LE read remote feature failed, expect disconnect complete to be received */
+    if (status == HCI_SUCCESS)
     {
-        if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
+        STREAM_TO_UINT16 (handle, p);
+
+        /* Look up the connection by handle and copy features */
+        for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
         {
-            STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
-            break;
+            if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
+            {
+                STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
+                /*notify link up here */
+                l2cble_notify_le_connection (p_acl_cb->remote_addr);
+                break;
+            }
         }
     }
+
 }
 
 /*******************************************************************************
@@ -2093,8 +3044,6 @@
         /* toggle back the adv mode */
         p_cb->adv_mode = !p_cb->adv_mode;
     }
-
-
 }
 
 /*******************************************************************************
@@ -2116,58 +3065,6 @@
 
 /*******************************************************************************
 **
-** Function         btm_ble_update_mode_operation
-**
-** Description      This function update the GAP role operation when a link status
-**                  is updated.
-**
-** Returns          void
-**
-*******************************************************************************/
-void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, BOOLEAN conn_cancel)
-{
-    tACL_CONN   *pa = &btm_cb.acl_db[0];
-    UINT16       xx;
-    UINT8        dev_role = link_role;
-    UNUSED(bd_addr);
-    UNUSED(conn_cancel);
-
-    BTM_TRACE_DEBUG1("btm_ble_update_mode_operation adv_mode = %d", btm_cb.ble_ctr_cb.inq_var.adv_mode );
-
-    /* update periphera role operation */
-    /* If we are LE connectable, check if we need to start advertising again */
-    if (link_role == HCI_ROLE_UNKNOWN)
-        /* && btm_cb.ble_ctr_cb.inq_var.connectable_mode != BTM_BLE_NON_CONNECTABLE) */
-    {
-        for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
-        {
-            /* If any other LE link is up, we are still not connectable */
-            if (pa->in_use && pa->is_le_link)
-            {
-                dev_role = pa->link_role;
-                break;
-            }
-        }
-    }
-
-    if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE  &&
-        (dev_role == HCI_ROLE_UNKNOWN )) /* when device has no connection, update adv here */
-        /* if already in connection, no connectable adv is allowed unless scatternet is enabled */
-    {
-        btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
-    }
-
-    if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
-    {
-        if (!btm_send_pending_direct_conn())
-        {
-            btm_ble_resume_bg_conn();
-        }
-    }
-}
-
-/*******************************************************************************
-**
 ** Function         btm_ble_init
 **
 ** Description      Initialize the control block variable values.
@@ -2179,9 +3076,12 @@
 {
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
 
-    BTM_TRACE_EVENT0 ("btm_ble_init ");
+    BTM_TRACE_EVENT ("btm_ble_init ");
 
     memset(p_cb, 0, sizeof(tBTM_BLE_CB));
+    memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
+    btm_cb.cmn_ble_vsc_cb.values_read = FALSE;
+    p_cb->cur_states       = 0;
 
     p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
     p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
@@ -2195,6 +3095,83 @@
     p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
 
     p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
+
+#if BLE_VND_INCLUDED == FALSE
+    btm_ble_vendor_init(BTM_CS_IRK_LIST_MAX);
+    btm_ble_adv_filter_init();
+#endif
 }
 
+/*******************************************************************************
+**
+** Function         btm_ble_topology_check
+**
+** Description      check to see requested state is supported. One state check at
+**                  a time is supported
+**
+** Returns          TRUE is request is allowed, FALSE otherwise.
+**
+*******************************************************************************/
+BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
+{
+    BOOLEAN rt = FALSE;
+    UINT32  llt_mask = 0;
+    UINT8   *p;
+
+    UINT8   state_offset = 0;
+    UINT16  cur_states = btm_cb.ble_ctr_cb.cur_states;
+    UINT8   mask, offset;
+    UINT8   request_state = 0;
+
+    /* check only one bit is set and within valid range */
+    if (request_state_mask == BTM_BLE_STATE_INVALID ||
+        request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
+        (request_state_mask & (request_state_mask -1 )) != 0)
+    {
+        BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
+        return rt;
+    }
+
+    while (request_state_mask)
+    {
+        request_state_mask >>= 1;
+        request_state ++;
+    }
+
+    /* check if the requested state is supported or not */
+    mask = btm_le_state_combo_tbl[0][request_state - 1][0];
+    offset = btm_le_state_combo_tbl[0][request_state-1][1];
+
+    if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
+    {
+        BTM_TRACE_ERROR("state requested not supported: %d", request_state);
+        return rt;
+    }
+
+    rt = TRUE;
+    /* make sure currently active states are all supported in conjunction with the requested
+       state. If the bit in table is not set, the combination is not supported */
+    while (cur_states != 0)
+    {
+        if (cur_states & 0x01)
+        {
+            mask = btm_le_state_combo_tbl[request_state][state_offset][0];
+            offset = btm_le_state_combo_tbl[request_state][state_offset][1];
+
+            if (mask != 0 && offset != 0)
+            {
+                if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
+                {
+                    rt = FALSE;
+                    break;
+                }
+            }
+        }
+        cur_states >>= 1;
+        state_offset ++;
+    }
+    return rt;
+}
+
+
 #endif  /* BLE_INCLUDED */
diff --git a/stack/btm/btm_ble_int.h b/stack/btm/btm_ble_int.h
index 7ce4f16..2512d33 100644
--- a/stack/btm/btm_ble_int.h
+++ b/stack/btm/btm_ble_int.h
@@ -61,9 +61,17 @@
 #define BTM_BLE_GAP_DISC_SCAN_INT   18         /* Interval(scan_int) = 11.25 ms= 0x0010 * 0.625 ms */
 #define BTM_BLE_GAP_DISC_SCAN_WIN   18         /* scan_window = 11.25 ms= 0x0010 * 0.625 ms */
 #define BTM_BLE_GAP_ADV_INT         512         /* Tgap(gen_disc) = 1.28 s= 512 * 0.625 ms */
-#define BTM_BLE_GAP_LIM_TOUT        30          /* Tgap(lim_timeout) = 30.72 s max, round down to 30 */
+#define BTM_BLE_GAP_LIM_TOUT        180          /* Tgap(lim_timeout) = 180s max */
 
 
+#define BTM_BLE_GAP_ADV_FAST_INT_1         48         /* TGAP(adv_fast_interval1) = 30(used) ~ 60 ms  = 48 *0.625 */
+#define BTM_BLE_GAP_ADV_FAST_INT_2         160         /* TGAP(adv_fast_interval2) = 100(used) ~ 150 ms = 160 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_SLOW_INT           2048         /* Tgap(adv_slow_interval) = 1.28 s= 512 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_DIR_MAX_INT        800         /* Tgap(dir_conn_adv_int_max) = 500 ms = 800 * 0.625 ms */
+#define BTM_BLE_GAP_ADV_DIR_MIN_INT        400         /* Tgap(dir_conn_adv_int_min) = 250 ms = 400 * 0.625 ms */
+
+#define BTM_BLE_GAP_FAST_ADV_TOUT          30
+
 #define BTM_BLE_SEC_REQ_ACT_NONE           0
 #define BTM_BLE_SEC_REQ_ACT_ENCRYPT        1 /* encrypt the link using current key or key refresh */
 #define BTM_BLE_SEC_REQ_ACT_PAIR           2
@@ -75,6 +83,16 @@
 #define BLE_RESOLVE_ADDR_MASK                0xc0   /* bit 6, and bit7 */
 #define BTM_BLE_IS_RESOLVE_BDA(x)           ((x[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB)
 
+/* LE scan activity bit mask, continue with LE inquiry bits */
+#define BTM_LE_SELECT_CONN_ACTIVE      0x40     /* selection connection is in progress */
+#define BTM_LE_OBSERVE_ACTIVE          0x80     /* observe is in progress */
+
+/* BLE scan activity mask checking */
+#define BTM_BLE_IS_SCAN_ACTIVE(x)   ((x) & BTM_BLE_SCAN_ACTIVE_MASK)
+#define BTM_BLE_IS_INQ_ACTIVE(x)   ((x) & BTM_BLE_INQUIRY_MASK)
+#define BTM_BLE_IS_OBS_ACTIVE(x)   ((x) & BTM_LE_OBSERVE_ACTIVE)
+#define BTM_BLE_IS_SEL_CONN_ACTIVE(x)   ((x) & BTM_LE_SELECT_CONN_ACTIVE)
+
 typedef struct
 {
     UINT16              data_mask;
@@ -98,16 +116,14 @@
 
 #define BTM_BLE_VALID_PRAM(x, min, max)  (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
 
+#define BTM_BLE_PRIVATE_ADDR_INT    900           /* 15 minutes minimum for
+                                                   random address refreshing */
+
 typedef struct
 {
 
     UINT16           discoverable_mode;
     UINT16           connectable_mode;
-    UINT16           br_edr_supported_flag;  /* combined BR EDR discoverable and connectable mode */
-                                             /* only meaningful when it is zero. This means
-                                                BR EDR is not supported*/
-    UINT8            proc_mode;        /* current procedure mode : inquiry or discovery */
-
     UINT16           scan_window;
     UINT16           scan_interval;
     UINT8            scan_type;        /* current scan type: active or passive */
@@ -121,6 +137,8 @@
     UINT8            adv_mode;
     tBLE_BD_ADDR     direct_bda;
     BOOLEAN          directed_conn;
+    BOOLEAN          fast_adv_on;
+    TIMER_LIST_ENT   fast_adv_timer;
 
     UINT8            adv_len;
     UINT8            adv_data_cache[BTM_BLE_CACHE_ADV_DATA_MAX];
@@ -148,8 +166,8 @@
 /* random address management control block */
 typedef struct
 {
-    tBLE_ADDR_TYPE	            own_addr_type;         /* local device LE address type */
-    BD_ADDR			            private_addr;
+    tBLE_ADDR_TYPE              own_addr_type;         /* local device LE address type */
+    BD_ADDR                     private_addr;
     BD_ADDR                     random_bda;
     BOOLEAN                     busy;
     UINT16                       index;
@@ -198,6 +216,37 @@
     void    *p_param;
 }tBTM_BLE_CONN_REQ;
 
+/* LE state request */
+#define BTM_BLE_STATE_INVALID               0
+#define BTM_BLE_STATE_CONN_ADV              1
+#define BTM_BLE_STATE_INIT                  2
+#define BTM_BLE_STATE_MASTER                3
+#define BTM_BLE_STATE_SLAVE                 4
+#define BTM_BLE_STATE_LO_DUTY_DIR_ADV       5
+#define BTM_BLE_STATE_HI_DUTY_DIR_ADV       6
+#define BTM_BLE_STATE_NON_CONN_ADV          7
+#define BTM_BLE_STATE_PASSIVE_SCAN          8
+#define BTM_BLE_STATE_ACTIVE_SCAN           9
+#define BTM_BLE_STATE_SCAN_ADV              10
+#define BTM_BLE_STATE_MAX                   11
+typedef UINT8 tBTM_BLE_STATE;
+
+#define BTM_BLE_STATE_CONN_ADV_BIT          0x0001
+#define BTM_BLE_STATE_INIT_BIT              0x0002
+#define BTM_BLE_STATE_MASTER_BIT            0x0004
+#define BTM_BLE_STATE_SLAVE_BIT             0x0008
+#define BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT   0x0010
+#define BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT   0x0020
+#define BTM_BLE_STATE_NON_CONN_ADV_BIT      0x0040
+#define BTM_BLE_STATE_PASSIVE_SCAN_BIT      0x0080
+#define BTM_BLE_STATE_ACTIVE_SCAN_BIT       0x0100
+#define BTM_BLE_STATE_SCAN_ADV_BIT          0x0200
+typedef UINT16 tBTM_BLE_STATE_MASK;
+
+#define BTM_BLE_STATE_ALL_MASK              0x03ff
+#define BTM_BLE_STATE_ALL_ADV_MASK          (BTM_BLE_STATE_CONN_ADV_BIT|BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT|BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT|BTM_BLE_STATE_SCAN_ADV_BIT)
+#define BTM_BLE_STATE_ALL_SCAN_MASK         (BTM_BLE_STATE_PASSIVE_SCAN_BIT|BTM_BLE_STATE_ACTIVE_SCAN_BIT)
+#define BTM_BLE_STATE_ALL_CONN_MASK         (BTM_BLE_STATE_MASTER_BIT|BTM_BLE_STATE_SLAVE_BIT)
 
 typedef struct
 {
@@ -210,11 +259,18 @@
 */
 typedef struct
 {
+    UINT8            scan_activity;         /* LE scan activity mask */
+
     /*****************************************************
     **      BLE Inquiry
     *****************************************************/
     tBTM_BLE_INQ_CB     inq_var;
 
+    /* observer callback and timer */
+    tBTM_INQ_RESULTS_CB *p_obs_results_cb;
+    tBTM_CMPL_CB        *p_obs_cmpl_cb;
+    TIMER_LIST_ENT      obs_timer_ent;
+
     /* background connection procedure cb value */
     tBTM_BLE_CONN_TYPE  bg_conn_type;
     UINT16              scan_int;
@@ -236,12 +292,16 @@
     tBTM_LE_RANDOM_CB   addr_mgnt_cb;
 
     BOOLEAN          enabled;
+    BOOLEAN          privacy;               /* local privacy enabled or disabled */
     tBTM_BLE_WL_OP  wl_op_q[BTM_BLE_MAX_BG_CONN_DEV_NUM];
 
 #ifdef BTM_BLE_PC_ADV_TEST_MODE
     tBTM_BLE_SCAN_REQ_CBACK *p_scan_req_cback;
 #endif
 
+    /* current BLE link state */
+    tBTM_BLE_STATE_MASK           cur_states;  /* bit mask of tBTM_BLE_STATE */
+
 } tBTM_BLE_CB;
 
 #ifdef __cplusplus
@@ -259,16 +319,22 @@
 extern tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration);
 extern void btm_ble_dir_adv_tout(void);
 
-extern void btm_ble_stop_scan(void);
-extern void btm_ble_att_db_init(void);
+extern void btm_ble_stop_scan();
+extern void btm_ble_stop_inquiry(void);
 extern void btm_ble_init (void);
 extern void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, tBLE_ADDR_TYPE addr_type, BOOLEAN addr_matched);
 extern void btm_ble_read_remote_features_complete(UINT8 *p);
 extern void btm_ble_write_adv_enable_complete(UINT8 * p);
 extern void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len);
+extern void btm_read_ble_local_supported_states_complete(UINT8 *p, UINT16 evt_len);
 extern tBTM_BLE_CONN_ST btm_ble_get_conn_st(void);
 extern void btm_ble_set_conn_st(tBTM_BLE_CONN_ST new_st);
-
+extern UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
+                                     tBTM_BLE_ADV_DATA *p_data);
+extern tBTM_STATUS btm_ble_start_adv(void);
+extern tBTM_STATUS btm_ble_stop_adv(void);
+extern tBTM_STATUS btm_ble_start_scan (UINT8 filter_enb);
+extern void btm_ble_create_ll_conn_complete (UINT8 status);
 
 /* LE security function from btm_sec.c */
 #if SMP_INCLUDED == TRUE
@@ -277,7 +343,7 @@
 extern UINT8 btm_proc_smp_cback(tSMP_EVT event, BD_ADDR bd_addr, tSMP_EVT_DATA *p_data);
 extern tBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 link_role);
 extern void btm_ble_ltk_request(UINT16 handle, UINT8 rand[8], UINT16 ediv);
-extern BOOLEAN btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk);
+extern tBTM_STATUS btm_ble_start_encrypt(BD_ADDR bda, BOOLEAN use_stk, BT_OCTET16 stk);
 extern void btm_ble_link_encrypted(BD_ADDR bd_addr, UINT8 encr_enable);
 #endif
 
@@ -291,15 +357,16 @@
 
 extern void btm_ble_test_command_complete(UINT8 *p);
 extern void btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback);
+
 extern void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys, BOOLEAN pass_to_application);
 extern void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size);
 extern UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr);
 
 /* white list function */
-extern BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr,UINT8 wl_type);
-extern BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr, UINT8 *p_attr_tag);
+extern BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr);
+extern BOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr);
 extern void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy);
-extern void btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy);
+extern void btm_update_scan_filter_policy(tBTM_BLE_AFP adv_policy);
 extern void btm_ble_clear_white_list (void);
 
 /* background connection function */
@@ -311,23 +378,46 @@
 extern BOOLEAN btm_ble_renew_bg_conn_params(BOOLEAN add, BD_ADDR bd_addr);
 extern UINT8 btm_ble_count_unconn_dev_in_whitelist(void);
 extern void btm_write_dir_conn_wl(BD_ADDR target_addr);
-extern void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, BOOLEAN conn_ccancel);
+extern void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bda, UINT8 status);
+extern BOOLEAN btm_execute_wl_dev_operation(void);
 
 /* direct connection utility */
 extern BOOLEAN btm_send_pending_direct_conn(void);
 extern void btm_ble_enqueue_direct_conn_req(void *p_param);
 
 /* BLE address management */
-extern void btm_gen_resolvable_private_addr (void);
+extern void btm_gen_resolvable_private_addr (void *p_cmd_cplt_cback);
 extern void btm_gen_non_resolvable_private_addr (tBTM_BLE_ADDR_CBACK *p_cback, void *p);
 extern void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p);
 extern void btm_ble_update_reconnect_address(BD_ADDR bd_addr);
+extern void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p);
+
+extern void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst);
+extern void btm_ble_multi_adv_init(void);
+extern void* btm_ble_multi_adv_get_ref(UINT8 inst_id);
+extern void btm_ble_multi_adv_cleanup(void);
+extern void btm_ble_multi_adv_reenable(UINT8 inst_id);
+extern void btm_ble_multi_adv_enb_privacy(BOOLEAN enable);
+extern char btm_ble_map_adv_tx_power(int tx_power_index);
+extern void btm_ble_batchscan_init(void);
+extern void btm_ble_batchscan_cleanup(void);
+extern void btm_ble_adv_filter_init(void);
+extern void btm_ble_adv_filter_cleanup(void);
+extern BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request);
+extern BOOLEAN btm_ble_clear_topology_mask(tBTM_BLE_STATE_MASK request_state);
+extern BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state);
+
+/* BLE address mapping with CS feature */
+extern BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type);
+extern BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type);
+extern void btm_ble_refresh_rra(BD_ADDR pseudo_bda, BD_ADDR rra);
 
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
 BT_API extern void btm_ble_set_no_disc_if_pair_fail (BOOLEAN disble_disc);
 BT_API extern void btm_ble_set_test_mac_value (BOOLEAN enable, UINT8 *p_test_mac_val);
 BT_API extern void btm_ble_set_test_local_sign_cntr_value(BOOLEAN enable, UINT32 test_local_sign_cntr);
 BT_API extern void btm_set_random_address(BD_ADDR random_bda);
+BT_API extern void btm_ble_set_keep_rfu_in_auth_req(BOOLEAN keep_rfu);
 #endif
 
 
diff --git a/stack/btm/btm_ble_multi_adv.c b/stack/btm/btm_ble_multi_adv.c
new file mode 100644
index 0000000..6876726
--- /dev/null
+++ b/stack/btm/btm_ble_multi_adv.c
@@ -0,0 +1,868 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014  Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "btm_int.h"
+#include "bt_utils.h"
+#include "hcidefs.h"
+#include "btm_ble_api.h"
+
+/* length of each multi adv sub command */
+#define BTM_BLE_MULTI_ADV_ENB_LEN                       3
+#define BTM_BLE_MULTI_ADV_SET_PARAM_LEN                 24
+#define BTM_BLE_MULTI_ADV_WRITE_DATA_LEN                (BTM_BLE_AD_DATA_LEN + 3)
+#define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN           8
+
+tBTM_BLE_MULTI_ADV_CB  btm_multi_adv_cb;
+tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q;
+
+#define BTM_BLE_MULTI_ADV_CB_EVT_MASK   0xF0
+#define BTM_BLE_MULTI_ADV_SUBCODE_MASK  0x0F
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_enq_op_q
+**
+** Description      enqueue a multi adv operation in q to check command complete
+**                  status.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_enq_op_q(UINT8 opcode, UINT8 inst_id, UINT8 cb_evt)
+{
+    tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
+
+    p_op_q->p_inst_id[p_op_q->next_idx] = inst_id;
+
+    p_op_q->p_sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
+
+    p_op_q->next_idx = (p_op_q->next_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_deq_op_q
+**
+** Description      dequeue a multi adv operation from q when command complete
+**                  is received.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_deq_op_q(UINT8 *p_opcode, UINT8 *p_inst_id, UINT8 *p_cb_evt)
+{
+    tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
+
+    *p_inst_id = p_op_q->p_inst_id[p_op_q->pending_idx] & 0x7F;
+    *p_cb_evt = (p_op_q->p_sub_code[p_op_q->pending_idx] >> 4);
+    *p_opcode = (p_op_q->p_sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
+
+    p_op_q->pending_idx = (p_op_q->pending_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_vsc_cmpl_cback
+**
+** Description      Multi adv VSC complete callback
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
+{
+    UINT8  status, subcode;
+    UINT8  *p = p_params->p_param_buf, inst_id;
+    UINT16  len = p_params->param_len;
+    tBTM_BLE_MULTI_ADV_INST *p_inst ;
+    UINT8   cb_evt = 0, opcode;
+
+    if (len  < 2)
+    {
+        BTM_TRACE_ERROR("wrong length for btm_ble_multi_adv_vsc_cmpl_cback");
+        return;
+    }
+
+    STREAM_TO_UINT8(status, p);
+    STREAM_TO_UINT8(subcode, p);
+
+    btm_ble_multi_adv_deq_op_q(&opcode, &inst_id, &cb_evt);
+
+    BTM_TRACE_DEBUG("op_code = %02x inst_id = %d cb_evt = %02x", opcode, inst_id, cb_evt);
+
+    if (opcode != subcode || inst_id == 0)
+    {
+        BTM_TRACE_ERROR("get unexpected VSC cmpl, expect: %d get: %d",subcode,opcode);
+        return;
+    }
+
+    p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+    switch (subcode)
+    {
+        case BTM_BLE_MULTI_ADV_ENB:
+        BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status);
+        if (status != HCI_SUCCESS)
+        {
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
+        }
+        break;
+
+        case BTM_BLE_MULTI_ADV_SET_PARAM:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_PARAM status = %d", status);
+            break;
+        }
+
+        case BTM_BLE_MULTI_ADV_WRITE_ADV_DATA:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_ADV_DATA status = %d", status);
+            break;
+        }
+
+        case BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA status = %d", status);
+            break;
+        }
+
+        case BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR:
+        {
+            BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR status = %d", status);
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    if (cb_evt != 0 && p_inst->p_cback != NULL)
+    {
+        (p_inst->p_cback)(cb_evt, inst_id, p_inst->p_ref, status);
+    }
+    return;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_enable_multi_adv
+**
+** Description      This function enable the customer specific feature in controller
+**
+** Parameters       enable: enable or disable
+**                  inst_id:    adv instance ID, can not be 0
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_enable_multi_adv (BOOLEAN enable, UINT8 inst_id, UINT8 cb_evt)
+{
+    UINT8           param[BTM_BLE_MULTI_ADV_ENB_LEN], *pp;
+    UINT8           enb = enable ? 1: 0;
+    tBTM_STATUS     rt;
+
+    pp = param;
+    memset(param, 0, BTM_BLE_MULTI_ADV_ENB_LEN);
+
+    UINT8_TO_STREAM (pp, BTM_BLE_MULTI_ADV_ENB);
+    UINT8_TO_STREAM (pp, enb);
+    UINT8_TO_STREAM (pp, inst_id);
+
+    BTM_TRACE_EVENT (" btm_ble_enable_multi_adv: enb %d, Inst ID %d",enb,inst_id);
+
+    if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+                                    BTM_BLE_MULTI_ADV_ENB_LEN,
+                                    param,
+                                    btm_ble_multi_adv_vsc_cmpl_cback))
+                                     == BTM_CMD_STARTED)
+    {
+        btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_ENB, inst_id, cb_evt);
+    }
+    return rt;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_map_adv_tx_power
+**
+** Description      return the actual power in dBm based on the mapping in config file
+**
+** Parameters       advertise parameters used for this instance.
+**
+** Returns          tx power in dBm
+**
+*******************************************************************************/
+int btm_ble_tx_power[BTM_BLE_ADV_TX_POWER_MAX + 1] = BTM_BLE_ADV_TX_POWER;
+char btm_ble_map_adv_tx_power(int tx_power_index)
+{
+    if(0 <= tx_power_index && tx_power_index < BTM_BLE_ADV_TX_POWER_MAX)
+        return (char)btm_ble_tx_power[tx_power_index];
+    return 0;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_set_params
+**
+** Description      This function enable the customer specific feature in controller
+**
+** Parameters       advertise parameters used for this instance.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_multi_adv_set_params (tBTM_BLE_MULTI_ADV_INST *p_inst,
+                                          tBTM_BLE_ADV_PARAMS *p_params,
+                                          UINT8 cb_evt)
+{
+    UINT8           param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN], *pp;
+    tBTM_STATUS     rt;
+    BD_ADDR         dummy ={0,0,0,0,0,0};
+
+    pp = param;
+    memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN);
+
+    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_PARAM);
+
+    UINT16_TO_STREAM (pp, p_params->adv_int_min);
+    UINT16_TO_STREAM (pp, p_params->adv_int_max);
+    UINT8_TO_STREAM  (pp, p_params->adv_type);
+
+#if BLE_PRIVACY_SPT
+    if (btm_cb.ble_ctr_cb.privacy)
+    {
+        UINT8_TO_STREAM  (pp, BLE_ADDR_RANDOM);
+        BDADDR_TO_STREAM (pp, p_inst->rpa);
+    }
+    else
+#endif
+    {
+        UINT8_TO_STREAM  (pp, BLE_ADDR_PUBLIC);
+        BDADDR_TO_STREAM (pp, btm_cb.devcb.local_addr);
+    }
+
+    BTM_TRACE_EVENT (" btm_ble_multi_adv_set_params,Min %d, Max %d,adv_type %d",
+        p_params->adv_int_min,p_params->adv_int_max,p_params->adv_type);
+
+    UINT8_TO_STREAM  (pp, 0);
+    BDADDR_TO_STREAM (pp, dummy);
+
+    if (p_params->channel_map == 0 || p_params->channel_map > BTM_BLE_DEFAULT_ADV_CHNL_MAP)
+        p_params->channel_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
+    UINT8_TO_STREAM (pp, p_params->channel_map);
+
+    if (p_params->adv_filter_policy >= AP_SCAN_CONN_POLICY_MAX)
+        p_params->adv_filter_policy = AP_SCAN_CONN_ALL;
+    UINT8_TO_STREAM (pp, p_params->adv_filter_policy);
+
+    UINT8_TO_STREAM (pp, p_inst->inst_id);
+
+    if (p_params->tx_power > BTM_BLE_ADV_TX_POWER_MAX)
+        p_params->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
+    UINT8_TO_STREAM (pp, btm_ble_map_adv_tx_power(p_params->tx_power));
+
+    BTM_TRACE_EVENT("set_params:Chnl Map %d,adv_fltr policy %d,ID:%d, TX Power%d",
+        p_params->channel_map,p_params->adv_filter_policy,p_inst->inst_id,p_params->tx_power);
+
+    if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+                                    BTM_BLE_MULTI_ADV_SET_PARAM_LEN,
+                                    param,
+                                    btm_ble_multi_adv_vsc_cmpl_cback))
+           == BTM_CMD_STARTED)
+    {
+        p_inst->adv_evt = p_params->adv_type;
+
+#if BLE_PRIVACY_SPT
+        if (btm_cb.ble_ctr_cb.privacy)
+        {
+            /* start timer */
+            p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst;
+            btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+                             BTM_BLE_PRIVATE_ADDR_INT);
+        }
+#endif
+        btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_PARAM, p_inst->inst_id, cb_evt);
+    }
+    return rt;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_write_rpa
+**
+** Description      This function write the random address for the adv instance into
+**                  controller
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADDR random_addr)
+{
+    UINT8           param[BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN], *pp = param;
+    tBTM_STATUS     rt;
+
+    BTM_TRACE_EVENT (" btm_ble_multi_adv_set_random_addr");
+
+    memset(param, 0, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN);
+
+    UINT8_TO_STREAM (pp, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR);
+    BDADDR_TO_STREAM(pp, random_addr);
+    UINT8_TO_STREAM(pp,  p_inst->inst_id);
+
+    if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+                                    BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN,
+                                    param,
+                                    btm_ble_multi_adv_vsc_cmpl_cback)) == BTM_CMD_STARTED)
+    {
+        /* start a periodical timer to refresh random addr */
+        btu_stop_timer(&p_inst->raddr_timer_ent);
+        p_inst->raddr_timer_ent.param = (TIMER_PARAM_TYPE) p_inst;
+        btu_start_timer_oneshot(&p_inst->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
+                         BTM_BLE_PRIVATE_ADDR_INT);
+
+        btm_ble_multi_adv_enq_op_q(BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR, p_inst->inst_id, 0);
+    }
+    return rt;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_gen_rpa_cmpl
+**
+** Description      RPA generation completion callback for each adv instance. Will
+**                  continue write the new RPA into controller.
+**
+** Returns          none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p)
+{
+#if (SMP_INCLUDED == TRUE)
+    tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
+    tSMP_ENC    output;
+    UINT8 index = 0;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+     /* Retrieve the index of adv instance from stored Q */
+    if (btm_multi_adv_idx_q.front == -1)
+    {
+        BTM_TRACE_ERROR(" %s can't locate advertise instance", __FUNCTION__);
+        return;
+    }
+    else
+    {
+        index = btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.front];
+        if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear)
+        {
+            btm_multi_adv_idx_q.front = -1;
+            btm_multi_adv_idx_q.rear = -1;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.front = (btm_multi_adv_idx_q.front + 1) % BTM_BLE_MULTI_ADV_MAX;
+        }
+    }
+
+    p_inst = &(btm_multi_adv_cb.p_adv_inst[index]);
+
+    BTM_TRACE_EVENT ("btm_ble_multi_adv_gen_rpa_cmpl inst_id = %d", p_inst->inst_id);
+    if (p)
+    {
+        p->param_buf[2] &= (~BLE_RESOLVE_ADDR_MASK);
+        p->param_buf[2] |= BLE_RESOLVE_ADDR_MSB;
+
+        p_inst->rpa[2] = p->param_buf[0];
+        p_inst->rpa[1] = p->param_buf[1];
+        p_inst->rpa[0] = p->param_buf[2];
+
+        if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output))
+        {
+            BTM_TRACE_DEBUG("generate random address failed");
+        }
+        else
+        {
+            /* set hash to be LSB of rpAddress */
+            p_inst->rpa[5] = output.param_buf[0];
+            p_inst->rpa[4] = output.param_buf[1];
+            p_inst->rpa[3] = output.param_buf[2];
+
+            if (p_inst->inst_id != 0 && (p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()))
+            {
+                /* set it to controller */
+                btm_ble_multi_adv_write_rpa(p_inst, p_inst->rpa);
+            }
+        }
+    }
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_configure_rpa
+**
+** Description      This function set the random address for the adv instance
+**
+** Parameters       advertise parameters used for this instance.
+**
+** Returns          none
+**
+*******************************************************************************/
+void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
+{
+    if (btm_multi_adv_idx_q.front == (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX)
+    {
+        BTM_TRACE_ERROR("outstanding rand generation exceeded max allowed ");
+        return;
+    }
+    else
+    {
+        if (btm_multi_adv_idx_q.front == -1)
+        {
+            btm_multi_adv_idx_q.front = 0;
+            btm_multi_adv_idx_q.rear = 0;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.rear = (btm_multi_adv_idx_q.rear + 1) % BTM_BLE_MULTI_ADV_MAX;
+        }
+        btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.rear] = p_inst->index;
+    }
+    btm_gen_resolvable_private_addr((void *)btm_ble_multi_adv_gen_rpa_cmpl);
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_reenable
+**
+** Description      This function re-enable adv instance upon a connection establishment.
+**
+** Parameters       advertise parameters used for this instance.
+**
+** Returns          none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_reenable(UINT8 inst_id)
+{
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+    if (p_inst->inst_id != 0)
+    {
+        if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT)
+            btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, 0);
+        else
+          /* mark directed adv as disabled if adv has been stopped */
+        {
+            (p_inst->p_cback)(BTM_BLE_MULTI_ADV_DISABLE_EVT,p_inst->inst_id,p_inst->p_ref,0);
+             p_inst->inst_id = 0;
+        }
+     }
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_enb_privacy
+**
+** Description      This function enable/disable privacy setting in multi adv
+**
+** Parameters       enable: enable or disable the adv instance.
+**
+** Returns          none.
+**
+*******************************************************************************/
+void btm_ble_multi_adv_enb_privacy(BOOLEAN enable)
+{
+    UINT8 i;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
+
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
+    {
+        if (enable)
+            btm_ble_multi_adv_configure_rpa (p_inst);
+        else
+            btu_stop_timer_oneshot(&p_inst->raddr_timer_ent);
+    }
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleEnableAdvInstance
+**
+** Description      This function enable a Multi-ADV instance with the specified
+**                  adv parameters
+**
+** Parameters       p_params: pointer to the adv parameter structure, set as default
+**                            adv parameter when the instance is enabled.
+**                  p_cback: callback function for the adv instance.
+**                  p_ref:  reference data attach to the adv instance to be enabled.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
+                                      tBTM_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref)
+{
+    UINT8 i;
+    tBTM_STATUS rt = BTM_NO_RESOURCES;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
+
+    BTM_TRACE_EVENT("BTM_BleEnableAdvInstance called");
+
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
+    {
+        BTM_TRACE_ERROR("Controller does not support Multi ADV");
+        return BTM_ERR_PROCESSING;
+    }
+
+    if (NULL == p_inst)
+    {
+        BTM_TRACE_ERROR("Invalid instance in BTM_BleEnableAdvInstance");
+        return BTM_ERR_PROCESSING;
+    }
+
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
+    {
+        if (p_inst->inst_id == 0)
+        {
+            p_inst->inst_id = i + 1;
+
+            /* configure adv parameter */
+            if (p_params)
+                rt = btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+            else
+                rt = BTM_CMD_STARTED;
+
+            /* enable adv */
+            BTM_TRACE_EVENT("btm_ble_enable_multi_adv being called with inst_id:%d",
+                p_inst->inst_id);
+
+            if (BTM_CMD_STARTED == rt)
+            {
+                if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id,
+                          BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED)
+                {
+                    p_inst->p_cback = p_cback;
+                    p_inst->p_ref   = p_ref;
+                }
+            }
+
+            if (BTM_CMD_STARTED != rt)
+            {
+                p_inst->inst_id = 0;
+                BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed");
+            }
+            break;
+        }
+    }
+    return rt;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleUpdateAdvInstParam
+**
+** Description      This function update a Multi-ADV instance with the specified
+**                  adv parameters.
+**
+** Parameters       inst_id: adv instance ID
+**                  p_params: pointer to the adv parameter structure.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params)
+{
+    tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+
+    BTM_TRACE_EVENT("BTM_BleUpdateAdvInstParam called with inst_id:%d", inst_id);
+
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
+    {
+        BTM_TRACE_ERROR("Controller does not support Multi ADV");
+        return BTM_ERR_PROCESSING;
+    }
+
+    if (inst_id <  BTM_BleMaxMultiAdvInstanceCount() &&
+        inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD &&
+        p_params != NULL)
+    {
+        if (p_inst->inst_id == 0)
+        {
+            BTM_TRACE_DEBUG("adv instance %d is not active", inst_id);
+            return BTM_WRONG_MODE;
+        }
+        else
+            btm_ble_enable_multi_adv(FALSE, inst_id, 0);
+
+        if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0))
+            rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
+    }
+    return rt;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleCfgAdvInstData
+**
+** Description      This function configure a Multi-ADV instance with the specified
+**                  adv data or scan response data.
+**
+** Parameters       inst_id: adv instance ID
+**                  is_scan_rsp: is this scacn response, if no set as adv data.
+**                  data_mask: adv data mask.
+**                  p_data: pointer to the adv data structure.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+                                    tBTM_BLE_AD_MASK data_mask,
+                                    tBTM_BLE_ADV_DATA *p_data)
+{
+    UINT8       param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN], *pp = param;
+    UINT8       sub_code = (is_scan_rsp) ?
+                           BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA : BTM_BLE_MULTI_ADV_WRITE_ADV_DATA;
+    UINT8       *p_len;
+    tBTM_STATUS rt;
+    UINT8 *pp_temp = (UINT8*)(param + BTM_BLE_MULTI_ADV_WRITE_DATA_LEN -1);
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    if (0 == cmn_ble_vsc_cb.adv_inst_max)
+    {
+        BTM_TRACE_ERROR("Controller does not support Multi ADV");
+        return BTM_ERR_PROCESSING;
+    }
+
+
+    BTM_TRACE_EVENT("BTM_BleCfgAdvInstData called with inst_id:%d", inst_id);
+    if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD)
+        return BTM_ILLEGAL_VALUE;
+
+    memset(param, 0, BTM_BLE_MULTI_ADV_WRITE_DATA_LEN);
+
+    UINT8_TO_STREAM(pp, sub_code);
+    p_len = pp ++;
+    btm_ble_build_adv_data(&data_mask, &pp, p_data);
+    *p_len = (UINT8)(pp - param - 2);
+    UINT8_TO_STREAM(pp_temp, inst_id);
+
+    if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF,
+                                    (UINT8)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN,
+                                    param,
+                                    btm_ble_multi_adv_vsc_cmpl_cback))
+                                     == BTM_CMD_STARTED)
+    {
+        btm_ble_multi_adv_enq_op_q(sub_code, inst_id, BTM_BLE_MULTI_ADV_DATA_EVT);
+    }
+    return rt;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_BleDisableAdvInstance
+**
+** Description      This function disables a Multi-ADV instance.
+**
+** Parameters       inst_id: adv instance ID
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id)
+{
+     tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
+     tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+     BTM_TRACE_EVENT("BTM_BleDisableAdvInstance with inst_id:%d", inst_id);
+
+     BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+     if (0 == cmn_ble_vsc_cb.adv_inst_max)
+     {
+         BTM_TRACE_ERROR("Controller does not support Multi ADV");
+         return BTM_ERR_PROCESSING;
+     }
+
+     if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+         inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+     {
+         if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT))
+            == BTM_CMD_STARTED)
+         {
+            btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id-1]);
+            btu_stop_timer(&btm_multi_adv_cb.p_adv_inst[inst_id-1].raddr_timer_ent);
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
+         }
+     }
+    return rt;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_vse_cback
+**
+** Description      VSE callback for multi adv events.
+**
+** Returns
+**
+*******************************************************************************/
+void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
+{
+    UINT8   sub_event;
+    UINT8   adv_inst, reason, conn_handle, idx;
+
+    /* Check if this is a BLE RSSI vendor specific event */
+    STREAM_TO_UINT8(sub_event, p);
+    len--;
+
+    BTM_TRACE_EVENT("btm_ble_multi_adv_vse_cback called with event:%d", sub_event);
+    if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4))
+    {
+        STREAM_TO_UINT8(adv_inst, p);
+        STREAM_TO_UINT8(reason, p);
+        STREAM_TO_UINT16(conn_handle, p);
+
+        if ((idx = btm_handle_to_acl_index(conn_handle)) != MAX_L2CAP_LINKS)
+        {
+            if (btm_cb.ble_ctr_cb.privacy &&
+                adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
+            {
+                memcpy(btm_cb.acl_db[idx].conn_addr, btm_multi_adv_cb.p_adv_inst[adv_inst - 1].rpa,
+                                BD_ADDR_LEN);
+            }
+        }
+
+        if (adv_inst < BTM_BleMaxMultiAdvInstanceCount() &&
+            adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
+        {
+            BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called");
+            btm_ble_multi_adv_reenable(adv_inst);
+        }
+        /* re-enable connectibility */
+        else if (adv_inst == BTM_BLE_MULTI_ADV_DEFAULT_STD)
+        {
+            if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
+            {
+                btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
+            }
+        }
+
+    }
+
+}
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_init
+**
+** Description      This function initialize the multi adv control block.
+**
+** Parameters       None
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_init()
+{
+    UINT8 i = 0;
+    memset(&btm_multi_adv_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    memset (&btm_multi_adv_idx_q,0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q));
+    btm_multi_adv_idx_q.front = -1;
+    btm_multi_adv_idx_q.rear = -1;
+
+    if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0)
+    {
+        btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                                 (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                               (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_sub_code = GKI_getbuf( sizeof(UINT8) *
+                                                      (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_sub_code, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_inst_id = GKI_getbuf( sizeof(UINT8) *
+                                          (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_inst_id, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+    }
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.adv_inst_max ; i ++)
+        btm_multi_adv_cb.p_adv_inst[i].index = i;
+
+    BTM_RegisterForVSEvents(btm_ble_multi_adv_vse_cback, TRUE);
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_cleanup
+**
+** Description      This function cleans up multi adv control block.
+**
+** Parameters
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_cleanup(void)
+{
+    if (btm_multi_adv_cb.p_adv_inst)
+        GKI_freebuf(btm_multi_adv_cb.p_adv_inst);
+
+    if (btm_multi_adv_cb.op_q.p_sub_code)
+         GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code);
+
+    if (btm_multi_adv_cb.op_q.p_inst_id)
+        GKI_freebuf(btm_multi_adv_cb.op_q.p_inst_id);
+
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_get_ref
+**
+** Description      This function obtains the reference pointer for the instance ID provided
+**
+** Parameters       inst_id - Instance ID
+**
+** Returns          void*
+**
+*******************************************************************************/
+void* btm_ble_multi_adv_get_ref(UINT8 inst_id)
+{
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+    if (inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+        if (NULL != p_inst)
+            return p_inst->p_ref;
+    }
+
+    return NULL;
+}
+#endif
+
diff --git a/stack/btm/btm_dev.c b/stack/btm/btm_dev.c
index 0dd534c..f60282f 100644
--- a/stack/btm/btm_dev.c
+++ b/stack/btm/btm_dev.c
@@ -35,6 +35,8 @@
 #include "btm_int.h"
 #include "hcidefs.h"
 #include "l2c_api.h"
+#include "vendor_ble.h"
+
 static tBTM_SEC_DEV_REC *btm_find_oldest_dev (void);
 
 /*******************************************************************************
@@ -64,6 +66,7 @@
     int               i, j;
     BOOLEAN           found = FALSE;
 
+    BTM_TRACE_API("%s, link key type:%x", __FUNCTION__,key_type);
     p_dev_rec = btm_find_dev (bd_addr);
     if (!p_dev_rec)
     {
@@ -79,7 +82,7 @@
                 memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
                 p_dev_rec->sec_flags = BTM_SEC_IN_USE;
                 memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
-                p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+                p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
 
 #if BLE_INCLUDED == TRUE
                 /* use default value for background connection params */
@@ -136,7 +139,7 @@
 
     if (link_key)
     {
-        BTM_TRACE_EVENT6 ("BTM_SecAddDevice()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+        BTM_TRACE_EVENT ("BTM_SecAddDevice()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
                           bd_addr[0], bd_addr[1], bd_addr[2],
                           bd_addr[3], bd_addr[4], bd_addr[5]);
         p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
@@ -172,15 +175,18 @@
 {
     tBTM_SEC_DEV_REC  *p_dev_rec;
 
-    if (BTM_IsAclConnectionUp(bd_addr))
+    if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) || BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR))
     {
-        BTM_TRACE_WARNING0("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active");
+        BTM_TRACE_WARNING("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active");
         return(FALSE);
     }
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
         return(FALSE);
 
+#if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
+    btm_ble_vendor_irk_list_remove_dev(p_dev_rec);
+#endif
     btm_sec_free_dev (p_dev_rec);
 
     /* Tell controller to get rid of the link key if it has one stored */
@@ -215,9 +221,9 @@
 ** Function         btm_sec_alloc_dev
 **
 ** Description      Look for the record in the device database for the record
-**                  with specified handle
+**                  with specified address
 **
-** Returns          Pointer to the record
+** Returns          Pointer to the record or NULL
 **
 *******************************************************************************/
 tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr)
@@ -225,21 +231,55 @@
     tBTM_SEC_DEV_REC *p_dev_rec = NULL;
     tBTM_INQ_INFO    *p_inq_info;
     int               i;
-    BTM_TRACE_EVENT0 ("btm_sec_alloc_dev");
+    DEV_CLASS         old_cod;
+    int               i_new_entry = BTM_SEC_MAX_DEVICE_RECORDS;
+    int               i_old_entry = BTM_SEC_MAX_DEVICE_RECORDS;
+    BTM_TRACE_EVENT ("btm_sec_alloc_dev");
+
     for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++)
     {
-        if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
+        /* look for old entry where device details are present */
+        if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) &&
+             (!memcmp (btm_cb.sec_dev_rec[i].bd_addr, bd_addr, BD_ADDR_LEN)))
         {
-            p_dev_rec = &btm_cb.sec_dev_rec[i];
+            i_old_entry = i;
+            BTM_TRACE_EVENT ("btm_sec_alloc_dev  old device found");
             break;
         }
     }
 
-    if (!p_dev_rec)
-        p_dev_rec = btm_find_oldest_dev();
+    for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++)
+    {
+        if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE))
+        {
+            i_new_entry = i;
+            break;
+        }
+    }
 
+    if (i_new_entry == BTM_SEC_MAX_DEVICE_RECORDS) {
+        p_dev_rec = btm_find_oldest_dev();
+    }
+    else {
+        /* if the old device entry not present go with
+            new entry */
+        if(i_old_entry == BTM_SEC_MAX_DEVICE_RECORDS) {
+            p_dev_rec = &btm_cb.sec_dev_rec[i_new_entry];
+        }
+        else {
+            p_dev_rec = &btm_cb.sec_dev_rec[i_old_entry];
+            memcpy (old_cod, p_dev_rec->dev_class, DEV_CLASS_LEN);
+        }
+    }
     memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC));
 
+    /* Retain the old COD for device */
+    if(i_old_entry != BTM_SEC_MAX_DEVICE_RECORDS) {
+        BTM_TRACE_EVENT ("btm_sec_alloc_dev restoring cod ");
+        memcpy (p_dev_rec->dev_class, old_cod, DEV_CLASS_LEN);
+
+    }
+
     p_dev_rec->sec_flags = BTM_SEC_IN_USE;
 
     /* Check with the BT manager if details about remote device are known */
@@ -278,7 +318,10 @@
 
     memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
 
-    p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr);
+#if BLE_INCLUDED == TRUE
+    p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE);
+#endif
+    p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
     p_dev_rec->timestamp = btm_cb.dev_rec_count++;
 
     return(p_dev_rec);
@@ -332,7 +375,7 @@
     {
         if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
         {
-            BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature found)");
+            BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)");
             return (TRUE);
         }
 
@@ -349,12 +392,12 @@
         /* If we don't know peer's capabilities, assume it supports Role-switch */
         if (feature_empty)
         {
-            BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature empty)");
+            BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)");
             return (TRUE);
         }
     }
 
-    BTM_TRACE_DEBUG0("btm_dev_support_switch return FALSE");
+    BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE");
     return(FALSE);
 }
 
@@ -376,7 +419,11 @@
     for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
     {
         if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE)
-            && (p_dev_rec->hci_handle == handle))
+            && ((p_dev_rec->hci_handle == handle)
+#if BLE_INCLUDED == TRUE
+            ||(p_dev_rec->ble_hci_handle == handle)
+#endif
+                ))
             return(p_dev_rec);
     }
     return(NULL);
@@ -422,7 +469,7 @@
 tBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr)
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
-    BTM_TRACE_EVENT0 ("btm_find_or_alloc_dev");
+    BTM_TRACE_EVENT ("btm_find_or_alloc_dev");
     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
     {
 
@@ -440,7 +487,7 @@
 **                  the oldest non-paired device.  If all devices are paired it
 **                  deletes the oldest paired device.
 **
-** Returns          Pointer to the record
+** Returns          Pointer to the record or NULL
 **
 *******************************************************************************/
 tBTM_SEC_DEV_REC *btm_find_oldest_dev (void)
@@ -454,7 +501,7 @@
     for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++)
     {
         if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0)
-            || ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0))
+            || ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN |BTM_SEC_LE_LINK_KEY_KNOWN)) != 0))
             continue; /* Device is paired so skip it */
 
         if (p_dev_rec->timestamp < ot)
diff --git a/stack/btm/btm_devctl.c b/stack/btm/btm_devctl.c
index 240bd2f..910a892 100644
--- a/stack/btm/btm_devctl.c
+++ b/stack/btm/btm_devctl.c
@@ -175,7 +175,7 @@
 #endif
 
 #else
-   BTM_TRACE_EVENT0 ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now");
+   BTM_TRACE_EVENT ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now");
 #endif
 
 }
@@ -319,7 +319,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_SetAfhChannels (UINT8 first, UINT8 last)
 {
-    BTM_TRACE_API4 ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)",
+    BTM_TRACE_API ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)",
                        first, btm_cb.first_disabled_channel, last,
                        btm_cb.last_disabled_channel);
 
@@ -441,7 +441,7 @@
 *******************************************************************************/
 void btm_read_ble_wl_size(void)
 {
-    BTM_TRACE_DEBUG0("btm_read_ble_wl_size ");
+    BTM_TRACE_DEBUG("btm_read_ble_wl_size ");
     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
 
     /* Send a Read Buffer Size message to the Host Controller. */
@@ -458,7 +458,7 @@
 *******************************************************************************/
 void btm_get_ble_buffer_size(void)
 {
-    BTM_TRACE_DEBUG0("btm_get_ble_buffer_size ");
+    BTM_TRACE_DEBUG("btm_get_ble_buffer_size ");
     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
 
     /* Send a Read Buffer Size message to the Host Controller. */
@@ -477,12 +477,31 @@
 *******************************************************************************/
 static void btm_read_ble_local_supported_features(void)
 {
-    BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features ");
+    BTM_TRACE_DEBUG("btm_read_ble_local_supported_features ");
     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
 
     /* Send a Read Local Supported Features message to the Host Controller. */
     btsnd_hcic_ble_read_local_spt_feat ();
 }
+
+/*******************************************************************************
+**
+** Function         btm_read_ble_local_supported_states
+**
+** Description      Local function called to send a read BLE local supported
+**                  features command
+**
+** Returns          void
+**
+*******************************************************************************/
+static void btm_read_ble_local_supported_states(void)
+{
+    BTM_TRACE_DEBUG("btm_read_ble_local_supported_states ");
+    btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
+
+    /* Send a Read Local Supported states message to the Host Controller. */
+    btsnd_hcic_ble_read_supported_states ();
+}
 #endif
 /*******************************************************************************
 **
@@ -519,7 +538,7 @@
 *******************************************************************************/
 static void btm_read_local_supported_cmds (UINT8 local_controller_id)
 {
-    BTM_TRACE_DEBUG0("Start reading local supported commands");
+    BTM_TRACE_DEBUG("Start reading local supported commands");
 
     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
 
@@ -613,7 +632,7 @@
 {
     int devinx;
 
-    BTM_TRACE_EVENT0 ("btm_reset_complete");
+    BTM_TRACE_EVENT ("btm_reset_complete");
 
     /* Handle if btm initiated the reset */
     if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT)
@@ -794,7 +813,7 @@
     UINT16      lm_num_le_bufs;
     UNUSED(evt_len);
 
-    BTM_TRACE_DEBUG0("btm_read_ble_buf_size_complete ");
+    BTM_TRACE_DEBUG("btm_read_ble_buf_size_complete ");
     STREAM_TO_UINT8  (status, p);
     if (status == HCI_SUCCESS)
     {
@@ -808,6 +827,36 @@
 
         l2c_link_processs_ble_num_bufs (lm_num_le_bufs);
     }
+    btm_read_ble_local_supported_states();
+}
+/*******************************************************************************
+**
+** Function         btm_read_ble_local_supported_states_complete
+**
+** Description      This function is called when command complete for
+**                  Read LE Local Supported states complete is received.
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_read_ble_local_supported_states_complete (UINT8 *p, UINT16 evt_len)
+{
+    UINT8       status;
+
+    UNUSED(evt_len);
+    BTM_TRACE_DEBUG("btm_read_ble_local_supported_states_complete ");
+
+    btu_stop_timer (&btm_cb.devcb.reset_timer);
+
+    STREAM_TO_UINT8  (status, p);
+    if (status == HCI_SUCCESS)
+    {
+        STREAM_TO_ARRAY(&btm_cb.devcb.le_supported_states, p, BTM_LE_SUPPORT_STATE_SIZE);
+    }
+    else
+    {
+        BTM_TRACE_WARNING ("btm_read_ble_local_supported_features_complete status = %d", status);
+    }
 
     btm_read_ble_local_supported_features();
 }
@@ -828,7 +877,7 @@
     UINT8       status;
     UNUSED(evt_len);
 
-    BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features_complete ");
+    BTM_TRACE_DEBUG("btm_read_ble_local_supported_features_complete ");
 
     btu_stop_timer (&btm_cb.devcb.reset_timer);
 
@@ -839,9 +888,11 @@
     }
     else
     {
-        BTM_TRACE_WARNING1 ("btm_read_ble_local_supported_features_complete status = %d", status);
+        BTM_TRACE_WARNING ("btm_read_ble_local_supported_features_complete status = %d", status);
     }
 
+    btsnd_hcic_ble_set_evt_mask((UINT8 *)HCI_BLE_EVENT_MASK_DEF);
+
 #if BTM_INTERNAL_BB == TRUE
     {
         UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA;
@@ -866,7 +917,7 @@
     UINT8       status;
     UNUSED(evt_len);
 
-    BTM_TRACE_DEBUG0("btm_read_white_list_size_complete ");
+    BTM_TRACE_DEBUG("btm_read_white_list_size_complete ");
     STREAM_TO_UINT8  (status, p);
 
     if (status == HCI_SUCCESS)
@@ -874,6 +925,8 @@
         STREAM_TO_UINT8(btm_cb.ble_ctr_cb.max_filter_entries, p);
         btm_cb.ble_ctr_cb.num_empty_filter = btm_cb.ble_ctr_cb.max_filter_entries;
     }
+    /* write LE host support and simultatunous LE supported */
+    btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, BTM_BLE_SIMULTANEOUS_HOST);
 
     btm_get_ble_buffer_size();
 }
@@ -935,7 +988,7 @@
     UINT8 last;
     UINT8 first;
 
-    BTM_TRACE_DEBUG1 ("btm_decode_ext_features_page page: %d", page_number);
+    BTM_TRACE_DEBUG ("btm_decode_ext_features_page page: %d", page_number);
     switch (page_number)
     {
     /* Extended (Legacy) Page 0 */
@@ -986,7 +1039,7 @@
             }
         }
 
-        BTM_TRACE_DEBUG1("Local supported ACL packet types: 0x%04x",
+        BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x",
                          btm_cb.btm_acl_pkt_types_supported);
 
         /* Create (e)SCO supported packet types mask */
@@ -1043,7 +1096,7 @@
         }
 #endif
 
-        BTM_TRACE_DEBUG1("Local supported SCO packet types: 0x%04x",
+        BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x",
                          btm_cb.btm_sco_pkt_types_supported);
 
         /* Create Default Policy Settings */
@@ -1102,7 +1155,7 @@
         break;
 
     default:
-        BTM_TRACE_ERROR1("btm_decode_ext_features_page page=%d unknown", page_number);
+        BTM_TRACE_ERROR("btm_decode_ext_features_page page=%d unknown", page_number);
         break;
     }
 }
@@ -1143,11 +1196,11 @@
     }
 
     if (!found)
-        BTM_TRACE_WARNING0 ("btm_reset_ctrlr_complete: NONE of local controller features is set");
+        BTM_TRACE_WARNING ("btm_reset_ctrlr_complete: NONE of local controller features is set");
 
     max_page_number = i;
 
-    BTM_TRACE_DEBUG1 ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number);
+    BTM_TRACE_DEBUG ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number);
 
     /*
     * Set State to Ready (needs to be done before btm_decode_ext_features_page
@@ -1191,7 +1244,7 @@
 *******************************************************************************/
 static void btm_issue_host_support_for_lmp_features (void)
 {
-    BTM_TRACE_DEBUG1("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support);
+    BTM_TRACE_DEBUG("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support);
 
     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
     {
@@ -1204,8 +1257,7 @@
     {
         if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE)
         {
-            /* At the moment the host can't work simultaneously with BR/EDR and LE */
-            btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0);
+            btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, BTM_BLE_SIMULTANEOUS_HOST);
         }
         else
         {
@@ -1241,7 +1293,7 @@
         return;
     }
 
-    BTM_TRACE_ERROR2("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__,
+    BTM_TRACE_ERROR("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__,
                       btm_cb.devcb.lmp_features_host_may_support);
 }
 
@@ -1349,7 +1401,7 @@
             /* if local controller has extended features and supports
             **HCI_Read_Local_Extended_Features command,
             ** then start reading these feature starting with extended features page 1 */
-            BTM_TRACE_DEBUG0 ("Start reading local extended features");
+            BTM_TRACE_DEBUG ("Start reading local extended features");
             btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1);
         }
         else
@@ -1384,7 +1436,7 @@
 
     if (status != HCI_SUCCESS)
     {
-        BTM_TRACE_WARNING1("btm_read_local_ext_features_complete status = 0x%02X", status);
+        BTM_TRACE_WARNING("btm_read_local_ext_features_complete status = 0x%02X", status);
         btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0);
         return;
     }
@@ -1397,7 +1449,7 @@
 
     if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
     {
-        BTM_TRACE_ERROR1("btm_read_local_ext_features_complete page=%d unknown",
+        BTM_TRACE_ERROR("btm_read_local_ext_features_complete page=%d unknown",
                 page_number);
         return;
     }
@@ -1420,7 +1472,7 @@
     if ((page_number == page_number_max) ||
         (page_number == HCI_EXT_FEATURES_PAGE_MAX))
     {
-        BTM_TRACE_DEBUG1("BTM reached last extended features page (%d)", page_number);
+        BTM_TRACE_DEBUG("BTM reached last extended features page (%d)", page_number);
         btm_read_all_lmp_features_complete(page_number);
     }
     /* Else (another page must be read) */
@@ -1428,7 +1480,7 @@
     {
         /* Read the next features page */
         page_number++;
-        BTM_TRACE_DEBUG1("BTM reads next extended features page (%d)", page_number);
+        BTM_TRACE_DEBUG("BTM reads next extended features page (%d)", page_number);
         btm_get_local_ext_features(page_number);
     }
 }
@@ -1451,7 +1503,7 @@
     btu_stop_timer (&(p_devcb->reset_timer));
 
     STREAM_TO_UINT8  (status, p);
-    BTM_TRACE_DEBUG1("btm_read_local_supported_cmds_complete status (0x%02x)", status);
+    BTM_TRACE_DEBUG("btm_read_local_supported_cmds_complete status (0x%02x)", status);
 
     if (status == HCI_SUCCESS)
     {
@@ -1481,7 +1533,7 @@
 
     if (status != HCI_SUCCESS)
     {
-        BTM_TRACE_WARNING1("btm_write_simple_paring_mode_complete status: 0x%02x", status);
+        BTM_TRACE_WARNING("btm_write_simple_paring_mode_complete status: 0x%02x", status);
     }
 
     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
@@ -1510,7 +1562,7 @@
 
     if (status != HCI_SUCCESS)
     {
-        BTM_TRACE_WARNING1("btm_write_le_host_supported_complete status: 0x%02x", status);
+        BTM_TRACE_WARNING("btm_write_le_host_supported_complete status: 0x%02x", status);
     }
 
     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE)
@@ -1822,7 +1874,7 @@
     if (page_number <= HCI_EXT_FEATURES_PAGE_MAX)
         return (btm_cb.devcb.local_lmp_features[page_number]);
 
-    BTM_TRACE_ERROR1("Warning: BTM_ReadLocalExtendedFeatures page %d unknown",
+    BTM_TRACE_ERROR("Warning: BTM_ReadLocalExtendedFeatures page %d unknown",
             page_number);
     return NULL;
 }
@@ -1883,7 +1935,7 @@
 {
     void *p_buf;
 
-    BTM_TRACE_EVENT2 ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.",
+    BTM_TRACE_EVENT ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.",
                       opcode, param_len);
 
     /* Allocate a buffer to hold HCI command plus the callback function */
@@ -1965,7 +2017,7 @@
             if (is_register == FALSE)
             {
                 btm_cb.devcb.p_vend_spec_cb[i] = NULL;
-                BTM_TRACE_EVENT0("BTM Deregister For VSEvents is successfully");
+                BTM_TRACE_EVENT("BTM Deregister For VSEvents is successfully");
             }
             return (BTM_SUCCESS);
         }
@@ -1977,12 +2029,12 @@
         if (free_idx < BTM_MAX_VSE_CALLBACKS)
         {
             btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb;
-            BTM_TRACE_EVENT0("BTM Register For VSEvents is successfully");
+            BTM_TRACE_EVENT("BTM Register For VSEvents is successfully");
         }
         else
         {
             /* No free entries available */
-            BTM_TRACE_ERROR0 ("BTM_RegisterForVSEvents: too many callbacks registered");
+            BTM_TRACE_ERROR ("BTM_RegisterForVSEvents: too many callbacks registered");
 
             retval = BTM_NO_RESOURCES;
         }
@@ -2007,7 +2059,7 @@
 {
     UINT8 i;
 
-    BTM_TRACE_DEBUG0 ("BTM Event: Vendor Specific event from controller");
+    BTM_TRACE_DEBUG ("BTM Event: Vendor Specific event from controller");
 
     for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++)
     {
@@ -2031,7 +2083,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout)
 {
-    BTM_TRACE_EVENT1 ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout);
+    BTM_TRACE_EVENT ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout);
 
     /* Send the HCI command */
     if (btsnd_hcic_write_page_tout (timeout))
@@ -2055,7 +2107,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings)
 {
-    BTM_TRACE_EVENT1 ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings);
+    BTM_TRACE_EVENT ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings);
 
     /* Send the HCI command */
     if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff)))
@@ -2083,7 +2135,7 @@
 {
     UINT8   cond;
 
-    BTM_TRACE_EVENT0 ("BTM: BTM_EnableTestMode");
+    BTM_TRACE_EVENT ("BTM: BTM_EnableTestMode");
 
     /* set auto accept connection as this is needed during test mode */
     /* Allocate a buffer to hold HCI command */
@@ -2170,7 +2222,7 @@
         bd_addr = local_bd_addr;
     }
 
-    BTM_TRACE_EVENT1 ("BTM: BTM_ReadStoredLinkKey: Read_All: %s",
+    BTM_TRACE_EVENT ("BTM: BTM_ReadStoredLinkKey: Read_All: %s",
                         read_all_flag ? "TRUE" : "FALSE");
 
     /* Send the HCI command */
@@ -2207,7 +2259,7 @@
     if (btm_cb.devcb.p_stored_link_key_cmpl_cb)
         return (BTM_BUSY);
 
-    BTM_TRACE_EVENT1 ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys);
+    BTM_TRACE_EVENT ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys);
 
     /* Check the maximum number of link keys */
     if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD)
@@ -2254,7 +2306,7 @@
         bd_addr = local_bd_addr;
     }
 
-    BTM_TRACE_EVENT1 ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s",
+    BTM_TRACE_EVENT ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s",
                         delete_all_flag ? "TRUE" : "FALSE");
 
     /* Send the HCI command */
@@ -2300,7 +2352,7 @@
         }
         else
         {
-            BTM_TRACE_WARNING1("Read stored link key status %d", result.status);
+            BTM_TRACE_WARNING("Read stored link key status %d", result.status);
             result.max_keys = 0;
             result.read_keys = 0;
         }
diff --git a/stack/btm/btm_inq.c b/stack/btm/btm_inq.c
index 24f91a8..6e7ad87 100644
--- a/stack/btm/btm_inq.c
+++ b/stack/btm/btm_inq.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 1999-2012 Broadcom Corporation
+ *  Copyright (C) 1999-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -183,7 +183,7 @@
     BOOLEAN      is_limited;
     BOOLEAN      cod_limited;
 
-    BTM_TRACE_API0 ("BTM_SetDiscoverability");
+    BTM_TRACE_API ("BTM_SetDiscoverability");
 #if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
     if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
     {
@@ -191,7 +191,7 @@
                             == BTM_SUCCESS)
         {
             btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_BLE_DISCOVERABLE_MASK);
-            btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_CONNECTABLE_MASK);
+            btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_DISCOVERABLE_MASK);
         }
     }
     inq_mode &= ~BTM_BLE_DISCOVERABLE_MASK;
@@ -212,7 +212,7 @@
     if (!interval)
         interval = BTM_DEFAULT_DISC_INTERVAL;
 
-    BTM_TRACE_API3 ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x",
+    BTM_TRACE_API ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x",
                         inq_mode, window, interval);
 
     /*** Check for valid window and interval parameters ***/
@@ -311,7 +311,7 @@
 tBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type)
 {
 
-    BTM_TRACE_API0 ("BTM_SetInquiryScanType");
+    BTM_TRACE_API ("BTM_SetInquiryScanType");
     if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
         return (BTM_ILLEGAL_VALUE);
 
@@ -348,7 +348,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_SetPageScanType (UINT16 scan_type)
 {
-    BTM_TRACE_API0 ("BTM_SetPageScanType");
+    BTM_TRACE_API ("BTM_SetPageScanType");
     if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
         return (BTM_ILLEGAL_VALUE);
 
@@ -389,7 +389,7 @@
 *******************************************************************************/
 tBTM_STATUS BTM_SetInquiryMode (UINT8 mode)
 {
-    BTM_TRACE_API0 ("BTM_SetInquiryMode");
+    BTM_TRACE_API ("BTM_SetInquiryMode");
     if (mode == BTM_INQ_RESULT_STANDARD)
     {
         /* mandatory mode */
@@ -434,7 +434,7 @@
 *******************************************************************************/
 UINT16 BTM_ReadDiscoverability (UINT16 *p_window, UINT16 *p_interval)
 {
-    BTM_TRACE_API0 ("BTM_ReadDiscoverability");
+    BTM_TRACE_API ("BTM_ReadDiscoverability");
     if (p_window)
         *p_window = btm_cb.btm_inq_vars.inq_scan_window;
 
@@ -480,7 +480,7 @@
     tBTM_STATUS  status;
     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
 
-    BTM_TRACE_API6 ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d",
+    BTM_TRACE_API ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d",
         p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
         p_inqparms->filter_cond_type, min_delay, max_delay);
 
@@ -524,7 +524,7 @@
                             (BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE));
 
 #if (defined(BTM_BYPASS_EVENT_FILTERING) && BTM_BYPASS_EVENT_FILTERING == TRUE)
-    BTM_TRACE_WARNING0("BTM: Bypassing event filtering...");
+    BTM_TRACE_WARNING("BTM: Bypassing event filtering...");
 
     p_inq->state = BTM_INQ_ACTIVE_STATE;
     p_inq->inqfilt_active = FALSE;
@@ -573,7 +573,7 @@
 {
     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
     tBTM_STATUS          status = BTM_SUCCESS;
-    BTM_TRACE_API0 ("BTM_CancelPeriodicInquiry called");
+    BTM_TRACE_API ("BTM_CancelPeriodicInquiry called");
 
     /*** Make sure the device is ready ***/
     if (!BTM_IsDeviceUp())
@@ -619,7 +619,7 @@
     UINT8    scan_mode = 0;
     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
 
-    BTM_TRACE_API0 ("BTM_SetConnectability");
+    BTM_TRACE_API ("BTM_SetConnectability");
 
 #if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
     if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
@@ -649,7 +649,7 @@
     if (!interval)
         interval = BTM_DEFAULT_CONN_INTERVAL;
 
-    BTM_TRACE_API3 ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x",
+    BTM_TRACE_API ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x",
                         page_mode, window, interval);
 
     /*** Check for valid window and interval parameters ***/
@@ -708,7 +708,7 @@
 *******************************************************************************/
 UINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval)
 {
-    BTM_TRACE_API0 ("BTM_ReadConnectability");
+    BTM_TRACE_API ("BTM_ReadConnectability");
     if (p_window)
         *p_window = btm_cb.btm_inq_vars.page_scan_window;
 
@@ -734,7 +734,7 @@
 *******************************************************************************/
 UINT16 BTM_IsInquiryActive (void)
 {
-    BTM_TRACE_API0 ("BTM_IsInquiryActive");
+    BTM_TRACE_API ("BTM_IsInquiryActive");
 
     return(btm_cb.btm_inq_vars.inq_active);
 }
@@ -759,7 +759,7 @@
 #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
     UINT8 active_mode=p_inq->inq_active;
 #endif
-    BTM_TRACE_API0 ("BTM_CancelInquiry called");
+    BTM_TRACE_API ("BTM_CancelInquiry called");
 
     /*** Make sure the device is ready ***/
     if (!BTM_IsDeviceUp())
@@ -796,10 +796,10 @@
 #if BLE_INCLUDED == TRUE
             if (((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
 #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
-            &&(active_mode & BTM_LE_INQ_ACTIVE_MASK)
+            &&(active_mode & BTM_BLE_INQ_ACTIVE_MASK)
 #endif
             )
-                btm_ble_stop_scan();
+                btm_ble_stop_inquiry();
 #endif
         }
 
@@ -853,7 +853,7 @@
     tBTM_STATUS  status = BTM_CMD_STARTED;
     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
 
-    BTM_TRACE_API4 ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d",
+    BTM_TRACE_API ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d",
                         p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
                         p_inqparms->filter_cond_type);
 
@@ -865,18 +865,17 @@
         /*check if LE observe is already running*/
         if(p_inq->scan_type==INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb!=NULL)
         {
-            BTM_TRACE_API0("BTM_StartInquiry: LE observe in progress");
+            BTM_TRACE_API("BTM_StartInquiry: LE observe in progress");
             p_inq->scan_type = INQ_GENERAL;
             p_inq->inq_active = BTM_INQUIRY_INACTIVE;
             btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
-            btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE;
             btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
         }
         else
 #endif
         {
             return (BTM_BUSY);
-            BTM_TRACE_API0("BTM_StartInquiry: return BUSY");
+            BTM_TRACE_API("BTM_StartInquiry: return BUSY");
         }
     }
     else
@@ -911,7 +910,7 @@
     p_inq->inq_cmpl_info.num_resp = 0;         /* Clear the results counter */
     p_inq->inq_active = p_inqparms->mode;
 
-    BTM_TRACE_DEBUG1("BTM_StartInquiry: p_inq->inq_active = 0x%02x", p_inq->inq_active);
+    BTM_TRACE_DEBUG("BTM_StartInquiry: p_inq->inq_active = 0x%02x", p_inq->inq_active);
 
 /* interleave scan minimal conditions */
 #if (BLE_INCLUDED==TRUE && (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE))
@@ -919,13 +918,13 @@
     /* check if both modes are present */
     if((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && (p_inqparms->mode & BTM_BR_INQUIRY_MASK))
     {
-        BTM_TRACE_API0("BTM:Interleave Inquiry Mode Set");
+        BTM_TRACE_API("BTM:Interleave Inquiry Mode Set");
         p_inqparms->duration=p_inqparms->intl_duration[p_inq->next_state];
         p_inq->inqparms.duration=p_inqparms->duration;
     }
     else
     {
-        BTM_TRACE_API1("BTM:Single Mode: No interleaving, Mode:0x%02x", p_inqparms->mode);
+        BTM_TRACE_API("BTM:Single Mode: No interleaving, Mode:0x%02x", p_inqparms->mode);
         p_inq->next_state=BTM_NO_INTERLEAVING;
     }
 #endif
@@ -944,7 +943,7 @@
     {
 #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
         p_inq->inq_active = (p_inqparms->mode & BTM_BLE_INQUIRY_MASK);
-        BTM_TRACE_API2("BTM:Starting LE Scan with duration %d and activeMode:0x%02x",
+        BTM_TRACE_API("BTM:Starting LE Scan with duration %d and activeMode:0x%02x",
                        p_inqparms->duration, (p_inqparms->mode & BTM_BLE_INQUIRY_MASK));
 #endif
         if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
@@ -956,7 +955,7 @@
         else if ((status = btm_ble_start_inquiry((UINT8)(p_inqparms->mode & BTM_BLE_INQUIRY_MASK),
                                             p_inqparms->duration)) != BTM_CMD_STARTED)
         {
-            BTM_TRACE_ERROR0("Err Starting LE Inquiry.");
+            BTM_TRACE_ERROR("Err Starting LE Inquiry.");
             p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK;
         }
 #if (!defined(BTA_HOST_INTERLEAVE_SEARCH) || BTA_HOST_INTERLEAVE_SEARCH == FALSE)
@@ -970,7 +969,7 @@
         }
         else
         {
-            BTM_TRACE_API1("BTM:Interleaving: started LE scan, Advancing to next state: %d",
+            BTM_TRACE_API("BTM:Interleaving: started LE scan, Advancing to next state: %d",
                            p_inq->next_state+1);
             p_inq->next_state+=1;
         }
@@ -983,7 +982,7 @@
 #endif
 
 
-        BTM_TRACE_DEBUG1("BTM_StartInquiry: mode = %02x", p_inqparms->mode);
+        BTM_TRACE_DEBUG("BTM_StartInquiry: mode = %02x", p_inqparms->mode);
     }
 #endif /* end of BLE_INCLUDED */
 
@@ -999,7 +998,7 @@
         p_inq->inq_active = (p_inqparms->mode & BTM_BR_INQUIRY_MASK);
 #endif
 #if (defined(BTM_BYPASS_EVENT_FILTERING) && BTM_BYPASS_EVENT_FILTERING == TRUE)
-    BTM_TRACE_WARNING0("BTM: Bypassing event filtering...");
+    BTM_TRACE_WARNING("BTM: Bypassing event filtering...");
     p_inq->inqfilt_active = FALSE;
     btm_initiate_inquiry (p_inq);
     status = BTM_CMD_STARTED;
@@ -1038,7 +1037,7 @@
             p_inq->next_state=BTM_FINISH;
         else
         {
-            BTM_TRACE_API1("BTM:Interleaving: Started BTM inq, Advancing to next state: %d",
+            BTM_TRACE_API("BTM:Interleaving: Started BTM inq, Advancing to next state: %d",
                            p_inq->next_state+1);
             p_inq->next_state+=1;
         }
@@ -1048,7 +1047,7 @@
          /* Some error beginning the scan process.
             Reset the next_state parameter.. Do we need to reset the inq_active also?
          */
-        BTM_TRACE_API1("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", status);
+        BTM_TRACE_API("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", status);
         p_inq->next_state=BTM_BR_ONE;
      }
 #endif
@@ -1080,12 +1079,13 @@
 **                  BTM_WRONG_MODE if the device is not up.
 **
 *******************************************************************************/
-tBTM_STATUS  BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb)
+tBTM_STATUS  BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb
+                                                ,tBT_TRANSPORT transport)
 {
     tBTM_INQ_INFO   *p_cur = NULL;
     tINQ_DB_ENT     *p_i;
 
-    BTM_TRACE_API6 ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]",
+    BTM_TRACE_API ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]",
                remote_bda[0], remote_bda[1], remote_bda[2],
                remote_bda[3], remote_bda[4], remote_bda[5]);
 
@@ -1098,10 +1098,10 @@
         p_cur->remote_name_state = BTM_INQ_RMT_NAME_EMPTY;
 #endif
     }
-    BTM_TRACE_API0 ("no device found in inquiry db");
+    BTM_TRACE_API ("no device found in inquiry db");
 
 #if (BLE_INCLUDED == TRUE)
-    if (BTM_UseLeLink(remote_bda))
+    if (transport == BT_TRANSPORT_LE)
     {
         return btm_ble_read_remote_name(remote_bda, p_cur, p_cb);
     }
@@ -1132,7 +1132,7 @@
 {
     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
 
-    BTM_TRACE_API0 ("BTM_CancelRemoteDeviceName()");
+    BTM_TRACE_API ("BTM_CancelRemoteDeviceName()");
 
     /* Make sure there is not already one in progress */
     if (p_inq->remname_active)
@@ -1237,7 +1237,7 @@
     UINT16       xx;
     tINQ_DB_ENT  *p_ent = btm_cb.btm_inq_vars.inq_db;
 
-    BTM_TRACE_API6 ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]",
+    BTM_TRACE_API ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]",
                p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
 
     for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
@@ -1583,7 +1583,7 @@
     UINT8 normal_active = (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE);
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG4 ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
     if (btm_cb.btm_inq_vars.no_inc_ssp)
@@ -1639,7 +1639,7 @@
     UINT16                   xx;
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG2 ("btm_clr_inq_db: inq_active:0x%x state:%d",
+    BTM_TRACE_DEBUG ("btm_clr_inq_db: inq_active:0x%x state:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
 #endif
     for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
@@ -1661,7 +1661,7 @@
         }
     }
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG2 ("inq_active:0x%x state:%d",
+    BTM_TRACE_DEBUG ("inq_active:0x%x state:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
 #endif
 }
@@ -1847,9 +1847,9 @@
     UINT8   *p_cond = condition_buf;                    /* points to the condition to pass to HCI */
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG1 ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]",
+    BTM_TRACE_DEBUG ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]",
         filter_cond_type);
-    BTM_TRACE_DEBUG6 ("                       condition [%02x%02x%02x %02x%02x%02x]",
+    BTM_TRACE_DEBUG ("                       condition [%02x%02x%02x %02x%02x%02x]",
                p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], p_filt_cond->bdaddr_cond[2],
                p_filt_cond->bdaddr_cond[3], p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]);
 #endif
@@ -1911,7 +1911,7 @@
     tBTM_CMPL_CB   *p_cb = p_inq->p_inqfilter_cmpl_cb;
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG3 ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
     /* If the filter complete event is from an old or cancelled request, ignore it */
@@ -1930,7 +1930,7 @@
         if (hci_status != HCI_SUCCESS)
         {
             /* If standalone operation, return the error status; if embedded in the inquiry, continue the inquiry */
-            BTM_TRACE_WARNING1 ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", hci_status);
+            BTM_TRACE_WARNING ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", hci_status);
             status = BTM_ERR_PROCESSING;
         }
         else
@@ -2010,7 +2010,7 @@
     tBTM_INQ_PARMS  *p_inqparms = &p_inq->inqparms;
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG3 ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -2046,7 +2046,7 @@
         {
             p_inq->max_bd_entries = (UINT16)(GKI_MAX_BUF_SIZE / sizeof(tINQ_BDADDR));
             memset(p_inq->p_bd_db, 0, GKI_MAX_BUF_SIZE);
-/*            BTM_TRACE_DEBUG1("btm_initiate_inquiry: memory allocated for %d bdaddrs",
+/*            BTM_TRACE_DEBUG("btm_initiate_inquiry: memory allocated for %d bdaddrs",
                               p_inq->max_bd_entries); */
         }
 
@@ -2098,7 +2098,7 @@
 #endif
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG3 ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
     /* Only process the results if the BR inquiry is still active */
@@ -2147,7 +2147,7 @@
 
             )
         {
-/*            BTM_TRACE_WARNING0("INQ RES: Extra Response Received...ignoring"); */
+/*            BTM_TRACE_WARNING("INQ RES: Extra Response Received...ignoring"); */
             return;
         }
 #endif
@@ -2155,7 +2155,7 @@
         /* Check if this address has already been processed for this inquiry */
         if (btm_inq_find_bdaddr(bda))
         {
-/*             BTM_TRACE_DEBUG6("BDA seen before [%02x%02x %02x%02x %02x%02x]",
+/*             BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]",
                              bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);*/
              /* By default suppose no update needed */
             i_rssi = (INT8)rssi;
@@ -2170,7 +2170,7 @@
                        ))
             {
                 p_cur = &p_i->inq_info.results;
-                BTM_TRACE_DEBUG2("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi);
+                BTM_TRACE_DEBUG("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi);
                 p_cur->rssi = i_rssi;
                 update = TRUE;
             }
@@ -2261,12 +2261,12 @@
 #endif
                 )
             {
-/*                BTM_TRACE_DEBUG0("BTMINQ: Found devices, cancelling inquiry..."); */
+/*                BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling inquiry..."); */
                 btsnd_hcic_inq_cancel();
 
 #if BLE_INCLUDED == TRUE
                 if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
-                    btm_ble_stop_scan();
+                    btm_ble_stop_inquiry();
 #endif
 
 
@@ -2432,7 +2432,7 @@
 
 
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG3 ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
@@ -2486,21 +2486,20 @@
             p_inq->p_inq_cmpl_cb = (tBTM_CMPL_CB *) NULL;
 
             /* If we have a callback registered for inquiry complete, call it */
-            BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
+            BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
                         p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
 
             if (p_inq_cb)
                 (p_inq_cb)((tBTM_INQUIRY_CMPL *) &p_inq->inq_cmpl_info);
         }
 #if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
-            if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))
-            {
-                /* make inquiry inactive for next iteration */
-                p_inq->inq_active = BTM_INQUIRY_INACTIVE;
-                /* call the inquiry again */
-                BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
-                return;
-            }
+        if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))
+        {
+            /* make inquiry inactive for next iteration */
+            p_inq->inq_active = BTM_INQUIRY_INACTIVE;
+            /* call the inquiry again */
+            BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
+        }
 #endif
     }
     if(p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL)//this inquiry is complete
@@ -2510,13 +2509,13 @@
         /* check if the LE observe is pending */
         if(p_inq->p_inq_ble_results_cb != NULL)
         {
-            BTM_TRACE_DEBUG0("BTM Inq Compl: resuming a pending LE scan");
+            BTM_TRACE_DEBUG("BTM Inq Compl: resuming a pending LE scan");
             BTM_BleObserve(1,0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb);
         }
 #endif
     }
 #if (BTM_INQ_DEBUG == TRUE)
-    BTM_TRACE_DEBUG3 ("inq_active:0x%x state:%d inqfilt_active:%d",
+    BTM_TRACE_DEBUG ("inq_active:0x%x state:%d inqfilt_active:%d",
         btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
 #endif
 }
@@ -2686,12 +2685,12 @@
 
     if (bda != NULL)
     {
-        BTM_TRACE_EVENT6("BDA %02x:%02x:%02x:%02x:%02x:%02x",bda[0], bda[1],
+        BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x",bda[0], bda[1],
                  bda[2], bda[3],
                  bda[4], bda[5]);
     }
 
-	BTM_TRACE_EVENT6("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x",p_inq->remname_bda[0], p_inq->remname_bda[1],
+	BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x",p_inq->remname_bda[0], p_inq->remname_bda[1],
              p_inq->remname_bda[2], p_inq->remname_bda[3],
              p_inq->remname_bda[4], p_inq->remname_bda[5]);
 
@@ -2857,7 +2856,7 @@
 *******************************************************************************/
 void btm_inq_rmt_name_failed (void)
 {
-    BTM_TRACE_ERROR1 ("btm_inq_rmt_name_failed()  remname_active=%d", btm_cb.btm_inq_vars.remname_active);
+    BTM_TRACE_ERROR ("btm_inq_rmt_name_failed()  remname_active=%d", btm_cb.btm_inq_vars.remname_active);
 
     if (btm_cb.btm_inq_vars.remname_active)
         btm_process_remote_name (btm_cb.btm_inq_vars.remname_bda, NULL, 0, HCI_ERR_UNSPECIFIED);
@@ -2893,7 +2892,7 @@
             results.status = BTM_SUCCESS;
 
             STREAM_TO_UINT8 (results.tx_power, p);
-            BTM_TRACE_EVENT2 ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x",
+            BTM_TRACE_EVENT ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x",
                               results.tx_power, results.hci_status);
         }
         else
@@ -2921,7 +2920,7 @@
 #if (BTM_EIR_SERVER_INCLUDED == TRUE)
     if (HCI_EXT_INQ_RSP_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
     {
-        BTM_TRACE_API0("Write Extended Inquiry Response to controller");
+        BTM_TRACE_API("Write Extended Inquiry Response to controller");
         btsnd_hcic_write_ext_inquiry_response (p_buff, BTM_EIR_DEFAULT_FEC_REQUIRED);
         return BTM_SUCCESS;
     }
@@ -2955,7 +2954,7 @@
     UINT8 *p = p_eir;
     UINT8 length;
     UINT8 eir_type;
-    BTM_TRACE_API1("BTM_CheckEirData type=0x%02X", type);
+    BTM_TRACE_API("BTM_CheckEirData type=0x%02X", type);
 
     STREAM_TO_UINT8(length, p);
     while( length && (p - p_eir <= HCI_EXT_INQ_RESPONSE_LEN))
@@ -3197,19 +3196,19 @@
 
     if( *p_num_uuid > max_num_uuid )
     {
-        BTM_TRACE_WARNING2("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d",
+        BTM_TRACE_WARNING("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d",
                            *p_num_uuid, max_num_uuid );
         *p_num_uuid = max_num_uuid;
     }
 
-    BTM_TRACE_DEBUG2("BTM_GetEirUuidList type = %02X, number of uuid = %d", type, *p_num_uuid );
+    BTM_TRACE_DEBUG("BTM_GetEirUuidList type = %02X, number of uuid = %d", type, *p_num_uuid );
 
     if( uuid_size == LEN_UUID_16 )
     {
         for( yy = 0; yy < *p_num_uuid; yy++ )
         {
             STREAM_TO_UINT16(*(p_uuid16 + yy), p_uuid_data);
-            BTM_TRACE_DEBUG1("                     0x%04X", *(p_uuid16 + yy));
+            BTM_TRACE_DEBUG("                     0x%04X", *(p_uuid16 + yy));
         }
     }
     else if( uuid_size == LEN_UUID_32 )
@@ -3217,7 +3216,7 @@
         for( yy = 0; yy < *p_num_uuid; yy++ )
         {
             STREAM_TO_UINT32(*(p_uuid32 + yy), p_uuid_data);
-            BTM_TRACE_DEBUG1("                     0x%08X", *(p_uuid32 + yy));
+            BTM_TRACE_DEBUG("                     0x%08X", *(p_uuid32 + yy));
         }
     }
     else if( uuid_size == LEN_UUID_128 )
@@ -3227,7 +3226,7 @@
             STREAM_TO_ARRAY16(p_uuid_list + yy * LEN_UUID_128, p_uuid_data);
             for( xx = 0; xx < LEN_UUID_128; xx++ )
                 sprintf(buff + xx*2, "%02X", *(p_uuid_list + yy * LEN_UUID_128 + xx));
-            BTM_TRACE_DEBUG1("                     0x%s", buff);
+            BTM_TRACE_DEBUG("                     0x%s", buff);
         }
     }
 
@@ -3350,7 +3349,7 @@
         }
         break;
     default:
-        BTM_TRACE_WARNING0("btm_convert_uuid_to_uuid16 invalid uuid size");
+        BTM_TRACE_WARNING("btm_convert_uuid_to_uuid16 invalid uuid size");
         break;
     }
 
@@ -3388,7 +3387,7 @@
         p_results->eir_complete_list = FALSE;
     }
 
-    BTM_TRACE_API1("btm_set_eir_uuid eir_complete_list=0x%02X", p_results->eir_complete_list);
+    BTM_TRACE_API("btm_set_eir_uuid eir_complete_list=0x%02X", p_results->eir_complete_list);
 
     if( p_uuid_data )
     {
@@ -3422,9 +3421,6 @@
                 BTM_AddEirService( p_results->eir_uuid, uuid16 );
         }
     }
-
-    BTM_TRACE_DEBUG2("btm_set_eir_uuid eir_uuid=0x%08X %08X",
-                     p_results->eir_uuid[1], p_results->eir_uuid[0] );
 }
 #endif
 
diff --git a/stack/btm/btm_int.h b/stack/btm/btm_int.h
index 7865b3e..fcb17bb 100644
--- a/stack/btm/btm_int.h
+++ b/stack/btm/btm_int.h
@@ -46,16 +46,12 @@
 typedef char tBTM_LOC_BD_NAME[BTM_MAX_LOC_BD_NAME_LEN + 1];
 #endif
 
-#define  BTM_ACL_IS_CONNECTED(bda)   (btm_bda_to_acl (bda) != NULL)
+#define  BTM_ACL_IS_CONNECTED(bda)   (btm_bda_to_acl (bda, BT_TRANSPORT_BR_EDR) != NULL)
 
 /* Definitions for Server Channel Number (SCN) management
 */
 #define BTM_MAX_SCN      PORT_MAX_RFC_PORTS
 
-/* Definition for number of the remote device role saved
-*/
-#define BTM_ROLE_DEVICE_NUM      4
-
 /* Define masks for supported and exception 2.0 ACL packet types
 */
 #define BTM_ACL_SUPPORTED_PKTS_MASK      (HCI_PKT_TYPES_MASK_DM1        | \
@@ -119,8 +115,9 @@
 #if BTM_PWR_MGR_INCLUDED == FALSE
     UINT8           mode;
 #endif /* BTM_PWR_MGR_INCLUDED */
+
 #if BLE_INCLUDED == TRUE
-    UINT8           is_le_link;
+    tBT_TRANSPORT   transport;
     BD_ADDR         conn_addr;              /* local device address used for this connection */
     UINT8           conn_addr_type;         /* local device address type for this connection */
     BD_ADDR         active_remote_addr;     /* remote address used on this connection */
@@ -189,24 +186,29 @@
     BD_FEATURES          local_lmp_features[HCI_EXT_FEATURES_PAGE_MAX + 1];
 
 #if BLE_INCLUDED == TRUE
+
+    tBTM_CMPL_CB        *p_le_test_cmd_cmpl_cb;   /* Callback function to be called when
+                                                  LE test mode command has been sent successfully */
+
     BD_ADDR                 read_tx_pwr_addr;   /* read TX power target address     */
     BD_FEATURES             local_le_features;  /* Local LE Supported features mask for the device */
 
     tBTM_BLE_LOCAL_ID_KEYS  id_keys;        /* local BLE ID keys                    */
     BT_OCTET16              er;             /* BLE encryption key                   */
 
+#define BTM_LE_SUPPORT_STATE_SIZE   8
+UINT8                   le_supported_states[BTM_LE_SUPPORT_STATE_SIZE];
+
+
+
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
     BOOLEAN                 no_disc_if_pair_fail;
-    BOOLEAN			        enable_test_mac_val;
+    BOOLEAN                 enable_test_mac_val;
     BT_OCTET8               test_mac;
-    BOOLEAN			        enable_test_local_sign_cntr;
-    UINT32			        test_local_sign_cntr;
+    BOOLEAN                 enable_test_local_sign_cntr;
+    UINT32                  test_local_sign_cntr;
 #endif
 
-#if BLE_INCLUDED == TRUE
-    tBTM_CMPL_CB        *p_le_test_cmd_cmpl_cb;   /* Callback function to be called when
-                                                  LE test mode command has been sent successfully */
-#endif
 
 #endif  /* BLE_INCLUDED */
 
@@ -216,8 +218,9 @@
 
     UINT8                state;
     tBTM_IO_CAP          loc_io_caps;       /* IO capability of the local device */
-    BOOLEAN              loc_auth_req;      /* the auth_req flag  */
+    tBTM_AUTH_REQ        loc_auth_req;      /* the auth_req flag  */
     BD_FEATURES          brcm_features;     /* Broadcom specific features bit mask  */
+#define BTM_RELOAD_LE_HOST_FEATURE      0x10
 
 #define BTM_RE_READ_1ST_PAGE            0x01            /* Set it if you set at least one of "..._HOST_MAY_SUPP_..." bits */
 #define BTM_HOST_MAY_SUPP_SSP           0x02
@@ -504,13 +507,16 @@
     tBLE_ADDR_TYPE      ble_addr_type;  /* LE device type: public or random address */
     tBLE_ADDR_TYPE      static_addr_type;   /* static address type */
     BD_ADDR             static_addr;    /* static address */
-#if BTM_BLE_PRIVACY_SPT == TRUE
+#if BLE_PRIVACY_SPT == TRUE
     BD_ADDR             cur_rand_addr;  /* current random address */
 
 #define BTM_BLE_ADDR_PSEUDO         0   /* address index device record */
 #define BTM_BLE_ADDR_RRA            1   /* cur_rand_addr */
-#define BTM_BLE_ADDR_STATIC         2   /* static_addr  */
+#define BTM_BLE_ADDR_RECONN         2   /* reconnection address */
+#define BTM_BLE_ADDR_STATIC         3   /* static_addr  */
     UINT8               active_addr_type;
+
+    BOOLEAN             privacy_enabled;   /* remote device privacy enabled or not */
 #endif
 
 #if SMP_INCLUDED == TRUE
@@ -519,6 +525,7 @@
 #endif
 } tBTM_SEC_BLE;
 
+
 #endif  /* BLE_INCLUDED */
 
 /*
@@ -546,8 +553,14 @@
 #define BTM_SEC_LINK_KEY_AUTHED 0x20
 #define BTM_SEC_ROLE_SWITCHED   0x40
 #define BTM_SEC_IN_USE          0x80
+    /* LE link security flag */
+#define BTM_SEC_LE_AUTHENTICATED   0x0200       /* 0x0200 */
+#define BTM_SEC_LE_ENCRYPTED       0x0400      /* 0x04 */
+#define BTM_SEC_LE_NAME_KNOWN      0x0800
+#define BTM_SEC_LE_LINK_KEY_KNOWN  0x1000       /* 0x10 */
+#define BTM_SEC_LE_LINK_KEY_AUTHED 0x2000
 
-    UINT8           sec_flags;          /* Current device security state      */
+    UINT16           sec_flags;          /* Current device security state      */
 
     tBTM_BD_NAME    sec_bd_name;        /* User friendly name of the device. (may be truncated to save space in dev_rec table) */
     BD_FEATURES     features[HCI_EXT_FEATURES_PAGE_MAX + 1];           /* Features supported by the device */
@@ -586,9 +599,10 @@
 #define BTM_SM4_CONN_PEND   0x40        /* set this bit to indicate accepting acl conn; to be cleared on btm_acl_created */
     UINT8       sm4;                    /* BTM_SM4_TRUE, if the peer supports SM4 */
     tBTM_IO_CAP rmt_io_caps;            /* IO capability of the peer device */
-    BOOLEAN     rmt_auth_req;           /* the auth_req flag as in the IO caps rsp evt */
+    tBTM_AUTH_REQ rmt_auth_req;         /* the auth_req flag as in the IO caps rsp evt */
 
 #if (BLE_INCLUDED == TRUE)
+    UINT16              ble_hci_handle;         /* use in DUMO connection */
     UINT8               enc_key_size;           /* current link encryption key size */
     tBTM_SEC_BLE        ble;
     tBT_DEVICE_TYPE     device_type;
@@ -612,6 +626,7 @@
 #define BTM_SEC_IS_SM4_LEGACY(sm) ((BOOLEAN)(BTM_SM4_KNOWN == ((sm)&BTM_SM4_TRUE)))
 #define BTM_SEC_IS_SM4_UNKNOWN(sm) ((BOOLEAN)(BTM_SM4_UNKNOWN == ((sm)&BTM_SM4_TRUE)))
 
+#define BTM_SEC_LE_MASK    (BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED|BTM_SEC_LE_LINK_KEY_KNOWN|BTM_SEC_LE_LINK_KEY_AUTHED)
 
 /*
 ** Define device configuration structure
@@ -726,11 +741,13 @@
 
 #define BTM_PAIR_FLAGS_WE_STARTED_DD    0x01    /* We want to do dedicated bonding              */
 #define BTM_PAIR_FLAGS_PEER_STARTED_DD  0x02    /* Peer initiated dedicated bonding             */
-#define BTM_PAIR_FLAGS_DISC_WHEN_DONE   0x04
+#define BTM_PAIR_FLAGS_DISC_WHEN_DONE   0x04    /* Disconnect when done     */
 #define BTM_PAIR_FLAGS_PIN_REQD         0x08    /* set this bit when pin_callback is called     */
 #define BTM_PAIR_FLAGS_PRE_FETCH_PIN    0x10    /* set this bit when pre-fetch pin     */
 #define BTM_PAIR_FLAGS_REJECTED_CONNECT 0x20    /* set this bit when rejected incoming connection  */
 #define BTM_PAIR_FLAGS_WE_CANCEL_DD     0x40    /* set this bit when cancelling a bonding procedure */
+#define BTM_PAIR_FLAGS_LE_ACTIVE        0x80    /* use this bit when SMP pairing is active */
+
 
 typedef struct
 {
@@ -827,6 +844,7 @@
     BT_OCTET8               enc_rand;   /* received rand value from LTK request*/
     UINT16                  ediv;       /* received ediv value from LTK request */
     UINT8                   key_size;
+    tBTM_BLE_VSC_CB         cmn_ble_vsc_cb;
 #endif
 
                                             /* Packet types supported by the local device */
@@ -918,9 +936,6 @@
     tBTM_PCM2_ACTION        pcm2_action;
 #endif
 
-    BD_ADDR previous_connected_remote_addr[BTM_ROLE_DEVICE_NUM];
-    UINT8   previous_connected_role[BTM_ROLE_DEVICE_NUM];
-    UINT8   front; /* front index of the role table */
 } tBTM_CB;
 
 
@@ -975,8 +990,8 @@
 extern void         btm_acl_init (void);
 extern void         btm_acl_timeout (TIMER_LIST_ENT  *p_tle);
 extern void         btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
-                                     UINT16 hci_handle, UINT8 link_role, UINT8 is_le_link);
-extern void         btm_acl_removed (BD_ADDR bda);
+                                     UINT16 hci_handle, UINT8 link_role, tBT_TRANSPORT transport);
+extern void         btm_acl_removed (BD_ADDR bda, tBT_TRANSPORT transport);
 extern void         btm_acl_device_down (void);
 extern void         btm_acl_update_busy_level (tBTM_BLI_EVENT event);
 extern void         btm_acl_link_key_change (UINT16 handle, UINT8 status);
@@ -995,17 +1010,19 @@
 extern void         btm_acl_role_changed (UINT8 hci_status, BD_ADDR bd_addr, UINT8 new_role);
 extern void         btm_acl_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable);
 BTM_API extern UINT16       btm_get_acl_disc_reason_code (void);
-BTM_API extern tBTM_STATUS  btm_remove_acl (BD_ADDR bd_addr);
+BTM_API extern tBTM_STATUS  btm_remove_acl (BD_ADDR bd_addr, tBT_TRANSPORT transport);
 extern void         btm_read_remote_features_complete (UINT8 *p);
 extern void         btm_read_remote_ext_features_complete (UINT8 *p);
 extern void         btm_read_remote_ext_features_failed (UINT8 status, UINT16 handle);
 extern void         btm_read_remote_version_complete (UINT8 *p);
+extern void         btm_establish_continue (tACL_CONN *p_acl_cb);
+
 // btla-specific ++
 extern void         btm_acl_chk_peer_pkt_type_support (tACL_CONN *p, UINT16 *p_pkt_type);
 // btla-specific --
 /* Read maximum data packet that can be sent over current connection */
 extern UINT16 btm_get_max_packet_size (BD_ADDR addr);
-extern tACL_CONN *btm_bda_to_acl (BD_ADDR bda);
+extern tACL_CONN *btm_bda_to_acl (BD_ADDR bda, tBT_TRANSPORT transport);
 extern BOOLEAN    btm_acl_notif_conn_collision (BD_ADDR bda);
 
 #if BTM_PWR_MGR_INCLUDED == FALSE
@@ -1139,7 +1156,7 @@
 extern void  btm_sec_link_key_request (UINT8 *p_bda);
 extern void  btm_sec_pin_code_request (UINT8 *p_bda);
 extern void  btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset);
-extern void  btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res);
+extern void  btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_trasnport);
 
 #if BLE_INCLUDED == TRUE
 extern void  btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec);
diff --git a/stack/btm/btm_main.c b/stack/btm/btm_main.c
index 869899d..f3037f6 100644
--- a/stack/btm/btm_main.c
+++ b/stack/btm/btm_main.c
@@ -48,7 +48,6 @@
 *******************************************************************************/
 void btm_init (void)
 {
-    UINT8 i;
     /* All fields are cleared; nonzero fields are reinitialized in appropriate function */
     memset(&btm_cb, 0, sizeof(tBTM_CB));
 
@@ -57,9 +56,6 @@
 #else
     btm_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
 #endif
-    for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
-        btm_cb.previous_connected_role[i] = BTM_ROLE_UNDEFINED;
-    }
     /* Initialize BTM component structures */
     btm_inq_db_init();                  /* Inquiry Database and Structures */
     btm_acl_init();                     /* ACL Database and Structures */
diff --git a/stack/btm/btm_pm.c b/stack/btm/btm_pm.c
index 02e3a6a..76bfc04 100644
--- a/stack/btm/btm_pm.c
+++ b/stack/btm/btm_pm.c
@@ -197,7 +197,7 @@
     if(p_mode == NULL)
         return BTM_ILLEGAL_VALUE;
 
-    BTM_TRACE_API3( "BTM_SetPowerMode: pm_id %d BDA: %08x mode:0x%x", pm_id,
+    BTM_TRACE_API( "BTM_SetPowerMode: pm_id %d BDA: %08x mode:0x%x", pm_id,
                    (remote_bda[2]<<24)+(remote_bda[3]<<16)+(remote_bda[4]<<8)+remote_bda[5], p_mode->mode);
 
     /* take out the force bit */
@@ -225,7 +225,7 @@
             ((p_mode->mode & BTM_PM_MD_FORCE) && (p_mode->max >= p_cb->interval) && (p_mode->min <= p_cb->interval)) ||
             ((p_mode->mode & BTM_PM_MD_FORCE)==0 && (p_mode->max >= p_cb->interval)) )
         {
-            BTM_TRACE_DEBUG4( "BTM_SetPowerMode: mode:0x%x interval %d max:%d, min:%d", p_mode->mode, p_cb->interval, p_mode->max, p_mode->min);
+            BTM_TRACE_DEBUG( "BTM_SetPowerMode: mode:0x%x interval %d max:%d, min:%d", p_mode->mode, p_cb->interval, p_mode->max, p_mode->min);
             return BTM_SUCCESS;
         }
     }
@@ -240,7 +240,7 @@
        || ((pm_id == BTM_PM_SET_ONLY_ID) && (btm_cb.pm_pend_link != MAX_L2CAP_LINKS)) )
     {
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind,temp_pm_id);
+    BTM_TRACE_DEBUG( "BTM_SetPowerMode: Saving cmd acl_ind %d temp_pm_id %d", acl_ind,temp_pm_id);
 #endif
         /* Make sure mask is set to BTM_PM_REG_SET */
         btm_cb.pm_reg_db[temp_pm_id].mask |= BTM_PM_REG_SET;
@@ -249,7 +249,7 @@
     }
 
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2( "btm_pm state:0x%x, pm_pend_link: %d", p_cb->state, btm_cb.pm_pend_link);
+    BTM_TRACE_DEBUG( "btm_pm state:0x%x, pm_pend_link: %d", p_cb->state, btm_cb.pm_pend_link);
 #endif
     /* if mode == hold or pending, return */
     if( (p_cb->state == BTM_PM_STS_HOLD) ||
@@ -260,7 +260,7 @@
         {
             /* set the stored mask */
             p_cb->state |= BTM_PM_STORED_MASK;
-            BTM_TRACE_DEBUG1( "btm_pm state stored:%d",acl_ind);
+            BTM_TRACE_DEBUG( "btm_pm state stored:%d",acl_ind);
         }
         return BTM_CMD_STORED;
     }
@@ -399,7 +399,7 @@
     memset (p_db, 0, sizeof(tBTM_PM_MCB));
     p_db->state = BTM_PM_ST_ACTIVE;
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2( "btm_pm_sm_alloc ind:%d st:%d", ind, p_db->state);
+    BTM_TRACE_DEBUG( "btm_pm_sm_alloc ind:%d st:%d", ind, p_db->state);
 #endif
 }
 
@@ -420,10 +420,14 @@
 
     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++)
     {
-        if ((p->in_use) && (!memcmp (p->remote_addr, remote_bda, BD_ADDR_LEN)))
+        if ((p->in_use) && (!memcmp (p->remote_addr, remote_bda, BD_ADDR_LEN))
+#if (BLE_INCLUDED == TRUE)
+            && p->transport == BT_TRANSPORT_BR_EDR
+#endif
+            )
         {
 #if BTM_PM_DEBUG == TRUE
-            BTM_TRACE_DEBUG2( "btm_pm_find_acl_ind ind:%d, st:%d", xx, btm_cb.pm_mode_db[xx].state);
+            BTM_TRACE_DEBUG( "btm_pm_find_acl_ind ind:%d, st:%d", xx, btm_cb.pm_mode_db[xx].state);
 #endif
             break;
         }
@@ -587,7 +591,7 @@
     md_res.mode = mode;
 
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2( "btm_pm_snd_md_req link_ind:%d, mode: %d",
+    BTM_TRACE_DEBUG( "btm_pm_snd_md_req link_ind:%d, mode: %d",
         link_ind, mode);
 #endif
 
@@ -623,7 +627,7 @@
     btm_cb.pm_pend_id   = pm_id;
 
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2("btm_pm_snd_md_req state:0x%x, link_ind: %d", p_cb->state, link_ind);
+    BTM_TRACE_DEBUG("btm_pm_snd_md_req state:0x%x, link_ind: %d", p_cb->state, link_ind);
 #endif
     switch(md_res.mode)
     {
@@ -681,7 +685,7 @@
     {
         /* the command was not sent */
 #if BTM_PM_DEBUG == TRUE
-        BTM_TRACE_DEBUG1( "pm_pend_link: %d",btm_cb.pm_pend_link);
+        BTM_TRACE_DEBUG( "pm_pend_link: %d",btm_cb.pm_pend_link);
 #endif
         return (BTM_NO_RESOURCES);
     }
@@ -708,7 +712,7 @@
         if(btm_cb.pm_mode_db[xx].state & BTM_PM_STORED_MASK)
         {
             btm_cb.pm_mode_db[xx].state &= ~BTM_PM_STORED_MASK;
-            BTM_TRACE_DEBUG1( "btm_pm_check_stored :%d", xx);
+            BTM_TRACE_DEBUG( "btm_pm_check_stored :%d", xx);
             btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, xx, NULL);
             break;
         }
@@ -743,7 +747,7 @@
         p_cb->state = BTM_PM_ST_PENDING;
         pm_status = BTM_PM_STS_PENDING;
 #if BTM_PM_DEBUG == TRUE
-        BTM_TRACE_DEBUG1( "btm_pm_proc_cmd_status new state:0x%x", p_cb->state);
+        BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status new state:0x%x", p_cb->state);
 #endif
     }
     else /* the command was not successfull. Stay in the same state */
@@ -760,7 +764,7 @@
 
     /* no pending cmd now */
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG3( "btm_pm_proc_cmd_status state:0x%x, pm_pend_link: %d(new: %d)",
+    BTM_TRACE_DEBUG( "btm_pm_proc_cmd_status state:0x%x, pm_pend_link: %d(new: %d)",
         p_cb->state, btm_cb.pm_pend_link, MAX_L2CAP_LINKS);
 #endif
     btm_cb.pm_pend_link = MAX_L2CAP_LINKS;
@@ -803,7 +807,7 @@
         {
             if(p->restore_pkt_types)
     {
-        BTM_TRACE_DEBUG3("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x/0x%02x",
+        BTM_TRACE_DEBUG("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x/0x%02x",
                             hci_handle, p->pkt_types_mask, p->restore_pkt_types);
         p->pkt_types_mask = p->restore_pkt_types;
         p->restore_pkt_types = 0;   /* Only exists while SCO is active */
@@ -812,7 +816,7 @@
 #if (BTM_PM_SNIFF_SLOT_WORK_AROUND == TRUE)
             else
             {
-                BTM_TRACE_DEBUG2("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x",
+                BTM_TRACE_DEBUG("btm mode change AFTER unsniffing; hci hdl 0x%x, types 0x%02x",
                                     hci_handle, btm_cb.btm_acl_pkt_types_supported);
                 btm_set_packet_types (p, btm_cb.btm_acl_pkt_types_supported);
             }
@@ -833,7 +837,7 @@
 #if (BTM_PM_SNIFF_SLOT_WORK_AROUND == TRUE)
     else if (mode == HCI_MODE_SNIFF)
     {
-        BTM_TRACE_DEBUG1("btm mode change to sniff; hci hdl 0x%x use single slot",
+        BTM_TRACE_DEBUG("btm mode change to sniff; hci hdl 0x%x use single slot",
                             hci_handle);
         btm_set_packet_types (p, (HCI_PKT_TYPES_MASK_DM1 | HCI_PKT_TYPES_MASK_DH1));
     }
@@ -845,18 +849,18 @@
     p_cb->state     = mode;
     p_cb->interval  = interval;
 #if BTM_PM_DEBUG == TRUE
-    BTM_TRACE_DEBUG2( "btm_pm_proc_mode_change new state:0x%x (old:0x%x)", p_cb->state, old_state);
+    BTM_TRACE_DEBUG( "btm_pm_proc_mode_change new state:0x%x (old:0x%x)", p_cb->state, old_state);
 #endif
 
-    if ((p_cb->state == HCI_MODE_ACTIVE) &&
-        ((p_lcb = l2cu_find_lcb_by_bd_addr (p->remote_addr)) != NULL))
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr(p->remote_addr, BT_TRANSPORT_BR_EDR)) != NULL)
     {
-        /* There might be any pending packets due to SNIFF or PENDING state */
-        /* Trigger L2C to start transmission of the pending packets.        */
-        BTM_TRACE_DEBUG0 ("btm mode change to active; check l2c_link for outgoing packets");
-        l2c_link_check_send_pkts (p_lcb, NULL, NULL);
-
-        //btu_stop_timer (&p_lcb->timer_entry);
+        if ((p_cb->state == BTM_PM_ST_ACTIVE) || (p_cb->state == BTM_PM_ST_SNIFF))
+        {
+            /* There might be any pending packets due to SNIFF or PENDING state */
+            /* Trigger L2C to start transmission of the pending packets. */
+            BTM_TRACE_DEBUG("btm mode change to active; check l2c_link for outgoing packets");
+            l2c_link_check_send_pkts(p_lcb, NULL, NULL);
+        }
     }
 
     /* notify registered parties */
@@ -871,7 +875,7 @@
     if(old_state & BTM_PM_STORED_MASK)
     {
 #if BTM_PM_DEBUG == TRUE
-        BTM_TRACE_DEBUG1( "btm_pm_proc_mode_change: Sending stored req:%d", xx);
+        BTM_TRACE_DEBUG( "btm_pm_proc_mode_change: Sending stored req:%d", xx);
 #endif
         btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, xx, NULL);
     }
@@ -882,7 +886,7 @@
             if(btm_cb.pm_mode_db[zz].chg_ind == TRUE)
             {
 #if BTM_PM_DEBUG == TRUE
-                BTM_TRACE_DEBUG1( "btm_pm_proc_mode_change: Sending PM req :%d", zz);
+                BTM_TRACE_DEBUG( "btm_pm_proc_mode_change: Sending PM req :%d", zz);
 #endif
                 btm_pm_snd_md_req(BTM_PM_SET_ONLY_ID, zz, NULL);
                 break;
@@ -955,7 +959,9 @@
         }
     }
 }
+
 #endif
+
 #else /* BTM_PWR_MGR_INCLUDED == TRUE */
 
 /*******************************************************************************
@@ -984,6 +990,7 @@
 
 #endif
 
+
 /*******************************************************************************
 **
 ** Function         BTM_IsPowerManagerOn
@@ -998,3 +1005,88 @@
 {
     return BTM_PWR_MGR_INCLUDED;
 }
+
+/*******************************************************************************
+**
+** Function         btm_pm_device_in_active_or_sniff_mode
+**
+** Description      This function is called to check if in active or sniff mode
+**
+** Returns          TRUE, if in active or sniff mode
+**
+*******************************************************************************/
+BOOLEAN btm_pm_device_in_active_or_sniff_mode(void)
+{
+    /* The active state is the highest state-includes connected device and sniff mode*/
+
+    /* Covers active and sniff modes */
+    if (btm_cb.num_acl > 0)
+    {
+        BTM_TRACE_DEBUG("btm_pm_device_in_active_or_sniff_mode-acl:%d", btm_cb.num_acl);
+        return TRUE;
+    }
+
+#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
+    /* Check BLE states */
+    if (btm_ble_get_conn_st() != BLE_CONN_IDLE)
+    {
+        BTM_TRACE_DEBUG("btm_pm_device_in_active_or_sniff_mode- BLE state: %x",
+                        btm_ble_get_conn_st());
+        return TRUE;
+    }
+#endif
+
+    return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         btm_pm_device_in_scan_state
+**
+** Description      This function is called to check if in paging, inquiry or connecting mode
+**
+** Returns          TRUE, if in paging, inquiry or connecting mode
+**
+*******************************************************************************/
+BOOLEAN btm_pm_device_in_scan_state(void)
+{
+    /* Scan state-paging, inquiry, and trying to connect */
+
+    /* Check for paging */
+    if (btm_cb.is_paging || btm_cb.page_queue.count > 0 ||
+       BTM_BL_PAGING_STARTED == btm_cb.busy_level)
+    {
+       BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- paging");
+       return TRUE;
+    }
+
+    /* Check for inquiry */
+    if ((btm_cb.btm_inq_vars.inq_active & (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK)) != 0)
+    {
+        BTM_TRACE_DEBUG("btm_pm_device_in_scan_state- Inq active");
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*******************************************************************************
+**
+** Function         BTM_PM_ReadControllerState
+**
+** Description      This function is called to obtain the controller state
+**
+** Returns          Controller State-BTM_CONTRL_ACTIVE, BTM_CONTRL_SCAN, and BTM_CONTRL_IDLE
+**
+*******************************************************************************/
+tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void)
+{
+    if (TRUE == btm_pm_device_in_active_or_sniff_mode())
+       return BTM_CONTRL_ACTIVE;
+    else
+    if (TRUE == btm_pm_device_in_scan_state())
+       return BTM_CONTRL_SCAN;
+    else
+       return BTM_CONTRL_IDLE;
+}
+
diff --git a/stack/btm/btm_sco.c b/stack/btm/btm_sco.c
index 2200b71..d9d0fbc 100644
--- a/stack/btm/btm_sco.c
+++ b/stack/btm/btm_sco.c
@@ -162,14 +162,14 @@
         {
             if (!btsnd_hcic_reject_conn (bda, hci_status))
             {
-                BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
+                BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!");
             }
         }
         else
         {
             if (!btsnd_hcic_reject_esco_conn (bda, hci_status))
             {
-                BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
+                BTM_TRACE_ERROR("Could not reject (e)SCO conn: No Buffer!!!");
             }
         }
     }
@@ -225,7 +225,7 @@
             }
             else
             {
-                BTM_TRACE_ERROR0("Could not accept SCO conn: No Buffer!!!");
+                BTM_TRACE_ERROR("Could not accept SCO conn: No Buffer!!!");
             }
         }
         else    /* Controller is version 1.1 or earlier */
@@ -260,7 +260,7 @@
         p_buf = NULL;
 
 #if BTM_SCO_HCI_DEBUG
-        BTM_TRACE_DEBUG1 ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count );
+        BTM_TRACE_DEBUG ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count );
 #endif
         p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_data_q);
 
@@ -347,7 +347,7 @@
         /* Ensure we have enough space in the buffer for the SCO and HCI headers */
         if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE)
         {
-            BTM_TRACE_ERROR1 ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset);
+            BTM_TRACE_ERROR ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset);
             GKI_freebuf (p_buf);
             status = BTM_ILLEGAL_VALUE;
         }
@@ -379,7 +379,7 @@
     {
         GKI_freebuf(p_buf);
 
-        BTM_TRACE_WARNING2 ("BTM_WriteScoData, invalid sco index: %d at state [%d]",
+        BTM_TRACE_WARNING ("BTM_WriteScoData, invalid sco index: %d at state [%d]",
             sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state);
         status = BTM_UNKNOWN_ADDR;
     }
@@ -437,21 +437,21 @@
             if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
             {
 
-                BTM_TRACE_WARNING0("BTM Remote does not support 2-EDR eSCO");
+                BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO");
                 temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 |
                                    HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5);
             }
             if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
             {
 
-                BTM_TRACE_WARNING0("BTM Remote does not support 3-EDR eSCO");
+                BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO");
                 temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 |
                                    HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5);
             }
         }
 
 
-        BTM_TRACE_API6("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
+        BTM_TRACE_API("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
             p_setup->tx_bw, p_setup->rx_bw,
             p_setup->max_latency, p_setup->voice_contfmt,
             p_setup->retrans_effort, temp_pkt_types);
@@ -505,7 +505,7 @@
 
     if (sco_inx >= BTM_MAX_SCO_LINKS)
     {
-        BTM_TRACE_ERROR1("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx);
+        BTM_TRACE_ERROR("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx);
         return;
     }
 
@@ -515,7 +515,7 @@
     p_sco->p_disc_cb = p_disc_cb;
     p_sco->esco.data.link_type = BTM_LINK_TYPE_ESCO; /* Accept with all supported types */
 
-    BTM_TRACE_DEBUG1("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types);
+    BTM_TRACE_DEBUG("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types);
 
     btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup);
 #else
@@ -582,7 +582,7 @@
     /* If originating, ensure that there is an ACL connection to the BD Address */
     if (is_orig)
     {
-        if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda)) == 0xFFFF))
+        if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF))
             return (BTM_UNKNOWN_ADDR);
     }
 
@@ -682,10 +682,10 @@
                 {
                     /* If role change is in progress, do not proceed with SCO setup
                      * Wait till role change is complete */
-                    p_acl = btm_bda_to_acl(remote_bda);
+                    p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR);
                     if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
                     {
-                        BTM_TRACE_API1("Role Change is in progress for ACL handle 0x%04x",acl_handle);
+                        BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x",acl_handle);
                         p->state = SCO_ST_PEND_ROLECHANGE;
 
                     }
@@ -696,7 +696,7 @@
             {
                 if (is_orig)
                 {
-                    BTM_TRACE_API2("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d",
+                    BTM_TRACE_API("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d",
                                     acl_handle, btm_cb.sco_cb.desired_sco_mode);
 
                     if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED)
@@ -740,10 +740,10 @@
     for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
     {
         if ((p->state == SCO_ST_PEND_UNPARK) &&
-            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
+            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle))
 
         {
-            BTM_TRACE_API3("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x",
+            BTM_TRACE_API("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x",
                                     acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status);
 
             if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
@@ -774,10 +774,10 @@
     for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
     {
         if ((p->state == SCO_ST_PEND_ROLECHANGE) &&
-            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
+            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle))
 
         {
-            BTM_TRACE_API1("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle);
+            BTM_TRACE_API("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle);
 
             if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
                 p->state = SCO_ST_CONNECTING;
@@ -878,7 +878,7 @@
 
 #endif
     /* If here, no one wants the SCO connection. Reject it */
-    BTM_TRACE_WARNING0("btm_sco_conn_req: No one wants this SCO connection; rejecting it");
+    BTM_TRACE_WARNING("btm_sco_conn_req: No one wants this SCO connection; rejecting it");
     btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL);
 }
 
@@ -921,7 +921,7 @@
                     /* If role switch is pending, we need try again after role switch is complete */
                     if(hci_status == HCI_ERR_ROLE_SWITCH_PENDING)
                     {
-                        BTM_TRACE_API1("Role Change pending for HCI handle 0x%04x",hci_handle);
+                        BTM_TRACE_API("Role Change pending for HCI handle 0x%04x",hci_handle);
                         p->state = SCO_ST_PEND_ROLECHANGE;
                     }
                     /* avoid calling disconnect callback because of sco creation race */
@@ -1374,17 +1374,17 @@
             }
         }
         p_esco->desired_sco_mode = sco_mode;
-        BTM_TRACE_API1("BTM_SetEScoMode -> mode %d",  sco_mode);
+        BTM_TRACE_API("BTM_SetEScoMode -> mode %d",  sco_mode);
     }
     else
     {
         p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO;
         p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK;
         p_def->retrans_effort = 0;
-        BTM_TRACE_API0("BTM_SetEScoMode -> mode SCO (eSCO not supported)");
+        BTM_TRACE_API("BTM_SetEScoMode -> mode SCO (eSCO not supported)");
     }
 
-    BTM_TRACE_DEBUG6("    txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x",
+    BTM_TRACE_DEBUG("    txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x",
                      p_def->tx_bw, p_def->rx_bw, p_def->max_latency,
                      p_def->voice_contfmt, p_def->packet_types,
                      p_def->retrans_effort);
@@ -1451,7 +1451,7 @@
 #if (BTM_MAX_SCO_LINKS>0)
     UINT8 index;
 
-    BTM_TRACE_API1("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
+    BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
 
     if (sco_inx < BTM_MAX_SCO_LINKS &&
         btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED)
@@ -1466,7 +1466,7 @@
         {
             if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED)
             {
-                BTM_TRACE_API1("BTM_ReadEScoLinkParms the first active SCO index is %d",index);
+                BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d",index);
                 *p_parms = btm_cb.sco_cb.sco_db[index].esco.data;
                 return (BTM_SUCCESS);
             }
@@ -1475,7 +1475,7 @@
 
 #endif
 
-    BTM_TRACE_API0("BTM_ReadEScoLinkParms cannot find the SCO index!");
+    BTM_TRACE_API("BTM_ReadEScoLinkParms cannot find the SCO index!");
     memset(p_parms, 0, sizeof(tBTM_ESCO_DATA));
     return (BTM_WRONG_MODE);
 }
@@ -1522,7 +1522,7 @@
             (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK);
 
 
-        BTM_TRACE_API2("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x",
+        BTM_TRACE_API("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x",
                          p_sco->hci_handle, p_setup->packet_types);
 
         if (!btsnd_hcic_change_conn_type (p_sco->hci_handle,
@@ -1541,8 +1541,8 @@
                 (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
         }
 
-        BTM_TRACE_API1("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle);
-        BTM_TRACE_API6("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
+        BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle);
+        BTM_TRACE_API("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
                          p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency,
                          p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types);
 
@@ -1633,7 +1633,7 @@
     tBTM_CHG_ESCO_EVT_DATA   data;
     UINT16                   xx;
 
-    BTM_TRACE_EVENT2("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x",
+    BTM_TRACE_EVENT("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x",
                       handle, status);
 
     for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
diff --git a/stack/btm/btm_sec.c b/stack/btm/btm_sec.c
index 09f41b7..9d7bf5a 100644
--- a/stack/btm/btm_sec.c
+++ b/stack/btm/btm_sec.c
@@ -80,13 +80,19 @@
 static UINT8    btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
 BOOLEAN         btm_sec_are_all_trusted(UINT32 p_mask[]);
 
-static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason);
+static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
+UINT8           btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
 tBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
 
 static BOOLEAN  btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
                                             UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
                                             UINT32 mx_chan_id);
 
+static BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
+static BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
+
 /* TRUE - authenticated link key is possible */
 static const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
 {
@@ -103,6 +109,78 @@
 
 /*******************************************************************************
 **
+** Function         btm_dev_authenticated
+**
+** Description      check device is authenticated
+**
+** Returns          BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+    if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
+    {
+        return(TRUE);
+    }
+    return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function         btm_dev_encrypted
+**
+** Description      check device is encrypted
+**
+** Returns          BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+    if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
+    {
+        return(TRUE);
+    }
+    return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function         btm_dev_authorized
+**
+** Description      check device is authorized
+**
+** Returns          BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
+{
+    if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
+    {
+        return(TRUE);
+    }
+    return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function         btm_serv_trusted
+**
+** Description      check service is trusted
+**
+** Returns          BOOLEAN TRUE or FALSE
+**
+*******************************************************************************/
+static BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
+{
+    if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
+    {
+        return(TRUE);
+    }
+    return(FALSE);
+}
+
+/*******************************************************************************
+**
 ** Function         BTM_SecRegister
 **
 ** Description      Application manager calls this function to register for
@@ -118,36 +196,37 @@
     BT_OCTET16      temp_value = {0};
 #endif
 
-    BTM_TRACE_EVENT0 ("BTM_Sec: application registered");
+    BTM_TRACE_EVENT ("BTM_Sec: application registered");
 
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-    BTM_TRACE_ERROR1 ("BTM_SecRegister:p_cb_info->p_le_callback == 0x%x ", p_cb_info->p_le_callback);
-
     if (p_cb_info->p_le_callback)
     {
-#if SMP_INCLUDED == TRUE
-        BTM_TRACE_EVENT0 ("BTM_Sec: SMP_Register( btm_proc_smp_cback )");
-        SMP_Register(btm_proc_smp_cback);
-#endif
-        /* if no IR is loaded, need to regenerate all the keys */
-        if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
+        BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == 0x%x ", p_cb_info->p_le_callback);
+
+        if (p_cb_info->p_le_callback)
         {
-            btm_ble_reset_id();
+    #if SMP_INCLUDED == TRUE
+            BTM_TRACE_EVENT ("BTM_Sec: SMP_Register( btm_proc_smp_cback )");
+            SMP_Register(btm_proc_smp_cback);
+    #endif
+            /* if no IR is loaded, need to regenerate all the keys */
+            if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
+            {
+                btm_ble_reset_id();
+            }
+        }
+        else
+        {
+            BTM_TRACE_ERROR ("BTM_SecRegister:p_cb_info->p_le_callback == NULL ");
         }
     }
-    else
-    {
-        BTM_TRACE_ERROR0 ("BTM_SecRegister:p_cb_info->p_le_callback == NULL ");
-    }
 #endif
 
-
-
     btm_cb.api = *p_cb_info;
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-     BTM_TRACE_ERROR1 ("BTM_SecRegister: btm_cb.api.p_le_callback = 0x%x ", btm_cb.api.p_le_callback);
+     BTM_TRACE_ERROR ("BTM_SecRegister: btm_cb.api.p_le_callback = 0x%x ", btm_cb.api.p_le_callback);
 #endif
-    BTM_TRACE_EVENT0 ("BTM_Sec: application registered");
+    BTM_TRACE_EVENT ("BTM_Sec: application registered");
     return(TRUE);
 }
 
@@ -270,10 +349,37 @@
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
     {
-        *p_sec_flags = p_dev_rec->sec_flags;
+        *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
         return(TRUE);
     }
-    BTM_TRACE_ERROR0 ("BTM_GetSecurityFlags false");
+    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
+    return(FALSE);
+}
+
+/*******************************************************************************
+**
+** Function         BTM_GetSecurityFlagsByTransport
+**
+** Description      Get security flags for the device on a particular transport
+**
+** Returns          BOOLEAN TRUE or FALSE is device found
+**
+*******************************************************************************/
+BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
+                                                tBT_TRANSPORT transport)
+{
+    tBTM_SEC_DEV_REC *p_dev_rec;
+
+    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
+    {
+        if (transport == BT_TRANSPORT_BR_EDR)
+            *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
+        else
+            *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
+
+        return(TRUE);
+    }
+    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
     return(FALSE);
 }
 
@@ -309,7 +415,7 @@
             /* the default is enabled */
             break;
         default:
-            BTM_TRACE_ERROR1 ("BTM_SetSecurityMode: unknown mode:%d", security_mode);
+            BTM_TRACE_ERROR ("BTM_SetSecurityMode: unknown mode:%d", security_mode);
             return;
     }
     btm_cb.security_mode = security_mode;
@@ -318,7 +424,7 @@
     {
         /* Lisbon devices and only use BTM_SEC_MODE_SP */
         btm_cb.security_mode = BTM_SEC_MODE_SP;
-        BTM_TRACE_DEBUG2("BTM_SetSecurityMode: SP:%d, debug:%d", sp_mode, sp_debug_mode);
+        BTM_TRACE_DEBUG("BTM_SetSecurityMode: SP:%d, debug:%d", sp_mode, sp_debug_mode);
         btsnd_hcic_write_simple_pairing_mode(sp_mode);
         btsnd_hcic_write_simp_pair_debug_mode(sp_debug_mode);
         return;
@@ -331,7 +437,7 @@
     if ((old_mode == BTM_SEC_MODE_LINK)
         && (       security_mode != BTM_SEC_MODE_LINK))
     {
-        BTM_TRACE_DEBUG0("BTM_SetSecurityMode: Authen Enable -> FALSE");
+        BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> FALSE");
         btsnd_hcic_write_auth_enable (FALSE);
         btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_DISABLED);
     }
@@ -341,7 +447,7 @@
     if ((old_mode != BTM_SEC_MODE_LINK)
         && (       security_mode == BTM_SEC_MODE_LINK))
     {
-        BTM_TRACE_DEBUG0("BTM_SetSecurityMode: Authen Enable -> TRUE");
+        BTM_TRACE_DEBUG("BTM_SetSecurityMode: Authen Enable -> TRUE");
         btsnd_hcic_write_auth_enable (TRUE);
         btsnd_hcic_write_encr_mode (HCI_ENCRYPT_MODE_POINT_TO_POINT);
     }
@@ -359,7 +465,7 @@
 *******************************************************************************/
 void BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
 {
-    BTM_TRACE_API3 ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
+    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
                     pin_type, (char *) pin_code, pin_code_len);
 
     /* If device is not up security mode will be set as a part of startup */
@@ -390,7 +496,7 @@
 *******************************************************************************/
 void BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
 {
-    BTM_TRACE_API2 ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
+    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
 
     btm_cb.pairing_disabled    = !allow_pairing;
     btm_cb.connect_only_paired = connect_only_paired;
@@ -571,7 +677,7 @@
 
     if (!record_allocated)
     {
-        BTM_TRACE_WARNING1("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
+        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
         return(record_allocated);
     }
 
@@ -679,24 +785,24 @@
         p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
     }
 
-    BTM_TRACE_API6("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
+    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
                    index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
 
-    BTM_TRACE_API2("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
+    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
                    p_srec->security_flags, p_srec->ucd_security_flags);
 
 #if BTM_SEC_SERVICE_NAME_LEN > 0
-    BTM_TRACE_API2("               : service name [%s] (up to %d chars saved)",
+    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
                    p_name, BTM_SEC_SERVICE_NAME_LEN);
 #endif
 #else
     p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
 
-    BTM_TRACE_API6("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
+    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
                    index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
 
 #if BTM_SEC_SERVICE_NAME_LEN > 0
-    BTM_TRACE_API3("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
+    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
                    p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
 #endif
 #endif
@@ -735,7 +841,7 @@
         if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
             (!service_id || (service_id == p_srec->service_id)))
         {
-            BTM_TRACE_API2("BTM_SEC_CLR[%d]: id %d", i, service_id);
+            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
             p_srec->security_flags = 0;
 #if (L2CAP_UCD_INCLUDED == TRUE)
             p_srec->ucd_security_flags = 0;
@@ -774,12 +880,12 @@
         /* Delete services with specified name (if in use and not SDP) */
         if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
         {
-            BTM_TRACE_API2("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
+            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
             p_srec->security_flags = 0;
             num_freed++;
         }
     }
-    BTM_TRACE_API2("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
+    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
 
     return(num_freed);
 }
@@ -802,14 +908,14 @@
 
     if ((p_dev_rec = btm_find_dev (bda)) == NULL)
     {
-        BTM_TRACE_WARNING0 ("btm_sec_clr_temp_auth_service() - no dev CB");
+        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
         return;
     }
 
     /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
     if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
     {
-        BTM_TRACE_DEBUG6 ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
+        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
                     bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
 
         p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
@@ -842,7 +948,7 @@
         if ((p_srec->security_flags & BTM_SEC_IN_USE) &&
             (!service_id || (service_id == (UINT32)p_srec->service_id)))
         {
-            BTM_TRACE_API2("BTM_UCD_SEC_CLR[%d]: id %d", i, service_id);
+            BTM_TRACE_API("BTM_UCD_SEC_CLR[%d]: id %d", i, service_id);
             p_srec->ucd_security_flags = 0;
             num_cleared++;
         }
@@ -873,25 +979,25 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_API4 ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
+    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
                     btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
 
     /* If timeout already expired or has been canceled, ignore the reply */
     if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
     {
-        BTM_TRACE_WARNING1 ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
+        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
         return;
     }
 
     if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
     {
-        BTM_TRACE_ERROR0 ("BTM_PINCodeReply() - Wrong BD Addr");
+        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
         return;
     }
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
     {
-        BTM_TRACE_ERROR0 ("BTM_PINCodeReply() - no dev CB");
+        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
         return;
     }
 
@@ -942,7 +1048,7 @@
         /*  before originating  */
         if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
         {
-            BTM_TRACE_WARNING0 ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
+            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
             /* we change state little bit early so btm_sec_connected() will originate connection */
             /*   when existing ACL link is down completely */
             btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
@@ -950,7 +1056,7 @@
         /* if we already accepted incoming connection from pairing device */
         else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
         {
-            BTM_TRACE_WARNING0 ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
+            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
             btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
         }
         else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
@@ -958,7 +1064,8 @@
             btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
             p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
 
-            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
+            if (btm_cb.api.p_auth_complete_callback)
+                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
                                                     p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
         }
         return;
@@ -968,7 +1075,7 @@
     btm_cb.acl_disc_reason = HCI_SUCCESS;
 
 #ifdef PORCHE_PAIRING_CONFLICT
-    BTM_TRACE_EVENT2("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
+    BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len);
     /* if this was not pre-fetched, save the PIN */
     if (btm_cb.pin_code_len == 0)
         memcpy (btm_cb.pin_code, p_pin, pin_len);
@@ -995,12 +1102,12 @@
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
     {
-        BTM_TRACE_WARNING6 ("Security Manager: Attempting Authorization of Unknown Device Address [%02x%02x%02x%02x%02x%02x]",
+        BTM_TRACE_WARNING ("Security Manager: Attempting Authorization of Unknown Device Address [%02x%02x%02x%02x%02x%02x]",
                             bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
         return;
     }
 
-    BTM_TRACE_EVENT4 ("Security Manager: authorized status:%d State:%d Trusted:%08x %08x",
+    BTM_TRACE_EVENT ("Security Manager: authorized status:%d State:%d Trusted:%08x %08x",
                       res, (p_dev_rec) ? p_dev_rec->sec_state : 0, trusted_mask[0], trusted_mask[1]);
 
     if (res == BTM_SUCCESS)
@@ -1015,7 +1122,7 @@
         by another multiplexer layer */
         if (!p_dev_rec->is_originator)
         {
-            BTM_TRACE_DEBUG1("BTM_DeviceAuthorized: Setting last_author_service_id to %d",
+            BTM_TRACE_DEBUG("BTM_DeviceAuthorized: Setting last_author_service_id to %d",
                              p_dev_rec->p_cur_service->service_id);
             p_dev_rec->last_author_service_id = p_dev_rec->p_cur_service->service_id;
         }
@@ -1028,25 +1135,21 @@
 
     if (res != BTM_SUCCESS)
     {
-        btm_sec_dev_rec_cback_event (p_dev_rec, res);
+        btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
         return;
     }
 
     if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
     {
-        btm_sec_dev_rec_cback_event (p_dev_rec, res);
+        btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
     }
 }
 
-
-
 /*******************************************************************************
 **
-** Function         BTM_SecBond
+** Function         btm_sec_bond_by_transport
 **
-** Description      This function is called to perform bonding with peer device.
-**                  If the connection is already up, but not secure, pairing
-**                  is attempted.  If already paired BTM_SUCCESS is returned.
+** Description      this is the bond function that will start either SSP or SMP.
 **
 ** Parameters:      bd_addr      - Address of the device to bond
 **                  pin_len      - length in bytes of the PIN Code
@@ -1055,35 +1158,45 @@
 **
 **  Note: After 2.1 parameters are not used and preserved here not to change API
 *******************************************************************************/
-tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+tBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
     tBTM_STATUS      status;
     UINT8            *p_features;
     UINT8            ii;
-
-    BTM_TRACE_API6 ("BTM_SecBond BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
+    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
                     bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
 
+    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
+
+
     /* Other security process is in progress */
     if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
     {
-        BTM_TRACE_ERROR1 ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
+        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
         return(BTM_WRONG_MODE);
     }
 
     if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
     {
         return(BTM_NO_RESOURCES);
-        }
+    }
 
-    BTM_TRACE_DEBUG1 ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
+    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
 
     /* Finished if connection is active and already paired */
-    if ( (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
-         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) )
+    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
+         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
+#if (BLE_INCLUDED == TRUE)
+        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
+         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
+#endif
+
+         )
     {
-        BTM_TRACE_WARNING0("BTM_SecBond -> Already Paired");
+        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
         return(BTM_SUCCESS);
     }
 
@@ -1107,26 +1220,29 @@
     if (trusted_mask)
         BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
 
+#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
+    if (transport == BT_TRANSPORT_LE)
+    {
+        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
+
+        if (SMP_Pair(bd_addr) == SMP_STARTED)
+        {
+            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
+            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
+            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
+            return BTM_CMD_STARTED;
+        }
+
+        btm_cb.pairing_flags = 0;
+        return(BTM_NO_RESOURCES);
+    }
+#endif
+
     p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
                                   | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
 
 
-#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-    /* LE device, do SMP pairing */
-    if (BTM_UseLeLink(bd_addr))
-    {
-        if (SMP_Pair(bd_addr) == SMP_STARTED)
-        {
-            btm_cb.pairing_state = BTM_PAIR_STATE_WAIT_AUTH_COMPLETE;
-            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
-            return BTM_CMD_STARTED;
-        }
-        else
-            return(BTM_NO_RESOURCES);
-    }
-#endif
-
-    BTM_TRACE_DEBUG1 ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
+    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
     if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
     {
         /* The special case when we authenticate keyboard.  Set pin type to fixed */
@@ -1144,20 +1260,20 @@
     for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
     {
         p_features = p_dev_rec->features[ii];
-        BTM_TRACE_EVENT5("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
+        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
                          ii, p_features[0], p_features[1], p_features[2], p_features[3]);
-        BTM_TRACE_EVENT4("                              %02x-%02x-%02x-%02x",
+        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
                              p_features[4], p_features[5], p_features[6], p_features[7]);
     }
 
-    BTM_TRACE_EVENT2 ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
+    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
 
 #if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
     p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
 #endif
 
     /* If connection already exists... */
-    if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
+    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
     {
         if (!btm_sec_start_authentication (p_dev_rec))
             return(BTM_NO_RESOURCES);
@@ -1169,7 +1285,7 @@
         return(BTM_CMD_STARTED);
     }
 
-    BTM_TRACE_DEBUG2 ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
+    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
     if (!HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])
         || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
     {
@@ -1185,14 +1301,15 @@
              * -> RNR (to learn if peer is 2.1)
              * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
             btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
-            BTM_ReadRemoteDeviceName(bd_addr, NULL);
+            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
         }
         else
         {
             /* We are accepting connection request from peer */
             btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
         }
-        BTM_TRACE_DEBUG3 ("State:%s sm4: 0x%x sec_state:%d", btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
+        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
+            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
         return BTM_CMD_STARTED;
     }
 
@@ -1207,7 +1324,64 @@
     return status;
 }
 
+/*******************************************************************************
+**
+** Function         BTM_SecBondByTransport
+**
+** Description      This function is called to perform bonding with peer device.
+**                  If the connection is already up, but not secure, pairing
+**                  is attempted.  If already paired BTM_SUCCESS is returned.
+**
+** Parameters:      bd_addr      - Address of the device to bond
+**                  transport    - doing SSP over BR/EDR or SMP over LE
+**                  pin_len      - length in bytes of the PIN Code
+**                  p_pin        - pointer to array with the PIN Code
+**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
+**  Note: After 2.1 parameters are not used and preserved here not to change API
+*******************************************************************************/
+tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+{
+#if SMP_INCLUDED == TRUE
+    tBT_DEVICE_TYPE     dev_type;
+    tBLE_ADDR_TYPE      addr_type;
 
+    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
+    /* LE device, do SMP pairing */
+    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
+        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
+    {
+        return BTM_ILLEGAL_ACTION;
+    }
+#endif
+    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
+}
+
+/*******************************************************************************
+**
+** Function         BTM_SecBond
+**
+** Description      This function is called to perform bonding with peer device.
+**                  If the connection is already up, but not secure, pairing
+**                  is attempted.  If already paired BTM_SUCCESS is returned.
+**
+** Parameters:      bd_addr      - Address of the device to bond
+**                  pin_len      - length in bytes of the PIN Code
+**                  p_pin        - pointer to array with the PIN Code
+**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
+**  Note: After 2.1 parameters are not used and preserved here not to change API
+*******************************************************************************/
+tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
+{
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
+#if BLE_INCLUDED == TRUE
+    if (BTM_UseLeLink(bd_addr))
+        transport = BT_TRANSPORT_LE;
+#endif
+    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
+}
 /*******************************************************************************
 **
 ** Function         BTM_SecBondCancel
@@ -1216,16 +1390,14 @@
 **                  with peer device.
 **
 ** Parameters:      bd_addr      - Address of the peer device
+**                         transport    - FALSE for BR/EDR link; TRUE for LE link
 **
 *******************************************************************************/
 tBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
-#if SMP_INCLUDED == TRUE
-    tACL_CONN   *p=NULL;
-#endif
 
-    BTM_TRACE_API2 ("BTM_SecBondCancel()  State: %s flags:0x%x",
+    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
                     btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
 
     if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
@@ -1233,23 +1405,21 @@
         return BTM_UNKNOWN_ADDR;
 
 #if SMP_INCLUDED == TRUE
-    p = btm_bda_to_acl(bd_addr);
-    if (p && p->is_le_link &&
-        (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING))
+    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
     {
-        BTM_TRACE_DEBUG0 ("Cancel LE pairing");
-        if (SMP_PairCancel(bd_addr))
+        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
         {
-            return BTM_CMD_STARTED;
+            BTM_TRACE_DEBUG ("Cancel LE pairing");
+            if (SMP_PairCancel(bd_addr))
+            {
+                return BTM_CMD_STARTED;
+            }
         }
-        else
-        {
-            return BTM_WRONG_MODE;
-        }
+        return BTM_WRONG_MODE;
     }
 
 #endif
-    BTM_TRACE_DEBUG2 ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
+    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
     if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
     {
@@ -1271,7 +1441,7 @@
 
             /* If the HCI link was set up by Bonding process */
             if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
-                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER);
+                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
             else
                 l2cu_update_lcb_4_bonding(bd_addr, FALSE);
 
@@ -1375,6 +1545,8 @@
 **                  p_ref_data    - pointer to any data the caller wishes to receive
 **                                  in the callback function upon completion.
 *                                   can be set to NULL if not used.
+**                  transport  -    TRUE to encryption the link over LE trasnport
+**                                  or FALSE for BR/EDR trasnport
 **
 ** Returns          BTM_SUCCESS   - already encrypted
 **                  BTM_PENDING   - command will be returned in the callback
@@ -1383,41 +1555,45 @@
 **                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
 **
 *******************************************************************************/
-tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBTM_SEC_CBACK *p_callback,
+tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
                                void *p_ref_data)
 {
     tBTM_SEC_DEV_REC  *p_dev_rec;
     tBTM_STATUS       rc;
-
 #if BLE_INCLUDED == TRUE
-    tACL_CONN         *p;
-    p = btm_bda_to_acl(bd_addr);
+   tACL_CONN         *p = btm_bda_to_acl(bd_addr, transport);
 #endif
 
     p_dev_rec = btm_find_dev (bd_addr);
-    if (!p_dev_rec || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
+
+    if (!p_dev_rec ||
+        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
+#if BLE_INCLUDED == TRUE
+        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
+#endif
+        )
     {
         /* Connection should be up and runnning */
-        BTM_TRACE_WARNING0 ("Security Manager: BTM_SetEncryption not connected");
+        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
 
         if (p_callback)
-            (*p_callback) (bd_addr, p_ref_data, BTM_WRONG_MODE);
+            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
 
         return(BTM_WRONG_MODE);
     }
 
-
-    if (
-#if BLE_INCLUDED == TRUE
-       !p->is_le_link &&
+    if ((transport == BT_TRANSPORT_BR_EDR &&
+         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
+#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
+         || (transport == BT_TRANSPORT_LE &&
+           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
 #endif
-       (p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))
-       == (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))
+          )
     {
-        BTM_TRACE_EVENT0 ("Security Manager: BTM_SetEncryption already encrypted");
+        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
 
         if (p_callback)
-            (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
 
         return(BTM_SUCCESS);
     }
@@ -1425,10 +1601,10 @@
     if (p_dev_rec->p_callback)
     {
         /* Connection should be up and runnning */
-        BTM_TRACE_WARNING0 ("Security Manager: BTM_SetEncryption busy");
+        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy");
 
         if (p_callback)
-            (*p_callback) (bd_addr, p_ref_data, BTM_BUSY);
+            (*p_callback) (bd_addr, transport, p_ref_data, BTM_BUSY);
 
         return(BTM_BUSY);
     }
@@ -1438,11 +1614,12 @@
     p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
     p_dev_rec->is_originator     = FALSE;
 
-    BTM_TRACE_API4 ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
+    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
                     p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
                     p_dev_rec->security_required);
+
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-    if (p->is_le_link)
+    if (transport == BT_TRANSPORT_LE)
     {
         rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role);
     }
@@ -1451,12 +1628,12 @@
 
         rc = btm_sec_execute_procedure (p_dev_rec);
 
-    if ( rc != BTM_CMD_STARTED)
+    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
     {
         if (p_callback)
         {
             p_dev_rec->p_callback = NULL;
-            (*p_callback) (bd_addr, p_dev_rec->p_ref_data, rc);
+            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
         }
     }
     return(rc);
@@ -1465,13 +1642,13 @@
 /*******************************************************************************
  * disconnect the ACL link, if it's not done yet.
 *******************************************************************************/
-static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason)
+static tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
 {
     UINT8       old_state = p_dev_rec->sec_state;
     tBTM_STATUS status = BTM_CMD_STARTED;
 
-    BTM_TRACE_EVENT2 ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
-                      p_dev_rec->hci_handle, reason);
+    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
+                      conn_handle, reason);
 
     /* if some other thread disconnecting, we do not send second command */
     if (BTM_SEC_STATE_DISCONNECTING != old_state)
@@ -1480,16 +1657,18 @@
 
 #if BTM_DISC_DURING_RS == TRUE
         /* If a Role Switch is in progress, delay the HCI Disconnect to avoid controller problem (4329B1) */
-        if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING)
+        if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING &&
+             p_dev_rec->hci_handle == conn_handle)
+
         {
-                 BTM_TRACE_ERROR0("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
+                 BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
                  p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
                  status = BTM_SUCCESS;
         }
         else
 #endif
         /* Tear down the HCI link */
-        if (!btsnd_hcic_disconnect (p_dev_rec->hci_handle, reason))
+        if (!btsnd_hcic_disconnect (conn_handle, reason))
         {
             /* could not send disconnect. restore old state */
             p_dev_rec->sec_state = old_state;
@@ -1514,7 +1693,7 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_EVENT2 ("BTM_ConfirmReqReply() State: %s  Res: %u",
+    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
                       btm_pair_state_descr(btm_cb.pairing_state), res);
 
     /* If timeout already expired or has been canceled, ignore the reply */
@@ -1562,7 +1741,7 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    BTM_TRACE_API2 ("BTM_PasskeyReqReply: State: %s  res:%d",
+    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
                     btm_pair_state_descr(btm_cb.pairing_state), res);
 
     if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
@@ -1579,7 +1758,7 @@
             btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
 
             if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
-                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
             else
                 BTM_SecBondCancel(bd_addr);
 
@@ -1652,7 +1831,7 @@
 *******************************************************************************/
 void BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
 {
-    BTM_TRACE_EVENT3 ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
+    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
                       btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
 
     if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
@@ -1703,7 +1882,7 @@
 *******************************************************************************/
 void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
 {
-    BTM_TRACE_EVENT2 ("BTM_RemoteOobDataReply():  State: %s  res:%d",
+    BTM_TRACE_EVENT ("BTM_RemoteOobDataReply():  State: %s  res:%d",
                       btm_pair_state_descr(btm_cb.pairing_state), res);
 
     /* If timeout already expired or has been canceled, ignore the reply */
@@ -1920,7 +2099,7 @@
             && (p_serv_rec->service_id == service_id)
             && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
         {
-            BTM_TRACE_API4("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
+            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
                            p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id);
             btm_cb.p_out_serv = p_serv_rec;
             if (p_dev_rec)
@@ -1951,9 +2130,17 @@
     if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
     {
         is_possible = FALSE;
-        BTM_TRACE_DEBUG5 ("btm_sec_is_upgrade_possible id:%d, link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, flags:x%x",
+        if(p_dev_rec->p_cur_service)
+        {
+        BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible id:%d, link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, flags:x%x",
                           p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps,
                           mtm_check, p_dev_rec->p_cur_service->security_flags);
+        }
+        else
+        {
+            BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible link_key_typet:%d, rmt_io_caps:%d, chk flags:x%x, ",
+                          p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
+        }
         /* Already have a link key to the connected peer. Is the link key secure enough?
         ** Is a link key upgrade even possible?
         */
@@ -1968,7 +2155,7 @@
             is_possible = TRUE;
         }
     }
-    BTM_TRACE_DEBUG2 ("btm_sec_is_upgrade_possible is_possible:%d sec_flags:0x%x", is_possible, p_dev_rec->sec_flags);
+    BTM_TRACE_DEBUG ("btm_sec_is_upgrade_possible is_possible:%d sec_flags:0x%x", is_possible, p_dev_rec->sec_flags);
     return is_possible;
 }
 
@@ -1986,14 +2173,14 @@
 {
     tBTM_SP_UPGRADE     evt_data;
 
-    BTM_TRACE_DEBUG0 ("btm_sec_check_upgrade...");
+    BTM_TRACE_DEBUG ("btm_sec_check_upgrade...");
 
     /* Only check if link key already exists */
     if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
         return;
     if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
     {
-        BTM_TRACE_DEBUG1 ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
+        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
         /* upgrade is possible: check if the application wants the upgrade.
          * If the application is configured to use a global MITM flag,
          * it probably would not want to upgrade the link key based on the security level database */
@@ -2002,7 +2189,7 @@
         if (btm_cb.api.p_sp_callback)
             (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
 
-        BTM_TRACE_DEBUG1 ("evt_data.upgrade:0x%x", evt_data.upgrade);
+        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
         if (evt_data.upgrade)
         {
             /* if the application confirms the upgrade, set the upgrade bit */
@@ -2011,7 +2198,7 @@
             /* Clear the link key known to go through authentication/pairing again */
             p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
             p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
-            BTM_TRACE_DEBUG1 ("sec_flags:0x%x", p_dev_rec->sec_flags);
+            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
         }
     }
 }
@@ -2050,6 +2237,7 @@
     tBTM_STATUS   rc = BTM_SUCCESS;
     BOOLEAN       chk_acp_auth_done = FALSE;
     BOOLEAN is_originator;
+    BOOLEAN     transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */
 
 #if (L2CAP_UCD_INCLUDED == TRUE)
     if (conn_type & CONNECTION_TYPE_ORIG_MASK)
@@ -2057,11 +2245,11 @@
     else
         is_originator = FALSE;
 
-    BTM_TRACE_DEBUG2 ("btm_sec_l2cap_access_req conn_type:0x%x, 0x%x", conn_type, p_ref_data);
+    BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req conn_type:0x%x, 0x%x", conn_type, p_ref_data);
 #else
     is_originator = conn_type;
 
-    BTM_TRACE_DEBUG2 ("btm_sec_l2cap_access_req is_originator:%d, 0x%x", is_originator, p_ref_data);
+    BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req is_originator:%d, 0x%x", is_originator, p_ref_data);
 #endif
 
     /* Find or get oldest record */
@@ -2075,9 +2263,9 @@
     /* If there is no application registered with this PSM do not allow connection */
     if (!p_serv_rec)
     {
-        BTM_TRACE_WARNING1 ("btm_sec_l2cap_access_req()  PSM:%d no application registerd", psm);
+        BTM_TRACE_WARNING ("btm_sec_l2cap_access_req()  PSM:%d no application registerd", psm);
 
-        (*p_callback) (bd_addr, p_ref_data, BTM_MODE_UNSUPPORTED);
+        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
 
         return(BTM_MODE_UNSUPPORTED);
     }
@@ -2085,7 +2273,7 @@
     /* SDP connection we will always let through */
     if (BT_PSM_SDP == psm)
     {
-        (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS_NO_SECURITY);
+        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
 
         return(BTM_SUCCESS);
     }
@@ -2119,7 +2307,7 @@
         if (rc == BTM_SUCCESS)
         {
             if (p_callback)
-                (*p_callback) (bd_addr, (void *)p_ref_data, BTM_SUCCESS);
+                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
 
             return(BTM_SUCCESS);
         }
@@ -2134,9 +2322,9 @@
     /* we will process one after another */
     if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
     {
-        BTM_TRACE_EVENT4 ("btm_sec_l2cap_access_req() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x",
+        BTM_TRACE_EVENT ("btm_sec_l2cap_access_req() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x",
                           psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
-        BTM_TRACE_EVENT2 ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
+        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
         rc = BTM_CMD_STARTED;
         if ((BTM_SEC_MODE_SP != btm_cb.security_mode)
             || ((BTM_SEC_MODE_SP == btm_cb.security_mode) && (BTM_SM4_KNOWN == p_dev_rec->sm4))
@@ -2148,9 +2336,9 @@
             if (is_originator)
             {
                 if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
-                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
-                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
-                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
+                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
+                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
                 {
                     rc = BTM_SUCCESS;
                 }
@@ -2158,9 +2346,12 @@
             else
             {
                 if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
-                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
-                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
-                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
+                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
+                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
+                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
+                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
+                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) ||
+                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS)  && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))))
                 {
                     rc = BTM_SUCCESS;
                 }
@@ -2169,7 +2360,7 @@
             if (rc == BTM_SUCCESS)
             {
                 if (p_callback)
-                    (*p_callback) (bd_addr, (void *)p_ref_data, BTM_SUCCESS);
+                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
 
                 return(BTM_SUCCESS);
             }
@@ -2197,7 +2388,7 @@
             {
                 if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4))
                 {
-                    BTM_TRACE_DEBUG1 ("remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
+                    BTM_TRACE_DEBUG ("remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
                     /* the remote features are not known yet */
                     p_dev_rec->sm4          |= BTM_SM4_REQ_PEND;
 
@@ -2219,7 +2410,7 @@
             {
                 if ( !(BTM_SM4_KNOWN & p_dev_rec->sm4))
                 {
-                    BTM_TRACE_DEBUG1 ("(rsp) remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
+                    BTM_TRACE_DEBUG ("(rsp) remote features unknown!!sec_flags:0x%x", p_dev_rec->sec_flags);
                     /* the remote features are not known yet */
                     p_dev_rec->sm4          |= BTM_SM4_REQ_PEND;
 
@@ -2229,7 +2420,7 @@
         }
     }
 
-    BTM_TRACE_DEBUG4 ("btm_sec_l2cap_access_req()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d",
+    BTM_TRACE_DEBUG ("btm_sec_l2cap_access_req()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d",
                       p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
 
     old_security_required        = p_dev_rec->security_required;
@@ -2254,15 +2445,15 @@
     if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
 #endif
     {
-        BTM_TRACE_DEBUG2 ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
+        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
         if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
         {
-            BTM_TRACE_EVENT1 ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
+            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
             /* pre-Lisbon: restore the old settings */
             p_dev_rec->security_required = old_security_required;
             p_dev_rec->is_originator     = old_is_originator;
 
-            (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
 
             return(BTM_SUCCESS);
         }
@@ -2272,19 +2463,19 @@
      * The layer above L2CAP needs to carry out the security requirement after L2CAP connect response is received*/
     if (is_originator && (btm_cb.security_mode != BTM_SEC_MODE_SP || !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
     {
-        BTM_TRACE_EVENT1 ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
+        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
         /* restore the old settings */
         p_dev_rec->security_required = old_security_required;
         p_dev_rec->is_originator     = old_is_originator;
 
-        (*p_callback) (bd_addr, p_ref_data, BTM_SUCCESS);
+        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
 
         return(BTM_SUCCESS);
     }
 
     if (chk_acp_auth_done)
     {
-        BTM_TRACE_DEBUG2 ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
+        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
                           (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
         /* SM4, but we do not know for sure which level of security we need.
          * as long as we have a link key, it's OK */
@@ -2296,12 +2487,12 @@
             2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
             because of data path issues. Delay this disconnect a little bit
             */
-            BTM_TRACE_ERROR0 ("peer should have initiated security process by now (SM4 to SM4)");
+            BTM_TRACE_ERROR ("peer should have initiated security process by now (SM4 to SM4)");
             p_dev_rec->p_callback        = p_callback;
             p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
-            (*p_callback) (bd_addr, p_ref_data, rc);
+            (*p_callback) (bd_addr, transport, p_ref_data, rc);
 
-            return(BTM_SUCCESS);
+            return(BTM_CMD_STARTED);
         }
     }
 
@@ -2324,13 +2515,13 @@
         btm_sec_check_upgrade(p_dev_rec, is_originator);
     }
 
-    BTM_TRACE_EVENT6 ("Security Manager: l2cap_access_req PSM:%d Handle:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
+    BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d Handle:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
                       psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
 
     if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
     {
         p_dev_rec->p_callback = NULL;
-        (*p_callback) (bd_addr, p_dev_rec->p_ref_data, (UINT8)rc);
+        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
     }
 
     return(rc);
@@ -2368,8 +2559,9 @@
     tBTM_SEC_SERV_REC *p_serv_rec;
     tBTM_STATUS        rc;
     UINT16             security_required;
+    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
 
-    BTM_TRACE_DEBUG1 ("btm_sec_mx_access_request is_originator:%d", is_originator);
+    BTM_TRACE_DEBUG ("btm_sec_mx_access_request is_originator:%d", is_originator);
     /* Find or get oldest record */
     p_dev_rec = btm_find_or_alloc_dev (bd_addr);
 
@@ -2380,9 +2572,9 @@
     if (!p_serv_rec)
     {
         if (p_callback)
-            (*p_callback) (bd_addr, p_ref_data, BTM_MODE_UNSUPPORTED);
+            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
 
-        BTM_TRACE_ERROR3 ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
+        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
                           psm, mx_proto_id, mx_chan_id);
         return BTM_NO_RESOURCES;
     }
@@ -2391,7 +2583,7 @@
     /* we will process one after another */
     if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
     {
-        BTM_TRACE_EVENT4 ("btm_sec_mx_access_request service PSM:%d Proto:%d SCN:%d delayed  state: %s",
+        BTM_TRACE_EVENT ("btm_sec_mx_access_request service PSM:%d Proto:%d SCN:%d delayed  state: %s",
                           psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
 
         rc = BTM_CMD_STARTED;
@@ -2406,8 +2598,8 @@
             if (is_originator)
             {
                 if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
-                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
-                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
+                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
                     )
                 {
                     rc = BTM_SUCCESS;
@@ -2416,8 +2608,11 @@
             else
             {
                 if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
-                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
-                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
+                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
+                    (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
+                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
+                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) ||
+                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
                     )
                 {
                     rc = BTM_SUCCESS;
@@ -2453,7 +2648,7 @@
     /* scn, we need to request user's permission again. */
     p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
 
-    BTM_TRACE_EVENT6 ("Security Manager: mx_access_req proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
+    BTM_TRACE_EVENT ("Security Manager: mx_access_req proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
                       mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
 
     if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
@@ -2462,7 +2657,7 @@
         {
             p_dev_rec->p_callback = NULL;
 
-            (*p_callback) (bd_addr, p_ref_data, (UINT8)rc);
+            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
         }
     }
 
@@ -2486,7 +2681,7 @@
     /* Some device may request a connection before we are done with the HCI_Reset sequence */
     if (btm_cb.devcb.state != BTM_DEV_STATE_READY)
     {
-        BTM_TRACE_EVENT0 ("Security Manager: connect request when device not ready");
+        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
         btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
         return;
     }
@@ -2498,7 +2693,7 @@
     {
         if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
         {
-            BTM_TRACE_EVENT0 ("Security Manager: connect request from non-paired device");
+            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
             btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
             return;
         }
@@ -2510,7 +2705,7 @@
     {
         if (!p_dev_rec)
         {
-            BTM_TRACE_EVENT0 ("Security Manager: connect request from not paired device");
+            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
             btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
             return;
         }
@@ -2522,7 +2717,7 @@
     {
         if (!(* btm_cb.p_conn_filter_cb) (bda, dc))
         {
-            BTM_TRACE_EVENT0 ("Security Manager: connect request did not pass filter");
+            BTM_TRACE_EVENT ("Security Manager: connect request did not pass filter");
 
             /* incomming call did not pass connection filters.  Reject */
             btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
@@ -2534,7 +2729,7 @@
         &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
         &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
     {
-        BTM_TRACE_EVENT0 ("Security Manager: reject connect request from bonding device");
+        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
 
         /* incoming connection from bonding device is rejected */
         btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
@@ -2613,7 +2808,7 @@
     UINT8       status;
 
     STREAM_TO_UINT8 (status, p);
-    BTM_TRACE_EVENT2 ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
+    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
                       btm_pair_state_descr(btm_cb.pairing_state), status);
 
     /* if the create conn cancel cmd was issued by the bond cancel,
@@ -2666,9 +2861,9 @@
         while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL)
         {
             /* Check that the ACL is still up before starting security procedures */
-            if (btm_bda_to_acl(p_e->bd_addr) != NULL)
+            if (btm_bda_to_acl(p_e->bd_addr, BT_TRANSPORT_BR_EDR) != NULL)
             {
-                BTM_TRACE_EVENT4 ("btm_sec_check_pending_reqs() submitting  PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
+                BTM_TRACE_EVENT ("btm_sec_check_pending_reqs() submitting  PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
                                   p_e->psm, p_e->is_orig, p_e->mx_proto_id, p_e->mx_chan_id);
 
                 btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
@@ -2717,7 +2912,7 @@
 *******************************************************************************/
 void btm_sec_device_down (void)
 {
-    BTM_TRACE_EVENT1 ("btm_sec_device_down()  State: %s", btm_pair_state_descr(btm_cb.pairing_state));
+    BTM_TRACE_EVENT ("btm_sec_device_down()  State: %s", btm_pair_state_descr(btm_cb.pairing_state));
 
     btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
 }
@@ -2747,9 +2942,13 @@
          * right now. */
         if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
     {
+        btsnd_hcic_write_simple_pairing_mode(HCI_SP_MODE_ENABLED);
 #if BLE_INCLUDED == TRUE
         btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID,
                                   (UINT8 *)HCI_DUMO_EVENT_MASK_EXT);
+
+        btsnd_hcic_ble_set_evt_mask((UINT8 *)HCI_BLE_EVENT_MASK_DEF);
+
 #else
         btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID,
                                   (UINT8 *)HCI_LISBON_EVENT_MASK_EXT);
@@ -2767,7 +2966,7 @@
         btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
     }
 
-    BTM_TRACE_DEBUG1 ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
+    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
 }
 
 /*******************************************************************************
@@ -2815,9 +3014,9 @@
     tL2C_LCB         *p_lcb;
 
     /* Make sure an L2cap link control block is available */
-    if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE)) == NULL)
+    if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        BTM_TRACE_WARNING6 ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
+        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
                             p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
                             p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
 
@@ -2827,9 +3026,9 @@
     /* set up the control block to indicated dedicated bonding */
     btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
 
-    if (l2cu_create_conn(p_lcb) == FALSE)
+    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
     {
-        BTM_TRACE_WARNING6 ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
+        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
                             p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
                             p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
 
@@ -2841,7 +3040,7 @@
     btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
 #endif
 
-    BTM_TRACE_DEBUG6 ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
+    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
                       p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
                       p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
 
@@ -2867,7 +3066,7 @@
     DEV_CLASS        dev_class;
     UINT8            old_sec_state;
 
-    BTM_TRACE_EVENT0 ("btm_sec_rmt_name_request_complete");
+    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
     if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
         || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
     {
@@ -2905,13 +3104,13 @@
 
     if (p_dev_rec)
     {
-        BTM_TRACE_EVENT5 ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
+        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ",
                           btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
                           status, p_dev_rec->sec_state, p_dev_rec);
     }
     else
     {
-        BTM_TRACE_EVENT3 ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
+        BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s  RemName: %s  status: %d",
                           btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
                           status);
     }
@@ -2924,7 +3123,7 @@
         {
             BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
             p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
-            BTM_TRACE_EVENT1 ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
+            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
         }
         else
         {
@@ -2938,7 +3137,7 @@
         /* Notify all clients waiting for name to be resolved */
         for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
         {
-            if (btm_cb.p_rmt_name_callback[i])
+            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
                 (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
                                                  p_dev_rec->sec_bd_name);
         }
@@ -2952,7 +3151,7 @@
         /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
         for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
         {
-            if (btm_cb.p_rmt_name_callback[i])
+            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
                 (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
         }
 
@@ -2963,13 +3162,13 @@
     if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
          &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
     {
-        BTM_TRACE_EVENT2 ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
+        BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
 
         if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) &&
             ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) &&
             btm_cb.api.p_pin_callback)
         {
-            BTM_TRACE_EVENT0 ("btm_sec_rmt_name_request_complete() calling pin_callback");
+            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback");
             btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
             (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name);
         }
@@ -2984,7 +3183,7 @@
     {
         if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
         {
-            BTM_TRACE_EVENT2 ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
+            BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status);
             if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
             {
                 btm_sec_bond_cancel_complete();
@@ -2995,23 +3194,29 @@
             {
                 btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
 
-                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
-                                                        p_dev_rec->sec_bd_name, status);
+                if (btm_cb.api.p_auth_complete_callback)
+                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
+                                                            p_dev_rec->sec_bd_name, status);
                 return;
             }
 
             /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
             if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
             {
-                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.
-                 * If it is set, there may be a race condition */
-				BTM_TRACE_EVENT1 ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x", btm_cb.pairing_flags);
+                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
+                /* If it is set, there may be a race condition */
+                BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete  IS_SM4_UNKNOWN Flags:0x%04x",
+                                   btm_cb.pairing_flags);
                 if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
                 {
                     p_dev_rec->sm4 |= BTM_SM4_KNOWN;
                 }
             }
 
+            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
+                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
+                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
+
             /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
             ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
             */
@@ -3021,15 +3226,16 @@
                 /*  before originating  */
                 if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
                 {
-                    BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
+                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection");
                 }
                 /* Both we and the peer are 2.1 - continue to create connection */
                 else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
                 {
-                    BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: failed to start connection");
+                    BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection");
 
                     btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
 
+                    if (btm_cb.api.p_auth_complete_callback)
                     (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
                                                             p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
                 }
@@ -3038,9 +3244,9 @@
         }
         else
         {
-            BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
+            BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA");
 
-            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL);
+            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
             return;
         }
     }
@@ -3072,7 +3278,7 @@
     if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
         && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
     {
-        BTM_TRACE_WARNING0 ("btm_sec_rmt_name_request_complete (none/ce)");
+        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
         p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
         l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
         return;
@@ -3084,13 +3290,13 @@
     /* If get name failed, notify the waiting layer */
     if (status != HCI_SUCCESS)
     {
-        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING);
+        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
         return;
     }
 
     if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
     {
-        BTM_TRACE_EVENT0 ("waiting for remote features!!");
+        BTM_TRACE_EVENT ("waiting for remote features!!");
         return;
     }
 
@@ -3102,7 +3308,7 @@
         return;
 
     /* There is no next procedure or start of procedure failed, notify the waiting layer */
-    btm_sec_dev_rec_cback_event  (p_dev_rec, status);
+    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
 }
 
 /*******************************************************************************
@@ -3124,7 +3330,7 @@
     STREAM_TO_BDADDR (bd_addr, p);
     p_dev_rec = btm_find_or_alloc_dev (bd_addr);
 
-    BTM_TRACE_EVENT2 ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
+    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
 
     if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
     {
@@ -3134,7 +3340,7 @@
         {
             p_dev_rec->sm4 = BTM_SM4_TRUE;
         }
-        BTM_TRACE_EVENT2 ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
+        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
     }
 }
 
@@ -3166,12 +3372,12 @@
     evt_data.oob_data = BTM_OOB_NONE;
     evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
 
-    BTM_TRACE_EVENT1 ("btm_io_capabilities_req() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
+    BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s", btm_pair_state_descr(btm_cb.pairing_state));
 
     p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
     p_dev_rec->sm4 |= BTM_SM4_TRUE;
 
-    BTM_TRACE_EVENT3 ("btm_io_capabilities_req() State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
+    BTM_TRACE_EVENT ("btm_io_capabilities_req() State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
                       btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, p_dev_rec->p_cur_service);
 
     if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
@@ -3279,7 +3485,7 @@
         btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
         btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
 
-        BTM_TRACE_EVENT4 ("btm_io_capabilities_req: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
+        BTM_TRACE_EVENT ("btm_io_capabilities_req: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
                           btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
                           evt_data.oob_data, evt_data.auth_req);
 
@@ -3374,7 +3580,7 @@
     /* All events start with bd_addr */
     STREAM_TO_BDADDR (p_bda, p);
 
-    BTM_TRACE_EVENT4 ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
+    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
                       (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5],
                       event, btm_pair_state_descr(btm_cb.pairing_state));
 
@@ -3409,7 +3615,7 @@
                     evt_data.cfm_req.just_works = FALSE;
                 }
 #endif
-                BTM_TRACE_DEBUG5 ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
+                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
                                   evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
                                   btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
 
@@ -3423,7 +3629,7 @@
                 /* Passkey notification (other side is a keyboard) */
                 STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
 
-                BTM_TRACE_DEBUG1 ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
+                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
 
                 btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
                 break;
@@ -3453,7 +3659,7 @@
 
         if (event == BTM_SP_CFM_REQ_EVT)
         {
-            BTM_TRACE_DEBUG1 ("calling BTM_ConfirmReqReply with status: %d", status);
+            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
             BTM_ConfirmReqReply (status, p_bda);
         }
 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
@@ -3542,13 +3748,13 @@
 
     if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
     {
-        BTM_TRACE_ERROR2 ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
+        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
                           (evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3],
                           (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
         return;
     }
 
-    BTM_TRACE_EVENT3 ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
+    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
                       btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
 
     evt_data.status = BTM_ERR_PROCESSING;
@@ -3592,7 +3798,11 @@
     if (disc)
     {
         /* simple pairing failed */
-        btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
+        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
+        {
+            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
+        }
     }
 }
 
@@ -3619,7 +3829,7 @@
 
     STREAM_TO_BDADDR (p_bda, p);
 
-    BTM_TRACE_EVENT6 ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
                       p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
 
     if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
@@ -3658,7 +3868,7 @@
     tBTM_SP_LOC_OOB evt_data;
     UINT8           status = *p++;
 
-    BTM_TRACE_EVENT1 ("btm_read_local_oob_complete:%d", status);
+    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
     if (status == HCI_SUCCESS)
     {
         evt_data.status = BTM_SUCCESS;
@@ -3702,7 +3912,7 @@
 
         if (p_dev_rec != NULL)
         {
-            BTM_TRACE_DEBUG1 ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
+            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
             /* We will restart authentication after timeout */
             if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
                 p_dev_rec->sec_state = 0;
@@ -3736,7 +3946,7 @@
 #if (BT_USE_TRACES == TRUE)
     if (p_dev_rec)
     {
-        BTM_TRACE_EVENT6 ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
+        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
                           btm_pair_state_descr (btm_cb.pairing_state),
                           handle, status,
                           p_dev_rec->sec_state,
@@ -3745,7 +3955,7 @@
     }
     else
     {
-        BTM_TRACE_EVENT3 ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
+        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
                           btm_pair_state_descr (btm_cb.pairing_state),
                           handle, status);
     }
@@ -3831,7 +4041,10 @@
         p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
 
         if (status != HCI_SUCCESS)
-            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER);
+        {
+            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
+                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
+        }
         else
             l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
 
@@ -3848,7 +4061,7 @@
             {
                 /* not retried yet. set the retry bit */
                 p_dev_rec->sm4 |= BTM_SM4_RETRY;
-                BTM_TRACE_DEBUG2 ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
+                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
             }
             /* this retry for missing key is for Lisbon or later only.
              * Legacy device do not need this. the controller will drive the retry automatically */
@@ -3857,7 +4070,7 @@
                 /* not retried yet. set the retry bit */
                 p_dev_rec->sm4 |= BTM_SM4_RETRY;
                 p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
-                BTM_TRACE_DEBUG2 ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
+                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
 
                 /* With BRCM controller, we do not need to delete the stored link key in controller.
                 If the stack may sit on top of other controller, we may need this
@@ -3871,11 +4084,11 @@
             }
         }
 
-        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
 
         if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
         {
-            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
         }
         return;
     }
@@ -3887,7 +4100,7 @@
 
     /* If there is no next procedure, or procedure failed to start, notify the caller */
     if (status != BTM_CMD_STARTED)
-        btm_sec_dev_rec_cback_event (p_dev_rec, status);
+        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
 }
 
 /*******************************************************************************
@@ -3905,7 +4118,7 @@
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
     UINT8 bd_addr[BD_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} ;
 
-    BTM_TRACE_EVENT2 ("Security Manager: mkey comp status:%d State:%d",
+    BTM_TRACE_EVENT ("Security Manager: mkey comp status:%d State:%d",
                       status, (p_dev_rec) ? p_dev_rec->sec_state : 0);
 
     /* If encryption setup failed, notify the waiting layer */
@@ -3933,11 +4146,12 @@
 {
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-    tACL_CONN         *p_acl;
+    tACL_CONN       *p_acl = NULL;
+    UINT8           acl_idx = btm_handle_to_acl_index(handle);
 #endif
-    BTM_TRACE_EVENT3 ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
+    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
                       status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
-    BTM_TRACE_DEBUG1 ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
+    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
 
     /* For transaction collision we need to wait and repeat.  There is no need */
     /* for random timeout because only slave should receive the result */
@@ -3952,20 +4166,34 @@
         return;
 
     if ((status == HCI_SUCCESS) && encr_enable)
-        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+    {
+        if (p_dev_rec->hci_handle == handle)
+            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+        else
+            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
+    }
 
     /* It is possible that we decrypted the link to perform role switch */
     /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
     if ((status == HCI_SUCCESS) && !encr_enable)
-        p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
+    {
+        if (p_dev_rec->hci_handle == handle)
+            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
+        else
+            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
+    }
 
-    BTM_TRACE_DEBUG1 ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
+    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
 
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
-    p_acl = btm_bda_to_acl(p_dev_rec->bd_addr);
+    if (acl_idx != MAX_L2CAP_LINKS )
+        p_acl = &btm_cb.acl_db[acl_idx];
 
-    if (p_acl && p_acl->is_le_link)
+    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
     {
+        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE
+            ||status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
+            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
         btm_ble_link_encrypted(p_dev_rec->bd_addr, encr_enable);
         return;
     }
@@ -3991,7 +4219,7 @@
     /* If encryption setup failed, notify the waiting layer */
     if (status != HCI_SUCCESS)
     {
-        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
         return;
     }
 
@@ -4000,7 +4228,7 @@
 
     /* If there is no next procedure, or procedure failed to start, notify the caller */
     if (status != BTM_CMD_STARTED)
-        btm_sec_dev_rec_cback_event (p_dev_rec, status);
+        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
 }
 
 /*******************************************************************************
@@ -4050,16 +4278,17 @@
     tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
     UNUSED(p_tle);
 
-    BTM_TRACE_EVENT0 ("btm_sec_connect_after_reject_timeout()");
+    BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()");
     btm_cb.sec_collision_tle.param = 0;
     btm_cb.p_collided_dev_rec = 0;
 
     if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
     {
-        BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
+        BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection");
 
         btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
 
+        if (btm_cb.api.p_auth_complete_callback)
         (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
                                                 p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
     }
@@ -4081,6 +4310,7 @@
     UINT8            res;
     BOOLEAN          is_pairing_device = FALSE;
     tACL_CONN        *p_acl_cb;
+    UINT8            bit_shift = 0;
 
     btm_acl_resubmit_page();
 
@@ -4089,14 +4319,14 @@
 #if (BT_USE_TRACES == TRUE)
     if (p_dev_rec)
     {
-        BTM_TRACE_EVENT6 ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
+        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
                           btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
                           (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
                           p_dev_rec->sec_bd_name);
     }
     else
     {
-        BTM_TRACE_EVENT5 ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
+        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
                           btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
                           (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
     }
@@ -4108,9 +4338,6 @@
         if (status == HCI_SUCCESS)
         {
             p_dev_rec = btm_sec_alloc_dev (bda);
-#if BLE_INCLUDED == TRUE
-            p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
-#endif
         }
         else
         {
@@ -4121,6 +4348,10 @@
     }
     else    /* Update the timestamp for this device */
     {
+
+#if BLE_INCLUDED == TRUE
+        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
+#endif
         p_dev_rec->timestamp = btm_cb.dev_rec_count++;
         if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
         {
@@ -4133,7 +4364,7 @@
                 /* Motorola S9 disconnects without asking pin code */
                 if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
                 {
-                    BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
+                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
 
                     p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
                     if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
@@ -4147,7 +4378,7 @@
                     else
                     {
                         btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
-                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL);
+                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
                     }
 #if BTM_DISC_DURING_RS == TRUE
                     p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
@@ -4164,6 +4395,10 @@
         }
     }
 
+#if BLE_INCLUDED == TRUE
+    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
+#endif
+
 #if BTM_DISC_DURING_RS == TRUE
     p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
 #endif
@@ -4177,7 +4412,7 @@
         if ((status == HCI_ERR_HOST_REJECT_DEVICE)
             &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
         {
-            BTM_TRACE_WARNING2 ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
+            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
                 btm_cb.pairing_flags, p_dev_rec->sm4);
 
             btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
@@ -4185,7 +4420,7 @@
             {
                 /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
                 btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
-                BTM_ReadRemoteDeviceName(bda, NULL);
+                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
                 return;
             }
 
@@ -4204,7 +4439,7 @@
         /* wait for incoming connection without resetting pairing state */
         else if (status == HCI_ERR_CONNECTION_EXISTS)
         {
-            BTM_TRACE_WARNING0 ("Security Manager: btm_sec_connected: Wait for incoming connection");
+            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
             return;
         }
 
@@ -4221,8 +4456,8 @@
         if (is_pairing_device)
         {
             p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
-            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
-            BTM_TRACE_DEBUG1 ("security_required:%x ", p_dev_rec->security_required );
+            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
+            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
 
             btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
 
@@ -4234,17 +4469,33 @@
                                                         p_dev_rec->sec_bd_name, status);
             }
         }
-        else if ((status == HCI_ERR_AUTH_FAILURE)                   ||
+ /*
+     Do not send authentication failure, if following conditions hold good
+      1.  BTM Sec Pairing state is idle
+      2.  Link key for the remote device is present.
+      3.  Remote is SSP capable.
+  */
+        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
+                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
                  (status == HCI_ERR_KEY_MISSING)                         ||
                  (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
                  (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
                  (status == HCI_ERR_UNIT_KEY_USED)                       ||
                  (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
                  (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
-                 (status == HCI_ERR_REPEATED_ATTEMPTS))
+                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
         {
             p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
-            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
+            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
+
+
+#ifdef BRCM_NOT_4_BTE
+            /* If we rejected pairing, pass this special result code */
+            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
+            {
+                status = HCI_ERR_HOST_REJECT_SECURITY;
+            }
+#endif
 
             /* We need to notify host that the key is not known any more */
             if (btm_cb.api.p_auth_complete_callback)
@@ -4257,9 +4508,9 @@
 
         if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
             status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
-            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT);
+            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
         else
-            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
 
         return;
     }
@@ -4304,7 +4555,7 @@
     /* role may not be correct here, it will be updated by l2cap, but we need to */
     /* notify btm_acl that link is up, so starting of rmt name request will not */
     /* set paging flag up */
-    p_acl_cb = btm_bda_to_acl(bda);
+    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
     if (p_acl_cb)
     {
         /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
@@ -4318,30 +4569,30 @@
             BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
 #endif
     }
-    btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, FALSE);
+    btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
 
     /* Initialize security flags.  We need to do that because some            */
     /* authorization complete could have come after the connection is dropped */
     /* and that would set wrong flag that link has been authorized already    */
-    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
-                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
+                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
 
     if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
-        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
+        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
 
     if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
-        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
+        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
 
     p_dev_rec->link_key_changed = FALSE;
 
     /* After connection is established we perform security if we do not know */
     /* the name, or if we are originator because some procedure can have */
     /* been scheduled while connection was down */
-    BTM_TRACE_DEBUG1 ("is_originator:%d ", p_dev_rec->is_originator);
+    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
     if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
     {
         if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
-            btm_sec_dev_rec_cback_event (p_dev_rec, res);
+            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
     }
     return;
 }
@@ -4361,7 +4612,7 @@
     tBTM_SEC_DEV_REC *p_dev_rec = (tBTM_SEC_DEV_REC *)p_ref_data;
     UINT8 res;
 
-    BTM_TRACE_EVENT0 ("Security Manager: role changed");
+    BTM_TRACE_EVENT ("Security Manager: role changed");
 
     /* If this role switch was started by peer do not need to do anything */
     if (p_dev_rec->sec_state != BTM_SEC_STATE_SWITCHING_ROLE)
@@ -4371,7 +4622,7 @@
     if (((p_dev_rec->security_required & BTM_SEC_FORCE_MASTER) && !p_dev_rec->role_master)
         || ((p_dev_rec->security_required & BTM_SEC_FORCE_SLAVE)  &&  p_dev_rec->role_master))
     {
-        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING);
+        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
         return;
     }
 
@@ -4384,7 +4635,7 @@
 
     if ((res = (UINT8)btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
     {
-        btm_sec_dev_rec_cback_event (p_dev_rec, res);
+        btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
     }
 }
 
@@ -4418,7 +4669,7 @@
         return(BTM_BUSY);
     }
 
-    return(btm_sec_send_hci_disconnect(p_dev_rec, reason));
+    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
 }
 
 /*******************************************************************************
@@ -4437,6 +4688,7 @@
     UINT8             old_pairing_flags = btm_cb.pairing_flags;
     int               result = HCI_ERR_AUTH_FAILURE;
     tBTM_SEC_CALLBACK   *p_callback = NULL;
+    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
 
     /* If page was delayed for disc complete, can do it now */
     btm_cb.discing = FALSE;
@@ -4446,21 +4698,23 @@
     if (!p_dev_rec)
         return;
 
+    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
+
     p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
 
 #if BTM_DISC_DURING_RS == TRUE
-    BTM_TRACE_ERROR0("btm_sec_disconnected - Clearing Pending flag");
+    BTM_TRACE_ERROR("btm_sec_disconnected - Clearing Pending flag");
     p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
 #endif
 
     /* clear unused flags */
     p_dev_rec->sm4 &= BTM_SM4_TRUE;
 
-    BTM_TRACE_EVENT6("btm_sec_disconnected() sec_req:x%x  State: %s   reason:%d bda:%04x%08x RName:%s",
+    BTM_TRACE_EVENT("btm_sec_disconnected() sec_req:x%x  State: %s   reason:%d bda:%04x%08x RName:%s",
                      p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), reason,  (p_dev_rec->bd_addr[0]<<8)+p_dev_rec->bd_addr[1],
                      (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5], p_dev_rec->sec_bd_name);
 
-    BTM_TRACE_EVENT1("before Update sec_flags=0x%x", p_dev_rec->sec_flags);
+    BTM_TRACE_EVENT("before Update sec_flags=0x%x", p_dev_rec->sec_flags);
 
     /* If we are in the process of bonding we need to tell client that auth failed */
     if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
@@ -4487,16 +4741,24 @@
         }
     }
 
-    p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
-    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
-
 #if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
     p_dev_rec->enc_key_size = 0;
-    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, FALSE);
+    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
     /* see sec_flags processing in btm_acl_removed */
-#endif
-    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
 
+    if (transport == BT_TRANSPORT_LE)
+    {
+        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
+        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
+    }
+    else
+#endif
+    {
+        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
+        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED);
+    }
+
+    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
     p_dev_rec->security_required = BTM_SEC_NONE;
 
     p_callback = p_dev_rec->p_callback;
@@ -4506,10 +4768,10 @@
     {
         p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
                                          we do, this call back must be reset here */
-        (*p_callback) (p_dev_rec->bd_addr, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
+        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
     }
 
-    BTM_TRACE_EVENT1("after Update sec_flags=0x%x", p_dev_rec->sec_flags);
+    BTM_TRACE_EVENT("after Update sec_flags=0x%x", p_dev_rec->sec_flags);
 }
 
 /*******************************************************************************
@@ -4527,7 +4789,7 @@
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
     BOOLEAN          we_are_bonding = FALSE;
 
-    BTM_TRACE_EVENT3 ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
+    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
                       (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5],
                       key_type);
 
@@ -4561,7 +4823,7 @@
     if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
         &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) )
     {
-        BTM_TRACE_EVENT3 ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
+        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
                           (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5], key_type);
 
         p_dev_rec->link_key_not_sent = TRUE;
@@ -4573,7 +4835,7 @@
                 btm_inq_rmt_name_failed();
         }
 
-        BTM_TRACE_EVENT3 ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
+        BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
         return;
     }
 
@@ -4613,9 +4875,19 @@
 {
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
 
-    BTM_TRACE_EVENT6 ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
+    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
                       p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
 
+    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
+        (btm_cb.collision_start_time != 0) &&
+        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
+    {
+        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
+            "State: %d START_TIMEOUT : %d",
+             btm_cb.pairing_state, btm_cb.collision_start_time);
+        btsnd_hcic_link_key_neg_reply (p_bda);
+        return;
+    }
     if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
     {
         btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
@@ -4673,7 +4945,7 @@
 */
     p_dev_rec = btm_find_dev (p_cb->pairing_bda);
 
-    BTM_TRACE_EVENT2 ("btm_sec_pairing_timeout()  State: %s   Flags: %u",
+    BTM_TRACE_EVENT ("btm_sec_pairing_timeout()  State: %s   Flags: %u",
                       btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
 
     switch (p_cb->pairing_state)
@@ -4736,12 +5008,12 @@
              * now it's time to tear down the ACL link*/
             if (p_dev_rec == NULL)
             {
-                BTM_TRACE_ERROR2 ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
+                BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
                                   (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
                                   (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
                 break;
             }
-            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE);
+            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
             btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
             break;
 
@@ -4765,7 +5037,7 @@
             break;
 
         default:
-            BTM_TRACE_WARNING1 ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
+            BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state));
             btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
             break;
     }
@@ -4785,7 +5057,11 @@
     tBTM_SEC_DEV_REC *p_dev_rec;
     tBTM_CB          *p_cb = &btm_cb;
 
-    BTM_TRACE_EVENT3 ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
+#ifdef PORCHE_PAIRING_CONFLICT
+    UINT8 default_pin_code_len = 4;
+    PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30};
+#endif
+    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
                       btm_pair_state_descr(btm_cb.pairing_state),
                       (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] );
 
@@ -4810,15 +5086,16 @@
         else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
                  || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
         {
-            BTM_TRACE_WARNING1 ("btm_sec_pin_code_request() rejected - state: %s",
+            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
                                 btm_pair_state_descr(btm_cb.pairing_state));
 
 #ifdef PORCHE_PAIRING_CONFLICT
             /* reply pin code again due to counter in_rand when local initiates pairing */
-            BTM_TRACE_EVENT0 ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
+            BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing");
             if(! btm_cb.pin_code_len_saved)
             {
-                btsnd_hcic_pin_code_neg_reply (p_bda);
+                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
+                btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code);
             }
             else
             {
@@ -4847,7 +5124,7 @@
 
     if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
     {
-        BTM_TRACE_EVENT0 ("btm_sec_pin_code_request fixed pin replying");
+        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
         btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
         btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
         return;
@@ -4861,7 +5138,7 @@
     /* We could have started connection after asking user for the PIN code */
     if (btm_cb.pin_code_len != 0)
     {
-        BTM_TRACE_EVENT0 ("btm_sec_pin_code_request bonding sending reply");
+        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
         btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
 
 #ifdef PORCHE_PAIRING_CONFLICT
@@ -4890,7 +5167,7 @@
                  && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
                  &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
     {
-        BTM_TRACE_WARNING3("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
+        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
                            p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
 
         btsnd_hcic_pin_code_neg_reply (p_bda);
@@ -4911,7 +5188,7 @@
         /* Also cannot send remote name request while paging, i.e. connection is not completed */
         if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
         {
-            BTM_TRACE_EVENT0 ("btm_sec_pin_code_request going for callback");
+            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
 
             btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
             if (p_cb->api.p_pin_callback)
@@ -4919,7 +5196,7 @@
         }
         else
         {
-            BTM_TRACE_EVENT0 ("btm_sec_pin_code_request going for remote name");
+            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
 
             /* We received PIN code request for the device with unknown name */
             /* it is not user friendly just to ask for the PIN without name */
@@ -4931,7 +5208,7 @@
                 p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
                 p_dev_rec->sec_bd_name[0] = 'f';
                 p_dev_rec->sec_bd_name[1] = '0';
-                BTM_TRACE_ERROR0 ("can not send rmt_name_req?? fake a name and call callback");
+                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
 
                 btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
                 if (p_cb->api.p_pin_callback)
@@ -4990,7 +5267,7 @@
 *******************************************************************************/
 static tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
 {
-    BTM_TRACE_EVENT3 ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
+    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
                       p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
 
     /* There is a chance that we are getting name.  Wait until done. */
@@ -5001,7 +5278,7 @@
     if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
         && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
     {
-        BTM_TRACE_EVENT0 ("Security Manager: Start get name");
+        BTM_TRACE_EVENT ("Security Manager: Start get name");
         if (!btm_sec_start_get_name (p_dev_rec))
         {
             return(BTM_NO_RESOURCES);
@@ -5022,7 +5299,7 @@
             return(BTM_FAILED_ON_SECURITY);
 #endif
 
-        BTM_TRACE_EVENT0 ("Security Manager: Start authentication");
+        BTM_TRACE_EVENT ("Security Manager: Start authentication");
 
         if (!btm_sec_start_authentication (p_dev_rec))
         {
@@ -5044,7 +5321,7 @@
             return(BTM_FAILED_ON_SECURITY);
 #endif
 
-        BTM_TRACE_EVENT0 ("Security Manager: Start encryption");
+        BTM_TRACE_EVENT ("Security Manager: Start encryption");
 
         if (!btm_sec_start_encryption (p_dev_rec))
         {
@@ -5059,7 +5336,7 @@
         && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
             || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
     {
-        BTM_TRACE_EVENT2 ("service id:%d, is trusted:%d",
+        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
                           p_dev_rec->p_cur_service->service_id,
                           (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
                                                       p_dev_rec->p_cur_service->service_id)));
@@ -5068,7 +5345,7 @@
             (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
                                         p_dev_rec->p_cur_service->service_id) == FALSE))
         {
-            BTM_TRACE_EVENT0 ("Security Manager: Start authorization");
+            BTM_TRACE_EVENT ("Security Manager: Start authorization");
             return(btm_sec_start_authorization (p_dev_rec));
         }
     }
@@ -5080,8 +5357,8 @@
                                       BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
                                       BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
 
-    BTM_TRACE_EVENT2 ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
-    BTM_TRACE_EVENT0 ("Security Manager: access granted");
+    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
+    BTM_TRACE_EVENT ("Security Manager: access granted");
 
     return(BTM_SUCCESS);
 }
@@ -5198,7 +5475,7 @@
 
         else    /* Already authorized once for this L2CAP bringup */
         {
-            BTM_TRACE_DEBUG1 ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
+            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
             return (BTM_SUCCESS);
         }
 
@@ -5329,7 +5606,7 @@
     tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
     int i;
 
-    BTM_TRACE_DEBUG0 ("btm_sec_find_mx_serv");
+    BTM_TRACE_DEBUG ("btm_sec_find_mx_serv");
     if (is_originator && p_out_serv && p_out_serv->psm == psm
         && p_out_serv->mx_proto_id == mx_proto_id
         && p_out_serv->orig_mx_chan_id == mx_chan_id)
@@ -5370,7 +5647,7 @@
     tBTM_STATUS status;
     UNUSED(p_tle);
 
-    BTM_TRACE_EVENT0 ("btm_sec_collision_timeout()");
+    BTM_TRACE_EVENT ("btm_sec_collision_timeout()");
     btm_cb.sec_collision_tle.param = 0;
 
     status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
@@ -5379,7 +5656,7 @@
     if (status != BTM_CMD_STARTED)
     {
         /* There is no next procedure or start of procedure failed, notify the waiting layer */
-        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status);
+        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
     }
 }
 
@@ -5442,7 +5719,7 @@
     if (btm_cb.security_mode_changed)
     {
         btm_cb.security_mode_changed = FALSE;
-        BTM_TRACE_DEBUG1("btm_restore_mode: Authen Enable -> %d", (btm_cb.security_mode == BTM_SEC_MODE_LINK));
+        BTM_TRACE_DEBUG("btm_restore_mode: Authen Enable -> %d", (btm_cb.security_mode == BTM_SEC_MODE_LINK));
         btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
     }
 
@@ -5492,11 +5769,11 @@
 {
     tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
 
-    BTM_TRACE_EVENT2 ("BTM_snd_conn_encrypt Security Manager: encrypt_change p_dev_rec : 0x%x, enable = %s", p_dev_rec, (enable == TRUE) ? "TRUE" : "FALSE");
+    BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Security Manager: encrypt_change p_dev_rec : 0x%x, enable = %s", p_dev_rec, (enable == TRUE) ? "TRUE" : "FALSE");
 
     if (!p_dev_rec)
     {
-        BTM_TRACE_EVENT1 ("BTM_snd_conn_encrypt Error no  p_dev_rec : 0x%x\n", p_dev_rec);
+        BTM_TRACE_EVENT ("BTM_snd_conn_encrypt Error no  p_dev_rec : 0x%x\n", p_dev_rec);
         return(FALSE);
     }
 
@@ -5524,8 +5801,8 @@
 {
     tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
 
-    BTM_TRACE_EVENT1 ("btm_sec_change_pairing_state  Old: %s",  btm_pair_state_descr(btm_cb.pairing_state));
-    BTM_TRACE_EVENT2 ("btm_sec_change_pairing_state  New: %s pairing_flags:0x%x",btm_pair_state_descr(new_state), btm_cb.pairing_flags);
+    BTM_TRACE_EVENT ("btm_sec_change_pairing_state  Old: %s",  btm_pair_state_descr(btm_cb.pairing_state));
+    BTM_TRACE_EVENT ("btm_sec_change_pairing_state  New: %s pairing_flags:0x%x",btm_pair_state_descr(new_state), btm_cb.pairing_flags);
 
     btm_cb.pairing_state = new_state;
 
@@ -5604,15 +5881,16 @@
 ** Parameters:      void
 **
 *******************************************************************************/
-void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res)
+void btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
 {
     tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
+    tBT_TRANSPORT transport = is_le_transport ? BT_TRANSPORT_LE : BT_TRANSPORT_BR_EDR;
 
     if (p_dev_rec->p_callback)
     {
         p_dev_rec->p_callback = NULL;
 
-        (*p_callback) (p_dev_rec->bd_addr, p_dev_rec->p_ref_data, res);
+        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, res);
 
     }
     btm_sec_check_pending_reqs();
@@ -5644,7 +5922,7 @@
 
         memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN);
 
-        BTM_TRACE_EVENT4 ("btm_sec_queue_mx_request() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
+        BTM_TRACE_EVENT ("btm_sec_queue_mx_request() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
                           psm, is_orig, mx_proto_id, mx_chan_id);
 
         GKI_enqueue (&btm_cb.sec_pending_q, p_e);
@@ -5664,7 +5942,7 @@
     if ((major == BTM_COD_MAJOR_AUDIO)
         &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
     {
-        BTM_TRACE_EVENT2 ("btm_sec_check_prefetch_pin: Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", major, minor);
+        BTM_TRACE_EVENT ("btm_sec_check_prefetch_pin: Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", major, minor);
 
         if (btm_cb.security_mode_changed == FALSE)
         {
@@ -5689,8 +5967,8 @@
             /* pin was not supplied - pre-fetch pin code now */
             if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
             {
-                BTM_TRACE_DEBUG0("btm_sec_check_prefetch_pin: PIN code callback called");
-                if (btm_bda_to_acl(p_dev_rec->bd_addr) == NULL)
+                BTM_TRACE_DEBUG("btm_sec_check_prefetch_pin: PIN code callback called");
+                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
                 btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
                 (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name);
             }
@@ -5717,7 +5995,7 @@
 void btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
 {
 
-    BTM_TRACE_DEBUG0 ("btm_sec_clear_ble_keys: Clearing BLE Keys");
+    BTM_TRACE_DEBUG ("btm_sec_clear_ble_keys: Clearing BLE Keys");
 #if (SMP_INCLUDED== TRUE)
     p_dev_rec->ble.key_type = 0;
     memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
@@ -5741,13 +6019,15 @@
     tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
     BOOLEAN is_bonded= FALSE;
 
+    if (p_dev_rec &&
 #if (SMP_INCLUDED== TRUE)
-    if (p_dev_rec && (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
+        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
+#endif
+         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
     {
         is_bonded = TRUE;
     }
-#endif
-    BTM_TRACE_DEBUG1 ("btm_sec_is_a_bonded_dev is_bonded=%d", is_bonded);
+    BTM_TRACE_DEBUG ("btm_sec_is_a_bonded_dev is_bonded=%d", is_bonded);
     return(is_bonded);
 }
 
@@ -5793,7 +6073,7 @@
     int i;
     if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS)
     {
-        BTM_TRACE_DEBUG0 ("LE bonded device not found");
+        BTM_TRACE_DEBUG ("LE bonded device not found");
         return found;
     }
 
@@ -5807,7 +6087,7 @@
             break;
         }
     }
-    BTM_TRACE_DEBUG1 ("btm_sec_find_bonded_dev=%d", found);
+    BTM_TRACE_DEBUG ("btm_sec_find_bonded_dev=%d", found);
 #endif
     return(found);
 }
diff --git a/stack/btu/btu_hcif.c b/stack/btu/btu_hcif.c
index 0081850..9ec8dd3 100644
--- a/stack/btu/btu_hcif.c
+++ b/stack/btu/btu_hcif.c
@@ -37,6 +37,9 @@
 #include "btm_api.h"
 #include "btm_int.h"
 
+extern void btm_process_cancel_complete(UINT8 status, UINT8 mode);
+extern void btm_ble_test_command_complete(UINT8 *p);
+
 // btla-specific ++
 #define LOG_TAG "BTLD"
 #if (defined(ANDROID_APP_INCLUDED) && (ANDROID_APP_INCLUDED == TRUE) && (!defined(LINUX_NATIVE)) )
@@ -133,9 +136,12 @@
 static void btu_ble_ll_conn_complete_evt (UINT8 *p, UINT16 evt_len);
 static void btu_ble_process_adv_pkt (UINT8 *p);
 static void btu_ble_read_remote_feat_evt (UINT8 *p);
-static void btu_ble_ll_conn_param_upd_evt (UINT8 *p);
+static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len);
 static void btu_ble_proc_ltk_req (UINT8 *p);
 static void btu_hcif_encryption_key_refresh_cmpl_evt (UINT8 *p);
+#if (BLE_LLT_INCLUDED == TRUE)
+static void btu_ble_rc_param_req_evt(UINT8 *p);
+#endif
     #endif
 /*******************************************************************************
 **
@@ -188,11 +194,6 @@
 #endif
        )
     {
-#if 0
-        BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-                    "Storing VSC callback opcode=0x%04x, Callback function=0x%07x",
-                    opcode, *(UINT32 *)(p_buf + 1));
-#endif
         memcpy ((UINT8 *)(p_cmd + 1), (UINT8 *)(p_buf + 1), sizeof(void *));
     }
 
@@ -401,8 +402,7 @@
         case HCI_BLE_EVENT:
             STREAM_TO_UINT8  (ble_sub_code, p);
 
-            BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "BLE HCI(id=%d) event = 0x%02x)",
-                        hci_evt_code,  ble_sub_code);
+            HCI_TRACE_EVENT("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code,  ble_sub_code);
 
             switch (ble_sub_code)
             {
@@ -413,7 +413,7 @@
                     btu_ble_ll_conn_complete_evt(p, hci_evt_len);
                     break;
                 case HCI_BLE_LL_CONN_PARAM_UPD_EVT:
-                    btu_ble_ll_conn_param_upd_evt(p);
+                    btu_ble_ll_conn_param_upd_evt(p, hci_evt_len);
                     break;
                 case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT:
                     btu_ble_read_remote_feat_evt(p);
@@ -421,6 +421,12 @@
                 case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */
                     btu_ble_proc_ltk_req(p);
                     break;
+#if (BLE_LLT_INCLUDED == TRUE)
+               case HCI_BLE_RC_PARAM_REQ_EVT:
+                    btu_ble_rc_param_req_evt(p);
+                    break;
+#endif
+
             }
             break;
 #endif /* BLE_INCLUDED */
@@ -498,7 +504,7 @@
             else
             {
                 /* Unknown controller */
-                BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(ctrl id=%d) controller ID not recognized", controller_id);
+                HCI_TRACE_WARNING("BTU HCI(ctrl id=%d) controller ID not recognized", controller_id);
                 GKI_freebuf(p_buf);;
             }
 
@@ -1100,7 +1106,7 @@
             break;
 
 #if (BLE_INCLUDED == TRUE)
-/* BLE Commands */
+/* BLE Commands sComplete*/
         case HCI_BLE_READ_WHITE_LIST_SIZE :
             btm_read_white_list_size_complete(p, evt_len);
             break;
@@ -1119,9 +1125,9 @@
 
         case HCI_BLE_RAND:
         case HCI_BLE_ENCRYPT:
-
             btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback);
             break;
+
         case HCI_BLE_READ_BUFFER_SIZE:
             btm_read_ble_buf_size_complete(p, evt_len);
             break;
@@ -1138,6 +1144,14 @@
             btm_ble_write_adv_enable_complete(p);
             break;
 
+        case HCI_BLE_READ_SUPPORTED_STATES:
+            btm_read_ble_local_supported_states_complete(p, evt_len);
+            break;
+
+        case HCI_BLE_CREATE_LL_CONN:
+            btm_ble_create_ll_conn_complete(*p);
+            break;
+
         case HCI_BLE_TRANSMITTER_TEST:
         case HCI_BLE_RECEIVER_TEST:
         case HCI_BLE_TEST_END:
@@ -1375,6 +1389,12 @@
                         btm_sec_encrypt_change (BTM_INVALID_HCI_HANDLE, status, FALSE);
                         break;
 
+#if BLE_INCLUDED == TRUE
+                    case HCI_BLE_CREATE_LL_CONN:
+                        btm_ble_create_ll_conn_complete(status);
+                        break;
+#endif
+
 #if BTM_SCO_INCLUDED == TRUE
                     case HCI_SETUP_ESCO_CONNECTION:
                         /* read handle out of stored command */
@@ -1504,8 +1524,7 @@
     }
     else
     {
-        BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING,
-                    "No command in queue matching opcode %d", opcode);
+        HCI_TRACE_WARNING("No command in queue matching opcode %d", opcode);
     }
 
     /* See if we can forward any more commands */
@@ -1533,7 +1552,7 @@
 #if (defined(BTU_CMD_CMPL_TOUT_DOUBLE_CHECK) && BTU_CMD_CMPL_TOUT_DOUBLE_CHECK == TRUE)
     if (!(p_hci_cmd_cb->checked_hcisu))
     {
-        BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(id=%d) command timeout - double check HCISU", controller_id);
+        HCI_TRACE_WARNING("BTU HCI(id=%d) command timeout - double check HCISU", controller_id);
 
         /* trigger HCISU to read any pending data in transport buffer */
         GKI_send_event(HCISU_TASK, HCISU_EVT_MASK);
@@ -1555,7 +1574,7 @@
     /* get queued command */
     if ((p_cmd = (BT_HDR *) GKI_dequeue (&(p_hci_cmd_cb->cmd_cmpl_q))) == NULL)
     {
-        BT_TRACE_0 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "Cmd timeout; no cmd in queue");
+        HCI_TRACE_WARNING("Cmd timeout; no cmd in queue");
         return;
     }
 
@@ -1578,7 +1597,7 @@
     if (controller_id == NFC_CONTROLLER_ID)
     {
         //TODO call nfc_ncif_cmd_timeout
-        BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU NCI command timeout - header 0x%02x%02x", p[0], p[1]);
+        HCI_TRACE_WARNING("BTU NCI command timeout - header 0x%02x%02x", p[0], p[1]);
         return;
     }
 #endif
@@ -1594,7 +1613,7 @@
     ALOGE("#");
     ALOGE("######################################################################");
 #else
-    BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "BTU HCI(id=%d) command timeout. opcode=0x%x", controller_id, opcode);
+    HCI_TRACE_WARNING("BTU HCI(id=%d) command timeout. opcode=0x%x", controller_id, opcode);
 #endif
 // btla-specific ++
 
@@ -1634,11 +1653,6 @@
                )
             {
                 p_cplt_cback = *((void **)(p_cmd + 1));
-#if 0
-                BT_TRACE_2 (TRACE_LAYER_HCI, TRACE_TYPE_DEBUG,
-                            "Restoring VSC callback for opcode=0x%04x, Callback function=0x%07x",
-                            opcode, (UINT32)p_cplt_cback);
-#endif
             }
 
             /* fake a command complete; first create a fake event */
@@ -1655,8 +1669,7 @@
      times, Bluetooth process will be killed and restarted */
     if (num_hci_cmds_timed_out >= BTM_MAX_HCI_CMD_TOUT_BEFORE_RESTART)
     {
-        BT_TRACE_1(TRACE_LAYER_HCI, TRACE_TYPE_ERROR,
-                  "Num consecutive HCI Cmd tout =%d Restarting BT process",num_hci_cmds_timed_out);
+        HCI_TRACE_ERROR("Num consecutive HCI Cmd tout =%d Restarting BT process",num_hci_cmds_timed_out);
 
         usleep(10000); /* 10 milliseconds */
         /* Killing the process to force a restart as part of fault tolerance */
@@ -1664,8 +1677,7 @@
     }
     else
     {
-        BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_WARNING, "HCI Cmd timeout counter %d",
-                    num_hci_cmds_timed_out);
+        HCI_TRACE_WARNING("HCI Cmd timeout counter %d", num_hci_cmds_timed_out);
 
         /* If anyone wants device status notifications, give him one */
         btm_report_device_status (BTM_DEV_STATUS_CMD_TOUT);
@@ -1685,7 +1697,7 @@
 *******************************************************************************/
 static void btu_hcif_hardware_error_evt (UINT8 *p)
 {
-    BT_TRACE_1 (TRACE_LAYER_HCI, TRACE_TYPE_ERROR, "Ctlr H/w error event - code:0x%x", *p);
+    HCI_TRACE_ERROR("Ctlr H/w error event - code:0x%x", *p);
 
     /* If anyone wants device status notifications, give him one. */
     btm_report_device_status (BTM_DEV_STATUS_DOWN);
@@ -2254,7 +2266,7 @@
 
 static void btu_ble_process_adv_pkt (UINT8 *p)
 {
-    BT_TRACE_0 (TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "btu_ble_process_adv_pkt");
+    HCI_TRACE_EVENT("btu_ble_process_adv_pkt");
 
     btm_ble_process_adv_pkt(p);
 }
@@ -2264,18 +2276,17 @@
     btm_ble_conn_complete(p, evt_len);
 }
 
-static void btu_ble_ll_conn_param_upd_evt (UINT8 *p)
+static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len)
 {
     /* LE connection update has completed successfully as a master. */
     /* We can enable the update request if the result is a success. */
     /* extract the HCI handle first */
     UINT8   status;
     UINT16  handle;
-    BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "btu_ble_ll_conn_param_upd_evt");
 
     STREAM_TO_UINT8  (status, p);
     STREAM_TO_UINT16 (handle, p);
-    L2CA_HandleConnUpdateEvent(handle, status);
+    l2cble_process_conn_update_evt(handle, status);
 }
 
 static void btu_ble_read_remote_feat_evt (UINT8 *p)
@@ -2299,5 +2310,21 @@
 /**********************************************
 ** End of BLE Events Handler
 ***********************************************/
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+static void btu_ble_rc_param_req_evt(UINT8 *p)
+{
+    UINT16 handle;
+    UINT16  int_min, int_max, latency, timeout;
+
+    STREAM_TO_UINT16(handle, p);
+    STREAM_TO_UINT16(int_min, p);
+    STREAM_TO_UINT16(int_max, p);
+    STREAM_TO_UINT16(latency, p);
+    STREAM_TO_UINT16(timeout, p);
+
+    l2cble_process_rc_param_request_evt(handle, int_min, int_max, latency, timeout);
+}
+#endif /* BLE_LLT_INCLUDED */
+
 #endif /* BLE_INCLUDED */
 
diff --git a/stack/btu/btu_init.c b/stack/btu/btu_init.c
index fe52361..c29d3e2 100644
--- a/stack/btu/btu_init.c
+++ b/stack/btu/btu_init.c
@@ -149,7 +149,7 @@
 *******************************************************************************/
 void btu_uipc_rx_cback(BT_HDR *p_msg)
 {
-    BT_TRACE_3 (TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, "btu_uipc_rx_cback event 0x%x, len %d, offset %d",
+    BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, "btu_uipc_rx_cback event 0x%x, len %d, offset %d",
 		p_msg->event, p_msg->len, p_msg->offset);
     GKI_send_msg(BTU_TASK, BTU_HCI_RCV_MBOX, p_msg);
 
diff --git a/stack/btu/btu_task.c b/stack/btu/btu_task.c
index 9c09214..16c671c 100644
--- a/stack/btu/btu_task.c
+++ b/stack/btu/btu_task.c
@@ -39,6 +39,7 @@
 #include "l2c_int.h"
 #include "btu.h"
 #include "bt_utils.h"
+#include <sys/prctl.h>
 
 #include "sdpint.h"
 
@@ -170,7 +171,7 @@
 
 #if (defined(HCISU_H4_INCLUDED) && HCISU_H4_INCLUDED == TRUE)
     /* wait an event that HCISU is ready */
-    BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_API,
+    BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API,
                 "btu_task pending for preload complete event");
 
     for (;;)
@@ -179,7 +180,7 @@
         if (event & EVENT_MASK(GKI_SHUTDOWN_EVT))
         {
             /* indicates BT ENABLE abort */
-            BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
+            BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
                         "btu_task start abort!");
             return (0);
         }
@@ -189,13 +190,13 @@
         }
         else
         {
-            BT_TRACE_1(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
+            BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_WARNING,
                 "btu_task ignore evt %04x while pending for preload complete",
                 event);
         }
     }
 
-    BT_TRACE_0(TRACE_LAYER_BTU, TRACE_TYPE_API,
+    BT_TRACE(TRACE_LAYER_BTU, TRACE_TYPE_API,
                 "btu_task received preload complete event");
 #endif
 
@@ -221,6 +222,8 @@
     /* Send a startup evt message to BTIF_TASK to kickstart the init procedure */
     GKI_send_event(BTIF_TASK, BT_EVT_TRIGGER_STACK_INIT);
 
+    prctl(PR_SET_NAME, (unsigned long)"BTU TASK", 0, 0, 0);
+
     raise_priority_a2dp(TASK_HIGH_BTU);
 
     /* Wait for, and process, events */
@@ -331,13 +334,32 @@
                         break;
 
                     case BT_EVT_TO_STOP_TIMER:
-                        if (btu_cb.timer_queue.p_first == NULL)
-                        {
+                        if (GKI_timer_queue_is_empty(&btu_cb.timer_queue)) {
                             GKI_stop_timer(TIMER_0);
                         }
                         GKI_freebuf (p_msg);
                         break;
 
+                    case BT_EVT_TO_START_TIMER_ONESHOT:
+                        if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+                            TIMER_LIST_ENT *tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+                            // Start non-repeating timer.
+                            GKI_start_timer(TIMER_3, tle->ticks, FALSE);
+                        } else {
+                            BTM_TRACE_WARNING("Oneshot timer queue empty when received start request");
+                        }
+                        GKI_freebuf(p_msg);
+                        break;
+
+                    case BT_EVT_TO_STOP_TIMER_ONESHOT:
+                        if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+                            GKI_stop_timer(TIMER_3);
+                        } else {
+                            BTM_TRACE_WARNING("Oneshot timer queue not empty when received stop request");
+                        }
+                        GKI_freebuf (p_msg);
+                        break;
+
 #if defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0)
                     case BT_EVT_TO_START_QUICK_TIMER :
                         GKI_start_timer (TIMER_2, QUICK_TIMER_TICKS, TRUE);
@@ -374,19 +396,17 @@
         }
 
 
-        if (event & TIMER_0_EVT_MASK)
-        {
-            TIMER_LIST_ENT  *p_tle;
-
+        if (event & TIMER_0_EVT_MASK) {
             GKI_update_timer_list (&btu_cb.timer_queue, 1);
 
-            while ((btu_cb.timer_queue.p_first) && (!btu_cb.timer_queue.p_first->ticks))
-            {
-                p_tle = btu_cb.timer_queue.p_first;
-                GKI_remove_from_timer_list (&btu_cb.timer_queue, p_tle);
+            while (!GKI_timer_queue_is_empty(&btu_cb.timer_queue)) {
+                TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue);
+                if (p_tle->ticks != 0)
+                    break;
 
-                switch (p_tle->event)
-                {
+                GKI_remove_from_timer_list(&btu_cb.timer_queue, p_tle);
+
+                switch (p_tle->event) {
                     case BTU_TTYPE_BTM_DEV_CTL:
                         btm_dev_timeout(p_tle);
                         break;
@@ -400,7 +420,6 @@
                     case BTU_TTYPE_L2CAP_HOLD:
                     case BTU_TTYPE_L2CAP_INFO:
                     case BTU_TTYPE_L2CAP_FCR_ACK:
-
                         l2c_process_timeout (p_tle);
                         break;
 
@@ -472,7 +491,8 @@
 #if (defined(BLE_INCLUDED) && BLE_INCLUDED == TRUE)
                     case BTU_TTYPE_BLE_INQUIRY:
                     case BTU_TTYPE_BLE_GAP_LIM_DISC:
-                    case BTU_TTYPE_BLE_RANDOM_ADDR:
+                    case BTU_TTYPE_BLE_GAP_FAST_ADV:
+                    case BTU_TTYPE_BLE_OBSERVE:
                         btm_ble_timeout(p_tle);
                         break;
 
@@ -560,6 +580,53 @@
         }
 #endif
 
+        if (event & TIMER_3_EVT_MASK) {
+            BTM_TRACE_API("Received oneshot timer event complete");
+            if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+                TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+                INT32 ticks_since_last_update = GKI_timer_ticks_getinitial(GKI_timer_getfirst(&btu_cb.timer_queue_oneshot));
+                GKI_update_timer_list(&btu_cb.timer_queue_oneshot, ticks_since_last_update);
+            }
+
+            while (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+                TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+                if (p_tle->ticks != 0)
+                    break;
+
+                GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
+
+                switch (p_tle->event) {
+#if (defined(BLE_INCLUDED) && BLE_INCLUDED == TRUE)
+                    case BTU_TTYPE_BLE_RANDOM_ADDR:
+                        btm_ble_timeout(p_tle);
+                        break;
+#endif
+
+                    case BTU_TTYPE_USER_FUNC:
+                        {
+                            tUSER_TIMEOUT_FUNC  *p_uf = (tUSER_TIMEOUT_FUNC *)p_tle->param;
+                            (*p_uf)(p_tle);
+                        }
+                        break;
+
+                    default:
+                        // FAIL
+                        BTM_TRACE_WARNING("Received unexpected oneshot timer event:0x%x\n",
+                            p_tle->event);
+                        break;
+                }
+            }
+
+            /* Update GKI timer with new tick value from first timer. */
+            if (!GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+                TIMER_LIST_ENT *p_tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+                if (p_tle->ticks > 0)
+                  GKI_start_timer(TIMER_3, p_tle->ticks, FALSE);
+            } else {
+                GKI_stop_timer(TIMER_3);
+            }
+        }
+
         if (event & EVENT_MASK(APPL_EVT_7))
             break;
     }
@@ -605,7 +672,8 @@
     GKI_remove_from_timer_list (&btu_cb.timer_queue, p_tle);
 
     p_tle->event = type;
-    p_tle->ticks = timeout;         /* Save the number of seconds for the timer */
+    p_tle->ticks = timeout;
+    p_tle->ticks_initial = timeout;
 
     GKI_add_to_timer_list (&btu_cb.timer_queue, p_tle);
     GKI_enable();
@@ -700,7 +768,8 @@
     GKI_remove_from_timer_list (&btu_cb.quick_timer_queue, p_tle);
 
     p_tle->event = type;
-    p_tle->ticks = timeout; /* Save the number of ticks for the timer */
+    p_tle->ticks = timeout;
+    p_tle->ticks_initial = timeout;
 
     GKI_add_to_timer_list (&btu_cb.quick_timer_queue, p_tle);
     GKI_enable();
@@ -783,84 +852,59 @@
 }
 #endif /* defined(QUICK_TIMER_TICKS_PER_SEC) && (QUICK_TIMER_TICKS_PER_SEC > 0) */
 
+/*
+ * Starts a oneshot timer with a timeout in seconds.
+ */
+void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_in_secs) {
+    INT32 timeout_in_ticks = GKI_SECS_TO_TICKS(timeout_in_secs);
+    BTM_TRACE_DEBUG("Starting oneshot timer type:%d timeout:%ds", type, timeout_in_secs);
+    GKI_disable();
+    if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+    }
 
+    GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
 
-void btu_register_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout, tBTU_TIMER_CALLBACK timer_cb)
-{
-    UINT8 i = 0;
-    INT8  first = -1;
-    for (; i < BTU_MAX_REG_TIMER; i++)
-    {
-        if (btu_cb.timer_reg[i].p_tle == NULL && first < 0)
-            first = i;
-        if (btu_cb.timer_reg[i].p_tle == p_tle)
-        {
-            btu_cb.timer_reg[i].timer_cb = timer_cb;
-            btu_start_timer(p_tle, type, timeout);
-            first = -1;
-            break;
+    p_tle->event = type;
+    p_tle->ticks = timeout_in_ticks;
+    p_tle->ticks_initial = timeout_in_ticks;
+
+    GKI_add_to_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
+    /* RPC to BTU thread if timer start request from non-BTU task */
+    if (GKI_get_taskid() != BTU_TASK) {
+        /* post event to start timer in BTU task */
+        BTM_TRACE_WARNING("Posting oneshot timer event to btu_task");
+        BT_HDR *p_msg = (BT_HDR *)GKI_getbuf(BT_HDR_SIZE);
+        if (p_msg != NULL) {
+            p_msg->event = BT_EVT_TO_START_TIMER_ONESHOT;
+            GKI_send_msg (BTU_TASK, TASK_MBOX_0, p_msg);
         }
+    } else {
+        TIMER_LIST_ENT *tle = GKI_timer_getfirst(&btu_cb.timer_queue_oneshot);
+        GKI_start_timer(TIMER_3, tle->ticks, FALSE);
     }
-
-    if (first >= 0 && first < BTU_MAX_REG_TIMER)
-    {
-        btu_cb.timer_reg[first].timer_cb = timer_cb;
-        btu_cb.timer_reg[first].p_tle = p_tle;
-        btu_start_timer(p_tle, type, timeout);
-    }
-
+    GKI_enable();
 }
 
+void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) {
+    GKI_disable();
+    GKI_remove_from_timer_list(&btu_cb.timer_queue_oneshot, p_tle);
 
-void btu_deregister_timer(TIMER_LIST_ENT *p_tle)
-{
-    UINT8 i = 0;
-
-    for (; i < BTU_MAX_REG_TIMER; i++)
-    {
-        if (btu_cb.timer_reg[i].p_tle == p_tle)
-        {
-            btu_stop_timer(p_tle);
-            btu_cb.timer_reg[i].timer_cb = NULL;
-            btu_cb.timer_reg[i].p_tle = NULL;
-            break;
+    if (GKI_get_taskid() != BTU_TASK) {
+        /* post event to stop timer in BTU task */
+        BT_HDR *p_msg = (BT_HDR *)GKI_getbuf(BT_HDR_SIZE);
+        if (p_msg != NULL) {
+            p_msg->event = BT_EVT_TO_STOP_TIMER_ONESHOT;
+            GKI_send_msg (BTU_TASK, TASK_MBOX_0, p_msg);
+        }
+    } else {
+        if (GKI_timer_queue_is_empty(&btu_cb.timer_queue_oneshot)) {
+            BTM_TRACE_WARNING("Stopping oneshot timer");
+            GKI_stop_timer(TIMER_3);
+        } else {
+            BTM_TRACE_WARNING("Request to stop oneshot timer with non empty queue");
         }
     }
-}
-
-void btu_register_event_range (UINT16 start, tBTU_EVENT_CALLBACK event_cb)
-{
-    UINT8 i = 0;
-    INT8  first = -1;
-
-    for (; i < BTU_MAX_REG_EVENT; i++)
-    {
-        if (btu_cb.event_reg[i].event_cb == NULL && first < 0)
-            first = i;
-
-        if (btu_cb.event_reg[i].event_range == start)
-        {
-            btu_cb.event_reg[i].event_cb = event_cb;
-
-            if (!event_cb)
-                btu_cb.event_reg[i].event_range = 0;
-
-            first = -1;
-        }
-    }
-
-    /* if not deregistering && an empty index was found in range, register */
-    if (event_cb && first >= 0 && first < BTU_MAX_REG_EVENT)
-    {
-        btu_cb.event_reg[first].event_range = start;
-        btu_cb.event_reg[first].event_cb = event_cb;
-    }
-}
-
-
-void btu_deregister_event_range (UINT16 range)
-{
-    btu_register_event_range(range, NULL);
+    GKI_enable();
 }
 
 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
diff --git a/stack/gap/gap_api.c b/stack/gap/gap_api.c
index fb90d03..530d141 100644
--- a/stack/gap/gap_api.c
+++ b/stack/gap/gap_api.c
@@ -348,7 +348,7 @@
     }
     else
     {
-        GAP_TRACE_ERROR1 ("GAP_SetPairableMode: illegal mode %d", mode);
+        GAP_TRACE_ERROR ("GAP_SetPairableMode: illegal mode %d", mode);
         status = GAP_ERR_ILL_MODE;
     }
     return (status);
@@ -604,13 +604,13 @@
         memcpy(p_results, &gap_cb.cur_inqptr->results, sizeof(tBTM_INQ_RESULTS));
 
         ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
-        GAP_TRACE_EVENT6("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
+        GAP_TRACE_EVENT("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
                     ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
         return(BT_PASS);
     }
     else
     {
-        GAP_TRACE_EVENT0("GAP_FirstInqResults:  No BD_ADDRs Found");
+        GAP_TRACE_EVENT("GAP_FirstInqResults:  No BD_ADDRs Found");
         memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
         return(GAP_EOINQDB);
     }
@@ -643,14 +643,14 @@
                    sizeof(tGAP_INQ_RESULTS));
 
             ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
-            GAP_TRACE_EVENT6("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
+            GAP_TRACE_EVENT("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
                         ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
 
             return(BT_PASS);
         }
         else
         {
-            GAP_TRACE_EVENT0("GAP_NextInqResults:  No BD_ADDRs Found");
+            GAP_TRACE_EVENT("GAP_NextInqResults:  No BD_ADDRs Found");
             memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
             return(GAP_EOINQDB);
         }
@@ -734,7 +734,7 @@
         p_cb->gap_cback = callback;
         p_cb->event = GAP_EVT_REM_NAME_COMPLETE;     /* Return event expected */
 
-        btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index]);
+        btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index], BT_TRANSPORT_BR_EDR);
 
         /* If the name was not returned immediately, or if an error occurred, release the control block */
         if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
diff --git a/stack/gap/gap_ble.c b/stack/gap/gap_ble.c
index d44577d..78a7819 100644
--- a/stack/gap/gap_ble.c
+++ b/stack/gap/gap_ble.c
@@ -57,7 +57,8 @@
 static void gap_ble_s_attr_request_cback (UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE op_code, tGATTS_DATA *p_data);
 
 /* client connection callback */
-static void  gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void  gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+                                            tGATT_DISCONN_REASON reason, tGATT_TRANSPORT transport);
 static void  gap_ble_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
 
 static tGATT_CBACK gap_cback =
@@ -67,6 +68,7 @@
     NULL,
     NULL,
     gap_ble_s_attr_request_cback,
+    NULL,
     NULL
 };
 
@@ -196,7 +198,7 @@
     tGAP_CLCB       *p_clcb;
     UINT16          i;
 
-    GAP_TRACE_EVENT2 ("gap_get_conn_id_if_connected() - BDA: %08x%04x ",
+    GAP_TRACE_EVENT ("gap_get_conn_id_if_connected() - BDA: %08x%04x ",
                       (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                       (bd_addr[4]<<8)+bd_addr[5]);
 
@@ -209,69 +211,10 @@
     }
 
     /* If here, failed to allocate a client control block */
-    GATT_TRACE_DEBUG0 ("gap_get_conn_id_if_connected: not connected");
+    GATT_TRACE_DEBUG ("gap_get_conn_id_if_connected: not connected");
     return(GATT_INVALID_CONN_ID);
 }
 
-/*******************************************************************************
-**
-** Function         gap_ble_enqueue_op
-**
-** Description      enqueue a GAP operation when GAP client is busy
-**
-** Returns          void
-**
-*******************************************************************************/
-void gap_ble_enqueue_op( tGAP_CLCB * p_clcb, UINT8 op, BD_ADDR reconn_addr, UINT8 privacy_flag, void *p_cback)
-{
-    tGAP_BLE_PENDING_OP  *p_op = (tGAP_BLE_PENDING_OP *)GKI_getbuf(sizeof(tGAP_BLE_PENDING_OP));
-
-    if (p_op != NULL)
-    {
-        p_op->op = op;
-        p_op->p_pending_cback = p_cback;
-
-        if (op == GATT_SET_GAP_PRIVACY_FLAG)
-            p_op->pending_data.privacy_flag = privacy_flag;
-        else if (op == GATT_UPDATE_RECONN_ADDR)
-            memcpy(p_op->pending_data.reconn_addr, reconn_addr, BD_ADDR_LEN);
-
-        GKI_enqueue(&p_clcb->pending_op_q, p_op);
-    }
-}
-
-/*******************************************************************************
-**
-** Function         gap_ble_process_pending_op
-**
-** Description      get next pending operation and process it
-**
-** Returns          void
-**
-*******************************************************************************/
-static BOOLEAN gap_ble_process_pending_op(tGAP_CLCB *p_clcb)
-{
-    tGAP_BLE_PENDING_OP *p_pending_op = (tGAP_BLE_PENDING_OP *)GKI_dequeue(&p_clcb->pending_op_q);
-    BOOLEAN         started = FALSE;
-
-    if (p_pending_op != NULL)
-    {
-        if (p_pending_op->op == GATT_UPDATE_RECONN_ADDR)
-        {
-            GAP_BleUpdateReconnectAddr( p_clcb->bda,
-                                        p_pending_op->pending_data.reconn_addr,
-                                        (tGAP_BLE_RECONN_ADDR_CBACK *)p_pending_op->p_pending_cback);
-            started = TRUE;
-        }
-        GKI_freebuf(p_pending_op);
-    }
-    else
-    {
-        GAP_TRACE_EVENT0("No pending operation");
-    }
-
-    return started;
-}
 
 /*******************************************************************************
 **   GAP Attributes Database Request callback
@@ -307,7 +250,7 @@
                         p_value->len -= offset;
                         p_dev_name += offset;
                         ARRAY_TO_STREAM(p, p_dev_name, p_value->len);
-                        GAP_TRACE_EVENT1("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len);
+                        GAP_TRACE_EVENT("GATT_UUID_GAP_DEVICE_NAME len=0x%04x", p_value->len);
                     }
                     break;
 
@@ -316,16 +259,6 @@
                     p_value->len = 2;
                     break;
 
-                case GATT_UUID_GAP_PRIVACY_FLAG:
-                    UINT8_TO_STREAM(p, p_db_attr->attr_value.privacy);
-                    p_value->len = 1;
-                    break;
-
-                case GATT_UUID_GAP_RECONN_ADDR:
-                    p_value->len = BD_ADDR_LEN;
-                    BDADDR_TO_STREAM(p, p_db_attr->attr_value.reconn_bda);
-                    break;
-
                 case GATT_UUID_GAP_PREF_CONN_PARAM:
                     UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_min); /* int_min */
                     UINT16_TO_STREAM(p, p_db_attr->attr_value.conn_param.int_max); /* int_max */
@@ -357,18 +290,6 @@
 
     return status;
 }
-BOOLEAN gap_read_local_reconn_addr(BD_ADDR_PTR reconn_bda)
-{
-    BD_ADDR dummy_bda = {0};
-
-    if (memcmp(gap_cb.reconn_bda, dummy_bda, BD_ADDR_LEN) != 0)
-    {
-        memcpy(reconn_bda, gap_cb.reconn_bda, BD_ADDR_LEN);
-        return TRUE;
-    }
-    else
-        return FALSE;
-}
 
 /******************************************************************************
 **
@@ -389,26 +310,7 @@
     {
         if (p_data-> handle == p_db_attr->handle)
         {
-            if (p_data->offset != 0) return GATT_NOT_LONG;
-            if (p_data->is_prep) return GATT_REQ_NOT_SUPPORTED;
-
-/* DO NOT SUPPORT RECONNECTION ADDRESS FOR NOW
-
-            if (p_db_attr->uuid == GATT_UUID_GAP_RECONN_ADDR)
-            {
-                if (!btm_cb.ble_ctr_cb.privacy)
-                    return GATT_WRITE_NOT_PERMIT;
-                if (p_data->len != BD_ADDR_LEN) return GATT_INVALID_ATTR_LEN;
-
-                STREAM_TO_BDADDR(p_db_attr->attr_value.reconn_bda, p);
-                // write direct connection address
-                memcpy(&gap_cb.reconn_bda, p_db_attr->attr_value.reconn_bda, BD_ADDR_LEN);
-
-                return GATT_SUCCESS;
-            }
-            else
-*/
-            return GATT_WRITE_NOT_PERMIT;
+                return GATT_WRITE_NOT_PERMIT;
         }
     }
     return GATT_NOT_FOUND;
@@ -431,7 +333,7 @@
     tGATTS_RSP  rsp_msg;
     BOOLEAN     ignore = FALSE;
 
-    GAP_TRACE_EVENT1("gap_ble_s_attr_request_cback : recv type (0x%02x)", type);
+    GAP_TRACE_EVENT("gap_ble_s_attr_request_cback : recv type (0x%02x)", type);
 
     memset(&rsp_msg, 0, sizeof(tGATTS_RSP));
 
@@ -450,16 +352,16 @@
 
         case GATTS_REQ_TYPE_WRITE_EXEC:
             ignore = TRUE;
-            GAP_TRACE_EVENT0("Ignore GATTS_REQ_TYPE_WRITE_EXEC"  );
+            GAP_TRACE_EVENT("Ignore GATTS_REQ_TYPE_WRITE_EXEC"  );
             break;
 
         case GATTS_REQ_TYPE_MTU:
-            GAP_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+            GAP_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
             ignore = TRUE;
             break;
 
         default:
-            GAP_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+            GAP_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
             break;
     }
 
@@ -495,7 +397,7 @@
     /* Create a GAP service */
     service_handle = GATTS_CreateService (gap_cb.gatt_if, &uuid, 0, GAP_MAX_ATTR_NUM, TRUE);
 
-    GAP_TRACE_EVENT1 ("gap_attr_db_init service_handle = %d", service_handle);
+    GAP_TRACE_EVENT ("gap_attr_db_init service_handle = %d", service_handle);
 
     /* add Device Name Characteristic
     */
@@ -513,12 +415,27 @@
                                                 GATT_CHAR_PROP_BIT_READ);
     p_db_attr ++;
 
+#if BTM_PERIPHERAL_ENABLED == TRUE       /* Only needed for peripheral testing */
+    /* add preferred connection parameter characteristic
+    */
+    uuid.uu.uuid16 = p_db_attr->uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
+    p_db_attr->attr_value.conn_param.int_max = GAP_PREFER_CONN_INT_MAX; /* 6 */
+    p_db_attr->attr_value.conn_param.int_min = GAP_PREFER_CONN_INT_MIN; /* 0 */
+    p_db_attr->attr_value.conn_param.latency = GAP_PREFER_CONN_LATENCY; /* 0 */
+    p_db_attr->attr_value.conn_param.sp_tout = GAP_PREFER_CONN_SP_TOUT; /* 2000 */
+    p_db_attr->handle = GATTS_AddCharacteristic(service_handle,
+                                                &uuid,
+                                                GATT_PERM_READ,
+                                                GATT_CHAR_PROP_BIT_READ);
+    p_db_attr ++;
+#endif
+
     /* start service now */
     memset (&app_uuid.uu.uuid128, 0x81, LEN_UUID_128);
 
     status = GATTS_StartService(gap_cb.gatt_if, service_handle, GAP_TRANSPORT_SUPPORTED );
 
-    GAP_TRACE_EVENT3 ("GAP App gatt_if: %d  s_hdl = %d start_status=%d",
+    GAP_TRACE_EVENT ("GAP App gatt_if: %d  s_hdl = %d start_status=%d",
                       gap_cb.gatt_if, service_handle, status);
 
 
@@ -539,13 +456,13 @@
     tGAP_ATTR  *p_db_attr = gap_cb.gatt_attr;
     UINT8       i = 0;
 
-    GAP_TRACE_EVENT1("GAP_BleAttrDBUpdate attr_uuid=0x%04x", attr_uuid);
+    GAP_TRACE_EVENT("GAP_BleAttrDBUpdate attr_uuid=0x%04x", attr_uuid);
 
     for (i = 0; i < GAP_MAX_CHAR_NUM; i ++, p_db_attr ++)
     {
         if (p_db_attr->uuid == attr_uuid)
         {
-            GAP_TRACE_EVENT1("Found attr_uuid=0x%04x", attr_uuid);
+            GAP_TRACE_EVENT("Found attr_uuid=0x%04x", attr_uuid);
 
             switch (attr_uuid)
             {
@@ -583,22 +500,19 @@
     tGAP_BLE_DEV_NAME_CBACK *p_dev_name_cback = (tGAP_BLE_DEV_NAME_CBACK *)(p_clcb->p_cback);
     UINT16                  op = p_clcb->cl_op_uuid;
 
-    GAP_TRACE_EVENT1("gap_ble_cl_op_cmpl status: %d", status);
+    GAP_TRACE_EVENT("gap_ble_cl_op_cmpl status: %d", status);
 
     p_clcb->cl_op_uuid = 0;
     p_clcb->p_cback=NULL;
 
     if (p_dev_name_cback)
     {
-        GAP_TRACE_EVENT0("calling gap_ble_cl_op_cmpl");
+        GAP_TRACE_EVENT("calling gap_ble_cl_op_cmpl");
 
         if (op == GATT_UUID_GAP_DEVICE_NAME)
             (* p_dev_name_cback)(status, p_clcb->bda, len, (char *)p_name);
     }
 
-    if (!gap_ble_process_pending_op(p_clcb) &&
-        p_clcb->cl_op_uuid == 0)
-        GATT_Disconnect(p_clcb->conn_id);
 
 }
 
@@ -612,13 +526,16 @@
 **
 *******************************************************************************/
 static void gap_ble_c_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
-                                     BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                     BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                     tGATT_TRANSPORT transport)
 {
     tGAP_CLCB   *p_clcb = gap_find_clcb_by_bd_addr (bda);
     UINT16      cl_op_uuid;
-    UNUSED(gatt_if);
 
-    GAP_TRACE_EVENT5 ("gap_ble_c_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+    UNUSED(gatt_if);
+    UNUSED(transport);
+
+    GAP_TRACE_EVENT ("gap_ble_c_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
                       (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
                       (bda[4]<<8)+bda[5], connected, conn_id, reason);
 
@@ -629,16 +546,13 @@
         {
             if ((p_clcb = gap_clcb_alloc(conn_id, bda))== NULL)
             {
-                GAP_TRACE_ERROR0 ("gap_ble_c_connect_cback: no_resource");
+                GAP_TRACE_ERROR ("gap_ble_c_connect_cback: no_resource");
                 return;
             }
         }
         p_clcb->conn_id = conn_id;
         p_clcb->connected = TRUE;
 
-        /* Do not use reconnection address for now -->
-          check privacy enabled? set reconnect address
-        btm_ble_update_reconnect_address(bda);*/
     }
     else
     {
@@ -650,7 +564,7 @@
     {
         cl_op_uuid = p_clcb->cl_op_uuid;
 
-        GAP_TRACE_EVENT1 ("cl_op_uuid=0x%04x", cl_op_uuid  );
+        GAP_TRACE_EVENT ("cl_op_uuid=0x%04x", cl_op_uuid  );
 
         if (p_clcb->connected)
         {
@@ -659,6 +573,10 @@
             {
                 GAP_BleReadPeerDevName (bda, (tGAP_BLE_DEV_NAME_CBACK *)p_clcb->p_cback);
             }
+            else if (cl_op_uuid == GATT_UUID_GAP_PREF_CONN_PARAM)
+            {
+                 GAP_BleReadPeerPrefConnParams(bda);
+            }
         }
         /* current link disconnect */
         else
@@ -693,9 +611,9 @@
 
     op_type = p_clcb->cl_op_uuid;
 
-    GAP_TRACE_EVENT3 ("gap_ble_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x  read_type: 0x%04x", op, status, op_type);
+    GAP_TRACE_EVENT ("gap_ble_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x  read_type: 0x%04x", op, status, op_type);
     /* Currently we only issue read commands */
-    if (op != GATTC_OPTYPE_READ && op != GATTC_OPTYPE_WRITE)
+    if (op != GATTC_OPTYPE_READ)
         return;
 
     if (status != GATT_SUCCESS)
@@ -709,7 +627,7 @@
     switch (op_type)
     {
         case GATT_UUID_GAP_PREF_CONN_PARAM:
-            GAP_TRACE_EVENT0 ("GATT_UUID_GAP_PREF_CONN_PARAM");
+            GAP_TRACE_EVENT ("GATT_UUID_GAP_PREF_CONN_PARAM");
             /* Extract the peripheral preferred connection parameters and save them */
 
             STREAM_TO_UINT16 (min, pp);
@@ -723,7 +641,7 @@
             break;
 
         case GATT_UUID_GAP_DEVICE_NAME:
-            GAP_TRACE_EVENT0 ("GATT_UUID_GAP_DEVICE_NAME");
+            GAP_TRACE_EVENT ("GATT_UUID_GAP_DEVICE_NAME");
             len = (UINT16)strlen((char *)pp);
             if (len > GAP_CHAR_DEV_NAME_SIZE)
                 len = GAP_CHAR_DEV_NAME_SIZE;
@@ -731,7 +649,6 @@
             break;
         case GATT_UUID_GAP_ICON:
             break;
-
     }
 }
 
@@ -758,7 +675,7 @@
 
     if (GATTC_Read(p_clcb->conn_id, GATT_READ_BY_TYPE, &param) != GATT_SUCCESS)
     {
-        GAP_TRACE_ERROR0 ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
+        GAP_TRACE_ERROR ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
         /* release the link here */
         GATT_Disconnect(p_clcb->conn_id);
         return(FALSE);
@@ -791,13 +708,13 @@
     {
         if ((p_clcb = gap_clcb_alloc(0, peer_bda)) == NULL)
         {
-            GAP_TRACE_ERROR0("GAP_BleReadPeerPrefConnParams max connection reached");
+            GAP_TRACE_ERROR("GAP_BleReadPeerPrefConnParams max connection reached");
             return FALSE;
         }
         p_clcb->connected = FALSE;
     }
 
-    GAP_TRACE_API3 ("GAP_BleReadPeerPrefConnParams() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
+    GAP_TRACE_API ("GAP_BleReadPeerPrefConnParams() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
                     (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
                     (peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
 
@@ -806,18 +723,20 @@
         return(FALSE);
 
     /* hold the link here */
-    GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
-
-    if (p_clcb->connected)
+    if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE))
     {
-    return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL);
+
+        if (p_clcb->connected)
+        {
+            return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_PREF_CONN_PARAM, NULL);
+        }
+        /* Mark currently active operation */
+        p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
+
+        return(TRUE);
     }
-    /* Mark currently active operation */
-    p_clcb->cl_op_uuid = GATT_UUID_GAP_PREF_CONN_PARAM;
-
-    return(TRUE);
-
-
+    else
+        return FALSE;
 }
 
 /*******************************************************************************
@@ -839,14 +758,14 @@
     if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL)
     {
         if ((p_clcb = gap_clcb_alloc(0, peer_bda)) == NULL)
-    {
-        GAP_TRACE_ERROR0("GAP_BleReadPeerDevName max connection reached");
+        {
+            GAP_TRACE_ERROR("GAP_BleReadPeerDevName max connection reached");
             return FALSE;
-    }
+        }
         p_clcb->connected = FALSE;
     }
 
-    GAP_TRACE_EVENT3 ("GAP_BleReadPeerDevName() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
+    GAP_TRACE_EVENT ("GAP_BleReadPeerDevName() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
                       (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
                       (peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
 
@@ -855,21 +774,26 @@
         return(FALSE);
 
     /* hold the link here */
-    GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
 
-    if (p_clcb->connected)
+    if (GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE, BT_TRANSPORT_LE))
     {
-        return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback);
+        if (p_clcb->connected)
+        {
+            return gap_ble_cl_read_request(p_clcb, GATT_UUID_GAP_DEVICE_NAME, (void *)p_cback);
+        }
+
+        p_clcb->p_cback = (void *)p_cback;
+        /* Mark currently active operation */
+        p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME;
+
+
+        return(TRUE);
     }
-
-    p_clcb->p_cback = (void *)p_cback;
-    /* Mark currently active operation */
-    p_clcb->cl_op_uuid = GATT_UUID_GAP_DEVICE_NAME;
-
-
-    return(TRUE);
+    else
+        return FALSE;
 }
 
+
 /*******************************************************************************
 **
 ** Function         GAP_BleCancelReadPeerDevName
@@ -883,13 +807,13 @@
 {
     tGAP_CLCB *p_clcb = gap_find_clcb_by_bd_addr (peer_bda);
 
-    GAP_TRACE_EVENT3 ("GAP_BleCancelReadPeerDevName() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
+    GAP_TRACE_EVENT ("GAP_BleCancelReadPeerDevName() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
                       (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
                       (peer_bda[4]<<8)+peer_bda[5], (p_clcb == NULL)? 0 : p_clcb->cl_op_uuid);
 
     if (p_clcb == NULL || p_clcb->cl_op_uuid != GATT_UUID_GAP_DEVICE_NAME)
     {
-        GAP_TRACE_ERROR0 ("Cannot cancel current op is not get dev name");
+        GAP_TRACE_ERROR ("Cannot cancel current op is not get dev name");
         return FALSE;
     }
 
@@ -897,7 +821,7 @@
     {
         if (!GATT_CancelConnect(gap_cb.gatt_if, peer_bda, TRUE))
         {
-            GAP_TRACE_ERROR0 ("Cannot cancel where No connection id");
+            GAP_TRACE_ERROR ("Cannot cancel where No connection id");
             return FALSE;
         }
     }
@@ -907,73 +831,6 @@
     return(TRUE);
 }
 
-/*******************************************************************************
-**
-** Function         GAP_BleUpdateReconnectAddr
-**
-** Description      Start a process to udpate the reconnect address if remote devive
-**                  has privacy enabled.
-**
-** Returns          TRUE if read started, else FALSE if GAP is busy
-**
-*******************************************************************************/
-BOOLEAN GAP_BleUpdateReconnectAddr (BD_ADDR peer_bda, BD_ADDR reconn_addr,
-                                    tGAP_BLE_RECONN_ADDR_CBACK *p_cback)
-{
-    tGAP_CLCB         *p_clcb;
-    tGATT_DISC_PARAM   param;
-
-    if (p_cback == NULL)
-        return(FALSE);
-
-    /* This function should only be called if there is a connection to  */
-    /* the peer. Get a client handle for that connection.               */
-    if ((p_clcb = gap_find_clcb_by_bd_addr (peer_bda)) == NULL ||
-        !p_clcb->connected)
-    {
-        GAP_TRACE_ERROR0("No connection, can not update reconnect address");
-        return(FALSE);
-    }
-
-    GAP_TRACE_API3 ("GAP_BleUpdateReconnectAddr() - BDA: %08x%04x  cl_op_uuid: 0x%04x",
-                    (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
-                    (peer_bda[4]<<8)+peer_bda[5], p_clcb->cl_op_uuid);
-
-    /* For now we only handle one at a time */
-    if (p_clcb->cl_op_uuid != 0)
-    {
-        gap_ble_enqueue_op(p_clcb, GATT_UPDATE_RECONN_ADDR, reconn_addr, 0, (void *)p_cback);
-        return(FALSE);
-    }
-
-    /* hold the link here */
-    GATT_Connect(gap_cb.gatt_if, p_clcb->bda, TRUE);
-
-    memset(&param, 0, sizeof(tGATT_DISC_PARAM));
-
-    param.service.len       = LEN_UUID_16;
-    param.service.uu.uuid16 = GATT_UUID_GAP_RECONN_ADDR;
-    param.s_handle          = 1;
-    param.e_handle          = 0xFFFF;
-
-    if (GATTC_Discover(p_clcb->conn_id, GATT_DISC_CHAR, &param) != GATT_SUCCESS)
-    {
-        GAP_TRACE_ERROR0 ("GAP_BleReadPeerPrefConnParams: GATT_Read Failed");
-        /* release the link here */
-        GATT_Disconnect(p_clcb->conn_id);
-        return(FALSE);
-    }
-    else
-    {
-        p_clcb->p_cback     = (void *)p_cback;
-        memcpy(p_clcb->reconn_addr, reconn_addr, BD_ADDR_LEN);
-        p_clcb->cl_op_uuid  = GATT_UUID_GAP_RECONN_ADDR;
-    }
-
-    return TRUE;
-
-}
-
 #endif  /* BLE_INCLUDED */
 
 
diff --git a/stack/gap/gap_conn.c b/stack/gap/gap_conn.c
index 44bb5ec..d1e96d8 100644
--- a/stack/gap/gap_conn.c
+++ b/stack/gap/gap_conn.c
@@ -127,7 +127,7 @@
     UINT16       cid;
     tBT_UUID    bt_uuid = {2, {GAP_PROTOCOL_ID}};
 
-    GAP_TRACE_EVENT0 ("GAP_CONN - Open Request");
+    GAP_TRACE_EVENT ("GAP_CONN - Open Request");
 
     /* Allocate a new CCB. Return if none available. */
     if ((p_ccb = gap_allocate_ccb()) == NULL)
@@ -152,7 +152,7 @@
     if (!p_ccb->rem_addr_specified && !is_server)
     {
         gap_release_ccb (p_ccb);
-        GAP_TRACE_ERROR0 ("GAP ERROR: Client must specify a remote BD ADDR to connect to!");
+        GAP_TRACE_ERROR ("GAP ERROR: Client must specify a remote BD ADDR to connect to!");
         return (GAP_INVALID_HANDLE);
     }
 
@@ -178,7 +178,7 @@
     /* Register the PSM with L2CAP */
     if ((p_ccb->psm = L2CA_REGISTER (psm, &gap_cb.conn.reg_info, AMP_AUTOSWITCH_ALLOWED|AMP_USE_AMP_IF_POSSIBLE)) == 0)
     {
-        GAP_TRACE_ERROR1 ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm);
+        GAP_TRACE_ERROR ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm);
         gap_release_ccb (p_ccb);
         return (GAP_INVALID_HANDLE);
     }
@@ -187,7 +187,7 @@
     p_ccb->service_id = service_id;
     if (!BTM_SetSecurityLevel ((UINT8)!is_server, p_serv_name, p_ccb->service_id, security, p_ccb->psm, 0, 0))
     {
-        GAP_TRACE_ERROR0 ("GAP_CONN - Security Error");
+        GAP_TRACE_ERROR ("GAP_CONN - Security Error");
         gap_release_ccb (p_ccb);
         return (GAP_INVALID_HANDLE);
     }
@@ -254,7 +254,7 @@
 {
     tGAP_CCB    *p_ccb = gap_find_ccb_by_handle (gap_handle);
 
-    GAP_TRACE_EVENT1 ("GAP_CONN - close  handle: 0x%x", gap_handle);
+    GAP_TRACE_EVENT ("GAP_CONN - close  handle: 0x%x", gap_handle);
 
     if (p_ccb)
     {
@@ -337,7 +337,7 @@
 
     GKI_enable();
 
-    GAP_TRACE_EVENT2 ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d",
+    GAP_TRACE_EVENT ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d",
                                        p_ccb->rx_queue_size, *p_len);
 
     return (BT_PASS);
@@ -374,7 +374,7 @@
     else
         rc = GAP_INVALID_HANDLE;
 
-    GAP_TRACE_EVENT2 ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d",
+    GAP_TRACE_EVENT ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d",
                                        rc , *p_rx_queue_count);
 
     return (rc);
@@ -538,7 +538,7 @@
         max_len -= p_buf->len;
         p_data  += p_buf->len;
 
-        GAP_TRACE_EVENT1 ("GAP_WriteData %d bytes", p_buf->len);
+        GAP_TRACE_EVENT ("GAP_WriteData %d bytes", p_buf->len);
 
         GKI_enqueue (&p_ccb->tx_queue, p_buf);
     }
@@ -652,18 +652,18 @@
 {
     tGAP_CCB    *p_ccb = gap_find_ccb_by_handle (gap_handle);
 
-    GAP_TRACE_EVENT1 ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle);
+    GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle);
 
     if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING))
     {
-        GAP_TRACE_EVENT6("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \
+        GAP_TRACE_EVENT("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \
                          p_ccb->rem_dev_address[0],p_ccb->rem_dev_address[1],p_ccb->rem_dev_address[2],
                          p_ccb->rem_dev_address[3],p_ccb->rem_dev_address[4],p_ccb->rem_dev_address[5]);
         return (p_ccb->rem_dev_address);
     }
     else
     {
-        GAP_TRACE_EVENT0 ("GAP_ConnGetRemoteAddr return Error ");
+        GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr return Error ");
         return (NULL);
     }
 }
@@ -742,9 +742,9 @@
 
     if (xx == GAP_MAX_CONNECTIONS)
     {
-        GAP_TRACE_WARNING0("*******");
-        GAP_TRACE_WARNING0("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting");
-        GAP_TRACE_WARNING0("*******");
+        GAP_TRACE_WARNING("*******");
+        GAP_TRACE_WARNING("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting");
+        GAP_TRACE_WARNING("*******");
 
         /* Disconnect because it is an unexpected connection */
         L2CA_DISCONNECT_REQ (l2cap_cid);
@@ -761,7 +761,7 @@
     /* Send response to the L2CAP layer. */
     L2CA_CONNECT_RSP (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK, &p_ccb->ertm_info, &bt_uuid);
 
-    GAP_TRACE_EVENT1("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id);
+    GAP_TRACE_EVENT("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id);
 
     /* Send a Configuration Request. */
     L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg);
@@ -779,7 +779,7 @@
 *******************************************************************************/
 static void gap_checks_con_flags (tGAP_CCB    *p_ccb)
 {
-    GAP_TRACE_EVENT1 ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags);
+    GAP_TRACE_EVENT ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags);
     /* if all the required con_flags are set, report the OPEN event now */
     if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE)
     {
@@ -799,12 +799,13 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gap_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void gap_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tGAP_CCB *p_ccb = (tGAP_CCB *)p_ref_data;
     UNUSED(bd_addr);
+    UNUSED (transport);
 
-    GAP_TRACE_EVENT3 ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d",
+    GAP_TRACE_EVENT ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d",
         p_ccb->con_state, p_ccb->con_flags, res);
     if (p_ccb->con_state == GAP_CCB_STATE_IDLE)
         return;
@@ -968,7 +969,7 @@
 {
     tGAP_CCB    *p_ccb;
 
-    GAP_TRACE_EVENT1 ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+    GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
 
     /* Find CCB based on CID */
     if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL)
@@ -1008,7 +1009,7 @@
 
         p_ccb->rx_queue_size += p_msg->len;
         /*
-        GAP_TRACE_EVENT2 ("gap_data_ind - rx_queue_size=%d, msg len=%d",
+        GAP_TRACE_EVENT ("gap_data_ind - rx_queue_size=%d, msg len=%d",
                                        p_ccb->rx_queue_size, p_msg->len);
          */
 
@@ -1036,7 +1037,7 @@
     BT_HDR      *p_buf;
     UINT8        status;
 
-    GAP_TRACE_EVENT2 ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x",
+    GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x",
                       is_congested, lcid);
 
     /* Find CCB based on CID */
@@ -1218,7 +1219,7 @@
     }
     else
     {
-        GAP_TRACE_ERROR0("Unable to allocate message buffer for event.");
+        GAP_TRACE_ERROR("Unable to allocate message buffer for event.");
     }
 }
 
diff --git a/stack/gap/gap_utils.c b/stack/gap/gap_utils.c
index 866ad7a..3ef893d 100644
--- a/stack/gap/gap_utils.c
+++ b/stack/gap/gap_utils.c
@@ -58,18 +58,18 @@
 
             p_data = &inq_cmpl;
 
-            GAP_TRACE_EVENT2("   GAP Inquiry Complete Event (Status 0x%04x, Result(s) %d)",
+            GAP_TRACE_EVENT("   GAP Inquiry Complete Event (Status 0x%04x, Result(s) %d)",
                             inq_cmpl.status, inq_cmpl.num_results);
             break;
 
         case GAP_EVT_DISCOVERY_COMPLETE:
             if (*((UINT16 *) p_data))
             {
-                GAP_TRACE_EVENT1("   GAP Discovery Complete Event(SDP Result: 0x%04x)", *((UINT16 *) p_data));
+                GAP_TRACE_EVENT("   GAP Discovery Complete Event(SDP Result: 0x%04x)", *((UINT16 *) p_data));
             }
             else
             {
-                GAP_TRACE_EVENT0("   GAP Discovery Successfully Completed");
+                GAP_TRACE_EVENT("   GAP Discovery Successfully Completed");
             }
 
             break;
@@ -79,7 +79,7 @@
             ((tGAP_REMOTE_DEV_NAME *)p_data)->status =
                     gap_convert_btm_status ((tBTM_STATUS)((tBTM_REMOTE_DEV_NAME *)p_data)->status);
 
-            GAP_TRACE_EVENT1("   GAP Remote Name Complete Event (status 0x%04x)", ((tGAP_REMOTE_DEV_NAME *)p_data)->status);
+            GAP_TRACE_EVENT("   GAP Remote Name Complete Event (status 0x%04x)", ((tGAP_REMOTE_DEV_NAME *)p_data)->status);
 
             break;
         };
@@ -119,11 +119,11 @@
     UINT8        index;
     UNUSED(p_eir);
 
-    GAP_TRACE_EVENT6 ("GAP Inquiry Results Callback (bdaddr [%02x%02x%02x%02x%02x%02x])",
+    GAP_TRACE_EVENT ("GAP Inquiry Results Callback (bdaddr [%02x%02x%02x%02x%02x%02x])",
                 p_results->remote_bd_addr[0], p_results->remote_bd_addr[1],
                 p_results->remote_bd_addr[2], p_results->remote_bd_addr[3],
                 p_results->remote_bd_addr[4], p_results->remote_bd_addr[5]);
-    GAP_TRACE_EVENT4 ("                             (COD [%02x%02x%02x], clkoff 0x%04x)",
+    GAP_TRACE_EVENT ("                             (COD [%02x%02x%02x], clkoff 0x%04x)",
                 p_results->dev_class[0], p_results->dev_class[1], p_results->dev_class[2],
                 p_results->clock_offset);
 
@@ -167,7 +167,7 @@
     {
         if (p->status == BTM_SUCCESS)
         {
-            GAP_TRACE_EVENT2("   GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x, Name [%s])",
+            GAP_TRACE_EVENT("   GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x, Name [%s])",
                                 p->status, p->remote_bd_name);
 
             /* See if the returned name matches the desired name; if not initiate another search */
@@ -183,7 +183,7 @@
                 if ((p_cb->p_cur_inq = BTM_InqDbNext(p_cb->p_cur_inq)) != NULL)
                 {
                     if ((BTM_ReadRemoteDeviceName (p_cb->p_cur_inq->results.remote_bd_addr,
-                        (tBTM_CMPL_CB *) gap_find_addr_name_cb)) == BTM_CMD_STARTED)
+                        (tBTM_CMPL_CB *) gap_find_addr_name_cb, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
                         return;     /* This routine will get called again with the next results */
                     else
                         p_result->status = gap_convert_btm_status ((tBTM_STATUS) p->status);
@@ -194,7 +194,7 @@
         }
         else
         {
-            GAP_TRACE_EVENT1("   GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x)", p->status);
+            GAP_TRACE_EVENT("   GAP: FindAddrByName Rem Name Cmpl Evt (Status 0x%04x)", p->status);
             p_result->status = gap_convert_btm_status ((tBTM_STATUS) p->status);
         }
 
@@ -232,7 +232,7 @@
     if (p_cb->in_use)
     {
 
-        GAP_TRACE_EVENT2("   GAP: FindAddrByName Inq Cmpl Evt (Status 0x%04x, Result(s) %d)",
+        GAP_TRACE_EVENT("   GAP: FindAddrByName Inq Cmpl Evt (Status 0x%04x, Result(s) %d)",
             p->status, p->num_resp);
 
         if (p->status == BTM_SUCCESS)
@@ -246,7 +246,7 @@
                 if ((p_cb->p_cur_inq = BTM_InqDbFirst()) != NULL)
                 {
                     if ((BTM_ReadRemoteDeviceName (p_cb->p_cur_inq->results.remote_bd_addr,
-                        (tBTM_CMPL_CB *) gap_find_addr_name_cb)) == BTM_CMD_STARTED)
+                        (tBTM_CMPL_CB *) gap_find_addr_name_cb, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
                         return;     /* Wait for the response in gap_find_addr_name_cb() */
                     else
                         p_result->status = gap_convert_btm_status (p->status);
diff --git a/stack/gatt/att_protocol.c b/stack/gatt/att_protocol.c
index 3348599..00512e2 100644
--- a/stack/gatt/att_protocol.c
+++ b/stack/gatt/att_protocol.c
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2008-2012 Broadcom Corporation
+ *  Copyright (C) 2008-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -74,7 +74,7 @@
     BT_HDR      *p_buf = NULL;
     UINT8       *p;
 
-    if ((p_buf = (BT_HDR *)GKI_getbuf((UINT16)(sizeof(BT_HDR) + 10 + L2CAP_MIN_OFFSET))) != NULL)
+    if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_BUF_POOL_ID)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
 
@@ -162,7 +162,7 @@
 ** Returns          pointer to the command buffer.
 **
 *******************************************************************************/
-BT_HDR *attp_build_read_handles_cmd (UINT16 payload_size, tGATT_FIND_TYPE_VALUE *p_value_type)
+BT_HDR *attp_build_read_by_type_value_cmd (UINT16 payload_size, tGATT_FIND_TYPE_VALUE *p_value_type)
 {
     BT_HDR      *p_buf = NULL;
     UINT8       *p;
@@ -335,7 +335,7 @@
                 if (op_code == GATT_RSP_READ_BY_TYPE)
                     *p_pair_len = (len + 2);
 
-                GATT_TRACE_WARNING1("attribute value too long, to be truncated to %d", len);
+                GATT_TRACE_WARNING("attribute value too long, to be truncated to %d", len);
             }
 
             ARRAY_TO_STREAM (p, p_data, len);
@@ -347,12 +347,12 @@
 
 /*******************************************************************************
 **
-** Function         attp_send_msg_to_L2CAP
+** Function         attp_send_msg_to_l2cap
 **
 ** Description      Send message to L2CAP.
 **
 *******************************************************************************/
-BOOLEAN  attp_send_msg_to_L2CAP(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP)
+tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP)
 {
     UINT16      l2cap_ret;
 
@@ -364,15 +364,16 @@
 
     if (l2cap_ret == L2CAP_DW_FAILED)
     {
-        GATT_TRACE_ERROR1("ATT   failed to pass msg:0x%0x to L2CAP",
+        GATT_TRACE_ERROR("ATT   failed to pass msg:0x%0x to L2CAP",
             *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
-        GKI_freebuf(p_toL2CAP);
-        return FALSE;
+        return GATT_INTERNAL_ERROR;
     }
-    else
+    else if (l2cap_ret == L2CAP_DW_CONGESTED)
     {
-        return TRUE;
+        GATT_TRACE_DEBUG("ATT congested, message accepted");
+        return GATT_CONGESTED;
     }
+    return GATT_SUCCESS;
 }
 
 /*******************************************************************************
@@ -391,7 +392,7 @@
     {
     case GATT_RSP_READ_BLOB:
     case GATT_RSP_PREPARE_WRITE:
-        GATT_TRACE_EVENT2 ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d",
+        GATT_TRACE_EVENT ("ATT_RSP_READ_BLOB/GATT_RSP_PREPARE_WRITE: len = %d offset = %d",
                     p_msg->attr_value.len, p_msg->attr_value.offset);
         offset = p_msg->attr_value.offset;
 /* Coverity: [FALSE-POSITIVE error] intended fall through */
@@ -426,12 +427,12 @@
         break;
 
     default:
-        GATT_TRACE_DEBUG1("attp_build_sr_msg: unknown op code = %d", op_code);
+        GATT_TRACE_DEBUG("attp_build_sr_msg: unknown op code = %d", op_code);
         break;
     }
 
     if (!p_cmd)
-        GATT_TRACE_ERROR0("No resources");
+        GATT_TRACE_ERROR("No resources");
 
     return p_cmd;
 }
@@ -459,11 +460,7 @@
         if (p_msg != NULL)
         {
             p_msg->offset = L2CAP_MIN_OFFSET;
-
-            if (attp_send_msg_to_L2CAP (p_tcb, p_msg))
-                cmd_sent = GATT_SUCCESS;
-            else
-                cmd_sent = GATT_INTERNAL_ERROR;
+            cmd_sent = attp_send_msg_to_l2cap (p_tcb, p_msg);
         }
     }
     return cmd_sent;
@@ -475,22 +472,26 @@
 **
 ** Description      Send a ATT command or enqueue it.
 **
-** Returns          TRUE if command sent, otherwise FALSE.
+** Returns          GATT_SUCCESS if command sent
+**                  GATT_CONGESTED if command sent but channel congested
+**                  GATT_CMD_STARTED if command queue up in GATT
+**                  GATT_ERROR if command sending failure
 **
 *******************************************************************************/
-UINT8 attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, BT_HDR *p_cmd)
+tGATT_STATUS attp_cl_send_cmd(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 cmd_code, BT_HDR *p_cmd)
 {
-    UINT8       att_ret = GATT_SUCCESS;
+    tGATT_STATUS att_ret = GATT_SUCCESS;
 
     if (p_tcb != NULL)
     {
         cmd_code &= ~GATT_AUTH_SIGN_MASK;
 
+        /* no pending request or value confirmation */
         if (p_tcb->pending_cl_req == p_tcb->next_slot_inq ||
             cmd_code == GATT_HANDLE_VALUE_CONF)
         {
-            /* no penindg request or value confirmation */
-            if (attp_send_msg_to_L2CAP(p_tcb, p_cmd))
+            att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd);
+            if (att_ret == GATT_CONGESTED || att_ret == GATT_SUCCESS)
             {
                 /* do not enq cmd if handle value confirmation or set request */
                 if (cmd_code != GATT_HANDLE_VALUE_CONF && cmd_code != GATT_CMD_WRITE)
@@ -509,7 +510,7 @@
         }
     }
     else
-        att_ret = GATT_ILLEGAL_PARAMETER;
+        att_ret = GATT_ERROR;
 
     return att_ret;
 }
@@ -606,7 +607,7 @@
             break;
 
         case GATT_REQ_FIND_TYPE_VALUE:
-            p_cmd = attp_build_read_handles_cmd(p_tcb->payload_size, &p_msg->find_type_value);
+            p_cmd = attp_build_read_by_type_value_cmd(p_tcb->payload_size, &p_msg->find_type_value);
             break;
 
         case GATT_REQ_READ_MULTI:
@@ -625,7 +626,7 @@
     }
     else
     {
-        GATT_TRACE_ERROR0("Peer device not connected");
+        GATT_TRACE_ERROR("Peer device not connected");
     }
 
     return status;
diff --git a/stack/gatt/gatt_api.c b/stack/gatt/gatt_api.c
index 54ea0f0..6683cb6 100644
--- a/stack/gatt/gatt_api.c
+++ b/stack/gatt/gatt_api.c
@@ -151,11 +151,11 @@
     tBT_UUID     *p_app_uuid128;
 
 
-    GATT_TRACE_API0 ("GATTS_CreateService" );
+    GATT_TRACE_API ("GATTS_CreateService" );
 
     if (p_reg == NULL)
     {
-        GATT_TRACE_ERROR1 ("Inavlid gatt_if=%d", gatt_if);
+        GATT_TRACE_ERROR ("Inavlid gatt_if=%d", gatt_if);
         return(0);
     }
 
@@ -164,7 +164,7 @@
     if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) != NULL)
     {
         s_hdl = p_list->asgn_range.s_handle;
-        GATT_TRACE_DEBUG0 ("Service already been created!!");
+        GATT_TRACE_DEBUG ("Service already been created!!");
     }
     else
     {
@@ -196,14 +196,14 @@
         /* check for space */
         if (num_handles > (0xFFFF - s_hdl + 1))
         {
-            GATT_TRACE_ERROR2 ("GATTS_ReserveHandles: no handles, s_hdl: %u  needed: %u", s_hdl, num_handles);
+            GATT_TRACE_ERROR ("GATTS_ReserveHandles: no handles, s_hdl: %u  needed: %u", s_hdl, num_handles);
             return(0);
         }
 
         if ( (p_list = gatt_alloc_hdl_buffer()) == NULL)
         {
             /* No free entry */
-            GATT_TRACE_ERROR0 ("GATTS_ReserveHandles: no free handle blocks");
+            GATT_TRACE_ERROR ("GATTS_ReserveHandles: no free handle blocks");
             return(0);
         }
 
@@ -224,7 +224,7 @@
             if ( (p_buf = gatt_add_pending_new_srv_start(&p_list->asgn_range)) == NULL)
             {
                 /* No free entry */
-                GATT_TRACE_ERROR0 ("gatt_add_pending_new_srv_start: no free blocks");
+                GATT_TRACE_ERROR ("gatt_add_pending_new_srv_start: no free blocks");
 
                 if (p_list)
                 {
@@ -234,13 +234,13 @@
                 return(0);
             }
 
-            GATT_TRACE_DEBUG0 ("Add a new srv chg item");
+            GATT_TRACE_DEBUG ("Add a new srv chg item");
         }
     }
 
-    if (!gatts_init_service_db(&p_list->svc_db, *p_svc_uuid, is_pri, s_hdl , num_handles))
+    if (!gatts_init_service_db(&p_list->svc_db, p_svc_uuid, is_pri, s_hdl , num_handles))
     {
-        GATT_TRACE_ERROR0 ("GATTS_ReserveHandles: service DB initialization failed");
+        GATT_TRACE_ERROR ("GATTS_ReserveHandles: service DB initialization failed");
         if (p_list)
         {
             gatt_remove_an_item_from_list(p_list_info, p_list);
@@ -252,7 +252,7 @@
         return(0);
     }
 
-    GATT_TRACE_DEBUG6 ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d",
+    GATT_TRACE_DEBUG ("GATTS_CreateService(success): handles needed:%u s_hdl=%u e_hdl=%u %s[%x] is_primary=%d",
                        num_handles, p_list->asgn_range.s_handle , p_list->asgn_range.e_handle,
                        ((p_list->asgn_range.svc_uuid.len == 2) ? "uuid16": "uuid128" ),
                        p_list->asgn_range.svc_uuid.uu.uuid16,
@@ -281,12 +281,12 @@
 
     if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
     {
-        GATT_TRACE_DEBUG0("Service not created");
+        GATT_TRACE_DEBUG("Service not created");
         return 0;
     }
     if ((p_incl_decl = gatt_find_hdl_buffer_by_handle(include_svc_handle)) == NULL)
     {
-        GATT_TRACE_DEBUG0("Included Service not created");
+        GATT_TRACE_DEBUG("Included Service not created");
         return 0;
     }
 
@@ -319,14 +319,14 @@
 
     if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
     {
-        GATT_TRACE_DEBUG0("Service not created");
+        GATT_TRACE_DEBUG("Service not created");
         return 0;
     }
     /* data validity checking */
     if (  ((property & GATT_CHAR_PROP_BIT_AUTH) && !(perm & GATT_WRITE_SIGNED_PERM)) ||
           ((perm & GATT_WRITE_SIGNED_PERM) && !(property & GATT_CHAR_PROP_BIT_AUTH)) )
     {
-        GATT_TRACE_DEBUG2("Invalid configuration property=0x%x perm=0x%x ", property, perm);
+        GATT_TRACE_DEBUG("Invalid configuration property=0x%x perm=0x%x ", property, perm);
         return 0;
     }
 
@@ -362,13 +362,14 @@
 
     if ((p_decl = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
     {
-        GATT_TRACE_DEBUG0("Service not created");
+        GATT_TRACE_DEBUG("Service not created");
         return 0;
     }
     if (p_descr_uuid == NULL ||
-        (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len !=  LEN_UUID_16))
+        (p_descr_uuid->len != LEN_UUID_128 && p_descr_uuid->len !=  LEN_UUID_16
+         && p_descr_uuid->len !=  LEN_UUID_32))
     {
-        GATT_TRACE_DEBUG0("Illegal parameter");
+        GATT_TRACE_DEBUG("Illegal parameter");
         return 0;
     }
 
@@ -400,18 +401,18 @@
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
     tBT_UUID *p_app_uuid128;
 
-    GATT_TRACE_DEBUG0 ("GATTS_DeleteService");
+    GATT_TRACE_DEBUG ("GATTS_DeleteService");
 
     if (p_reg == NULL)
     {
-        GATT_TRACE_ERROR0 ("Applicaiton not foud");
+        GATT_TRACE_ERROR ("Applicaiton not foud");
         return(FALSE);
     }
     p_app_uuid128 = &p_reg->app_uuid128;
 
     if ((p_list = gatt_find_hdl_buffer_by_app_id(p_app_uuid128, p_svc_uuid, svc_inst)) == NULL)
     {
-        GATT_TRACE_ERROR0 ("No Service found");
+        GATT_TRACE_ERROR ("No Service found");
         return(FALSE);
     }
 
@@ -419,7 +420,7 @@
                                          &p_list->asgn_range.svc_uuid,
                                          p_list->asgn_range.svc_inst)) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("Delete a new service changed item - the service has not yet started");
+        GATT_TRACE_DEBUG ("Delete a new service changed item - the service has not yet started");
         GKI_freebuf (GKI_remove_from_queue (&gatt_cb.pending_new_srv_start_q, p_buf));
     }
     else
@@ -434,7 +435,7 @@
         GATTS_StopService(gatt_cb.sr_reg[i_sreg].s_hdl);
     }
 
-    GATT_TRACE_DEBUG2 ("released handles s_hdl=%u e_hdl=%u",
+    GATT_TRACE_DEBUG ("released handles s_hdl=%u e_hdl=%u",
                        p_list->asgn_range.s_handle , p_list->asgn_range.e_handle  );
 
     if ( (p_list->asgn_range.s_handle >= gatt_cb.hdl_cfg.app_start_hdl)
@@ -471,19 +472,19 @@
 
     tGATTS_PENDING_NEW_SRV_START *p_buf;
 
-    GATT_TRACE_API0 ("GATTS_StartService");
+    GATT_TRACE_API ("GATTS_StartService");
 
     if (p_reg == NULL)
     {
         /* Not found  */
-        GATT_TRACE_ERROR0 ("Applicaiton not found ");
+        GATT_TRACE_ERROR ("Applicaiton not found ");
         return GATT_NOT_FOUND;
     }
 
     if ((p_list = gatt_find_hdl_buffer_by_handle(service_handle)) == NULL)
     {
         /* Not found  */
-        GATT_TRACE_ERROR0 ("no service found");
+        GATT_TRACE_ERROR ("no service found");
         return GATT_NOT_FOUND;
     }
 
@@ -491,14 +492,14 @@
                                       &p_list->asgn_range.svc_uuid,
                                       p_list->asgn_range.svc_inst) != GATT_MAX_SR_PROFILES)
     {
-        GATT_TRACE_ERROR0 ("Duplicate Service start - Service already started");
+        GATT_TRACE_ERROR ("Duplicate Service start - Service already started");
         return GATT_SERVICE_STARTED;
     }
 
     /*this is a new application servoce start */
     if ((i_sreg = gatt_sr_alloc_rcb(p_list)) ==  GATT_MAX_SR_PROFILES)
     {
-        GATT_TRACE_ERROR0 ("GATTS_StartService: no free server registration block");
+        GATT_TRACE_ERROR ("GATTS_StartService: no free server registration block");
         return GATT_NO_RESOURCES;
     }
 
@@ -525,9 +526,9 @@
 
     gatt_add_a_srv_to_list(&gatt_cb.srv_list_info, &gatt_cb.srv_list[i_sreg]);
 
-    GATT_TRACE_DEBUG1 ("allocated i_sreg=%d ",i_sreg);
+    GATT_TRACE_DEBUG ("allocated i_sreg=%d ",i_sreg);
 
-    GATT_TRACE_DEBUG5 ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x",
+    GATT_TRACE_DEBUG ("s_hdl=%d e_hdl=%d type=0x%x svc_inst=%d sdp_hdl=0x%x",
                        p_sreg->s_hdl,p_sreg->e_hdl,
                        p_sreg->type,  p_sreg->service_instance,
                        p_sreg->sdp_handle);
@@ -560,7 +561,7 @@
 {
     UINT8           ii = gatt_sr_find_i_rcb_by_handle(service_handle);
 
-    GATT_TRACE_API1("GATTS_StopService %u", service_handle);
+    GATT_TRACE_API("GATTS_StopService %u", service_handle);
 
     /* Index 0 is reserved for GATT, and is never stopped */
     if ( (ii > 0) && (ii < GATT_MAX_SR_PROFILES) && (gatt_cb.sr_reg[ii].in_use) )
@@ -575,7 +576,7 @@
     }
     else
     {
-        GATT_TRACE_ERROR1("GATTS_StopService service_handle: %u is not in use", service_handle);
+        GATT_TRACE_ERROR("GATTS_StopService service_handle: %u is not in use", service_handle);
     }
 }
 /*******************************************************************************
@@ -594,7 +595,7 @@
 *******************************************************************************/
 tGATT_STATUS GATTS_HandleValueIndication (UINT16 conn_id,  UINT16 attr_handle, UINT16 val_len, UINT8 *p_val)
 {
-    tGATT_STATUS    cmd_status = GATT_ILLEGAL_PARAMETER;
+    tGATT_STATUS    cmd_status = GATT_NO_RESOURCES;
 
     tGATT_VALUE      indication;
     BT_HDR          *p_msg;
@@ -605,44 +606,45 @@
     tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
 
 
-    GATT_TRACE_API0 ("GATTS_HandleValueIndication");
+    GATT_TRACE_API ("GATTS_HandleValueIndication");
     if ( (p_reg == NULL) || (p_tcb == NULL))
     {
-        GATT_TRACE_ERROR1 ("GATTS_HandleValueIndication Unknown  conn_id: %u ", conn_id);
+        GATT_TRACE_ERROR ("GATTS_HandleValueIndication Unknown  conn_id: %u ", conn_id);
         return(tGATT_STATUS) GATT_INVALID_CONN_ID;
     }
+
+    if (! GATT_HANDLE_IS_VALID (attr_handle))
+        return GATT_ILLEGAL_PARAMETER;
+
     indication.conn_id  = conn_id;
     indication.handle   = attr_handle;
     indication.len      = val_len;
     memcpy (indication.value, p_val, val_len);
     indication.auth_req = GATT_AUTH_REQ_NONE;
 
-    if (GATT_HANDLE_IS_VALID (attr_handle)  )
+    if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle))
     {
-        if (GATT_HANDLE_IS_VALID(p_tcb->indicate_handle))
+        GATT_TRACE_DEBUG ("Add a pending indication");
+        if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL)
         {
-            GATT_TRACE_DEBUG0 ("Add a pending indication");
-            if ((p_buf = gatt_add_pending_ind(p_tcb, &indication)) !=NULL)
-            {
-                cmd_status = GATT_SUCCESS;
-            }
-            else
-            {
-                cmd_status = GATT_NO_RESOURCES;
-            }
+            cmd_status = GATT_SUCCESS;
         }
         else
         {
+            cmd_status = GATT_NO_RESOURCES;
+        }
+    }
+    else
+    {
 
-            if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL)
+        if ( (p_msg = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_IND, (tGATT_SR_MSG *)&indication)) != NULL)
+        {
+            cmd_status = attp_send_sr_msg (p_tcb, p_msg);
+
+            if (cmd_status == GATT_SUCCESS || cmd_status == GATT_CONGESTED)
             {
-                cmd_status = attp_send_sr_msg (p_tcb, p_msg);
-
-                if (cmd_status == GATT_SUCCESS)
-                {
-                    p_tcb->indicate_handle = indication.handle;
-                    gatt_start_conf_timer(p_tcb);
-                }
+                p_tcb->indicate_handle = indication.handle;
+                gatt_start_conf_timer(p_tcb);
             }
         }
     }
@@ -674,11 +676,11 @@
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
     tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
 
-    GATT_TRACE_API0 ("GATTS_HandleValueNotification");
+    GATT_TRACE_API ("GATTS_HandleValueNotification");
 
     if ( (p_reg == NULL) || (p_tcb == NULL))
     {
-        GATT_TRACE_ERROR1 ("GATTS_HandleValueNotification Unknown  conn_id: %u ", conn_id);
+        GATT_TRACE_ERROR ("GATTS_HandleValueNotification Unknown  conn_id: %u ", conn_id);
         return(tGATT_STATUS) GATT_INVALID_CONN_ID;
     }
 
@@ -689,8 +691,13 @@
         memcpy (notif.value, p_val, val_len);
         notif.auth_req = GATT_AUTH_REQ_NONE;;
 
-        p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)&notif);
-        cmd_sent = attp_send_sr_msg (p_tcb, p_buf);
+        if ((p_buf = attp_build_sr_msg (p_tcb, GATT_HANDLE_VALUE_NOTIF, (tGATT_SR_MSG *)&notif))
+                   != NULL)
+        {
+            cmd_sent = attp_send_sr_msg (p_tcb, p_buf);
+        }
+        else
+            cmd_sent = GATT_NO_RESOURCES;
     }
     return cmd_sent;
 }
@@ -718,18 +725,18 @@
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
     tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
 
-    GATT_TRACE_API3 ("GATTS_SendRsp: conn_id: %u  trans_id: %u  Status: 0x%04x",
+    GATT_TRACE_API ("GATTS_SendRsp: conn_id: %u  trans_id: %u  Status: 0x%04x",
                      conn_id, trans_id, status);
 
     if ( (p_reg == NULL) || (p_tcb == NULL))
     {
-        GATT_TRACE_ERROR1 ("GATTS_SendRsp Unknown  conn_id: %u ", conn_id);
+        GATT_TRACE_ERROR ("GATTS_SendRsp Unknown  conn_id: %u ", conn_id);
         return(tGATT_STATUS) GATT_INVALID_CONN_ID;
     }
 
     if (p_tcb->sr_cmd.trans_id != trans_id)
     {
-        GATT_TRACE_ERROR2 ("GATTS_SendRsp conn_id: %u  waiting for op_code = %02x",
+        GATT_TRACE_ERROR ("GATTS_SendRsp conn_id: %u  waiting for op_code = %02x",
                            conn_id, p_tcb->sr_cmd.op_code);
 
         return(GATT_WRONG_STATE);
@@ -773,10 +780,13 @@
 
     tGATT_CLCB    *p_clcb;
 
-    GATT_TRACE_API2 ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu );
+    GATT_TRACE_API ("GATTC_ConfigureMTU conn_id=%d mtu=%d", conn_id, mtu );
 
-    // Validate that the link is BLE, not BR/EDR
-    // ????
+    /* Validate that the link is BLE, not BR/EDR */
+    if (p_tcb->transport != BT_TRANSPORT_LE)
+    {
+        return GATT_ERROR;
+    }
 
     if ( (p_tcb == NULL) || (p_reg==NULL) || (mtu < GATT_DEF_BLE_MTU_SIZE) || (mtu > GATT_MAX_MTU_SIZE))
     {
@@ -785,7 +795,7 @@
 
     if (gatt_is_clcb_allocated(conn_id))
     {
-        GATT_TRACE_ERROR1("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_ConfigureMTU GATT_BUSY conn_id = %d", conn_id);
         return GATT_BUSY;
     }
 
@@ -824,19 +834,19 @@
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
 
 
-    GATT_TRACE_API2 ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type);
+    GATT_TRACE_API ("GATTC_Discover conn_id=%d disc_type=%d",conn_id, disc_type);
 
     if ( (p_tcb == NULL) || (p_reg==NULL) ||(p_param == NULL) ||
          (disc_type >= GATT_DISC_MAX))
     {
-        GATT_TRACE_ERROR2("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id);
+        GATT_TRACE_ERROR("GATTC_Discover Illegal param: disc_type %d conn_id = %d", disc_type, conn_id);
         return GATT_ILLEGAL_PARAMETER;
     }
 
 
     if (gatt_is_clcb_allocated(conn_id))
     {
-        GATT_TRACE_ERROR1("GATTC_Discover GATT_BUSY conn_id = %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_Discover GATT_BUSY conn_id = %d", conn_id);
         return GATT_BUSY;
     }
 
@@ -893,17 +903,17 @@
     tGATT_REG           *p_reg = gatt_get_regcb(gatt_if);
 
 
-    GATT_TRACE_API2 ("GATTC_Read conn_id=%d type=%d", conn_id, type);
+    GATT_TRACE_API ("GATTC_Read conn_id=%d type=%d", conn_id, type);
 
     if ( (p_tcb == NULL) || (p_reg==NULL) || (p_read == NULL) || ((type >= GATT_READ_MAX) || (type == 0)))
     {
-        GATT_TRACE_ERROR2("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type);
+        GATT_TRACE_ERROR("GATT_Read Illegal param: conn_id %d, type 0%d,", conn_id, type);
         return GATT_ILLEGAL_PARAMETER;
     }
 
     if (gatt_is_clcb_allocated(conn_id))
     {
-        GATT_TRACE_ERROR1("GATTC_Read GATT_BUSY conn_id = %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_Read GATT_BUSY conn_id = %d", conn_id);
         return GATT_BUSY;
     }
 
@@ -983,13 +993,13 @@
     if ( (p_tcb == NULL) || (p_reg==NULL) || (p_write == NULL) ||
          ((type != GATT_WRITE) && (type != GATT_WRITE_PREPARE) && (type != GATT_WRITE_NO_RSP)) )
     {
-        GATT_TRACE_ERROR2("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type);
+        GATT_TRACE_ERROR("GATT_Write Illegal param: conn_id %d, type 0%d,", conn_id, type);
         return GATT_ILLEGAL_PARAMETER;
     }
 
     if (gatt_is_clcb_allocated(conn_id))
     {
-        GATT_TRACE_ERROR1("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
         return GATT_BUSY;
     }
 
@@ -1054,17 +1064,17 @@
     tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
 
-    GATT_TRACE_API2 ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute);
+    GATT_TRACE_API ("GATTC_ExecuteWrite conn_id=%d is_execute=%d", conn_id, is_execute);
 
     if ( (p_tcb == NULL) || (p_reg==NULL) )
     {
-        GATT_TRACE_ERROR1("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_ExecuteWrite Illegal param: conn_id %d", conn_id);
         return GATT_ILLEGAL_PARAMETER;
     }
 
     if (gatt_is_clcb_allocated(conn_id))
     {
-        GATT_TRACE_ERROR1("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
+        GATT_TRACE_ERROR("GATTC_Write GATT_BUSY conn_id = %d", conn_id);
         return GATT_BUSY;
     }
 
@@ -1076,7 +1086,7 @@
     }
     else
     {
-        GATT_TRACE_ERROR1("Unable to allocate client CB for conn_id %d ", conn_id);
+        GATT_TRACE_ERROR("Unable to allocate client CB for conn_id %d ", conn_id);
         status = GATT_NO_RESOURCES;
     }
     return status;
@@ -1100,7 +1110,7 @@
     tGATT_STATUS    ret = GATT_ILLEGAL_PARAMETER;
     tGATT_TCB     *p_tcb=gatt_get_tcb_by_idx(GATT_GET_TCB_IDX(conn_id));
 
-    GATT_TRACE_API2 ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle);
+    GATT_TRACE_API ("GATTC_SendHandleValueConfirm conn_id=%d handle=0x%x", conn_id, handle);
 
     if (p_tcb)
     {
@@ -1108,7 +1118,7 @@
         {
             btu_stop_timer (&p_tcb->ind_ack_timer_ent);
 
-            GATT_TRACE_DEBUG1 ("notif_count=%d ", p_tcb->ind_count);
+            GATT_TRACE_DEBUG ("notif_count=%d ", p_tcb->ind_count);
             /* send confirmation now */
             ret = attp_send_cl_msg(p_tcb, 0, GATT_HANDLE_VALUE_CONF, (tGATT_CL_MSG *)&handle);
 
@@ -1117,13 +1127,13 @@
         }
         else
         {
-            GATT_TRACE_DEBUG1 ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id);
+            GATT_TRACE_DEBUG ("GATTC_SendHandleValueConfirm - conn_id: %u - ignored not waiting for indicaiton ack", conn_id);
             ret = GATT_SUCCESS;
         }
     }
     else
     {
-        GATT_TRACE_ERROR1 ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id);
+        GATT_TRACE_ERROR ("GATTC_SendHandleValueConfirm - Unknown conn_id: %u", conn_id);
     }
     return ret;
 }
@@ -1147,12 +1157,12 @@
 ** Returns          void
 **
 *******************************************************************************/
-void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout)
+void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout, tBT_TRANSPORT transport)
 {
     tGATT_TCB       *p_tcb;
     BOOLEAN         status = FALSE;
 
-    if ((p_tcb = gatt_find_tcb_by_addr (bd_addr)) != NULL)
+    if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, transport)) != NULL)
     {
         if (p_tcb->att_lcid == L2CAP_ATT_CID)
         {
@@ -1164,7 +1174,7 @@
         }
     }
 
-    GATT_TRACE_API2 ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)",
+    GATT_TRACE_API ("GATT_SetIdleTimeout idle_tout=%d status=%d(1-OK 0-not performed)",
                     idle_tout, status);
 }
 
@@ -1188,14 +1198,14 @@
     UINT8        i_gatt_if=0;
     tGATT_IF     gatt_if=0;
 
-    GATT_TRACE_API0 ("GATT_Register");
+    GATT_TRACE_API ("GATT_Register");
     gatt_dbg_display_uuid(*p_app_uuid128);
 
     for (i_gatt_if = 0, p_reg = gatt_cb.cl_rcb; i_gatt_if < GATT_MAX_APPS; i_gatt_if++, p_reg++)
     {
         if (p_reg->in_use  && !memcmp(p_app_uuid128->uu.uuid128, p_reg->app_uuid128.uu.uuid128, LEN_UUID_128))
         {
-            GATT_TRACE_ERROR0("application already registered.");
+            GATT_TRACE_ERROR("application already registered.");
             return 0;
         }
     }
@@ -1215,7 +1225,7 @@
             break;
         }
     }
-    GATT_TRACE_API1 ("allocated gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("allocated gatt_if=%d", gatt_if);
     return gatt_if;
 }
 
@@ -1239,11 +1249,11 @@
     UINT8           i, ii, j;
     tGATT_SR_REG    *p_sreg;
 
-    GATT_TRACE_API1 ("GATT_Deregister gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("GATT_Deregister gatt_if=%d", gatt_if);
     /* Index 0 is GAP and is never deregistered */
     if ( (gatt_if == 0) || (p_reg == NULL) )
     {
-        GATT_TRACE_ERROR1 ("GATT_Deregister with invalid gatt_if: %u", gatt_if);
+        GATT_TRACE_ERROR ("GATT_Deregister with invalid gatt_if: %u", gatt_if);
         return;
     }
 
@@ -1275,7 +1285,7 @@
                 if (!gatt_num_apps_hold_link(p_tcb))
                 {
                     /* this will disconnect the link or cancel the pending connect request at lower layer*/
-                    gatt_disconnect(p_tcb->peer_bda);
+                    gatt_disconnect(p_tcb);
                 }
             }
 
@@ -1323,19 +1333,20 @@
     BD_ADDR     bda;
     UINT8       start_idx, found_idx;
     UINT16      conn_id;
+    tGATT_TRANSPORT transport ;
 
-    GATT_TRACE_API1 ("GATT_StartIf gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("GATT_StartIf gatt_if=%d", gatt_if);
     if ((p_reg = gatt_get_regcb(gatt_if)) != NULL)
     {
         p_reg = &gatt_cb.cl_rcb[gatt_if - 1];
         start_idx = 0;
-        while (gatt_find_the_connected_bda(start_idx, bda, &found_idx))
+        while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport))
         {
-            p_tcb = gatt_find_tcb_by_addr(bda);
+            p_tcb = gatt_find_tcb_by_addr(bda, transport);
             if (p_reg->app_cb.p_conn_cb && p_tcb)
             {
                 conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, gatt_if);
-                (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0);
+                (*p_reg->app_cb.p_conn_cb)(gatt_if, bda, conn_id, TRUE, 0, transport);
             }
             start_idx = ++found_idx;
         }
@@ -1357,23 +1368,31 @@
 ** Returns          TRUE if connection started; FALSE if connection start failure.
 **
 *******************************************************************************/
-BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct){
+BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct, tBT_TRANSPORT transport)
+{
     tGATT_REG    *p_reg;
-    BOOLEAN status;
+    BOOLEAN status = FALSE;
 
-    GATT_TRACE_API1 ("GATT_Connect gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("GATT_Connect gatt_if=%d", gatt_if);
 
     /* Make sure app is registered */
     if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
     {
-        GATT_TRACE_ERROR1("GATT_Connect - gatt_if =%d is not registered", gatt_if);
+        GATT_TRACE_ERROR("GATT_Connect - gatt_if =%d is not registered", gatt_if);
         return(FALSE);
     }
 
     if (is_direct)
-        status = gatt_act_connect (p_reg, bd_addr);
+        status = gatt_act_connect (p_reg, bd_addr, transport);
     else
+    {
+        if (transport == BT_TRANSPORT_LE)
         status = gatt_update_auto_connect_dev(gatt_if,TRUE, bd_addr, TRUE);
+        else
+        {
+            GATT_TRACE_ERROR("Unsupported transport for background connection");
+        }
+    }
 
     return status;
 
@@ -1400,11 +1419,11 @@
     tGATT_IF      temp_gatt_if;
     UINT8         start_idx, found_idx;
 
-    GATT_TRACE_API1 ("GATT_CancelConnect gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("GATT_CancelConnect gatt_if=%d", gatt_if);
 
     if ((gatt_if != 0) && ((p_reg = gatt_get_regcb(gatt_if)) == NULL))
     {
-        GATT_TRACE_ERROR1("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if);
+        GATT_TRACE_ERROR("GATT_CancelConnect - gatt_if =%d is not registered", gatt_if);
         return(FALSE);
     }
 
@@ -1412,9 +1431,10 @@
     {
         if (!gatt_if)
         {
-            GATT_TRACE_DEBUG0("GATT_CancelConnect - unconditional");
+            GATT_TRACE_DEBUG("GATT_CancelConnect - unconditional");
             start_idx = 0;
-            p_tcb = gatt_find_tcb_by_addr(bd_addr);
+            /* only LE connection can be cancelled */
+            p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
             if (p_tcb && gatt_num_apps_hold_link(p_tcb))
             {
                 while (status && gatt_find_app_hold_link(p_tcb, start_idx, &found_idx, &temp_gatt_if))
@@ -1425,7 +1445,7 @@
             }
             else
             {
-                GATT_TRACE_ERROR0("GATT_CancelConnect - no app found");
+                GATT_TRACE_ERROR("GATT_CancelConnect - no app found");
                 status = FALSE;
             }
         }
@@ -1445,7 +1465,7 @@
             }
             else
             {
-                GATT_TRACE_ERROR0("GATT_CancelConnect -no app associated with the bg device for unconditional removal");
+                GATT_TRACE_ERROR("GATT_CancelConnect -no app associated with the bg device for unconditional removal");
                 status = FALSE;
             }
         }
@@ -1477,7 +1497,7 @@
     tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
     UINT8          tcb_idx = GATT_GET_TCB_IDX(conn_id);
 
-    GATT_TRACE_API1 ("GATT_Disconnect conn_id=%d ", conn_id);
+    GATT_TRACE_API ("GATT_Disconnect conn_id=%d ", conn_id);
 
     p_tcb = gatt_get_tcb_by_idx(tcb_idx);
 
@@ -1486,7 +1506,7 @@
         gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
         if (!gatt_num_apps_hold_link(p_tcb))
         {
-            gatt_disconnect(p_tcb->peer_bda);
+            gatt_disconnect(p_tcb);
         }
         ret = GATT_SUCCESS;
     }
@@ -1508,7 +1528,8 @@
 ** Returns          TRUE the ligical link information is found for conn_id
 **
 *******************************************************************************/
-BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr)
+BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr,
+                                tBT_TRANSPORT *p_transport)
 {
 
     tGATT_IF        gatt_if = GATT_GET_GATT_IF(conn_id);
@@ -1517,12 +1538,13 @@
     tGATT_TCB       *p_tcb= gatt_get_tcb_by_idx(tcb_idx);
     BOOLEAN         status=FALSE;
 
-    GATT_TRACE_API1 ("GATT_GetConnectionInfor conn_id=%d", conn_id);
+    GATT_TRACE_API ("GATT_GetConnectionInfor conn_id=%d", conn_id);
 
     if (p_tcb && p_reg )
     {
         memcpy(bd_addr, p_tcb->peer_bda, BD_ADDR_LEN);
         *p_gatt_if = gatt_if;
+        *p_transport = p_tcb->transport;
         status = TRUE;
     }
     return status;
@@ -1539,14 +1561,16 @@
 ** Parameters        gatt_if: applicaiton interface (input)
 **                   bd_addr: peer device address. (input)
 **                   p_conn_id: connection id  (output)
+**                   transport: transport option
 **
 ** Returns          TRUE the logical link is connected
 **
 *******************************************************************************/
-BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id)
+BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id,
+                                  tBT_TRANSPORT transport)
 {
     tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
-    tGATT_TCB       *p_tcb= gatt_find_tcb_by_addr(bd_addr);
+    tGATT_TCB       *p_tcb= gatt_find_tcb_by_addr(bd_addr, transport);
     BOOLEAN         status=FALSE;
 
     if (p_reg && p_tcb && (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN) )
@@ -1555,7 +1579,7 @@
         status = TRUE;
     }
 
-    GATT_TRACE_API1 ("GATT_GetConnIdIfConnected status=%d", status);
+    GATT_TRACE_API ("GATT_GetConnIdIfConnected status=%d", status);
     return status;
 }
 
@@ -1580,12 +1604,12 @@
     tGATT_REG    *p_reg;
     BOOLEAN status = TRUE;
 
-    GATT_TRACE_API1 ("GATT_Listen gatt_if=%d", gatt_if);
+    GATT_TRACE_API ("GATT_Listen gatt_if=%d", gatt_if);
 
     /* Make sure app is registered */
     if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
     {
-        GATT_TRACE_ERROR1("GATT_Listen - gatt_if =%d is not registered", gatt_if);
+        GATT_TRACE_ERROR("GATT_Listen - gatt_if =%d is not registered", gatt_if);
         return(FALSE);
     }
 
@@ -1598,10 +1622,7 @@
         p_reg->listening = start ? GATT_LISTEN_TO_ALL : GATT_LISTEN_TO_NONE;
     }
 
-    gatt_update_listen_mode();
-
-    return status;
-
+    return gatt_update_listen_mode();
 }
 
 #endif
diff --git a/stack/gatt/gatt_attr.c b/stack/gatt/gatt_attr.c
index 1ee4ae3..df852e3 100644
--- a/stack/gatt/gatt_attr.c
+++ b/stack/gatt/gatt_attr.c
@@ -41,7 +41,8 @@
 #endif
 
 static void gatt_profile_request_cback (UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data);
-static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
+                                         BOOLEAN connected, tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
 
 static tGATT_CBACK gatt_profile_cback =
 {
@@ -50,6 +51,7 @@
     NULL,
     NULL,
     gatt_profile_request_cback,
+    NULL,
     NULL
 } ;
 
@@ -87,14 +89,15 @@
 ** Returns          Pointer to the found link conenction control block.
 **
 *******************************************************************************/
-tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda)
+static tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda, tBT_TRANSPORT transport)
 {
     UINT8 i_clcb;
     tGATT_PROFILE_CLCB    *p_clcb = NULL;
 
     for (i_clcb = 0, p_clcb= gatt_cb.profile_clcb; i_clcb < GATT_MAX_APPS; i_clcb++, p_clcb++)
     {
-        if (p_clcb->in_use && p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
+        if (p_clcb->in_use && p_clcb->transport == transport &&
+            p_clcb->connected && !memcmp(p_clcb->bda, bda, BD_ADDR_LEN))
         {
             return p_clcb;
         }
@@ -112,7 +115,7 @@
 ** Returns           NULL if not found. Otherwise pointer to the connection link block.
 **
 *******************************************************************************/
-tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda)
+tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TRANSPORT tranport)
 {
     UINT8                   i_clcb = 0;
     tGATT_PROFILE_CLCB      *p_clcb = NULL;
@@ -124,6 +127,7 @@
             p_clcb->in_use      = TRUE;
             p_clcb->conn_id     = conn_id;
             p_clcb->connected   = TRUE;
+            p_clcb->transport   = tranport;
             memcpy (p_clcb->bda, bda, BD_ADDR_LEN);
             break;
         }
@@ -187,16 +191,16 @@
         case GATTS_REQ_TYPE_WRITE_EXEC:
         case GATT_CMD_WRITE:
             ignore = TRUE;
-            GATT_TRACE_EVENT0("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
+            GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
             break;
 
         case GATTS_REQ_TYPE_MTU:
-            GATT_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+            GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
             ignore = TRUE;
             break;
 
         default:
-            GATT_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+            GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
             break;
     }
 
@@ -215,19 +219,20 @@
 **
 *******************************************************************************/
 static void gatt_profile_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
-                                        BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                        BOOLEAN connected, tGATT_DISCONN_REASON reason,
+                                        tBT_TRANSPORT transport)
 {
     UNUSED(gatt_if);
 
-    GATT_TRACE_EVENT5 ("gatt_profile_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+    GATT_TRACE_EVENT ("gatt_profile_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
                        (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
                        (bda[4]<<8)+bda[5], connected, conn_id, reason);
 
     if (connected)
     {
-        if (gatt_profile_clcb_alloc(conn_id, bda) == NULL)
+        if (gatt_profile_clcb_alloc(conn_id, bda, transport) == NULL)
         {
-            GATT_TRACE_ERROR0 ("gatt_profile_connect_cback: no_resource");
+            GATT_TRACE_ERROR ("gatt_profile_connect_cback: no_resource");
             return;
         }
     }
@@ -268,14 +273,14 @@
     gatt_cb.gattp_attr.handle   =
     gatt_cb.handle_of_h_r       = GATTS_AddCharacteristic(service_handle, &uuid, 0, GATT_CHAR_PROP_BIT_INDICATE);
 
-    GATT_TRACE_DEBUG1 ("gatt_profile_db_init:  handle of service changed%d",
+    GATT_TRACE_DEBUG ("gatt_profile_db_init:  handle of service changed%d",
                        gatt_cb.handle_of_h_r  );
 
     /* start service
     */
     status = GATTS_StartService (gatt_cb.gatt_if, service_handle, GATTP_TRANSPORT_SUPPORTED );
 
-    GATT_TRACE_DEBUG2 ("gatt_profile_db_init:  gatt_if=%d   start status%d",
+    GATT_TRACE_DEBUG ("gatt_profile_db_init:  gatt_if=%d   start status%d",
                        gatt_cb.gatt_if,  status);
 }
 
diff --git a/stack/gatt/gatt_auth.c b/stack/gatt/gatt_auth.c
index 7dc99e1..10cf76e 100644
--- a/stack/gatt/gatt_auth.c
+++ b/stack/gatt/gatt_auth.c
@@ -114,9 +114,8 @@
     }
     else
     {
-        /* if this is a bad signature, assume from attacker, ignore it */
-        GATT_TRACE_ERROR0("Signature Verification Failed");
-        gatt_disconnect(p_tcb->peer_bda);
+        /* if this is a bad signature, assume from attacker, ignore it  */
+        GATT_TRACE_ERROR("Signature Verification Failed, data ignored");
     }
 
     return;
@@ -132,7 +131,7 @@
 *******************************************************************************/
 void gatt_sec_check_complete(BOOLEAN sec_check_ok, tGATT_CLCB   *p_clcb, UINT8 sec_act)
 {
-    if (GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb))
+    if (p_clcb && p_clcb->p_tcb && GKI_queue_is_empty(&p_clcb->p_tcb->pending_enc_clcb))
         gatt_set_sec_act(p_clcb->p_tcb, GATT_SEC_NONE);
 
     if (!sec_check_ok)
@@ -157,7 +156,7 @@
 ** Returns
 **
 *******************************************************************************/
-void gatt_enc_cmpl_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
+void gatt_enc_cmpl_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
 {
     tGATT_TCB   *p_tcb;
     UINT8       sec_flag;
@@ -166,8 +165,8 @@
     UINT16       count;
     UNUSED(p_ref_data);
 
-    GATT_TRACE_DEBUG0("gatt_enc_cmpl_cback");
-    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+    GATT_TRACE_DEBUG("gatt_enc_cmpl_cback");
+    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL)
     {
         if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENC_PENDING)
             return;
@@ -178,8 +177,9 @@
             {
                 if (gatt_get_sec_act(p_tcb) == GATT_SEC_ENCRYPT_MITM )
                 {
-                    BTM_GetSecurityFlags(bd_addr, &sec_flag);
-                    if (sec_flag & sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
+                    BTM_GetSecurityFlagsByTransport(bd_addr, &sec_flag, transport);
+
+                    if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
                     {
                         status = TRUE;
                     }
@@ -206,12 +206,12 @@
         }
         else
         {
-            GATT_TRACE_ERROR0("Unknown operation encryption completed");
+            GATT_TRACE_ERROR("Unknown operation encryption completed");
         }
     }
     else
     {
-        GATT_TRACE_ERROR0("enc callback for unknown bd_addr");
+        GATT_TRACE_ERROR("enc callback for unknown bd_addr");
     }
 }
 
@@ -232,7 +232,7 @@
     UINT16       count;
     UINT8        i = 0;
 
-    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE)) != NULL)
     {
         for (i = 0; i < GATT_MAX_APPS; i++)
         {
@@ -262,7 +262,7 @@
     }
     else
     {
-        GATT_TRACE_DEBUG0("notify GATT for encryption completion of unknown device");
+        GATT_TRACE_DEBUG("notify GATT for encryption completion of unknown device");
     }
     return;
 }
@@ -316,9 +316,7 @@
     UINT8               sec_flag;
     tGATT_TCB           *p_tcb = p_clcb->p_tcb;
     tGATT_AUTH_REQ      auth_req = p_clcb->auth_req;
-
     BOOLEAN             is_link_encrypted= FALSE;
-    BOOLEAN             is_le_link=FALSE;
     BOOLEAN             is_link_key_known=FALSE;
     BOOLEAN             is_key_mitm=FALSE;
     UINT8               key_type;
@@ -327,8 +325,8 @@
     if (auth_req == GATT_AUTH_REQ_NONE )
         return act;
 
-    is_le_link = BTM_UseLeLink(p_tcb->peer_bda);
-    BTM_GetSecurityFlags(p_tcb->peer_bda, &sec_flag);
+    BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_clcb->p_tcb->transport);
+
     btm_ble_link_sec_check(p_tcb->peer_bda, auth_req, &sec_act);
 
     /* if a encryption is pending, need to wait */
@@ -336,24 +334,15 @@
         auth_req != GATT_AUTH_REQ_NONE)
         return GATT_SEC_ENC_PENDING;
 
-    if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
+    if (sec_flag & (BTM_SEC_FLAG_ENCRYPTED| BTM_SEC_FLAG_LKEY_KNOWN))
     {
-        is_link_encrypted = TRUE;
+        if (sec_flag & BTM_SEC_FLAG_ENCRYPTED)
+            is_link_encrypted = TRUE;
+
         is_link_key_known = TRUE;
 
         if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
-        {
             is_key_mitm = TRUE;
-        }
-
-    }
-    else if (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN)
-    {
-        is_link_key_known = TRUE;
-        if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED)
-        {
-            is_key_mitm = TRUE;
-        }
     }
 
     /* first check link key upgrade required or not */
@@ -377,7 +366,7 @@
     /* now check link needs to be encrypted or not if the link key upgrade is not required */
     if (act == GATT_SEC_OK)
     {
-        if (is_le_link &&
+        if (p_tcb->transport == BT_TRANSPORT_LE &&
             (p_clcb->operation == GATTC_OPTYPE_WRITE) &&
             (p_clcb->op_subtype == GATT_WRITE_NO_RSP))
         {
@@ -430,7 +419,7 @@
     tGATT_STATUS    encrypt_status = GATT_NOT_ENCRYPTED;
     UINT8           sec_flag=0;
 
-    BTM_GetSecurityFlags(p_tcb->peer_bda, &sec_flag);
+    BTM_GetSecurityFlagsByTransport(p_tcb->peer_bda, &sec_flag, p_tcb->transport);
 
     if ((sec_flag & BTM_SEC_FLAG_ENCRYPTED) && (sec_flag & BTM_SEC_FLAG_LKEY_KNOWN))
     {
@@ -439,7 +428,7 @@
             encrypt_status = GATT_ENCRYPED_MITM;
     }
 
-    GATT_TRACE_DEBUG1("gatt_get_link_encrypt_status status=0x%x",encrypt_status);
+    GATT_TRACE_DEBUG("gatt_get_link_encrypt_status status=0x%x",encrypt_status);
     return  encrypt_status ;
 }
 
@@ -500,7 +489,7 @@
     switch (gatt_sec_act )
     {
         case GATT_SEC_SIGN_DATA:
-            GATT_TRACE_DEBUG0("gatt_security_check_start: Do data signing");
+            GATT_TRACE_DEBUG("gatt_security_check_start: Do data signing");
             gatt_sign_data(p_clcb);
             break;
         case GATT_SEC_ENCRYPT:
@@ -508,12 +497,12 @@
         case GATT_SEC_ENCRYPT_MITM:
             if (sec_act_old < GATT_SEC_ENCRYPT)
             {
-                GATT_TRACE_DEBUG0("gatt_security_check_start: Encrypt now or key upgreade first");
+                GATT_TRACE_DEBUG("gatt_security_check_start: Encrypt now or key upgreade first");
                 gatt_convert_sec_action(gatt_sec_act, &btm_ble_sec_act);
-                btm_status = BTM_SetEncryption(p_tcb->peer_bda, gatt_enc_cmpl_cback, &btm_ble_sec_act);
+                btm_status = BTM_SetEncryption(p_tcb->peer_bda, p_tcb->transport , gatt_enc_cmpl_cback, &btm_ble_sec_act);
                 if ( (btm_status != BTM_SUCCESS) && (btm_status != BTM_CMD_STARTED))
                 {
-                    GATT_TRACE_ERROR1("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status);
+                    GATT_TRACE_ERROR("gatt_security_check_start BTM_SetEncryption failed btm_status=%d", btm_status);
                     status = FALSE;
                 }
             }
diff --git a/stack/gatt/gatt_cl.c b/stack/gatt/gatt_cl.c
index e8c41fc..0dd3c49 100644
--- a/stack/gatt/gatt_cl.c
+++ b/stack/gatt/gatt_cl.c
@@ -27,6 +27,7 @@
 #if BLE_INCLUDED == TRUE
 
 #include <string.h>
+#include "bt_utils.h"
 #include "gki.h"
 #include "gatt_int.h"
 
@@ -102,6 +103,13 @@
             cl_req.find_type_value.s_handle = p_clcb->s_handle;
             cl_req.find_type_value.e_handle = p_clcb->e_handle;
             cl_req.find_type_value.value_len = p_clcb->uuid.len;
+            /* if service type is 32 bits UUID, convert it now */
+            if (p_clcb->uuid.len == LEN_UUID_32)
+            {
+                cl_req.find_type_value.value_len = LEN_UUID_128;
+                gatt_convert_uuid32_to_uuid128(cl_req.find_type_value.value, p_clcb->uuid.uu.uuid32);
+            }
+            else
             memcpy (cl_req.find_type_value.value,  &p_clcb->uuid.uu, p_clcb->uuid.len);
         }
 
@@ -164,7 +172,7 @@
                 else
                     p_clcb->first_read_blob_after_read = FALSE;
 
-                GATT_TRACE_DEBUG1("gatt_act_read first_read_blob_after_read=%d",
+                GATT_TRACE_DEBUG("gatt_act_read first_read_blob_after_read=%d",
                                   p_clcb->first_read_blob_after_read);
                 op_code = GATT_REQ_READ_BLOB;
                 msg.read_blob.offset = offset;
@@ -191,7 +199,7 @@
             break;
 
         default:
-            GATT_TRACE_ERROR1("Unknown read type: %d", p_clcb->op_subtype);
+            GATT_TRACE_ERROR("Unknown read type: %d", p_clcb->op_subtype);
             break;
     }
 
@@ -260,19 +268,19 @@
 
             default:
                 rt = GATT_INTERNAL_ERROR;
-                GATT_TRACE_ERROR1("Unknown write type: %d", p_clcb->op_subtype);
+                GATT_TRACE_ERROR("Unknown write type: %d", p_clcb->op_subtype);
                 break;
         }
     }
     else
         rt = GATT_INTERNAL_ERROR;
 
-    if ((rt != GATT_SUCCESS  && rt != GATT_CMD_STARTED)
+    if ((rt != GATT_SUCCESS  && rt != GATT_CMD_STARTED && rt != GATT_CONGESTED)
         || (rt != GATT_CMD_STARTED && p_clcb->op_subtype == GATT_WRITE_NO_RSP))
     {
         if (rt != GATT_SUCCESS)
         {
-            GATT_TRACE_ERROR1("gatt_act_write() failed op_code=0x%x", op_code);
+            GATT_TRACE_ERROR("gatt_act_write() failed op_code=0x%x", op_code);
         }
         gatt_end_operation(p_clcb, rt, NULL);
     }
@@ -290,7 +298,7 @@
 {
     UINT8       rt ;
 
-    GATT_TRACE_DEBUG0("gatt_send_queue_write_cancel ");
+    GATT_TRACE_DEBUG("gatt_send_queue_write_cancel ");
 
     rt = attp_send_cl_msg(p_tcb, p_clcb->clcb_idx, GATT_REQ_EXEC_WRITE, (tGATT_CL_MSG *)&flag);
 
@@ -314,7 +322,7 @@
     BOOLEAN             exec = FALSE;
     tGATT_EXEC_FLAG     flag = GATT_PREP_WRITE_EXEC;
 
-    GATT_TRACE_DEBUG0("gatt_check_write_long_terminate ");
+    GATT_TRACE_DEBUG("gatt_check_write_long_terminate ");
     /* check the first write response status */
     if (p_rsp_value != NULL)
     {
@@ -358,7 +366,7 @@
     UINT8   rt = GATT_SUCCESS;
     UINT8   type = p_clcb->op_subtype;
 
-    GATT_TRACE_DEBUG1("gatt_send_prepare_write type=0x%x", type );
+    GATT_TRACE_DEBUG("gatt_send_prepare_write type=0x%x", type );
     to_send = p_attr->len - p_attr->offset;
 
     if (to_send > (p_tcb->payload_size - GATT_WRITE_LONG_HDR_SIZE)) /* 2 = UINT16 offset bytes  */
@@ -372,7 +380,7 @@
         offset += p_clcb->start_offset;
     }
 
-    GATT_TRACE_DEBUG2("offset =0x%x len=%d", offset, to_send );
+    GATT_TRACE_DEBUG("offset =0x%x len=%d", offset, to_send );
 
     rt = gatt_send_write_msg(p_tcb,
                              p_clcb->clcb_idx,
@@ -402,12 +410,14 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatt_process_find_type_value_rsp (tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
+void gatt_process_find_type_value_rsp (tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
 {
     tGATT_DISC_RES      result;
     UINT8               *p = p_data;
 
-    GATT_TRACE_DEBUG0("gatt_process_find_type_value_rsp ");
+    UNUSED(p_tcb);
+
+    GATT_TRACE_DEBUG("gatt_process_find_type_value_rsp ");
     /* unexpected response */
     if (p_clcb->operation != GATTC_OPTYPE_DISCOVERY || p_clcb->op_subtype != GATT_DISC_SRVC_BY_UUID)
         return;
@@ -445,14 +455,18 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatt_process_read_info_rsp(tGATT_CLCB *p_clcb, UINT16 len, UINT8 *p_data)
+void gatt_process_read_info_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
+                                UINT16 len, UINT8 *p_data)
 {
     tGATT_DISC_RES  result;
     UINT8   *p = p_data, uuid_len = 0, type;
 
+    UNUSED(p_tcb);
+    UNUSED(op_code);
+
     if (len < GATT_INFO_RSP_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("invalid Info Response PDU received, discard.");
+        GATT_TRACE_ERROR("invalid Info Response PDU received, discard.");
         gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
         return;
     }
@@ -500,11 +514,15 @@
 ** Returns          void.
 **
 *******************************************************************************/
-static void gatt_proc_disc_error_rsp(tGATT_CLCB *p_clcb, UINT8 opcode, UINT8 reason)
+void gatt_proc_disc_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 opcode,
+                              UINT16 handle, UINT8 reason)
 {
     tGATT_STATUS    status = (tGATT_STATUS) reason;
 
-    GATT_TRACE_DEBUG2("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode);
+    UNUSED(p_tcb);
+    UNUSED(handle);
+
+    GATT_TRACE_DEBUG("gatt_proc_disc_error_rsp reason: %02x cmd_code %04x", reason, opcode);
 
     switch (opcode)
     {
@@ -515,11 +533,11 @@
             if (reason == GATT_NOT_FOUND)
             {
                 status = GATT_SUCCESS;
-                GATT_TRACE_DEBUG0("Discovery completed");
+                GATT_TRACE_DEBUG("Discovery completed");
             }
             break;
         default:
-            GATT_TRACE_ERROR1("Incorrect discovery opcode %04x",   opcode);
+            GATT_TRACE_ERROR("Incorrect discovery opcode %04x",   opcode);
             break;
     }
 
@@ -536,20 +554,24 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 *p_data)
+void gatt_process_error_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT8 op_code,
+                            UINT16 len, UINT8 *p_data)
 {
     UINT8   opcode, reason, * p= p_data;
     UINT16  handle;
     tGATT_VALUE  *p_attr = (tGATT_VALUE *)p_clcb->p_attr_buf;
 
-    GATT_TRACE_DEBUG0("gatt_process_error_rsp ");
+    UNUSED(op_code);
+    UNUSED(len);
+
+    GATT_TRACE_DEBUG("gatt_process_error_rsp ");
     STREAM_TO_UINT8(opcode, p);
     STREAM_TO_UINT16(handle, p);
     STREAM_TO_UINT8(reason, p);
 
     if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)
     {
-        gatt_proc_disc_error_rsp(p_clcb, opcode, reason);
+        gatt_proc_disc_error_rsp(p_tcb, p_clcb, opcode, handle, reason);
     }
     else
     {
@@ -591,11 +613,11 @@
     tGATT_VALUE  value = {0};
     UINT8        *p= p_data;
 
-    GATT_TRACE_ERROR2("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len);
+    GATT_TRACE_ERROR("value resp op_code = %s len = %d", gatt_dbg_op_name(op_code), len);
 
     if (len < GATT_PREP_WRITE_RSP_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("illegal prepare write response length, discard");
+        GATT_TRACE_ERROR("illegal prepare write response length, discard");
         gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value);
         return;
     }
@@ -643,11 +665,11 @@
     UINT8           *p= p_data, i,
     event = (op_code == GATT_HANDLE_VALUE_NOTIF) ? GATTC_OPTYPE_NOTIFICATION : GATTC_OPTYPE_INDICATION;
 
-    GATT_TRACE_DEBUG0("gatt_process_notification ");
+    GATT_TRACE_DEBUG("gatt_process_notification ");
 
     if (len < GATT_NOTIFICATION_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("illegal notification PDU length, discard");
+        GATT_TRACE_ERROR("illegal notification PDU length, discard");
         return;
     }
 
@@ -672,7 +694,7 @@
                For now, just log the error reset the counter.
                Later we need to disconnect the link unconditionally.
             */
-            GATT_TRACE_ERROR1("gatt_process_notification rcv Ind. but ind_count=%d (will reset ind_count)",  p_tcb->ind_count);
+            GATT_TRACE_ERROR("gatt_process_notification rcv Ind. but ind_count=%d (will reset ind_count)",  p_tcb->ind_count);
         }
         p_tcb->ind_count = 0;
     }
@@ -733,7 +755,7 @@
 
     if (len < GATT_READ_BY_TYPE_RSP_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("Illegal ReadByType/ReadByGroupType Response length, discard");
+        GATT_TRACE_ERROR("Illegal ReadByType/ReadByGroupType Response length, discard");
         gatt_end_operation(p_clcb, GATT_INVALID_PDU, NULL);
         return;
     }
@@ -744,7 +766,7 @@
     {
         /* this is an error case that server's response containing a value length which is larger than MTU-2
            or value_len > message total length -1 */
-        GATT_TRACE_ERROR4("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)",
+        GATT_TRACE_ERROR("gatt_process_read_by_type_rsp: Discard response op_code=%d vale_len=%d > (MTU-2=%d or msg_len-1=%d)",
                           op_code, value_len, (p_tcb->payload_size - 2), (len-1));
         gatt_end_operation(p_clcb, GATT_ERROR, NULL);
         return;
@@ -790,7 +812,7 @@
                 record_value.group_value.e_handle = handle;
                 if (!gatt_parse_uuid_from_cmd(&record_value.group_value.service_type, value_len, &p))
                 {
-                    GATT_TRACE_ERROR0("discover all service response parsing failure");
+                    GATT_TRACE_ERROR("discover all service response parsing failure");
                     break;
                 }
             }
@@ -826,7 +848,7 @@
             }
             else
             {
-               GATT_TRACE_ERROR1("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len);
+               GATT_TRACE_ERROR("gatt_process_read_by_type_rsp INCL_SRVC failed with invalid data value_len=%d", value_len);
                gatt_end_operation(p_clcb, GATT_INVALID_PDU, (void *)p);
                return;
             }
@@ -921,12 +943,14 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb,
-                                  UINT16 len, UINT8 *p_data)
+void gatt_process_read_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb,  UINT8 op_code,
+                           UINT16 len, UINT8 *p_data)
 {
     UINT16      offset = p_clcb->counter;
     UINT8       * p= p_data;
 
+    UNUSED(op_code);
+
     if (p_clcb->operation == GATTC_OPTYPE_READ)
     {
         if (p_clcb->op_subtype != GATT_READ_BY_HANDLE)
@@ -956,7 +980,7 @@
                 if (len == (p_tcb->payload_size - 1) && /* full packet for read or read blob rsp */
                     len + offset < GATT_MAX_ATTR_LEN)
                 {
-                    GATT_TRACE_DEBUG3("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d",
+                    GATT_TRACE_DEBUG("full pkt issue read blob for remianing bytes old offset=%d len=%d new offset=%d",
                                       offset, len, p_clcb->counter);
                     gatt_act_read(p_clcb, p_clcb->counter);
                 }
@@ -967,7 +991,7 @@
             }
             else /* exception, should not happen */
             {
-                GATT_TRACE_ERROR2("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf);
+                GATT_TRACE_ERROR("attr offset = %d p_attr_buf = %d ", offset, p_clcb->p_attr_buf);
                 gatt_end_operation(p_clcb, GATT_NO_RESOURCES, (void *)p_clcb->p_attr_buf);
             }
         }
@@ -1030,7 +1054,7 @@
 
     if (len < GATT_MTU_RSP_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("invalid MTU response PDU received, discard.");
+        GATT_TRACE_ERROR("invalid MTU response PDU received, discard.");
         status = GATT_INVALID_PDU;
     }
     else
@@ -1078,15 +1102,17 @@
     BOOLEAN     sent = FALSE;
     UINT8       rsp_code;
     tGATT_CLCB   *p_clcb = NULL;
+    tGATT_STATUS att_ret = GATT_SUCCESS;
 
     while (!sent &&
            p_tcb->pending_cl_req != p_tcb->next_slot_inq &&
            p_cmd->to_send && p_cmd->p_cmd != NULL)
     {
-        sent = attp_send_msg_to_L2CAP(p_tcb, p_cmd->p_cmd);
+        att_ret = attp_send_msg_to_l2cap(p_tcb, p_cmd->p_cmd);
 
-        if (sent)
+        if (att_ret == GATT_SUCCESS || att_ret == GATT_CONGESTED)
         {
+            sent = TRUE;
             p_cmd->to_send = FALSE;
             p_cmd->p_cmd = NULL;
 
@@ -1100,15 +1126,17 @@
                 p_clcb = gatt_cmd_dequeue(p_tcb, &rsp_code);
 
                 /* if no ack needed, keep sending */
-                sent = FALSE;
+                if (att_ret == GATT_SUCCESS)
+                    sent = FALSE;
+
                 p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
                 /* send command complete callback here */
-                gatt_end_operation(p_clcb, GATT_SUCCESS, NULL);
+                gatt_end_operation(p_clcb, att_ret, NULL);
             }
         }
         else
         {
-            GATT_TRACE_ERROR0("gatt_cl_send_next_cmd_inq: L2CAP sent error");
+            GATT_TRACE_ERROR("gatt_cl_send_next_cmd_inq: L2CAP sent error");
 
             memset(p_cmd, 0, sizeof(tGATT_CMD_Q));
             p_tcb->pending_cl_req ++;
@@ -1144,7 +1172,7 @@
 
         if (p_clcb == NULL || (rsp_code != op_code && op_code != GATT_RSP_ERROR))
         {
-            GATT_TRACE_WARNING2 ("ATT - Ignore wrong response. Receives (%02x) \
+            GATT_TRACE_WARNING ("ATT - Ignore wrong response. Receives (%02x) \
                                 Request(%02x) Ignored", op_code, rsp_code);
 
             return;
@@ -1159,7 +1187,7 @@
     /* The message has to be smaller than the agreed MTU, len does not count op_code */
     if (len >= p_tcb->payload_size)
     {
-        GATT_TRACE_ERROR2("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size);
+        GATT_TRACE_ERROR("invalid response/indicate pkt size: %d, PDU size: %d", len + 1, p_tcb->payload_size);
         if (op_code != GATT_HANDLE_VALUE_NOTIF &&
             op_code != GATT_HANDLE_VALUE_IND)
             gatt_end_operation(p_clcb, GATT_ERROR, NULL);
@@ -1169,7 +1197,7 @@
         switch (op_code)
         {
             case GATT_RSP_ERROR:
-                gatt_process_error_rsp(p_tcb, p_clcb, p_data);
+                gatt_process_error_rsp(p_tcb, p_clcb, op_code, len, p_data);
                 break;
 
             case GATT_RSP_MTU:       /* 2 bytes mtu */
@@ -1177,7 +1205,7 @@
                 break;
 
             case GATT_RSP_FIND_INFO:
-                gatt_process_read_info_rsp(p_clcb, len, p_data);
+                gatt_process_read_info_rsp(p_tcb, p_clcb, op_code, len, p_data);
                 break;
 
             case GATT_RSP_READ_BY_TYPE:
@@ -1188,11 +1216,11 @@
             case GATT_RSP_READ:
             case GATT_RSP_READ_BLOB:
             case GATT_RSP_READ_MULTI:
-                gatt_process_read_rsp(p_tcb, p_clcb, len, p_data);
+                gatt_process_read_rsp(p_tcb, p_clcb, op_code, len, p_data);
                 break;
 
             case GATT_RSP_FIND_TYPE_VALUE: /* disc service with UUID */
-                gatt_process_find_type_value_rsp(p_clcb, len, p_data);
+                gatt_process_find_type_value_rsp(p_tcb, p_clcb, len, p_data);
                 break;
 
             case GATT_RSP_WRITE:
@@ -1213,7 +1241,7 @@
                 break;
 
             default:
-                GATT_TRACE_ERROR1("Unknown opcode = %d", op_code);
+                GATT_TRACE_ERROR("Unknown opcode = %d", op_code);
                 break;
         }
     }
diff --git a/stack/gatt/gatt_db.c b/stack/gatt/gatt_db.c
index 268bc7d..b7887c9 100644
--- a/stack/gatt/gatt_db.c
+++ b/stack/gatt/gatt_db.c
@@ -27,6 +27,7 @@
 #if BLE_INCLUDED == TRUE
 
 #include "bt_trace.h"
+#include "bt_utils.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -38,11 +39,11 @@
 **              L O C A L    F U N C T I O N     P R O T O T Y P E S            *
 *********************************************************************************/
 static BOOLEAN allocate_svc_db_buf(tGATT_SVC_DB *p_db);
-static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, UINT16 uuid16, UINT8 *p_uuid128, tGATT_PERM perm);
+static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PERM perm);
 static BOOLEAN deallocate_attr_in_db(tGATT_SVC_DB *p_db, void *p_attr);
 static BOOLEAN copy_extra_byte_in_db(tGATT_SVC_DB *p_db, void **p_dst, UINT16 len);
 
-static void gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri);
+static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri);
 static tGATT_STATUS gatts_send_app_read_request(tGATT_TCB *p_tcb, UINT8 op_code,
                                                 UINT16 handle, UINT16 offset, UINT32 trans_id);
 
@@ -58,25 +59,23 @@
 ** Returns          Status of te operation.
 **
 *******************************************************************************/
-BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID service,  BOOLEAN is_pri,
+BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service,  BOOLEAN is_pri,
                                UINT16 s_hdl, UINT16 num_handle)
 {
     if (!allocate_svc_db_buf(p_db))
     {
-        GATT_TRACE_ERROR0("gatts_init_service_db failed, no resources");
+        GATT_TRACE_ERROR("gatts_init_service_db failed, no resources");
         return FALSE;
     }
 
-    GATT_TRACE_DEBUG0("gatts_init_service_db");
-    GATT_TRACE_DEBUG2("s_hdl = %d num_handle = %d", s_hdl, num_handle );
+    GATT_TRACE_DEBUG("gatts_init_service_db");
+    GATT_TRACE_DEBUG("s_hdl = %d num_handle = %d", s_hdl, num_handle );
 
     /* update service database information */
     p_db->next_handle   = s_hdl;
     p_db->end_handle    = s_hdl + num_handle;
 
-    gatts_db_add_service_declaration(p_db, service, is_pri);
-
-    return TRUE;
+    return gatts_db_add_service_declaration(p_db, p_service, is_pri);
 }
 
 /*******************************************************************************
@@ -95,7 +94,7 @@
 {
     if (!p_db || !p_db->p_attr_list)
     {
-        GATT_TRACE_ERROR0("service DB empty");
+        GATT_TRACE_ERROR("service DB empty");
 
         return NULL;
     }
@@ -115,6 +114,7 @@
 **
 *******************************************************************************/
 static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr,
+                                                 UINT16 offset,
                                                  BOOLEAN read_long,
                                                  tGATT_SEC_FLAG sec_flag,
                                                  UINT8 key_size)
@@ -122,6 +122,7 @@
     UINT16          min_key_size;
     tGATT_PERM      perm = p_attr->permission;
 
+    UNUSED(offset);
     min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12));
     if (min_key_size != 0 )
     {
@@ -130,32 +131,32 @@
 
     if (!(perm & GATT_READ_ALLOWED))
     {
-        GATT_TRACE_ERROR0( "GATT_READ_NOT_PERMIT");
+        GATT_TRACE_ERROR( "GATT_READ_NOT_PERMIT");
         return GATT_READ_NOT_PERMIT;
     }
 
     if ((perm & GATT_READ_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED) &&
         !(sec_flag & BTM_SEC_FLAG_ENCRYPTED))
     {
-        GATT_TRACE_ERROR0( "GATT_INSUF_AUTHENTICATION");
+        GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION");
         return GATT_INSUF_AUTHENTICATION;
     }
 
     if ((perm & GATT_READ_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED))
     {
-        GATT_TRACE_ERROR0( "GATT_INSUF_AUTHENTICATION: MITM Required");
+        GATT_TRACE_ERROR( "GATT_INSUF_AUTHENTICATION: MITM Required");
         return GATT_INSUF_AUTHENTICATION;
     }
 
     if ((perm & GATT_READ_ENCRYPTED_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
     {
-        GATT_TRACE_ERROR0( "GATT_INSUF_ENCRYPTION");
+        GATT_TRACE_ERROR( "GATT_INSUF_ENCRYPTION");
         return GATT_INSUF_ENCRYPTION;
     }
 
     if ( (perm & GATT_READ_ENCRYPTED_REQUIRED) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size))
     {
-        GATT_TRACE_ERROR0( "GATT_INSUF_KEY_SIZE");
+        GATT_TRACE_ERROR( "GATT_INSUF_KEY_SIZE");
         return GATT_INSUF_KEY_SIZE;
     }
 
@@ -172,7 +173,7 @@
             case GATT_UUID_CHAR_CLIENT_CONFIG:
             case GATT_UUID_CHAR_SRVR_CONFIG:
             case GATT_UUID_CHAR_PRESENT_FORMAT:
-                GATT_TRACE_ERROR0("GATT_NOT_LONG");
+                GATT_TRACE_ERROR("GATT_NOT_LONG");
                 return GATT_NOT_LONG;
 
             default:
@@ -216,21 +217,21 @@
     UINT16          read_long_uuid=0;
     tGATT_ATTR16    *p_attr16  = (tGATT_ATTR16  *)p_attr;
 
-    GATT_TRACE_DEBUG5("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d",
+    GATT_TRACE_DEBUG("read_attr_value uuid=0x%04x perm=0x%0x sec_flag=0x%x offset=%d read_long=%d",
                       p_attr16->uuid,
                       p_attr16->permission,
                       sec_flag,
                       offset,
                       read_long);
 
-    status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, read_long, sec_flag, key_size);
-
-    if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
-        uuid16 = p_attr16->uuid;
+    status = gatts_check_attr_readability((tGATT_ATTR16 *)p_attr, offset, read_long, sec_flag, key_size);
 
     if (status != GATT_SUCCESS)
         return status;
 
+    if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
+        uuid16 = p_attr16->uuid;
+
     status = GATT_NO_RESOURCES;
 
     if (read_long &&
@@ -261,6 +262,12 @@
             {
                 UINT16_TO_STREAM(p, ((tGATT_ATTR16 *)(p_attr16->p_next))->uuid);
             }
+            /* convert a 32bits UUID to 128 bits */
+            else if (((tGATT_ATTR32 *)(p_attr16->p_next))->uuid_type == GATT_ATTR_UUID_TYPE_32)
+            {
+                gatt_convert_uuid32_to_uuid128 (p, ((tGATT_ATTR32 *)(p_attr16->p_next))->uuid);
+                p += LEN_UUID_128;
+            }
             else
             {
                 ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *)(p_attr16->p_next))->uuid, LEN_UUID_128);
@@ -271,13 +278,17 @@
     }
     else if (uuid16 == GATT_UUID_INCLUDE_SERVICE)
     {
-        len = (p_attr16->p_value->incl_handle.service_type.len == 2) ? 6 : 4;
+        if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16)
+            len = 6;
+        else
+            len = 4;
+
         if (mtu >= len)
         {
             UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.s_handle);
             UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.e_handle);
 
-            if (p_attr16->p_value->incl_handle.service_type.len == 2)
+            if (p_attr16->p_value->incl_handle.service_type.len == LEN_UUID_16)
             {
                 UINT16_TO_STREAM(p, p_attr16->p_value->incl_handle.service_type.uu.uuid16);
             }
@@ -345,6 +356,11 @@
                 attr_uuid.len = LEN_UUID_16;
                 attr_uuid.uu.uuid16 = p_attr->uuid;
             }
+            else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+            {
+                attr_uuid.len = LEN_UUID_32;
+                attr_uuid.uu.uuid32 = ((tGATT_ATTR32 *)p_attr)->uuid;
+            }
             else
             {
                 attr_uuid.len = LEN_UUID_128;
@@ -382,7 +398,7 @@
                     }
                     else
                     {
-                        GATT_TRACE_ERROR0("format mismatch");
+                        GATT_TRACE_ERROR("format mismatch");
                         status = GATT_NO_RESOURCES;
                         break;
                     }
@@ -407,7 +423,7 @@
                  BTM_SEC_LINK_KEY_KNOWN)
             {
                 tACL_CONN         *p;
-                p = btm_bda_to_acl(p_tcb->peer_bda);
+                p = btm_bda_to_acl(p_tcb->peer_bda, BT_TRANSPORT_LE);
                 if ((p != NULL) && (p->link_role == BTM_ROLE_MASTER))
                 {
                     tBTM_BLE_SEC_ACT sec_act = BTM_BLE_SEC_ENCRYPT;
@@ -436,17 +452,18 @@
                                    tBT_UUID service)
 {
     tGATT_ATTR16      *p_attr;
+    tBT_UUID         uuid = {LEN_UUID_16, {GATT_UUID_INCLUDE_SERVICE}};
 
-    GATT_TRACE_DEBUG3("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x",
+    GATT_TRACE_DEBUG("gatts_add_included_service: s_hdl = 0x%04x e_hdl = 0x%04x uuid = 0x%04x",
                       s_handle, e_handle, service.uu.uuid16);
 
     if (service.len == 0 || s_handle == 0 || e_handle == 0)
     {
-        GATT_TRACE_ERROR0("gatts_add_included_service Illegal Params.");
+        GATT_TRACE_ERROR("gatts_add_included_service Illegal Params.");
         return 0;
     }
 
-    if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, GATT_UUID_INCLUDE_SERVICE, NULL, GATT_PERM_READ)) != NULL)
+    if ((p_attr = (tGATT_ATTR16 *) allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
     {
         if (copy_extra_byte_in_db(p_db, (void **)&p_attr->p_value, sizeof(tGATT_INCL_SRVC)))
         {
@@ -485,11 +502,11 @@
                                  tBT_UUID * p_char_uuid)
 {
     tGATT_ATTR16     *p_char_decl, *p_char_val;
-    UINT16          uuid16 = (p_char_uuid->len == LEN_UUID_16) ? p_char_uuid->uu.uuid16 : 0;
+    tBT_UUID        uuid = {LEN_UUID_16, {GATT_UUID_CHAR_DECLARE}};
 
-    GATT_TRACE_DEBUG2("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property);
+    GATT_TRACE_DEBUG("gatts_add_characteristic perm=0x%0x property=0x%0x", perm, property);
 
-    if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, GATT_UUID_CHAR_DECLARE, NULL, GATT_PERM_READ)) != NULL)
+    if ((p_char_decl = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ)) != NULL)
     {
         if (!copy_extra_byte_in_db(p_db, (void **)&p_char_decl->p_value, sizeof(tGATT_CHAR_DECL)))
         {
@@ -497,7 +514,7 @@
             return 0;
         }
 
-        p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, uuid16, p_char_uuid->uu.uuid128, perm);
+        p_char_val = (tGATT_ATTR16 *)allocate_attr_in_db(p_db, p_char_uuid, perm);
 
         if (p_char_val == NULL)
         {
@@ -578,18 +595,16 @@
                              tBT_UUID *     p_descr_uuid)
 {
     tGATT_ATTR16    *p_char_dscptr;
-    UINT16    uuid16  = (p_descr_uuid->len == LEN_UUID_16)? p_descr_uuid->uu.uuid16 : 0;
 
-    GATT_TRACE_DEBUG1("gatts_add_char_descr uuid=0x%04x", p_descr_uuid->uu.uuid16);
+    GATT_TRACE_DEBUG("gatts_add_char_descr uuid=0x%04x", p_descr_uuid->uu.uuid16);
 
     /* Add characteristic descriptors */
     if ((p_char_dscptr = (tGATT_ATTR16 *)allocate_attr_in_db(p_db,
-                                                             uuid16,
-                                                             p_descr_uuid->uu.uuid128,
+                                                             p_descr_uuid,
                                                              perm))
         == NULL)
     {
-        GATT_TRACE_DEBUG0("gatts_add_char_descr Fail for adding char descriptors.");
+        GATT_TRACE_DEBUG("gatts_add_char_descr Fail for adding char descriptors.");
         return 0;
     }
     else
@@ -695,7 +710,7 @@
         {
             if (p_attr->handle == handle)
             {
-                status = gatts_check_attr_readability (p_attr,
+                status = gatts_check_attr_readability (p_attr, 0,
                                                        is_long,
                                                        sec_flag, key_size);
                 break;
@@ -734,7 +749,7 @@
     tGATT_PERM      perm;
     UINT16          min_key_size;
 
-    GATT_TRACE_DEBUG6( "gatts_write_attr_perm_check op_code=0x%0x handle=0x%04x offset=%d len=%d sec_flag=0x%0x key_size=%d",
+    GATT_TRACE_DEBUG( "gatts_write_attr_perm_check op_code=0x%0x handle=0x%04x offset=%d len=%d sec_flag=0x%0x key_size=%d",
                        op_code, handle, offset, len, sec_flag, key_size);
 
     if (p_db != NULL)
@@ -751,7 +766,7 @@
                 {
                     min_key_size +=6;
                 }
-                GATT_TRACE_DEBUG2( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x",
+                GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x",
                                    p_attr->permission,
                                    min_key_size);
 
@@ -778,44 +793,45 @@
                 if ((op_code == GATT_SIGN_CMD_WRITE) && !(perm & GATT_WRITE_SIGNED_PERM))
                 {
                     status = GATT_WRITE_NOT_PERMIT;
-                    GATT_TRACE_DEBUG0( "gatts_write_attr_perm_check - sign cmd write not allowed");
+                    GATT_TRACE_DEBUG( "gatts_write_attr_perm_check - sign cmd write not allowed");
                 }
                  if ((op_code == GATT_SIGN_CMD_WRITE) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED))
                 {
                     status = GATT_INVALID_PDU;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - Error!! sign cmd write sent on a encypted link");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - Error!! sign cmd write sent on a encypted link");
                 }
                 else if (!(perm & GATT_WRITE_ALLOWED))
                 {
                     status = GATT_WRITE_NOT_PERMIT;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT");
                 }
                 /* require authentication, but not been authenticated */
                 else if ((perm & GATT_WRITE_AUTH_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_UNAUTHED))
                 {
                     status = GATT_INSUF_AUTHENTICATION;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION");
                 }
                 else if ((perm & GATT_WRITE_MITM_REQUIRED ) && !(sec_flag & GATT_SEC_FLAG_LKEY_AUTHED))
                 {
                     status = GATT_INSUF_AUTHENTICATION;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: MITM required");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: MITM required");
                 }
                 else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
                 {
                     status = GATT_INSUF_ENCRYPTION;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_ENCRYPTION");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_ENCRYPTION");
                 }
                 else if ((perm & GATT_WRITE_ENCRYPTED_PERM ) && (sec_flag & GATT_SEC_FLAG_ENCRYPTED) && (key_size < min_key_size))
                 {
                     status = GATT_INSUF_KEY_SIZE;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_KEY_SIZE");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_KEY_SIZE");
                 }
                 /* LE security mode 2 attribute  */
-                else if (perm & GATT_WRITE_SIGNED_PERM && op_code != GATT_SIGN_CMD_WRITE && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED))
+                else if (perm & GATT_WRITE_SIGNED_PERM && op_code != GATT_SIGN_CMD_WRITE && !(sec_flag & GATT_SEC_FLAG_ENCRYPTED)
+                    &&  (perm & GATT_WRITE_ALLOWED) == 0)
                 {
                     status = GATT_INSUF_AUTHENTICATION;
-                    GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: LE security mode 2 required");
+                    GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INSUF_AUTHENTICATION: LE security mode 2 required");
                 }
                 else /* writable: must be char value declaration or char descritpors */
                 {
@@ -842,7 +858,8 @@
                             break;
                         }
                     }
-                    else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128)
+                    else if (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128 ||
+				              p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
                     {
                          status = GATT_SUCCESS;
                     }
@@ -865,12 +882,12 @@
                         if (op_code == GATT_REQ_PREPARE_WRITE && offset != 0) /* does not allow write blob */
                         {
                             status = GATT_NOT_LONG;
-                            GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_NOT_LONG");
+                            GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_NOT_LONG");
                         }
                         else if (len != max_size)    /* data does not match the required format */
                         {
                             status = GATT_INVALID_ATTR_LEN;
-                            GATT_TRACE_ERROR0( "gatts_write_attr_perm_check - GATT_INVALID_PDU");
+                            GATT_TRACE_ERROR( "gatts_write_attr_perm_check - GATT_INVALID_PDU");
                         }
                         else
                         {
@@ -897,28 +914,35 @@
 **
 **
 ** Parameter        p_db    : database pointer.
+**                  p_uuid:     pointer to attribute UUID
 **                  service : type of attribute to be added.
 **
 ** Returns          pointer to the newly allocated attribute.
 **
 *******************************************************************************/
-static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, UINT16 uuid16, UINT8 *uuid128, tGATT_PERM perm)
+static void *allocate_attr_in_db(tGATT_SVC_DB *p_db, tBT_UUID *p_uuid, tGATT_PERM perm)
 {
     tGATT_ATTR16    *p_attr16 = NULL, *p_last;
+    tGATT_ATTR32    *p_attr32 = NULL;
     tGATT_ATTR128   *p_attr128 = NULL;
-    UINT16      len = (uuid16 == 0) ? sizeof(tGATT_ATTR128): sizeof(tGATT_ATTR16);
+    UINT16      len = sizeof(tGATT_ATTR128);
 
-    GATT_TRACE_DEBUG1("allocate attr %d bytes ",len);
-
-    if (uuid16 == GATT_ILLEGAL_UUID && uuid128 == NULL)
+    if (p_uuid == NULL)
     {
-        GATT_TRACE_ERROR0("illegal UUID");
+        GATT_TRACE_ERROR("illegal UUID");
         return NULL;
     }
 
+    if (p_uuid->len == LEN_UUID_16)
+        len = sizeof(tGATT_ATTR16);
+    else if (p_uuid->len == LEN_UUID_32)
+        len = sizeof(tGATT_ATTR32);
+
+    GATT_TRACE_DEBUG("allocate attr %d bytes ",len);
+
     if (p_db->end_handle <= p_db->next_handle)
     {
-        GATT_TRACE_DEBUG2("handle space full. handle_max = %d next_handle = %d",
+        GATT_TRACE_DEBUG("handle space full. handle_max = %d next_handle = %d",
                           p_db->end_handle, p_db->next_handle);
         return NULL;
     }
@@ -927,25 +951,29 @@
     {
         if (!allocate_svc_db_buf(p_db))
         {
-            GATT_TRACE_ERROR0("allocate_attr_in_db failed, no resources");
+            GATT_TRACE_ERROR("allocate_attr_in_db failed, no resources");
             return NULL;
         }
     }
-
+    memset(p_db->p_free_mem, 0, len);
     p_attr16 = (tGATT_ATTR16 *) p_db->p_free_mem;
-    p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem;
 
-    memset(p_attr16, 0, len);
-
-    if (uuid16 != GATT_ILLEGAL_UUID)
+    if (p_uuid->len == LEN_UUID_16 && p_uuid->uu.uuid16 != GATT_ILLEGAL_UUID)
     {
         p_attr16->uuid_type = GATT_ATTR_UUID_TYPE_16;
-        p_attr16->uuid = uuid16;
+        p_attr16->uuid = p_uuid->uu.uuid16;
     }
-    else
+    else if (p_uuid->len == LEN_UUID_32)
     {
+        p_attr32 = (tGATT_ATTR32 *) p_db->p_free_mem;
+        p_attr32->uuid_type = GATT_ATTR_UUID_TYPE_32;
+        p_attr32->uuid = p_uuid->uu.uuid32;
+    }
+    else if (p_uuid->len == LEN_UUID_128)
+    {
+        p_attr128 = (tGATT_ATTR128 *) p_db->p_free_mem;
         p_attr128->uuid_type = GATT_ATTR_UUID_TYPE_128;
-        memcpy(p_attr128->uuid, uuid128, LEN_UUID_128);
+        memcpy(p_attr128->uuid, p_uuid->uu.uuid128, LEN_UUID_128);
     }
 
     p_db->p_free_mem += len;
@@ -970,12 +998,17 @@
 
     if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_16)
     {
-        GATT_TRACE_DEBUG3("=====> handle = [0x%04x] uuid = [0x%04x] perm=0x%02x ",
+        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid16 = [0x%04x] perm=0x%02x ",
                           p_attr16->handle, p_attr16->uuid, p_attr16->permission);
     }
+    else if (p_attr16->uuid_type == GATT_ATTR_UUID_TYPE_32)
+    {
+        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid32 = [0x%08x] perm=0x%02x ",
+                          p_attr32->handle, p_attr32->uuid, p_attr32->permission);
+    }
     else
     {
-        GATT_TRACE_DEBUG4("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ",
+        GATT_TRACE_DEBUG("=====> handle = [0x%04x] uuid128 = [0x%02x:0x%02x] perm=0x%02x ",
                           p_attr128->handle, p_attr128->uuid[0],p_attr128->uuid[1],
                           p_attr128->permission);
     }
@@ -1050,7 +1083,7 @@
     {
         if (!allocate_svc_db_buf(p_db))
         {
-            GATT_TRACE_ERROR0("copy_extra_byte_in_db failed, no resources");
+            GATT_TRACE_ERROR("copy_extra_byte_in_db failed, no resources");
             return FALSE;
         }
     }
@@ -1077,11 +1110,11 @@
 {
     BT_HDR  *p_buf;
 
-    GATT_TRACE_DEBUG0("allocate_svc_db_buf allocating extra buffer");
+    GATT_TRACE_DEBUG("allocate_svc_db_buf allocating extra buffer");
 
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf(GATT_DB_POOL_ID)) == NULL)
     {
-        GATT_TRACE_ERROR0("allocate_svc_db_buf failed, no resources");
+        GATT_TRACE_ERROR("allocate_svc_db_buf failed, no resources");
         return FALSE;
     }
 
@@ -1151,21 +1184,44 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri)
+static BOOLEAN gatts_db_add_service_declaration(tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri)
 {
     tGATT_ATTR16  *p_attr;
-    UINT16      service_type = is_pri ? GATT_UUID_PRI_SERVICE: GATT_UUID_SEC_SERVICE;
+    tBT_UUID    uuid = {LEN_UUID_16, {0}};
+    BOOLEAN     rt = FALSE;
 
-    GATT_TRACE_DEBUG0( "add_service_declaration");
+    GATT_TRACE_DEBUG( "add_service_declaration");
+
+    if (is_pri)
+        uuid.uu.uuid16 = GATT_UUID_PRI_SERVICE;
+    else
+        uuid.uu.uuid16 = GATT_UUID_SEC_SERVICE;
 
     /* add service declration record */
-    if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, service_type, NULL, GATT_PERM_READ))) != NULL)
+    if ((p_attr = (tGATT_ATTR16 *)(allocate_attr_in_db(p_db, &uuid, GATT_PERM_READ))) != NULL)
     {
         if (copy_extra_byte_in_db (p_db, (void **)&p_attr->p_value, sizeof(tBT_UUID)))
         {
-            memcpy (&p_attr->p_value->uuid, &service, sizeof(tBT_UUID));
+            if (p_service->len == LEN_UUID_16)
+            {
+                p_attr->p_value->uuid.len = LEN_UUID_16;
+                p_attr->p_value->uuid.uu.uuid16 = p_service->uu.uuid16;
+            }
+            else if (p_service->len == LEN_UUID_32)
+            {
+                p_attr->p_value->uuid.len = LEN_UUID_128;
+                gatt_convert_uuid32_to_uuid128(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid32);
+            }
+            else
+            {
+                p_attr->p_value->uuid.len = LEN_UUID_128;
+                memcpy(p_attr->p_value->uuid.uu.uuid128, p_service->uu.uuid128, LEN_UUID_128);
+            }
+            rt = TRUE;
         }
+
     }
+    return rt;
 }
 
 #endif /* BLE_INCLUDED */
diff --git a/stack/gatt/gatt_int.h b/stack/gatt/gatt_int.h
index 1f81d63..663aa7d 100644
--- a/stack/gatt/gatt_int.h
+++ b/stack/gatt/gatt_int.h
@@ -21,8 +21,6 @@
 
 #include "bt_target.h"
 
-#if BLE_INCLUDED == TRUE
-
 
 #include "bt_trace.h"
 #include "gatt_api.h"
@@ -169,6 +167,7 @@
 */
 #define GATT_ATTR_UUID_TYPE_16      0
 #define GATT_ATTR_UUID_TYPE_128     1
+#define GATT_ATTR_UUID_TYPE_32      2
 typedef UINT8   tGATT_ATTR_UUID_TYPE;
 
 /* 16 bits UUID Attribute in server database
@@ -184,6 +183,20 @@
     UINT16                              uuid;
 } tGATT_ATTR16;
 
+/* 32 bits UUID Attribute in server database
+*/
+typedef struct
+{
+    void                                *p_next;  /* pointer to the next attribute,
+                                                    either tGATT_ATTR16, tGATT_ATTR32 or tGATT_ATTR128 */
+    tGATT_ATTR_VALUE                    *p_value;
+    tGATT_ATTR_UUID_TYPE                uuid_type;
+    tGATT_PERM                          permission;
+    UINT16                              handle;
+    UINT32                              uuid;
+} tGATT_ATTR32;
+
+
 /* 128 bits UUID Attribute in server database
 */
 typedef struct
@@ -340,6 +353,7 @@
     BUFFER_Q        pending_enc_clcb;   /* pending encryption channel q */
     tGATT_SEC_ACTION sec_act;
     BD_ADDR         peer_bda;
+    tBT_TRANSPORT   transport;
     UINT32          trans_id;
 
     UINT16          att_lcid;           /* L2CAP channel ID for ATT */
@@ -400,6 +414,7 @@
     BOOLEAN                 in_use;
     TIMER_LIST_ENT          rsp_timer_ent;  /* peer response timer */
     UINT8                   retry_count;
+
 } tGATT_CLCB;
 
 typedef struct
@@ -454,6 +469,7 @@
     BOOLEAN in_use;
     BOOLEAN connected;
     BD_ADDR bda;
+    tBT_TRANSPORT   transport;
 }tGATT_PROFILE_CLCB;
 
 typedef struct
@@ -524,9 +540,9 @@
 extern void gatt_init (void);
 
 /* from gatt_main.c */
-extern BOOLEAN gatt_disconnect (BD_ADDR rem_bda);
-extern BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr);
-extern BOOLEAN gatt_connect (BD_ADDR rem_bda,  tGATT_TCB *p_tcb);
+extern BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb);
+extern BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT transport);
+extern BOOLEAN gatt_connect (BD_ADDR rem_bda,  tGATT_TCB *p_tcb, tBT_TRANSPORT transport);
 extern void gatt_data_process (tGATT_TCB *p_tcb, BT_HDR *p_buf);
 extern void gatt_update_app_use_link_flag ( tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link);
 
@@ -541,16 +557,15 @@
 
 /* from gatt_attr.c */
 extern UINT16 gatt_profile_find_conn_id_by_bd_addr(BD_ADDR bda);
-extern tGATT_PROFILE_CLCB *gatt_profile_find_clcb_by_bd_addr(BD_ADDR bda);
 extern BOOLEAN gatt_profile_clcb_dealloc (UINT16 conn_id);
-extern tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda);
+extern tGATT_PROFILE_CLCB *gatt_profile_clcb_alloc (UINT16 conn_id, BD_ADDR bda, tBT_TRANSPORT transport);
 
 
 /* Functions provided by att_protocol.c */
 extern tGATT_STATUS attp_send_cl_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, tGATT_CL_MSG *p_msg);
 extern BT_HDR *attp_build_sr_msg(tGATT_TCB *p_tcb, UINT8 op_code, tGATT_SR_MSG *p_msg);
 extern tGATT_STATUS attp_send_sr_msg (tGATT_TCB *p_tcb, BT_HDR *p_msg);
-extern BOOLEAN  attp_send_msg_to_L2CAP(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP);
+extern tGATT_STATUS attp_send_msg_to_l2cap(tGATT_TCB *p_tcb, BT_HDR *p_toL2CAP);
 
 /* utility functions */
 extern UINT8 * gatt_dbg_op_name(UINT8 op_code);
@@ -558,7 +573,8 @@
 extern BOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid, UINT16 len, UINT8 **p_data);
 extern UINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid);
 extern BOOLEAN gatt_uuid_compare(tBT_UUID src, tBT_UUID tar);
-extern void gatt_sr_get_sec_info(BD_ADDR rem_bda, BOOLEAN le_conn, UINT8 *p_sec_flag, UINT8 *p_key_size);
+extern void gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32);
+extern void gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size);
 extern void gatt_start_rsp_timer(UINT16 clcb_idx);
 extern void gatt_start_conf_timer(tGATT_TCB    *p_tcb);
 extern void gatt_rsp_timeout(TIMER_LIST_ENT *p_tle);
@@ -573,13 +589,14 @@
 extern BOOLEAN gatt_is_srv_chg_ind_pending (tGATT_TCB *p_tcb);
 extern tGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda);
 
-extern BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx);
+extern BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx, tBT_TRANSPORT *p_transport);
 extern void gatt_set_srv_chg(void);
 extern void gatt_delete_dev_from_srv_chg_clt_list(BD_ADDR bd_addr);
 extern tGATT_VALUE *gatt_add_pending_ind(tGATT_TCB  *p_tcb, tGATT_VALUE *p_ind);
 extern tGATTS_PENDING_NEW_SRV_START *gatt_add_pending_new_srv_start( tGATTS_HNDL_RANGE *p_new_srv_start);
 extern void gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id);
-extern void gatt_update_listen_mode(void);
+extern BOOLEAN gatt_update_listen_mode(void);
+extern BOOLEAN gatt_cl_send_next_cmd_inq(tGATT_TCB *p_tcb);
 
 /* reserved handle list */
 extern tGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst);
@@ -635,16 +652,16 @@
 extern UINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb);
 extern UINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda);
 extern tGATT_TCB * gatt_find_tcb_by_cid(UINT16 lcid);
-extern tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda);
+extern tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport);
 extern tGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx);
-extern tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda);
-
+extern tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport);
+extern BOOLEAN gatt_send_ble_burst_data (BD_ADDR remote_bda,  BT_HDR *p_buf);
 
 /* GATT client functions */
 extern void gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb);
 extern UINT8 gatt_send_write_msg(tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code, UINT16 handle,
                                  UINT16 len, UINT16 offset, UINT8 *p_data);
-extern void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason);
+extern void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport);
 extern void gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data);
 
 extern void gatt_act_discovery(tGATT_CLCB *p_clcb);
@@ -667,7 +684,7 @@
 extern void gatt_set_sec_act(tGATT_TCB *p_tcb, tGATT_SEC_ACTION sec_act);
 
 /* gatt_db.c */
-extern BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID service, BOOLEAN is_pri, UINT16 s_hdl, UINT16 num_handle);
+extern BOOLEAN gatts_init_service_db (tGATT_SVC_DB *p_db, tBT_UUID *p_service, BOOLEAN is_pri, UINT16 s_hdl, UINT16 num_handle);
 extern UINT16 gatts_add_included_service (tGATT_SVC_DB *p_db, UINT16 s_handle, UINT16 e_handle, tBT_UUID service);
 extern UINT16 gatts_add_characteristic (tGATT_SVC_DB *p_db, tGATT_PERM perm, tGATT_CHAR_PROP property, tBT_UUID *p_char_uuid);
 extern UINT16 gatts_add_char_descr (tGATT_SVC_DB *p_db, tGATT_PERM perm, tBT_UUID *p_dscp_uuid);
@@ -684,4 +701,4 @@
 extern void gatt_reset_bgdev_list(void);
 #endif
 
-#endif /* BLE_INCLUDED */
+
diff --git a/stack/gatt/gatt_main.c b/stack/gatt/gatt_main.c
index d5e017b..54951b2 100644
--- a/stack/gatt/gatt_main.c
+++ b/stack/gatt/gatt_main.c
@@ -44,8 +44,9 @@
 /********************************************************************************/
 /*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
 /********************************************************************************/
-static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason);
+static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport);
 static void gatt_le_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf);
+static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congest);
 
 static void gatt_l2cif_connect_ind_cback (BD_ADDR  bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id);
 static void gatt_l2cif_connect_cfm_cback (UINT16 l2cap_cid, UINT16 result);
@@ -55,6 +56,7 @@
 static void gatt_l2cif_disconnect_cfm_cback (UINT16 l2cap_cid, UINT16 result);
 static void gatt_l2cif_data_ind_cback (UINT16 l2cap_cid, BT_HDR *p_msg);
 static void gatt_send_conn_cback (tGATT_TCB *p_tcb);
+static void gatt_l2cif_congest_cback (UINT16 cid, BOOLEAN congested);
 
 static const tL2CAP_APPL_INFO dyn_info =
 {
@@ -67,7 +69,7 @@
     gatt_l2cif_disconnect_cfm_cback,
     NULL,
     gatt_l2cif_data_ind_cback,
-    NULL,
+    gatt_l2cif_congest_cback,
     NULL
 } ;
 
@@ -89,7 +91,7 @@
 {
     tL2CAP_FIXED_CHNL_REG  fixed_reg;
 
-    GATT_TRACE_DEBUG0("gatt_init()");
+    GATT_TRACE_DEBUG("gatt_init()");
 
     memset (&gatt_cb, 0, sizeof(tGATT_CB));
 
@@ -110,6 +112,7 @@
 
     fixed_reg.pL2CA_FixedConn_Cb = gatt_le_connect_cback;
     fixed_reg.pL2CA_FixedData_Cb = gatt_le_data_ind;
+    fixed_reg.pL2CA_FixedCong_Cb = gatt_le_cong_cback;      /* congestion callback */
     fixed_reg.default_idle_tout  = 0xffff;                  /* 0xffff default idle timeout */
 
     L2CA_RegisterFixedChannel (L2CAP_ATT_CID, &fixed_reg);
@@ -117,7 +120,7 @@
     /* Now, register with L2CAP for ATT PSM over BR/EDR */
     if (!L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info))
     {
-        GATT_TRACE_ERROR0 ("ATT Dynamic Registration failed");
+        GATT_TRACE_ERROR ("ATT Dynamic Registration failed");
     }
 
     BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_ATT, BTM_SEC_NONE, BT_PSM_ATT, 0, 0);
@@ -143,15 +146,14 @@
 ** Returns          TRUE if connection is started, otherwise return FALSE.
 **
 *******************************************************************************/
-BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb)
+BOOLEAN gatt_connect (BD_ADDR rem_bda, tGATT_TCB *p_tcb, tBT_TRANSPORT transport)
 {
     BOOLEAN             gatt_ret = FALSE;
 
     if (gatt_get_ch_state(p_tcb) != GATT_CH_OPEN)
         gatt_set_ch_state(p_tcb, GATT_CH_CONN);
 
-    /* select the physical link for GATT connection */
-    if (BTM_UseLeLink(rem_bda))
+    if (transport == BT_TRANSPORT_LE)
     {
         p_tcb->att_lcid = L2CAP_ATT_CID;
         gatt_ret = L2CA_ConnectFixedChnl (L2CAP_ATT_CID, rem_bda);
@@ -171,18 +173,17 @@
 **
 ** Description      This function is called to disconnect to an ATT device.
 **
-** Parameter        rem_bda: remote device address to disconnect from.
+** Parameter        p_tcb: pointer to the TCB to disconnect.
 **
 ** Returns          TRUE: if connection found and to be disconnected; otherwise
 **                  return FALSE.
 **
 *******************************************************************************/
-BOOLEAN gatt_disconnect (BD_ADDR rem_bda)
+BOOLEAN gatt_disconnect (tGATT_TCB *p_tcb)
 {
-    tGATT_TCB           *p_tcb = gatt_find_tcb_by_addr(rem_bda);
     BOOLEAN             ret = FALSE;
     tGATT_CH_STATE      ch_state;
-    GATT_TRACE_DEBUG0 ("gatt_disconnect ");
+    GATT_TRACE_DEBUG ("gatt_disconnect ");
 
     if (p_tcb != NULL)
     {
@@ -194,12 +195,12 @@
                 if (ch_state == GATT_CH_OPEN)
                 {
                     /* only LCB exist between remote device and local */
-                    ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, rem_bda);
+                    ret = L2CA_RemoveFixedChnl (L2CAP_ATT_CID, p_tcb->peer_bda);
                 }
                 else
                 {
                     gatt_set_ch_state(p_tcb, GATT_CH_CLOSING);
-                    ret = L2CA_CancelBleConnectReq (rem_bda);
+                    ret = L2CA_CancelBleConnectReq (p_tcb->peer_bda);
                 }
             }
             else
@@ -209,7 +210,7 @@
         }
         else
         {
-            GATT_TRACE_DEBUG0 ("gatt_disconnect already in closing state");
+            GATT_TRACE_DEBUG ("gatt_disconnect already in closing state");
         }
     }
 
@@ -232,7 +233,7 @@
 
     if (p_tcb == NULL)
     {
-        GATT_TRACE_ERROR0("gatt_update_app_hold_link_status p_tcb=NULL");
+        GATT_TRACE_ERROR("gatt_update_app_hold_link_status p_tcb=NULL");
         return;
     }
 
@@ -263,7 +264,7 @@
         }
     }
 
-    GATT_TRACE_DEBUG4("gatt_update_app_hold_link_status found=%d[1-found] idx=%d gatt_if=%d is_add=%d", found, i, gatt_if, is_add);
+    GATT_TRACE_DEBUG("gatt_update_app_hold_link_status found=%d[1-found] idx=%d gatt_if=%d is_add=%d", found, i, gatt_if, is_add);
 
 }
 
@@ -279,20 +280,21 @@
 *******************************************************************************/
 void gatt_update_app_use_link_flag (tGATT_IF gatt_if, tGATT_TCB *p_tcb, BOOLEAN is_add, BOOLEAN check_acl_link)
 {
-    GATT_TRACE_DEBUG2("gatt_update_app_use_link_flag  is_add=%d chk_link=%d",
+    GATT_TRACE_DEBUG("gatt_update_app_use_link_flag  is_add=%d chk_link=%d",
                       is_add, check_acl_link);
 
     gatt_update_app_hold_link_status(gatt_if, p_tcb, is_add);
 
     if (check_acl_link &&
         p_tcb &&
-        (BTM_GetHCIConnHandle(p_tcb->peer_bda) != GATT_INVALID_ACL_HANDLE))
+         p_tcb->att_lcid == L2CAP_ATT_CID && /* only update link idle timer for fixed channel */
+        (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) != GATT_INVALID_ACL_HANDLE))
     {
         if (is_add)
         {
-            GATT_TRACE_DEBUG0("GATT disables link idle timer");
+            GATT_TRACE_DEBUG("GATT disables link idle timer");
             /* acl link is connected disable the idle timeout */
-            GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT);
+            GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport);
         }
         else
         {
@@ -300,8 +302,8 @@
             {
                 /* acl link is connected but no application needs to use the link
                    so set the timeout value to GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP seconds */
-                GATT_TRACE_DEBUG1("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
-                GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
+                GATT_TRACE_DEBUG("GATT starts link idle timer =%d sec", GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP);
+                GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP, p_tcb->transport);
             }
 
         }
@@ -317,25 +319,22 @@
 ** Returns          void.
 **
 *******************************************************************************/
-BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr)
+BOOLEAN gatt_act_connect (tGATT_REG *p_reg, BD_ADDR bd_addr, tBT_TRANSPORT transport)
 {
     BOOLEAN     ret = FALSE;
     tGATT_TCB   *p_tcb;
     UINT8       st;
 
-    GATT_TRACE_DEBUG0("gatt_act_connect");
-
-    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) != NULL)
+    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr, transport)) != NULL)
     {
         ret = TRUE;
         st = gatt_get_ch_state(p_tcb);
 
         /* before link down, another app try to open a GATT connection */
         if(st == GATT_CH_OPEN &&  gatt_num_apps_hold_link(p_tcb) == 0 &&
-            /* only connection on fix channel when the l2cap channel is already open */
-            p_tcb->att_lcid == L2CAP_ATT_CID )
+            transport == BT_TRANSPORT_LE )
         {
-            if (!gatt_connect(bd_addr,  p_tcb))
+            if (!gatt_connect(bd_addr,  p_tcb, transport))
                 ret = FALSE;
         }
         else if(st == GATT_CH_CLOSING)
@@ -346,11 +345,11 @@
     }
     else
     {
-        if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) != NULL)
+        if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, transport)) != NULL)
         {
-            if (!gatt_connect(bd_addr,  p_tcb))
+            if (!gatt_connect(bd_addr,  p_tcb, transport))
             {
-                GATT_TRACE_ERROR0("gatt_connect failed");
+                GATT_TRACE_ERROR("gatt_connect failed");
                 memset(p_tcb, 0, sizeof(tGATT_TCB));
             }
             else
@@ -359,7 +358,7 @@
         else
         {
             ret = 0;
-            GATT_TRACE_ERROR1("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if);
+            GATT_TRACE_ERROR("Max TCB for gatt_if [%d] reached.", p_reg->gatt_if);
         }
     }
 
@@ -380,19 +379,22 @@
 **                      connected (conn = TRUE)/disconnected (conn = FALSE).
 **
 *******************************************************************************/
-static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason)
+static void gatt_le_connect_cback (BD_ADDR bd_addr, BOOLEAN connected,
+                                   UINT16 reason, tBT_TRANSPORT transport)
 {
 
-    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr);
-
+    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr, transport);
     BOOLEAN                 check_srv_chg = FALSE;
     tGATTS_SRV_CHG          *p_srv_chg_clt=NULL;
 
-    GATT_TRACE_DEBUG3 ("GATT   ATT protocol channel with BDA: %08x%04x is %s",
+    /* ignore all fixed channel connect/disconnect on BR/EDR link for GATT */
+    if (transport == BT_TRANSPORT_BR_EDR)
+        return;
+
+    GATT_TRACE_DEBUG ("GATT   ATT protocol channel with BDA: %08x%04x is %s",
                        (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                        (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected");
 
-
     if ((p_srv_chg_clt = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL)
     {
         check_srv_chg = TRUE;
@@ -405,16 +407,9 @@
 
     if (connected)
     {
-        GATT_TRACE_DEBUG1("connected is TRUE reason=%d",reason );
-        /* BR/EDR lik, ignore this callback */
-        if (reason == 0)
-            return;
-
         /* do we have a channel initiating a connection? */
         if (p_tcb)
         {
-            if (check_srv_chg)
-                gatt_chk_srv_chg (p_srv_chg_clt);
             /* we are initiating connection */
             if ( gatt_get_ch_state(p_tcb) == GATT_CH_CONN)
             {
@@ -424,11 +419,14 @@
 
                 gatt_send_conn_cback(p_tcb);
             }
+            if (check_srv_chg)
+                gatt_chk_srv_chg (p_srv_chg_clt);
         }
         /* this is incoming connection or background connection callback */
+
         else
         {
-            if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) != NULL)
+            if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_LE)) != NULL)
             {
                 p_tcb->att_lcid = L2CAP_ATT_CID;
 
@@ -444,14 +442,70 @@
             }
             else
             {
-                GATT_TRACE_ERROR0("CCB max out, no rsources");
+                GATT_TRACE_ERROR("CCB max out, no rsources");
             }
         }
     }
     else
     {
-        gatt_cleanup_upon_disc(bd_addr, reason);
-        GATT_TRACE_DEBUG0 ("ATT disconnected");
+        gatt_cleanup_upon_disc(bd_addr, reason, transport);
+        GATT_TRACE_DEBUG ("ATT disconnected");
+    }
+}
+
+/*******************************************************************************
+**
+** Function         gatt_channel_congestion
+**
+** Description      This function is called to process the congestion callback
+**                  from lcb
+**
+** Returns          void
+**
+*******************************************************************************/
+static void gatt_channel_congestion(tGATT_TCB *p_tcb, BOOLEAN congested)
+{
+    UINT8 i = 0;
+    tGATT_REG *p_reg=NULL;
+    UINT16 conn_id;
+
+    /* if uncongested, check to see if there is any more pending data */
+    if (p_tcb != NULL && congested == FALSE)
+    {
+        gatt_cl_send_next_cmd_inq(p_tcb);
+    }
+    /* notifying all applications for the connection up event */
+    for (i = 0, p_reg = gatt_cb.cl_rcb ; i < GATT_MAX_APPS; i++, p_reg++)
+    {
+        if (p_reg->in_use)
+        {
+            if (p_reg->app_cb.p_congestion_cb)
+            {
+                conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
+                (*p_reg->app_cb.p_congestion_cb)(conn_id, congested);
+            }
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         gatt_le_cong_cback
+**
+** Description      This function is called when GATT fixed channel is congested
+**                  or uncongested.
+**
+** Returns          void
+**
+*******************************************************************************/
+static void gatt_le_cong_cback(BD_ADDR remote_bda, BOOLEAN congested)
+{
+    tGATT_TCB *p_tcb = gatt_find_tcb_by_addr(remote_bda, BT_TRANSPORT_LE);
+
+    /* if uncongested, check to see if there is any more pending data */
+    if (p_tcb != NULL)
+    {
+        gatt_channel_congestion(p_tcb, congested);
     }
 }
 
@@ -475,7 +529,7 @@
     tGATT_TCB    *p_tcb;
 
     /* Find CCB based on bd addr */
-    if ((p_tcb = gatt_find_tcb_by_addr (bd_addr)) != NULL &&
+    if ((p_tcb = gatt_find_tcb_by_addr (bd_addr, BT_TRANSPORT_LE)) != NULL &&
         gatt_get_ch_state(p_tcb) >= GATT_CH_OPEN)
     {
         gatt_data_process(p_tcb, p_buf);
@@ -486,7 +540,7 @@
 
         if (p_tcb != NULL)
         {
-            GATT_TRACE_WARNING1 ("ATT - Ignored L2CAP data while in state: %d",
+            GATT_TRACE_WARNING ("ATT - Ignored L2CAP data while in state: %d",
                                  gatt_get_ch_state(p_tcb));
         }
     }
@@ -508,15 +562,15 @@
     /* do we already have a control channel for this peer? */
     UINT8       result = L2CAP_CONN_OK;
     tL2CAP_CFG_INFO cfg;
-    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_BR_EDR);
     UNUSED(psm);
 
-    GATT_TRACE_ERROR1("Connection indication cid = %d", lcid);
+    GATT_TRACE_ERROR("Connection indication cid = %d", lcid);
     /* new connection ? */
     if (p_tcb == NULL)
     {
         /* allocate tcb */
-        if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr)) == NULL)
+        if ((p_tcb = gatt_allocate_tcb_by_bdaddr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
         {
             /* no tcb available, reject L2CAP connection */
             result = L2CAP_CONN_NO_RESOURCES;
@@ -558,7 +612,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result)
+static void gatt_l2cif_connect_cfm_cback(UINT16 lcid, UINT16 result)
 {
     tGATT_TCB       *p_tcb;
     tL2CAP_CFG_INFO cfg;
@@ -566,7 +620,7 @@
     /* look up clcb for this channel */
     if ((p_tcb = gatt_find_tcb_by_cid(lcid)) != NULL)
     {
-        GATT_TRACE_DEBUG3("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid);
+        GATT_TRACE_DEBUG("gatt_l2c_connect_cfm_cback result: %d ch_state: %d, lcid:0x%x", result, gatt_get_ch_state(p_tcb), p_tcb->att_lcid);
 
         /* if in correct state */
         if (gatt_get_ch_state(p_tcb) == GATT_CH_CONN)
@@ -586,7 +640,7 @@
             /* else initiating connection failure */
             else
             {
-                gatt_cleanup_upon_disc(p_tcb->peer_bda, GATT_CONN_L2C_FAILURE);
+                gatt_cleanup_upon_disc(p_tcb->peer_bda, result, GATT_TRANSPORT_BR_EDR);
             }
         }
         else /* wrong state, disconnect it */
@@ -701,11 +755,8 @@
                 }
                 else
                 {
-                    if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
-                        btm_sec_is_le_capable_dev(p_tcb->peer_bda))
-                    {
+                    if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
                         gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
-                    }
                 }
 
                 /* send callback */
@@ -738,20 +789,17 @@
             /* send L2CAP disconnect response */
             L2CA_DisconnectRsp(lcid);
         }
-
         if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL)
         {
-            if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
-                btm_sec_is_le_capable_dev(p_tcb->peer_bda))
+            if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
                 gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
         }
-
         /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */
-        if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0)
+        if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0)
             reason = GATT_CONN_TERMINATE_PEER_USER;
 
         /* send disconnect callback */
-        gatt_cleanup_upon_disc(p_tcb->peer_bda, reason);
+        gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR);
     }
 }
 
@@ -765,7 +813,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result)
+static void gatt_l2cif_disconnect_cfm_cback(UINT16 lcid, UINT16 result)
 {
     tGATT_TCB       *p_tcb;
     UINT16          reason;
@@ -777,17 +825,16 @@
         /* If the device is not in the service changed client list, add it... */
         if (gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda) == NULL)
         {
-            if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda) &&
-                btm_sec_is_le_capable_dev(p_tcb->peer_bda))
+            if (btm_sec_is_a_bonded_dev(p_tcb->peer_bda))
                 gatt_add_a_bonded_dev_for_srv_chg(p_tcb->peer_bda);
         }
 
         /* send disconnect callback */
         /* if ACL link is still up, no reason is logged, l2cap is disconnect from peer */
-        if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda)) == 0)
+        if ((reason = L2CA_GetDisconnectReason(p_tcb->peer_bda, p_tcb->transport)) == 0)
             reason = GATT_CONN_TERMINATE_LOCAL_HOST;
 
-        gatt_cleanup_upon_disc(p_tcb->peer_bda, reason);
+        gatt_cleanup_upon_disc(p_tcb->peer_bda, reason, GATT_TRANSPORT_BR_EDR);
     }
 }
 
@@ -801,7 +848,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf)
+static void gatt_l2cif_data_ind_cback(UINT16 lcid, BT_HDR *p_buf)
 {
     tGATT_TCB       *p_tcb;
 
@@ -818,6 +865,25 @@
 
 /*******************************************************************************
 **
+** Function         gatt_l2cif_congest_cback
+**
+** Description      L2CAP congestion callback
+**
+** Returns          void
+**
+*******************************************************************************/
+static void gatt_l2cif_congest_cback (UINT16 lcid, BOOLEAN congested)
+{
+    tGATT_TCB *p_tcb = gatt_find_tcb_by_cid(lcid);
+
+    if (p_tcb != NULL)
+    {
+        gatt_channel_congestion(p_tcb, congested);
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         gatt_send_conn_cback
 **
 ** Description      Callback used to notify layer above about a connection.
@@ -846,16 +912,17 @@
             if (p_reg->app_cb.p_conn_cb)
             {
                 conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
-                (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id, TRUE, 0);
+                (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if, p_tcb->peer_bda, conn_id,
+                                          TRUE, 0, p_tcb->transport);
             }
         }
     }
 
 
-    if (gatt_num_apps_hold_link(p_tcb))
+    if (gatt_num_apps_hold_link(p_tcb) &&  p_tcb->att_lcid == L2CAP_ATT_CID )
     {
         /* disable idle timeout if one or more clients are holding the link disable the idle timer */
-        GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT);
+        GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT, p_tcb->transport);
     }
 }
 
@@ -894,7 +961,6 @@
             if (op_code == GATT_SIGN_CMD_WRITE)
             {
                 gatt_verify_signature(p_tcb, p_buf);
-                return;
             }
             else
             {
@@ -907,12 +973,12 @@
         }
         else
         {
-            GATT_TRACE_ERROR1 ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code);
+            GATT_TRACE_ERROR ("ATT - Rcvd L2CAP data, unknown cmd: 0x%x", op_code);
         }
     }
     else
     {
-        GATT_TRACE_ERROR0 ("invalid data length, ignore");
+        GATT_TRACE_ERROR ("invalid data length, ignore");
     }
 
     GKI_freebuf (p_buf);
@@ -961,7 +1027,7 @@
     UINT8   *p = handle_range;
     UINT16  conn_id;
 
-    GATT_TRACE_DEBUG0("gatt_send_srv_chg_ind");
+    GATT_TRACE_DEBUG("gatt_send_srv_chg_ind");
 
     if (gatt_cb.handle_of_h_r)
     {
@@ -976,7 +1042,7 @@
         }
         else
         {
-            GATT_TRACE_ERROR2("Unable to find conn_id for  %08x%04x ",
+            GATT_TRACE_ERROR("Unable to find conn_id for  %08x%04x ",
                               (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
                               (peer_bda[4]<<8)+peer_bda[5] );
         }
@@ -995,7 +1061,7 @@
 *******************************************************************************/
 void gatt_chk_srv_chg(tGATTS_SRV_CHG *p_srv_chg_clt)
 {
-    GATT_TRACE_DEBUG1("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed );
+    GATT_TRACE_DEBUG("gatt_chk_srv_chg srv_changed=%d", p_srv_chg_clt->srv_changed );
 
     if (p_srv_chg_clt->srv_changed)
     {
@@ -1021,14 +1087,14 @@
     UINT8 num_clients,i;
     tGATTS_SRV_CHG  srv_chg_clt;
 
-    GATT_TRACE_DEBUG0("gatt_init_srv_chg");
+    GATT_TRACE_DEBUG("gatt_init_srv_chg");
     if (gatt_cb.cb_info.p_srv_chg_callback)
     {
         status = (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_READ_NUM_CLENTS, NULL, &rsp);
 
         if (status && rsp.num_clients)
         {
-            GATT_TRACE_DEBUG1("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients);
+            GATT_TRACE_DEBUG("gatt_init_srv_chg num_srv_chg_clt_clients=%d", rsp.num_clients);
             num_clients = rsp.num_clients;
             i = 1; /* use one based index */
             while ((i <= num_clients) && status)
@@ -1039,7 +1105,7 @@
                     memcpy(&srv_chg_clt, &rsp.srv_chg ,sizeof(tGATTS_SRV_CHG));
                     if (gatt_add_srv_chg_clt(&srv_chg_clt) == NULL)
                     {
-                        GATT_TRACE_ERROR0("Unable to add a service change client");
+                        GATT_TRACE_ERROR("Unable to add a service change client");
                         status = FALSE;
                     }
                 }
@@ -1049,7 +1115,7 @@
     }
     else
     {
-        GATT_TRACE_DEBUG0("gatt_init_srv_chg callback not registered yet");
+        GATT_TRACE_DEBUG("gatt_init_srv_chg callback not registered yet");
     }
 }
 
@@ -1068,14 +1134,15 @@
     BD_ADDR             bda;
     BOOLEAN             srv_chg_ind_pending=FALSE;
     tGATT_TCB           *p_tcb;
+    tBT_TRANSPORT      transport;
 
-    GATT_TRACE_DEBUG0 ("gatt_proc_srv_chg");
+    GATT_TRACE_DEBUG ("gatt_proc_srv_chg");
 
     if (gatt_cb.cb_info.p_srv_chg_callback && gatt_cb.handle_of_h_r)
     {
         gatt_set_srv_chg();
         start_idx =0;
-        while (gatt_find_the_connected_bda(start_idx, bda, &found_idx))
+        while (gatt_find_the_connected_bda(start_idx, bda, &found_idx, &transport))
         {
             p_tcb = &gatt_cb.tcb[found_idx];;
             srv_chg_ind_pending  = gatt_is_srv_chg_ind_pending(p_tcb);
@@ -1086,7 +1153,7 @@
             }
             else
             {
-                GATT_TRACE_DEBUG0 ("discard srv chg - already has one in the queue");
+                GATT_TRACE_DEBUG ("discard srv chg - already has one in the queue");
             }
             start_idx = ++found_idx;
         }
@@ -1106,7 +1173,7 @@
 {
     if (p_tcb)
     {
-        GATT_TRACE_DEBUG2 ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state);
+        GATT_TRACE_DEBUG ("gatt_set_ch_state: old=%d new=%d", p_tcb->ch_state, ch_state);
         p_tcb->ch_state = ch_state;
     }
 }
@@ -1125,7 +1192,7 @@
     tGATT_CH_STATE ch_state = GATT_CH_CLOSE;
     if (p_tcb)
     {
-        GATT_TRACE_DEBUG1 ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state);
+        GATT_TRACE_DEBUG ("gatt_get_ch_state: ch_state=%d", p_tcb->ch_state);
         ch_state = p_tcb->ch_state;
     }
     return ch_state;
diff --git a/stack/gatt/gatt_sr.c b/stack/gatt/gatt_sr.c
old mode 100644
new mode 100755
index c006dd2..2199794
--- a/stack/gatt/gatt_sr.c
+++ b/stack/gatt/gatt_sr.c
@@ -98,10 +98,10 @@
 void gatt_dequeue_sr_cmd (tGATT_TCB *p_tcb)
 {
     /* Double check in case any buffers are queued */
-    GATT_TRACE_DEBUG0("gatt_dequeue_sr_cmd" );
+    GATT_TRACE_DEBUG("gatt_dequeue_sr_cmd" );
     if (p_tcb->sr_cmd.p_rsp_msg)
     {
-        GATT_TRACE_ERROR1("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg);
+        GATT_TRACE_ERROR("free p_tcb->sr_cmd.p_rsp_msg = %d", p_tcb->sr_cmd.p_rsp_msg);
 
         GKI_freebuf (p_tcb->sr_cmd.p_rsp_msg);
     }
@@ -129,7 +129,7 @@
     UINT8           *p;
     BOOLEAN         is_overflow = FALSE;
 
-    GATT_TRACE_DEBUG2 ("process_read_multi_rsp status=%d mtu=%d", status, mtu);
+    GATT_TRACE_DEBUG ("process_read_multi_rsp status=%d mtu=%d", status, mtu);
 
     if (p_buf == NULL)
     {
@@ -144,7 +144,7 @@
     p_cmd->status = status;
     if (status == GATT_SUCCESS)
     {
-        GATT_TRACE_DEBUG2 ("Multi read count=%d num_hdls=%d",
+        GATT_TRACE_DEBUG ("Multi read count=%d num_hdls=%d",
                            p_cmd->multi_rsp_q.count, p_cmd->multi_req.num_handles);
         /* Wait till we get all the responses */
         if (p_cmd->multi_rsp_q.count == p_cmd->multi_req.num_handles)
@@ -186,7 +186,7 @@
                         /* just send the partial response for the overflow case */
                         len = p_rsp->attr_value.len - (total_len - mtu);
                         is_overflow = TRUE;
-                        GATT_TRACE_DEBUG2 ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len );
+                        GATT_TRACE_DEBUG ("multi read overflow available len=%d val_len=%d", len, p_rsp->attr_value.len );
                     }
                     else
                     {
@@ -222,10 +222,10 @@
             /* Sanity check on the buffer length */
             if (p_buf->len == 0)
             {
-                GATT_TRACE_ERROR0("process_read_multi_rsp - nothing found!!");
+                GATT_TRACE_ERROR("process_read_multi_rsp - nothing found!!");
                 p_cmd->status = GATT_NOT_FOUND;
                 GKI_freebuf (p_buf);
-                GATT_TRACE_DEBUG0(" GKI_freebuf (p_buf)");
+                GATT_TRACE_DEBUG(" GKI_freebuf (p_buf)");
             }
             else if (p_cmd->p_rsp_msg != NULL)
             {
@@ -265,7 +265,7 @@
     tGATT_STATUS    ret_code = GATT_SUCCESS;
     UNUSED(trans_id);
 
-    GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp gatt_if=%d", gatt_if);
+    GATT_TRACE_DEBUG("gatt_sr_process_app_rsp gatt_if=%d", gatt_if);
 
     gatt_sr_update_cback_cnt(p_tcb, gatt_if, FALSE, FALSE);
 
@@ -294,7 +294,7 @@
             }
             else
             {
-                GATT_TRACE_ERROR0("Exception!!! already has respond message");
+                GATT_TRACE_ERROR("Exception!!! already has respond message");
             }
         }
     }
@@ -313,7 +313,7 @@
         gatt_dequeue_sr_cmd(p_tcb);
     }
 
-    GATT_TRACE_DEBUG1("gatt_sr_process_app_rsp ret_code=%d", ret_code);
+    GATT_TRACE_DEBUG("gatt_sr_process_app_rsp ret_code=%d", ret_code);
 
     return ret_code;
 }
@@ -328,7 +328,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT8 *p_data)
+void gatt_process_exec_write_req (tGATT_TCB *p_tcb, UINT8 op_code, UINT16 len, UINT8 *p_data)
 {
     UINT8   *p = p_data, flag, i = 0;
     UINT32  trans_id = 0;
@@ -336,11 +336,13 @@
     tGATT_IF gatt_if;
     UINT16  conn_id;
 
+    UNUSED(len);
+
 #if GATT_CONFORMANCE_TESTING == TRUE
     if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
     {
-        GATT_TRACE_DEBUG2("conf test forced err rsp for %s error status=%d",
-                           __FUNCTION__,gatt_cb.err_status);
+        GATT_TRACE_DEBUG("Conformance tst: forced err rspv for Execute Write: error status=%d",
+        gatt_cb.err_status);
 
         gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, gatt_cb.handle, FALSE);
 
@@ -376,13 +378,8 @@
     }
     else /* nothing needs to be executed , send response now */
     {
-        GATT_TRACE_ERROR0("gatt_process_exec_write_req: no prepare write pending");
-
-        if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_EXEC_WRITE, NULL)) != NULL)
-        {
-            attp_send_sr_msg (p_tcb, p_buf);
-        }
-
+        GATT_TRACE_ERROR("gatt_process_exec_write_req: no prepare write pending");
+        gatt_send_error_rsp(p_tcb, GATT_ERROR, GATT_REQ_EXEC_WRITE, 0, FALSE);
     }
 }
 
@@ -405,18 +402,18 @@
     UINT8           sec_flag, key_size;
     tGATTS_RSP       *p_msg;
 
-    GATT_TRACE_DEBUG0("gatt_process_read_multi_req" );
+    GATT_TRACE_DEBUG("gatt_process_read_multi_req" );
     p_tcb->sr_cmd.multi_req.num_handles = 0;
 
     gatt_sr_get_sec_info(p_tcb->peer_bda,
-                         (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+                         p_tcb->transport,
                          &sec_flag,
                          &key_size);
 
 #if GATT_CONFORMANCE_TESTING == TRUE
     if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
     {
-        GATT_TRACE_DEBUG1("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status);
+        GATT_TRACE_DEBUG("Conformance tst: forced err rspvofr ReadMultiple: error status=%d", gatt_cb.err_status);
 
         STREAM_TO_UINT16(handle, p);
 
@@ -442,7 +439,7 @@
                                                      key_size))
                 != GATT_SUCCESS)
             {
-                GATT_TRACE_DEBUG1("read permission denied : 0x%02x", err);
+                GATT_TRACE_DEBUG("read permission denied : 0x%02x", err);
                 break;
             }
         }
@@ -457,7 +454,7 @@
 
     if (ll != 0)
     {
-        GATT_TRACE_ERROR0("max attribute handle reached in ReadMultiple Request.");
+        GATT_TRACE_ERROR("max attribute handle reached in ReadMultiple Request.");
     }
 
     if (p_tcb->sr_cmd.multi_req.num_handles == 0)
@@ -527,7 +524,7 @@
 *******************************************************************************/
 static tGATT_STATUS gatt_build_primary_service_rsp (BT_HDR *p_msg, tGATT_TCB *p_tcb,
                                                     UINT8 op_code, UINT16 s_hdl,
-                                                    UINT16 e_hdl, tBT_UUID value)
+                                                    UINT16 e_hdl, UINT8 *p_data, tBT_UUID value)
 {
     tGATT_STATUS    status = GATT_NOT_FOUND;
     UINT8           handle_len =4, *p ;
@@ -536,6 +533,8 @@
     tGATT_SRV_LIST_ELEM  *p_srv=NULL;
     tBT_UUID       *p_uuid;
 
+    UNUSED(p_data);
+
     p = (UINT8 *)(p_msg + 1) + L2CAP_MIN_OFFSET;
 
     p_srv = p_list->p_first;
@@ -579,7 +578,7 @@
                         if (p_list->p_last_primary == p_srv &&
                             p_list->p_last_primary == p_list->p_last)
                         {
-                            GATT_TRACE_DEBUG0("Use 0xFFFF for the last primary attribute");
+                            GATT_TRACE_DEBUG("Use 0xFFFF for the last primary attribute");
                             UINT16_TO_STREAM(p, 0xFFFF); /* see GATT ERRATA 4065, 4063, ATT ERRATA 4062 */
                         }
                         else
@@ -643,7 +642,7 @@
         if (p_attr->handle >= s_hdl)
         {
             if (p_msg->offset == 0)
-                p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128) ? GATT_INFO_TYPE_PAIR_128 : GATT_INFO_TYPE_PAIR_16;
+                p_msg->offset = (p_attr->uuid_type == GATT_ATTR_UUID_TYPE_16) ? GATT_INFO_TYPE_PAIR_16 : GATT_INFO_TYPE_PAIR_128;
 
             if (len >= info_pair_len[p_msg->offset - 1])
             {
@@ -652,15 +651,20 @@
                     UINT16_TO_STREAM(p, p_attr->handle);
                     UINT16_TO_STREAM(p, p_attr->uuid);
                 }
-                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 &&
-                         p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128  )
+                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_128  )
                 {
                     UINT16_TO_STREAM(p, p_attr->handle);
                     ARRAY_TO_STREAM (p, ((tGATT_ATTR128 *) p_attr)->uuid, LEN_UUID_128);
                 }
+                else if (p_msg->offset == GATT_INFO_TYPE_PAIR_128 && p_attr->uuid_type == GATT_ATTR_UUID_TYPE_32)
+                {
+                    UINT16_TO_STREAM(p, p_attr->handle);
+                    gatt_convert_uuid32_to_uuid128(p, ((tGATT_ATTR32 *) p_attr)->uuid);
+                    p += LEN_UUID_128;
+                }
                 else
                 {
-                    GATT_TRACE_ERROR0("format mismatch");
+                    GATT_TRACE_ERROR("format mismatch");
                     status = GATT_NO_RESOURCES;
                     break;
                     /* format mismatch */
@@ -725,7 +729,7 @@
                 if (gatt_parse_uuid_from_cmd (p_uuid_filter, uuid_len, &p) == FALSE ||
                     p_uuid_filter->len == 0)
                 {
-                    GATT_TRACE_DEBUG0("UUID filter does not exsit");
+                    GATT_TRACE_DEBUG("UUID filter does not exsit");
                     reason = GATT_INVALID_PDU;
                 }
                 else
@@ -764,6 +768,7 @@
     BT_HDR          *p_msg = NULL;
     UINT16          msg_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET);
 
+    memset (&value, 0, sizeof(tBT_UUID));
     reason = gatts_validate_packet_format(op_code, &len, &p_data, &uuid, &s_hdl, &e_hdl);
 
     if (reason == GATT_SUCCESS)
@@ -780,13 +785,13 @@
             {
                 if ((p_msg =  (BT_HDR *)GKI_getbuf(msg_len)) == NULL)
                 {
-                    GATT_TRACE_ERROR0("gatts_process_primary_service_req failed. no resources.");
+                    GATT_TRACE_ERROR("gatts_process_primary_service_req failed. no resources.");
                     reason = GATT_NO_RESOURCES;
                 }
                 else
                 {
                     memset(p_msg, 0, msg_len);
-                    reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, value);
+                    reason = gatt_build_primary_service_rsp (p_msg, p_tcb, op_code, s_hdl, e_hdl, p_data, value);
                 }
             }
         }
@@ -795,13 +800,13 @@
             if (op_code == GATT_REQ_READ_BY_GRP_TYPE)
             {
                 reason = GATT_UNSUPPORT_GRP_TYPE;
-                GATT_TRACE_DEBUG1("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16);
+                GATT_TRACE_DEBUG("unexpected ReadByGrpType Group: 0x%04x", uuid.uu.uuid16);
             }
             else
             {
                 /* we do not support ReadByTypeValue with any non-primamry_service type */
                 reason = GATT_NOT_FOUND;
-                GATT_TRACE_DEBUG1("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16);
+                GATT_TRACE_DEBUG("unexpected ReadByTypeValue type: 0x%04x", uuid.uu.uuid16);
             }
         }
     }
@@ -915,7 +920,7 @@
     }
     else if (len < GATT_MTU_REQ_MIN_LEN)
     {
-        GATT_TRACE_ERROR0("invalid MTU request PDU received.");
+        GATT_TRACE_ERROR("invalid MTU request PDU received.");
         gatt_send_error_rsp (p_tcb, GATT_INVALID_PDU, GATT_REQ_MTU, 0, FALSE);
     }
     else
@@ -929,7 +934,7 @@
         else
             p_tcb->payload_size = mtu;
 
-        GATT_TRACE_ERROR1("MTU request PDU with MTU size %d", p_tcb->payload_size);
+        GATT_TRACE_ERROR("MTU request PDU with MTU size %d", p_tcb->payload_size);
 
         if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL)
         {
@@ -986,7 +991,7 @@
 #if GATT_CONFORMANCE_TESTING == TRUE
     if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
     {
-        GATT_TRACE_DEBUG1("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status);
+        GATT_TRACE_DEBUG("Conformance tst: forced err rsp for ReadByType: error status=%d", gatt_cb.err_status);
 
         gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, s_hdl, FALSE);
 
@@ -998,7 +1003,7 @@
     {
         if ((p_msg =  (BT_HDR *)GKI_getbuf(msg_len)) == NULL)
         {
-            GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources.");
+            GATT_TRACE_ERROR("gatts_process_find_info failed. no resources.");
 
             reason = GATT_NO_RESOURCES;
         }
@@ -1025,7 +1030,7 @@
                       p_rcb->e_hdl < s_hdl))
                 {
                     gatt_sr_get_sec_info(p_tcb->peer_bda,
-                                         (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+                                         p_tcb->transport,
                                          &sec_flag,
                                          &key_size);
 
@@ -1105,7 +1110,7 @@
         case GATT_SIGN_CMD_WRITE:
             if (op_code == GATT_SIGN_CMD_WRITE)
             {
-                GATT_TRACE_DEBUG0("Write CMD with data sigining" );
+                GATT_TRACE_DEBUG("Write CMD with data sigining" );
                 len -= GATT_AUTH_SIGN_LEN;
             }
             /* fall through */
@@ -1120,7 +1125,7 @@
     }
 
     gatt_sr_get_sec_info(p_tcb->peer_bda,
-                         (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+                         p_tcb->transport,
                          &sec_flag,
                          &key_size);
 
@@ -1148,7 +1153,7 @@
         }
         else
         {
-            GATT_TRACE_ERROR0("max pending command, send error");
+            GATT_TRACE_ERROR("max pending command, send error");
             status = GATT_BUSY; /* max pending command, application error */
         }
     }
@@ -1173,7 +1178,7 @@
 **
 *******************************************************************************/
 static void gatts_process_read_req(tGATT_TCB *p_tcb, tGATT_SR_REG *p_rcb, UINT8 op_code,
-                                   UINT16 handle, UINT8 *p_data)
+                                   UINT16 handle, UINT16 len, UINT8 *p_data)
 {
     UINT16          buf_len = (UINT16)(sizeof(BT_HDR) + p_tcb->payload_size + L2CAP_MIN_OFFSET);
     tGATT_STATUS    reason;
@@ -1181,9 +1186,10 @@
     UINT8           sec_flag, key_size, *p;
     UINT16          offset = 0, value_len = 0;
 
+    UNUSED (len);
     if ((p_msg =  (BT_HDR *)GKI_getbuf(buf_len)) == NULL)
     {
-        GATT_TRACE_ERROR0("gatts_process_find_info failed. no resources.");
+        GATT_TRACE_ERROR("gatts_process_find_info failed. no resources.");
 
         reason = GATT_NO_RESOURCES;
     }
@@ -1199,7 +1205,7 @@
         buf_len = p_tcb->payload_size - 1;
 
         gatt_sr_get_sec_info(p_tcb->peer_bda,
-                             (BOOLEAN)(p_tcb->att_lcid == L2CAP_ATT_CID),
+                             p_tcb->transport,
                              &sec_flag,
                              &key_size);
 
@@ -1252,7 +1258,7 @@
 
     if (len < 2)
     {
-        GATT_TRACE_ERROR0("Illegal PDU length, discard request");
+        GATT_TRACE_ERROR("Illegal PDU length, discard request");
         status = GATT_INVALID_PDU;
     }
     else
@@ -1265,7 +1271,7 @@
     gatt_cb.handle = handle;
     if (gatt_cb.enable_err_rsp && gatt_cb.req_op_code == op_code)
     {
-        GATT_TRACE_DEBUG1("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status);
+        GATT_TRACE_DEBUG("Conformance tst: forced err rsp: error status=%d", gatt_cb.err_status);
 
         gatt_send_error_rsp (p_tcb, gatt_cb.err_status, gatt_cb.req_op_code, handle, FALSE);
 
@@ -1289,7 +1295,7 @@
                         {
                             case GATT_REQ_READ: /* read char/char descriptor value */
                             case GATT_REQ_READ_BLOB:
-                                gatts_process_read_req(p_tcb, p_rcb, op_code, handle, p);
+                                gatts_process_read_req(p_tcb, p_rcb, op_code, handle, len, p);
                                 break;
 
                             case GATT_REQ_WRITE: /* write char/char descriptor value */
@@ -1329,11 +1335,11 @@
     tGATTS_SRV_CHG_REQ  req;
     tGATTS_SRV_CHG      *p_buf = NULL;
 
-    GATT_TRACE_DEBUG0("gatts_proc_srv_chg_ind_ack");
+    GATT_TRACE_DEBUG("gatts_proc_srv_chg_ind_ack");
 
     if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(p_tcb->peer_bda)) != NULL)
     {
-        GATT_TRACE_DEBUG0("NV update set srv chg = FALSE");
+        GATT_TRACE_DEBUG("NV update set srv chg = FALSE");
         p_buf->srv_changed = FALSE;
         memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG));
         if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -1354,7 +1360,7 @@
 static void gatts_chk_pending_ind(tGATT_TCB *p_tcb )
 {
     tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q);
-    GATT_TRACE_DEBUG0("gatts_chk_pending_ind");
+    GATT_TRACE_DEBUG("gatts_chk_pending_ind");
 
     if (p_buf )
     {
@@ -1380,7 +1386,7 @@
 {
     BOOLEAN continue_processing = TRUE;
 
-    GATT_TRACE_DEBUG1 ("gatts_proc_ind_ack ack handle=%d", ack_handle);
+    GATT_TRACE_DEBUG ("gatts_proc_ind_ack ack handle=%d", ack_handle);
 
     if (ack_handle == gatt_cb.handle_of_h_r)
     {
@@ -1433,7 +1439,7 @@
     }
     else
     {
-        GATT_TRACE_ERROR0("unexpected handle value confirmation");
+        GATT_TRACE_ERROR("unexpected handle value confirmation");
     }
 }
 
@@ -1459,7 +1465,7 @@
     /* The message has to be smaller than the agreed MTU, len does not include op code */
     if (len >= p_tcb->payload_size)
     {
-        GATT_TRACE_ERROR2("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size );
+        GATT_TRACE_ERROR("server receive invalid PDU size:%d pdu size:%d", len + 1, p_tcb->payload_size );
         /* for invalid request expecting response, send it now */
         if (op_code != GATT_CMD_WRITE &&
             op_code != GATT_SIGN_CMD_WRITE &&
@@ -1506,7 +1512,7 @@
                 break;
 
             case GATT_REQ_EXEC_WRITE:
-                gatt_process_exec_write_req (p_tcb, op_code, p_data);
+                gatt_process_exec_write_req (p_tcb, op_code, len, p_data);
                 break;
 
             case GATT_REQ_READ_MULTI:
diff --git a/stack/gatt/gatt_utils.c b/stack/gatt/gatt_utils.c
index 978c88c..0e841a9 100644
--- a/stack/gatt/gatt_utils.c
+++ b/stack/gatt/gatt_utils.c
@@ -91,7 +91,7 @@
 *******************************************************************************/
 void gatt_free_pending_ind(tGATT_TCB *p_tcb)
 {
-    GATT_TRACE_DEBUG0("gatt_free_pending_ind");
+    GATT_TRACE_DEBUG("gatt_free_pending_ind");
     /* release all queued indications */
     while (p_tcb->pending_ind_q.p_first)
         GKI_freebuf (GKI_dequeue (&p_tcb->pending_ind_q));
@@ -108,7 +108,7 @@
 *******************************************************************************/
 void gatt_free_pending_enc_queue(tGATT_TCB *p_tcb)
 {
-    GATT_TRACE_DEBUG0("gatt_free_pending_enc_queue");
+    GATT_TRACE_DEBUG("gatt_free_pending_enc_queue");
     /* release all queued indications */
     while (p_tcb->pending_enc_clcb.p_first)
         GKI_freebuf (GKI_dequeue (&p_tcb->pending_enc_clcb));
@@ -128,7 +128,7 @@
     tGATTS_SRV_CHG     *p_buf;
     tGATTS_SRV_CHG_REQ  req;
 
-    GATT_TRACE_DEBUG0 ("gatt_delete_dev_from_srv_chg_clt_list");
+    GATT_TRACE_DEBUG ("gatt_delete_dev_from_srv_chg_clt_list");
     if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL)
     {
         if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -156,13 +156,13 @@
     tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
     tGATTS_SRV_CHG_REQ req;
 
-    GATT_TRACE_DEBUG0 ("gatt_set_srv_chg");
+    GATT_TRACE_DEBUG ("gatt_set_srv_chg");
     while (p_buf)
     {
-        GATT_TRACE_DEBUG0 ("found a srv_chg clt");
+        GATT_TRACE_DEBUG ("found a srv_chg clt");
         if (!p_buf->srv_changed)
         {
-            GATT_TRACE_DEBUG0 ("set srv_changed to TRUE");
+            GATT_TRACE_DEBUG ("set srv_changed to TRUE");
             p_buf->srv_changed= TRUE;
             memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG));
             if (gatt_cb.cb_info.p_srv_chg_callback)
@@ -193,7 +193,7 @@
               &&  gatt_uuid_compare (*p_svc_uuid, p->svc_uuid)
               &&  (svc_inst == p->svc_inst) )
         {
-            GATT_TRACE_DEBUG0 ("gatt_sr_is_new_srv_chg: Yes");
+            GATT_TRACE_DEBUG ("gatt_sr_is_new_srv_chg: Yes");
             break;
         }
         p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getnext(p_buf);
@@ -215,10 +215,10 @@
 tGATT_VALUE *gatt_add_pending_ind(tGATT_TCB  *p_tcb, tGATT_VALUE *p_ind)
 {
     tGATT_VALUE   *p_buf;
-    GATT_TRACE_DEBUG0 ("gatt_add_pending_ind");
+    GATT_TRACE_DEBUG ("gatt_add_pending_ind");
     if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("enqueue a pending indication");
+        GATT_TRACE_DEBUG ("enqueue a pending indication");
         memcpy(p_buf, p_ind, sizeof(tGATT_VALUE));
         GKI_enqueue (&p_tcb->pending_ind_q, p_buf);
     }
@@ -239,10 +239,10 @@
 {
     tGATTS_PENDING_NEW_SRV_START   *p_buf;
 
-    GATT_TRACE_DEBUG0 ("gatt_add_pending_new_srv_start");
+    GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
     if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("enqueue a new pending new srv start");
+        GATT_TRACE_DEBUG ("enqueue a new pending new srv start");
         p_buf->p_new_srv_start = p_new_srv_start;
         GKI_enqueue (&gatt_cb.pending_new_srv_start_q, p_buf);
     }
@@ -262,10 +262,10 @@
 tGATTS_SRV_CHG *gatt_add_srv_chg_clt(tGATTS_SRV_CHG *p_srv_chg)
 {
     tGATTS_SRV_CHG *p_buf;
-    GATT_TRACE_DEBUG0 ("gatt_add_srv_chg_clt");
+    GATT_TRACE_DEBUG ("gatt_add_srv_chg_clt");
     if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("enqueue a srv chg client");
+        GATT_TRACE_DEBUG ("enqueue a srv chg client");
         memcpy(p_buf, p_srv_chg, sizeof(tGATTS_SRV_CHG));
         GKI_enqueue (&gatt_cb.srv_chg_clt_q, p_buf);
     }
@@ -352,7 +352,7 @@
              &&  gatt_uuid_compare (*p_svc_uuid,    p_list->asgn_range.svc_uuid)
              &&  (svc_inst == p_list->asgn_range.svc_inst) )
         {
-            GATT_TRACE_DEBUG0 ("Already allocated handles for this service before!!");
+            GATT_TRACE_DEBUG ("Already allocated handles for this service before!!");
             return(p_list);
         }
         p_list = p_list->p_next;
@@ -503,7 +503,7 @@
 
     if (!p_new)
     {
-        GATT_TRACE_DEBUG0("p_new==NULL");
+        GATT_TRACE_DEBUG("p_new==NULL");
         return FALSE;
     }
 
@@ -567,7 +567,7 @@
 {
     if (!p_remove || !p_list->p_first)
     {
-        GATT_TRACE_DEBUG0("p_remove==NULL || p_list->p_first==NULL");
+        GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
         return FALSE;
     }
 
@@ -608,7 +608,7 @@
     tGATT_HDL_LIST_ELEM *p_old;
     if (!p_new)
     {
-        GATT_TRACE_DEBUG0("p_new==NULL");
+        GATT_TRACE_DEBUG("p_new==NULL");
         return FALSE;
     }
 
@@ -671,7 +671,7 @@
 {
     if (!p_remove || !p_list->p_first)
     {
-        GATT_TRACE_DEBUG0("p_remove==NULL || p_list->p_first==NULL");
+        GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
         return FALSE;
     }
 
@@ -705,11 +705,12 @@
 ** Returns           TRUE if found
 **
 *******************************************************************************/
-BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx)
+BOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx,
+                                    tBT_TRANSPORT *p_transport)
 {
     UINT8 i;
     BOOLEAN found = FALSE;
-    GATT_TRACE_DEBUG1("gatt_find_the_connected_bda start_idx=%d",start_idx);
+    GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d",start_idx);
 
     for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++)
     {
@@ -717,13 +718,14 @@
         {
             memcpy( bda, gatt_cb.tcb[i].peer_bda, BD_ADDR_LEN);
             *p_found_idx = i;
+            *p_transport = gatt_cb.tcb[i].transport;
             found = TRUE;
-            GATT_TRACE_DEBUG6("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x",
+            GATT_TRACE_DEBUG("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x",
                               bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
             break;
         }
     }
-    GATT_TRACE_DEBUG2("gatt_find_the_connected_bda found=%d found_idx=%d", found, i);
+    GATT_TRACE_DEBUG("gatt_find_the_connected_bda found=%d found_idx=%d", found, i);
     return found;
 }
 
@@ -744,7 +746,7 @@
     tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q);
     BOOLEAN srv_chg_ind_pending = FALSE;
 
-    GATT_TRACE_DEBUG1("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) );
+    GATT_TRACE_DEBUG("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) );
 
     if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r)
     {
@@ -763,7 +765,7 @@
         }
     }
 
-    GATT_TRACE_DEBUG1("srv_chg_ind_pending = %d", srv_chg_ind_pending);
+    GATT_TRACE_DEBUG("srv_chg_ind_pending = %d", srv_chg_ind_pending);
     return srv_chg_ind_pending;
 }
 
@@ -781,14 +783,14 @@
 {
     tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
 
-    GATT_TRACE_DEBUG6("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x",
+    GATT_TRACE_DEBUG("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x",
                       bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
 
     while (p_buf != NULL)
     {
         if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN))
         {
-            GATT_TRACE_DEBUG0("bda is in the srv chg clt list");
+            GATT_TRACE_DEBUG("bda is in the srv chg clt list");
             break;
         }
         p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf);
@@ -833,19 +835,19 @@
 ** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
 **
 *******************************************************************************/
-UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda)
+UINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
 {
-    UINT8 i = 0, j = GATT_INDEX_INVALID;
+    UINT8 i = 0;
 
     for ( ; i < GATT_MAX_PHY_CHANNEL; i ++)
     {
-        if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN))
+        if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN) &&
+            gatt_cb.tcb[i].transport == transport)
         {
-            j = i;
-            break;
+            return i;
         }
     }
-    return j;
+    return GATT_INDEX_INVALID;
 }
 
 
@@ -877,12 +879,12 @@
 ** Returns           NULL if not found. Otherwise index to the tcb.
 **
 *******************************************************************************/
-tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda)
+tGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
 {
     tGATT_TCB   *p_tcb = NULL;
     UINT8 i = 0;
 
-    if ((i = gatt_find_i_tcb_by_addr(bda)) != GATT_INDEX_INVALID)
+    if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID)
         p_tcb = &gatt_cb.tcb[i];
 
     return p_tcb;
@@ -919,14 +921,14 @@
 ** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
 **
 *******************************************************************************/
-tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda)
+tGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport)
 {
     UINT8 i = 0;
     BOOLEAN allocated = FALSE;
     tGATT_TCB    *p_tcb = NULL;
 
     /* search for existing tcb with matching bda    */
-    i = gatt_find_i_tcb_by_addr(bda);
+    i = gatt_find_i_tcb_by_addr(bda, transport);
     /* find free tcb */
     if (i == GATT_INDEX_INVALID)
     {
@@ -944,6 +946,7 @@
             GKI_init_q (&p_tcb->pending_ind_q);
             p_tcb->in_use = TRUE;
             p_tcb->tcb_idx = i;
+            p_tcb->transport = transport;
         }
         memcpy(p_tcb->peer_bda, bda, BD_ADDR_LEN);
     }
@@ -970,6 +973,23 @@
 
 /*******************************************************************************
 **
+** Function         gatt_convert_uuid32_to_uuid128
+**
+** Description      Convert a 32 bits UUID to be an standard 128 bits one.
+**
+** Returns          TRUE if two uuid match; FALSE otherwise.
+**
+*******************************************************************************/
+void gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32)
+{
+    UINT8   *p = &uuid_128[LEN_UUID_128 - 4];
+
+    memcpy (uuid_128, base_uuid, LEN_UUID_128);
+
+    UINT32_TO_STREAM(p, uuid_32);
+}
+/*******************************************************************************
+**
 ** Function         gatt_uuid_compare
 **
 ** Description      Compare two UUID to see if they are the same.
@@ -989,11 +1009,17 @@
     }
 
     /* If both are 16-bit, we can do a simple compare */
-    if (src.len == 2 && tar.len == 2)
+    if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16)
     {
         return src.uu.uuid16 == tar.uu.uuid16;
     }
 
+    /* If both are 32-bit, we can do a simple compare */
+    if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32)
+    {
+        return src.uu.uuid32 == tar.uu.uuid32;
+    }
+
     /* One or both of the UUIDs is 128-bit */
     if (src.len == LEN_UUID_16)
     {
@@ -1001,6 +1027,11 @@
         gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16);
         ps = su;
     }
+    else if (src.len == LEN_UUID_32)
+    {
+        gatt_convert_uuid32_to_uuid128(su, src.uu.uuid32);
+        ps = su;
+    }
     else
         ps = src.uu.uuid128;
 
@@ -1010,6 +1041,12 @@
         gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16);
         pt = tu;
     }
+    else if (tar.len == LEN_UUID_32)
+    {
+        /* convert a 32 bits UUID to 128 bits value */
+        gatt_convert_uuid32_to_uuid128(tu, tar.uu.uuid32);
+        pt = tu;
+    }
     else
         pt = tar.uu.uuid128;
 
@@ -1035,6 +1072,12 @@
         UINT16_TO_STREAM (p, uuid.uu.uuid16);
         len = LEN_UUID_16;
     }
+    else if (uuid.len == LEN_UUID_32) /* always convert 32 bits into 128 bits as alwats */
+    {
+        gatt_convert_uuid32_to_uuid128(p, uuid.uu.uuid32);
+        p += LEN_UUID_128;
+        len = LEN_UUID_128;
+    }
     else if (uuid.len == LEN_UUID_128)
     {
         ARRAY_TO_STREAM (p, uuid.uu.uuid128, LEN_UUID_128);
@@ -1090,7 +1133,11 @@
                     STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid);
                 }
                 else
-                    is_base_uuid = FALSE;
+                {
+                    p_uuid += (LEN_UUID_128 - LEN_UUID_32);
+                    p_uuid_rec->len = LEN_UUID_32;
+                    STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid);
+                }
             }
             if (!is_base_uuid)
             {
@@ -1100,10 +1147,13 @@
             *p_data += LEN_UUID_128;
             break;
 
+        /* do not allow 32 bits UUID in ATT PDU now */
+        case LEN_UUID_32:
+            GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU");
         case 0:
         default:
             if (uuid_size != 0) ret = FALSE;
-            GATT_TRACE_WARNING0("gatt_parse_uuid_from_cmd invalid uuid size");
+            GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size");
             break;
     }
 
@@ -1178,7 +1228,7 @@
     tGATT_CLCB *p_clcb = (tGATT_CLCB *)p_tle->param;
     if (p_clcb == NULL || p_clcb->p_tcb == NULL)
     {
-        GATT_TRACE_WARNING0("gatt_rsp_timeout clcb is already deleted");
+        GATT_TRACE_WARNING("gatt_rsp_timeout clcb is already deleted");
         return;
     }
     if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
@@ -1186,10 +1236,10 @@
         p_clcb->retry_count < GATT_REQ_RETRY_LIMIT)
     {
         UINT8 rsp_code;
-        GATT_TRACE_WARNING0("gatt_rsp_timeout retry discovery primary service");
+        GATT_TRACE_WARNING("gatt_rsp_timeout retry discovery primary service");
         if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code))
         {
-            GATT_TRACE_ERROR0("gatt_rsp_timeout command queue out of sync, disconnect");
+            GATT_TRACE_ERROR("gatt_rsp_timeout command queue out of sync, disconnect");
         }
         else
         {
@@ -1199,8 +1249,8 @@
         }
     }
 
-    GATT_TRACE_WARNING0("gatt_rsp_timeout disconnecting...");
-    gatt_disconnect (p_clcb->p_tcb->peer_bda);
+    GATT_TRACE_WARNING("gatt_rsp_timeout disconnecting...");
+    gatt_disconnect (p_clcb->p_tcb);
 }
 
 /*******************************************************************************
@@ -1216,7 +1266,7 @@
 {
     tGATT_TCB * p_tcb = (tGATT_TCB *)p_tle->param;
 
-    GATT_TRACE_WARNING0("gatt_ind_ack_timeout send ack now");
+    GATT_TRACE_WARNING("gatt_ind_ack_timeout send ack now");
 
     if (p_tcb != NULL)
         p_tcb->ind_count = 0;
@@ -1274,7 +1324,7 @@
                 gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) &&
                 (svc_inst == p_sreg->service_instance))
             {
-                GATT_TRACE_ERROR0 ("Active Service Found ");
+                GATT_TRACE_ERROR ("Active Service Found ");
                 gatt_dbg_display_uuid(*p_svc_uuid);
 
                 break;
@@ -1313,7 +1363,7 @@
             p_sreg->e_hdl               = p_list->asgn_range.e_handle;
             p_sreg->p_db                = &p_list->svc_db;
 
-            GATT_TRACE_DEBUG1 ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count);
+            GATT_TRACE_DEBUG ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count);
             break;
         }
     }
@@ -1330,12 +1380,11 @@
 ** Returns          void
 **
 *******************************************************************************/
-void gatt_sr_get_sec_info(BD_ADDR rem_bda, BOOLEAN le_conn, UINT8 *p_sec_flag, UINT8 *p_key_size)
+void gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size)
 {
     UINT8           sec_flag = 0;
-    UNUSED(le_conn);
 
-    BTM_GetSecurityFlags(rem_bda, &sec_flag);
+    BTM_GetSecurityFlagsByTransport(rem_bda, &sec_flag, transport);
 
     sec_flag &= (GATT_SEC_FLAG_LKEY_UNAUTHED | GATT_SEC_FLAG_LKEY_AUTHED | GATT_SEC_FLAG_ENCRYPTED);
 
@@ -1361,7 +1410,7 @@
 
     if (!p_reg )
     {
-        GATT_TRACE_ERROR0 ("p_reg not found discard request");
+        GATT_TRACE_ERROR ("p_reg not found discard request");
         return;
     }
 
@@ -1372,7 +1421,7 @@
     }
     else
     {
-        GATT_TRACE_WARNING1("Call back not found for application conn_id=%d", conn_id);
+        GATT_TRACE_WARNING("Call back not found for application conn_id=%d", conn_id);
     }
 
 }
@@ -1428,7 +1477,7 @@
     UINT8               buff[60];
     UINT8               *p = buff;
 
-    GATT_TRACE_DEBUG2("gatt_add_sdp_record s_hdl=0x%x  s_hdl=0x%x",start_hdl, end_hdl);
+    GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x  s_hdl=0x%x",start_hdl, end_hdl);
 
     if ((sdp_handle = SDP_CreateRecord()) == 0)
         return 0;
@@ -1438,6 +1487,14 @@
         case LEN_UUID_16:
             SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16);
             break;
+
+        case LEN_UUID_32:
+            UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
+            UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32);
+            SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
+                              (UINT32) (p - buff), buff);
+            break;
+
         case LEN_UUID_128:
             UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES);
             ARRAY_TO_BE_STREAM (p, p_uuid->uu.uuid128, LEN_UUID_128);
@@ -1446,7 +1503,7 @@
             break;
 
         default:
-            GATT_TRACE_ERROR1("inavlid UUID len=%d", p_uuid->len);
+            GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len);
             SDP_DeleteRecord(sdp_handle);
             return 0;
             break;
@@ -1482,7 +1539,7 @@
 *******************************************************************************/
 void gatt_set_err_rsp(BOOLEAN enable, UINT8 req_op_code, UINT8 err_status)
 {
-    GATT_TRACE_DEBUG3("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status);
+    GATT_TRACE_DEBUG("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status);
     gatt_cb.enable_err_rsp  = enable;
     gatt_cb.req_op_code     = req_op_code;
     gatt_cb.err_status      = err_status;
@@ -1644,7 +1701,7 @@
             num ++;
     }
 
-    GATT_TRACE_DEBUG1("gatt_num_apps_hold_link   num=%d",  num);
+    GATT_TRACE_DEBUG("gatt_num_apps_hold_link   num=%d",  num);
     return num;
 }
 
@@ -1853,7 +1910,7 @@
 {
     UINT8 idx = ((UINT8) gatt_if) - 1 ;
 
-    GATT_TRACE_DEBUG4("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d",
+    GATT_TRACE_DEBUG("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d",
                       p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first);
 
     if (p_tcb)
@@ -1889,12 +1946,13 @@
     tGATT_TCB *p_tcb=NULL;
     BOOLEAN status= TRUE;
 
-    p_tcb = gatt_find_tcb_by_addr(bda);
+    p_tcb = gatt_find_tcb_by_addr(bda, BT_TRANSPORT_LE);
+
     if (p_tcb)
     {
         if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN)
         {
-            GATT_TRACE_ERROR0("GATT_CancelConnect - link connected Too late to cancel");
+            GATT_TRACE_ERROR("GATT_CancelConnect - link connected Too late to cancel");
             status = FALSE;
         }
         else
@@ -1902,7 +1960,7 @@
             gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
             if (!gatt_num_apps_hold_link(p_tcb))
             {
-                gatt_disconnect(p_tcb->peer_bda);
+                gatt_disconnect(p_tcb);
             }
         }
     }
@@ -2060,7 +2118,7 @@
     UINT16              conn_id;
     UINT8               operation;
 
-    GATT_TRACE_DEBUG3 ("gatt_end_operation status=%d op=%d subtype=%d",
+    GATT_TRACE_DEBUG ("gatt_end_operation status=%d op=%d subtype=%d",
                        status, p_clcb->operation, p_clcb->op_subtype);
 
     if (p_cmpl_cb != NULL && p_clcb->operation != 0)
@@ -2087,7 +2145,7 @@
                 }
                 else
                 {
-                    GATT_TRACE_DEBUG0("Rcv Prepare write rsp but no data");
+                    GATT_TRACE_DEBUG("Rcv Prepare write rsp but no data");
                 }
             }
         }
@@ -2117,7 +2175,7 @@
     else if (p_cmpl_cb && op)
         (*p_cmpl_cb)(conn_id, op, status, &cb_data);
     else
-        GATT_TRACE_WARNING3 ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p",
+        GATT_TRACE_WARNING ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p",
                              operation, p_disc_cmpl_cb, p_cmpl_cb);
 }
 
@@ -2131,7 +2189,7 @@
 ** Returns          16 bits uuid.
 **
 *******************************************************************************/
-void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason)
+void gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport)
 {
     tGATT_TCB       *p_tcb = NULL;
     tGATT_CLCB      *p_clcb;
@@ -2140,18 +2198,19 @@
     tGATT_REG        *p_reg=NULL;
 
 
-    GATT_TRACE_DEBUG0 ("gatt_cleanup_upon_disc ");
+    GATT_TRACE_DEBUG ("gatt_cleanup_upon_disc ");
 
-    if ((p_tcb = gatt_find_tcb_by_addr(bda)) != NULL)
+    if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("found p_tcb ");
+        GATT_TRACE_DEBUG ("found p_tcb ");
+        gatt_set_ch_state(p_tcb, GATT_CH_CLOSE);
         for (i = 0; i < GATT_CL_MAX_LCB; i ++)
         {
             p_clcb = &gatt_cb.clcb[i];
             if (p_clcb->in_use && p_clcb->p_tcb == p_tcb)
             {
                 btu_stop_timer(&p_clcb->rsp_timer_ent);
-                GATT_TRACE_DEBUG2 ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx);
+                GATT_TRACE_DEBUG ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx);
                 if (p_clcb->operation != GATTC_OPTYPE_NONE)
                     gatt_end_operation(p_clcb, GATT_ERROR, NULL);
 
@@ -2171,14 +2230,14 @@
             if (p_reg->in_use && p_reg->app_cb.p_conn_cb)
             {
                 conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
-                GATT_TRACE_DEBUG3 ("found p_reg tcb_idx=%d gatt_if=%d  conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id);
-                (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if,  bda, conn_id, FALSE, reason);
+                GATT_TRACE_DEBUG ("found p_reg tcb_idx=%d gatt_if=%d  conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id);
+                (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if,  bda, conn_id, FALSE, reason, transport);
             }
         }
         memset(p_tcb, 0, sizeof(tGATT_TCB));
 
     }
-    GATT_TRACE_DEBUG0 ("exit gatt_cleanup_upon_disc ");
+    GATT_TRACE_DEBUG ("exit gatt_cleanup_upon_disc ");
 }
 /*******************************************************************************
 **
@@ -2228,6 +2287,10 @@
     {
         sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16);
     }
+    else if (bt_uuid.len == LEN_UUID_32)
+    {
+        sprintf(str_buf, "0x%08x", (unsigned int)bt_uuid.uu.uuid32);
+    }
     else if (bt_uuid.len == LEN_UUID_128)
     {
         x += sprintf(&str_buf[x], "0x%02x%02x%02x%02x%02x%02x%02x%02x",
@@ -2244,7 +2307,7 @@
     else
         BCM_STRNCPY_S(str_buf, sizeof(str_buf), "Unknown UUID 0", 15);
 
-    GATT_TRACE_DEBUG1 ("UUID=[%s]", str_buf);
+    GATT_TRACE_DEBUG ("UUID=[%s]", str_buf);
 
 }
 
@@ -2350,7 +2413,7 @@
             {
                 if (p_dev->gatt_if[i] == gatt_if)
                 {
-                    GATT_TRACE_ERROR0("device already in iniator white list");
+                    GATT_TRACE_ERROR("device already in iniator white list");
                     return TRUE;
                 }
                 else if (p_dev->gatt_if[i] == 0)
@@ -2367,7 +2430,7 @@
             {
                 if (p_dev->listen_gif[i] == gatt_if)
                 {
-                    GATT_TRACE_ERROR0("device already in adv white list");
+                    GATT_TRACE_ERROR("device already in adv white list");
                     return TRUE;
                 }
                 else if (p_dev->listen_gif[i] == 0)
@@ -2389,7 +2452,7 @@
     }
     else
     {
-        GATT_TRACE_ERROR0("no device record available");
+        GATT_TRACE_ERROR("no device record available");
     }
 
     return ret;
@@ -2406,7 +2469,7 @@
 *******************************************************************************/
 BOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr)
 {
-    tGATT_TCB    *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+    tGATT_TCB    *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
     BOOLEAN       status;
 
     if (p_tcb)
@@ -2628,13 +2691,13 @@
 {
     BOOLEAN         ret = FALSE;
     tGATT_REG        *p_reg;
-    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr);
+    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
 
-    GATT_TRACE_API0 ("gatt_update_auto_connect_dev ");
+    GATT_TRACE_API ("gatt_update_auto_connect_dev ");
     /* Make sure app is registered */
     if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
     {
-        GATT_TRACE_ERROR1("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if);
+        GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if);
         return(FALSE);
     }
 
@@ -2659,54 +2722,6 @@
 
 /*******************************************************************************
 **
-** Function         gatt_get_conn_id
-**
-** Description      This function returns a connecttion handle to a ATT server
-**                  if the server is already connected
-**
-** Parameters       gatt_if: client interface.
-**                  bd_addr: peer device address.
-**
-** Returns          Connection handle or invalid handle value
-**
-*******************************************************************************/
-UINT16 gatt_get_conn_id (tGATT_IF gatt_if, BD_ADDR bd_addr)
-{
-    tGATT_REG       *p_reg;
-    tGATT_CLCB      *p_clcb;
-    tGATT_TCB       *p_tcb;
-    UINT8           i;
-
-    GATT_TRACE_API1 ("GATTC_GetConnIfConnected gatt_if=%d", gatt_if);
-    /* Do we have a transport to the peer ? If not, we are not connected */
-    if ((p_tcb = gatt_find_tcb_by_addr(bd_addr)) == NULL)
-    {
-        GATT_TRACE_EVENT0 ("GATTC_GetConnIfConnected - no TCB found");
-        return(GATT_INVALID_CONN_ID);
-    }
-
-    /* Make sure app is registered */
-    if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
-    {
-        GATT_TRACE_ERROR1("GATTC_GetConnIfConnected - gatt_if is not registered", gatt_if);
-        return(GATT_INVALID_CONN_ID);
-    }
-
-    /* Now see if the app already has a client control block to that peer */
-    for (i = 0, p_clcb = gatt_cb.clcb; i < GATT_CL_MAX_LCB; i++, p_clcb++)
-    {
-        if ( p_clcb->in_use && (p_clcb->p_reg == p_reg) && (p_clcb->p_tcb == p_tcb) )
-        {
-            return(p_clcb->conn_id);
-        }
-    }
-
-    /* If here, failed to allocate a client control block */
-    GATT_TRACE_ERROR1 ("gatt_get_conn_id: not connected- gatt_if: %u", gatt_if);
-    return(GATT_INVALID_CONN_ID);
-}
-/*******************************************************************************
-**
 ** Function     gatt_add_pending_new_srv_start
 **
 ** Description  Add a pending new srv start to the new service start queue
@@ -2718,10 +2733,10 @@
 {
     tGATT_PENDING_ENC_CLCB   *p_buf;
 
-    GATT_TRACE_DEBUG0 ("gatt_add_pending_new_srv_start");
+    GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
     if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL)
     {
-        GATT_TRACE_DEBUG0 ("enqueue a new pending encryption channel clcb");
+        GATT_TRACE_DEBUG ("enqueue a new pending encryption channel clcb");
         p_buf->p_clcb = p_clcb;
         GKI_enqueue (&p_tcb->pending_enc_clcb, p_buf);
     }
@@ -2736,12 +2751,13 @@
 ** Returns    Pointer to the new service start buffer, NULL no buffer available
 **
 *******************************************************************************/
-void gatt_update_listen_mode(void)
+BOOLEAN gatt_update_listen_mode(void)
 {
     UINT8           ii = 0;
     tGATT_REG       *p_reg = &gatt_cb.cl_rcb[0];
     UINT8           listening = 0;
     UINT16          connectability, window, interval;
+    BOOLEAN         rt = TRUE;
 
     for (; ii < GATT_MAX_APPS; ii ++, p_reg ++)
     {
@@ -2757,16 +2773,24 @@
     else
         BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_WL);
 
-    connectability = BTM_ReadConnectability (&window, &interval);
-
-    if (listening != GATT_LISTEN_TO_NONE)
+    if (rt)
     {
-        connectability |= BTM_BLE_CONNECTABLE;
+        connectability = BTM_ReadConnectability (&window, &interval);
+
+        if (listening != GATT_LISTEN_TO_NONE)
+        {
+            connectability |= BTM_BLE_CONNECTABLE;
+        }
+        else
+        {
+            if ((connectability & BTM_BLE_CONNECTABLE) == 0)
+            connectability &= ~BTM_BLE_CONNECTABLE;
+        }
+        /* turning on the adv now */
+        btm_ble_set_connectability(connectability);
     }
-    else
-        connectability &= ~BTM_BLE_CONNECTABLE;
-    /* turning on the adv now */
-    BTM_SetConnectability(connectability, window, interval);
+
+    return rt;
 
 }
 #endif
diff --git a/stack/hcic/hciblecmds.c b/stack/hcic/hciblecmds.c
index a4e55da..860fb7a 100644
--- a/stack/hcic/hciblecmds.c
+++ b/stack/hcic/hciblecmds.c
@@ -35,27 +35,6 @@
 
 #if (defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
 
-BOOLEAN btsnd_hcic_ble_reset(void)
-{
-    BT_HDR *p;
-    UINT8 *pp;
-
-    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
-        return (FALSE);
-
-    pp = (UINT8 *)(p + 1);
-
-    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
-    p->offset = 0;
-
-    UINT16_TO_STREAM (pp,  HCI_BLE_RESET);
-    UINT8_TO_STREAM  (pp,  0);
-
-    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
-    return (TRUE);
-
-}
-
 BOOLEAN btsnd_hcic_ble_set_evt_mask (BT_EVENT_MASK event_mask)
 {
     BT_HDR *p;
@@ -163,7 +142,7 @@
 BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
                                        UINT8 adv_type, UINT8 addr_type_own,
                                        UINT8 addr_type_dir, BD_ADDR direct_bda,
-                                       UINT8 channel_map, UINT8 adv_filter_policy)
+                                       UINT8 channel_map, UINT8 scan_filter_policy)
 {
     BT_HDR *p;
     UINT8 *pp;
@@ -186,7 +165,7 @@
     UINT8_TO_STREAM (pp, addr_type_dir);
     BDADDR_TO_STREAM (pp, direct_bda);
     UINT8_TO_STREAM (pp, channel_map);
-    UINT8_TO_STREAM (pp, adv_filter_policy);
+    UINT8_TO_STREAM (pp, scan_filter_policy);
 
     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
     return (TRUE);
@@ -856,4 +835,62 @@
     return (TRUE);
 }
 
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+
+BOOLEAN btsnd_hcic_ble_rc_param_req_reply(  UINT16 handle,
+                                            UINT16 conn_int_min, UINT16 conn_int_max,
+                                            UINT16 conn_latency, UINT16 conn_timeout,
+                                            UINT16 min_ce_len, UINT16 max_ce_len  )
+{
+    BT_HDR *p;
+    UINT8 *pp;
+
+    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL)
+        return (FALSE);
+
+    pp = (UINT8 *)(p + 1);
+
+    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
+    p->offset = 0;
+
+    UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_REPLY);
+    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
+
+    UINT16_TO_STREAM (pp, handle);
+    UINT16_TO_STREAM (pp, conn_int_min);
+    UINT16_TO_STREAM (pp, conn_int_max);
+    UINT16_TO_STREAM (pp, conn_latency);
+    UINT16_TO_STREAM (pp, conn_timeout);
+    UINT16_TO_STREAM (pp, min_ce_len);
+    UINT16_TO_STREAM (pp, max_ce_len);
+
+    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
+    return (TRUE);
+}
+
+BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason)
+{
+    BT_HDR *p;
+    UINT8 *pp;
+
+    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL)
+        return (FALSE);
+
+    pp = (UINT8 *)(p + 1);
+
+    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
+    p->offset = 0;
+
+    UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
+    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
+
+    UINT16_TO_STREAM (pp, handle);
+    UINT8_TO_STREAM (pp, reason);
+
+    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
+    return (TRUE);
+}
 #endif
+
+#endif
+
diff --git a/stack/hcic/hcicmds.c b/stack/hcic/hcicmds.c
index 778ebfb..a530d2a 100644
--- a/stack/hcic/hcicmds.c
+++ b/stack/hcic/hcicmds.c
@@ -783,13 +783,6 @@
     BT_HDR *p;
     UINT8 *pp;
 
-    #ifdef BDCFG_OVERRIDE_SNIFF_MODE_MAX
-    max_sniff_period = BDCFG_OVERRIDE_SNIFF_MODE_MAX;
-    min_sniff_period = BDCFG_OVERRIDE_SNIFF_MODE_MIN;
-    sniff_attempt = BDCFG_OVERRIDE_SNIFF_MODE_ATTEMPT;
-    sniff_timeout = BDCFG_OVERRIDE_SNIFF_MODE_TIMEOUT;
-    #endif
-
     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL)
         return (FALSE);
 
@@ -1371,6 +1364,7 @@
         return (FALSE);
 
     pp = (UINT8 *)(p + 1);
+    memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
 
     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
     p->offset = 0;
diff --git a/stack/hid/hidh_api.c b/stack/hid/hidh_api.c
index 1868671..b0c3aa5 100644
--- a/stack/hid/hidh_api.c
+++ b/stack/hid/hidh_api.c
@@ -445,19 +445,19 @@
 
     if( !hh_cb.reg_flag )
     {
-        HIDH_TRACE_ERROR0("HID_ERR_NOT_REGISTERED");
+        HIDH_TRACE_ERROR("HID_ERR_NOT_REGISTERED");
         status = HID_ERR_NOT_REGISTERED;
     }
 
     if( (dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use) )
     {
-        HIDH_TRACE_ERROR0("HID_ERR_INVALID_PARAM");
+        HIDH_TRACE_ERROR("HID_ERR_INVALID_PARAM");
         status = HID_ERR_INVALID_PARAM;
     }
 
     else if( hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED )
     {
-        HIDH_TRACE_ERROR1("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
+        HIDH_TRACE_ERROR("HID_ERR_NO_CONNECTION dev_handle %d", dev_handle);
         status = HID_ERR_NO_CONNECTION;
     }
 
@@ -504,42 +504,42 @@
     if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
                                sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 1 failed");
+        HIDH_TRACE_ERROR ("Security Registration 1 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
     if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_SEC_CTRL,
                                sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_SEC_CHN))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 2 failed");
+        HIDH_TRACE_ERROR ("Security Registration 2 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
     if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
                                BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 3 failed");
+        HIDH_TRACE_ERROR ("Security Registration 3 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
     if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_NOSEC_CTRL,
                                BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HID_NOSEC_CHN))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 4 failed");
+        HIDH_TRACE_ERROR ("Security Registration 4 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
     if (!BTM_SetSecurityLevel (TRUE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
                                BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 5 failed");
+        HIDH_TRACE_ERROR ("Security Registration 5 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
     if (!BTM_SetSecurityLevel (FALSE, serv_name, BTM_SEC_SERVICE_HIDH_INTR,
                                BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0))
     {
-        HIDH_TRACE_ERROR0 ("Security Registration 6 failed");
+        HIDH_TRACE_ERROR ("Security Registration 6 failed");
         return (HID_ERR_NO_RESOURCES);
     }
 
@@ -570,7 +570,7 @@
         if ((p_inq_info->results.dev_class[1] & BTM_COD_MAJOR_CLASS_MASK)
             == BTM_COD_MAJOR_PERIPHERAL )
         {
-            HIDH_TRACE_DEBUG0("hid_known_hid_device:dev found in InqDB & COD matches HID dev");
+            HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in InqDB & COD matches HID dev");
             return TRUE;
         }
     }
@@ -581,7 +581,7 @@
         if ((p_dev_rec != NULL) &&
             ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL ))
         {
-            HIDH_TRACE_DEBUG0("hid_known_hid_device:dev found in SecDevDB & COD matches HID dev");
+            HIDH_TRACE_DEBUG("hid_known_hid_device:dev found in SecDevDB & COD matches HID dev");
             return TRUE;
         }
     }
@@ -594,6 +594,6 @@
              return TRUE;
      }
     /* Check if this device is marked as HID Device in IOP Dev */
-    HIDH_TRACE_DEBUG0("hid_known_hid_device:remote is not HID device");
+    HIDH_TRACE_DEBUG("hid_known_hid_device:remote is not HID device");
     return FALSE;
 }
diff --git a/stack/hid/hidh_conn.c b/stack/hid/hidh_conn.c
index 86b41d3..853e3ed 100644
--- a/stack/hid/hidh_conn.c
+++ b/stack/hid/hidh_conn.c
@@ -98,13 +98,13 @@
     /* Now, register with L2CAP */
     if (!L2CA_Register (HID_PSM_CONTROL, (tL2CAP_APPL_INFO *) &hst_reg_info))
     {
-        HIDH_TRACE_ERROR0 ("HID Control Registration failed");
+        HIDH_TRACE_ERROR ("HID-Host Control Registration failed");
         return (HID_ERR_L2CAP_FAILED) ;
     }
     if (!L2CA_Register (HID_PSM_INTERRUPT, (tL2CAP_APPL_INFO *) &hst_reg_info))
     {
         L2CA_Deregister( HID_PSM_CONTROL ) ;
-        HIDH_TRACE_ERROR0 ("HID Interrupt Registration failed");
+        HIDH_TRACE_ERROR ("HID-Host Interrupt Registration failed");
         return (HID_ERR_L2CAP_FAILED) ;
     }
 
@@ -130,17 +130,19 @@
 {
     tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn;
 
-    HIDH_TRACE_EVENT0 ("HID-Host disconnect");
+    HIDH_TRACE_EVENT ("HID-Host disconnect");
 
     if ((p_hcon->ctrl_cid != 0) || (p_hcon->intr_cid != 0))
     {
         p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
 
+        /* Set l2cap idle timeout to 0 (so ACL link is disconnected
+         * immediately after last channel is closed) */
+        L2CA_SetIdleTimeoutByBdAddr(hh_cb.devices[dhandle].addr, 0);
         /* Disconnect both interrupt and control channels */
         if (p_hcon->intr_cid)
             L2CA_DisconnectReq (p_hcon->intr_cid);
-
-        if (p_hcon->ctrl_cid)
+        else if (p_hcon->ctrl_cid)
             L2CA_DisconnectReq (p_hcon->ctrl_cid);
     }
     else
@@ -161,10 +163,11 @@
 **                  send security block L2C connection response.
 **
 *******************************************************************************/
-void hidh_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void hidh_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tHID_HOST_DEV_CTB *p_dev= (tHID_HOST_DEV_CTB *) p_ref_data;
     UNUSED(bd_addr);
+    UNUSED (transport);
 
     if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
     {
@@ -206,7 +209,7 @@
     UINT8        i = HID_HOST_MAX_DEVICES;
     tHID_HOST_DEV_CTB *p_dev;
 
-    HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x  CID 0x%x", psm, l2cap_cid);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x  CID 0x%x", psm, l2cap_cid);
 
     /* always add incoming connection device into HID database by default */
     if (HID_HostAddDev(bd_addr, HID_SEC_REQUIRED, &i) != HID_SUCCESS)
@@ -223,12 +226,12 @@
     {
         if (p_hcon->ctrl_cid == 0)
         {
-            HIDH_TRACE_WARNING0 ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel");
+            HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel");
             bAccept = FALSE;
         }
         if (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
         {
-            HIDH_TRACE_WARNING1 ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d",
+            HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d",
                                  p_hcon->conn_state);
             bAccept = FALSE;
         }
@@ -241,7 +244,7 @@
 #else
         if (p_hcon->conn_state != HID_CONN_STATE_UNUSED)
         {
-            HIDH_TRACE_WARNING1 ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d",
+            HIDH_TRACE_WARNING ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d",
                                  p_hcon->conn_state);
             bAccept = FALSE;
         }
@@ -283,7 +286,7 @@
     /* Send a Configuration Request. */
     L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
 
-    HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x  CID 0x%x",
+    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x  CID 0x%x",
                        psm, l2cap_cid);
 }
 
@@ -314,7 +317,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void hidh_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void hidh_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tHID_HOST_DEV_CTB *p_dev = (tHID_HOST_DEV_CTB *) p_ref_data;
     UINT8 dhandle;
@@ -323,27 +326,19 @@
 #endif
     UINT32 reason;
     UNUSED(bd_addr);
+    UNUSED (transport);
 
     dhandle = ((UINT32)p_dev - (UINT32)&(hh_cb.devices[0]))/ sizeof(tHID_HOST_DEV_CTB);
     if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
     {
-        HIDH_TRACE_EVENT0 ("HID-Host Originator security pass.");
+        HIDH_TRACE_EVENT ("HID-Host Originator security pass.");
         p_dev->conn.disc_reason = HID_SUCCESS;  /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */
 
-        /* Check if L2CAP started the connection process for interrupt channel */
-        if ((p_dev->conn.intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
-        {
-            HIDH_TRACE_WARNING0 ("HID-Host INTR Originate failed");
-            reason = HID_L2CAP_REQ_FAIL ;
-            hidh_conn_disconnect (dhandle);
-            hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
-            return;
-        }
-        else
-        {
-            /* Transition to the next appropriate state, waiting for connection confirm on control channel. */
-            p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_INTR;
-        }
+        /* Transition to the next appropriate state, configuration */
+        p_dev->conn.conn_state = HID_CONN_STATE_CONFIG;
+        L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg);
+        HIDH_TRACE_EVENT ("HID-Host Got Control conn cnf, sent cfg req, CID: 0x%x", p_dev->conn.ctrl_cid);
+
     }
 
     if( res != BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
@@ -394,9 +389,10 @@
     if ((p_hcon == NULL)
      || (!(p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG))
      || ((l2cap_cid == p_hcon->ctrl_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_CTRL))
-     || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)))
+     || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
+     && (p_hcon->conn_state != HID_CONN_STATE_DISCONNECTING)))
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid);
         return;
     }
 
@@ -439,12 +435,11 @@
     else
     {
         p_hcon->conn_state = HID_CONN_STATE_CONFIG;
+        /* Send a Configuration Request. */
+        L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
+        HIDH_TRACE_EVENT ("HID-Host got Interrupt conn cnf, sent cfg req, CID: 0x%x", l2cap_cid);
     }
 
-    /* Send a Configuration Request. */
-    L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
-
-    HIDH_TRACE_EVENT1 ("HID-Host got CTRL conn cnf, sent cfg req, CID: 0x%x", l2cap_cid);
     return;
 }
 
@@ -463,6 +458,7 @@
     UINT8 dhandle;
     tHID_CONN    *p_hcon = NULL;
     tHID_HOST_DEV_CTB *p_dev;
+    UINT32  reason;
 
     /* Find CCB based on CID */
     if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
@@ -473,11 +469,11 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    HIDH_TRACE_EVENT1 ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
 
     /* Remember the remote MTU size */
     if ((!p_cfg->mtu_present) || (p_cfg->mtu > HID_HOST_MTU))
@@ -493,7 +489,29 @@
     L2CA_ConfigRsp (l2cap_cid, p_cfg);
 
     if (l2cap_cid == p_hcon->ctrl_cid)
+    {
         p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_CTRL_CFG_DONE;
+        if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
+           (p_hcon->conn_flags & HID_CONN_FLAGS_MY_CTRL_CFG_DONE))
+        {
+            /* Connect interrupt channel */
+            p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;	/* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
+            if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
+            {
+                HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
+                reason = HID_L2CAP_REQ_FAIL ;
+                p_hcon->conn_state = HID_CONN_STATE_UNUSED;
+                hidh_conn_disconnect (dhandle);
+                hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
+                return;
+            }
+            else
+            {
+                /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
+                p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
+            }
+        }
+    }
     else
         p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_INTR_CFG_DONE;
 
@@ -502,6 +520,8 @@
      && (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
     {
         p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
+        /* Reset disconnect reason to success, as connection successful */
+        p_hcon->disc_reason = HID_SUCCESS;
 
         hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
         hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
@@ -525,7 +545,7 @@
     tHID_CONN    *p_hcon = NULL;
     UINT32  reason;
 
-    HIDH_TRACE_EVENT2 ("HID-Host Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
 
     /* Find CCB based on CID */
     if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
@@ -533,7 +553,7 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
@@ -547,7 +567,29 @@
     }
 
     if (l2cap_cid == p_hcon->ctrl_cid)
+    {
         p_hcon->conn_flags |= HID_CONN_FLAGS_MY_CTRL_CFG_DONE;
+        if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
+           (p_hcon->conn_flags & HID_CONN_FLAGS_HIS_CTRL_CFG_DONE))
+        {
+            /* Connect interrupt channel */
+            p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;  /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
+            if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
+            {
+                HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
+                reason = HID_L2CAP_REQ_FAIL ;
+                p_hcon->conn_state = HID_CONN_STATE_UNUSED;
+                hidh_conn_disconnect (dhandle);
+                hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
+                return;
+            }
+            else
+            {
+                /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
+                p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
+            }
+        }
+    }
     else
         p_hcon->conn_flags |= HID_CONN_FLAGS_MY_INTR_CFG_DONE;
 
@@ -556,6 +598,8 @@
      && (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
     {
         p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
+        /* Reset disconnect reason to success, as connection successful */
+        p_hcon->disc_reason = HID_SUCCESS;
 
         hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
         hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
@@ -586,14 +630,14 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
     if (ack_needed)
         L2CA_DisconnectRsp (l2cap_cid);
 
-    HIDH_TRACE_EVENT1 ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
 
     p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
 
@@ -618,6 +662,7 @@
             hh_cb.devices[dhandle].conn_tries = 0;
             hh_cb.devices[dhandle].conn.timer_entry.param = (UINT32) dhandle;
             btu_start_timer (&(hh_cb.devices[dhandle].conn.timer_entry), BTU_TTYPE_HID_HOST_REPAGE_TO, HID_HOST_REPAGE_WIN);
+            hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, disc_res, NULL);
         }
         else
 #endif
@@ -665,16 +710,23 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    HIDH_TRACE_EVENT1 ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
 
     if (l2cap_cid == p_hcon->ctrl_cid)
         p_hcon->ctrl_cid = 0;
     else
+    {
         p_hcon->intr_cid = 0;
+        if (p_hcon->ctrl_cid)
+        {
+            HIDH_TRACE_EVENT ("HID-Host Initiating L2CAP Ctrl disconnection");
+            L2CA_DisconnectReq (p_hcon->ctrl_cid);
+        }
+    }
 
     if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0))
     {
@@ -705,11 +757,11 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    HIDH_TRACE_EVENT2 ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x  Cong: %d", l2cap_cid, congested);
+    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x  Cong: %d", l2cap_cid, congested);
 
     if (congested)
         p_hcon->conn_flags |= HID_CONN_FLAGS_CONGESTED;
@@ -743,7 +795,7 @@
     UINT8 dhandle;
     tHID_CONN    *p_hcon = NULL;
 
-    HIDH_TRACE_DEBUG1 ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid);
+    HIDH_TRACE_DEBUG ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid);
 
     /* Find CCB based on CID */
      if ((dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES)
@@ -751,7 +803,7 @@
 
     if (p_hcon == NULL)
     {
-        HIDH_TRACE_WARNING1 ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
         GKI_freebuf (p_msg);
         return;
     }
@@ -831,6 +883,13 @@
     UINT8       use_data = 0 ;
     BOOLEAN     blank_datc = FALSE;
 
+    if (!BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR))
+    {
+        if (buf)
+            GKI_freebuf ((void *)buf);
+        return( HID_ERR_NO_CONNECTION );
+    }
+
     if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED)
     {
         if (buf)
@@ -977,7 +1036,7 @@
     /* Check if L2CAP started the connection process */
     if ((p_dev->conn.ctrl_cid = L2CA_ConnectReq (HID_PSM_CONTROL, p_dev->addr)) == 0)
     {
-        HIDH_TRACE_WARNING0 ("HID-Host Originate failed");
+        HIDH_TRACE_WARNING ("HID-Host Originate failed");
         hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE,
                                 HID_ERR_L2CAP_FAILED, NULL ) ;
     }
diff --git a/stack/include/avdt_api.h b/stack/include/avdt_api.h
index beaecf6..93ed6ae 100644
--- a/stack/include/avdt_api.h
+++ b/stack/include/avdt_api.h
@@ -454,6 +454,35 @@
 *******************************************************************************/
 AVDT_API extern void AVDT_Deregister(void);
 
+
+/*******************************************************************************
+**
+** Function         AVDT_SINK_Activate
+**
+** Description      Activate SEP of A2DP Sink. In Use parameter is adjusted.
+**                  In Use will be made false in case of activation. A2DP SRC
+**                  will receive in_use as false and can open A2DP Sink
+**                  connection
+**
+** Returns          void
+**
+*******************************************************************************/
+AVDT_API extern void AVDT_SINK_Activate(void);
+
+/*******************************************************************************
+**
+** Function         AVDT_SINK_Deactivate
+**
+** Description      Deactivate SEP of A2DP Sink. In Use parameter is adjusted.
+**                  In Use will be made TRUE in case of activation. A2DP SRC
+**                  will receive in_use as true and will not open A2DP Sink
+**                  connection
+**
+** Returns          void.
+**
+*******************************************************************************/
+AVDT_API extern void AVDT_SINK_Deactivate(void);
+
 /*******************************************************************************
 **
 ** Function         AVDT_CreateStream
diff --git a/stack/include/bt_types.h b/stack/include/bt_types.h
index 33fb884..617eaf3 100644
--- a/stack/include/bt_types.h
+++ b/stack/include/bt_types.h
@@ -128,6 +128,12 @@
 
 #define BT_EVT_TO_NFCCSIM_NCI       0x4a00      /* events to NFCC simulation (NCI packets) */
 
+/* start timer */
+#define BT_EVT_TO_START_TIMER_ONESHOT 0x4c00
+
+/* stop timer */
+#define BT_EVT_TO_STOP_TIMER_ONESHOT  0x4d00
+
 /* HCISU Events */
 
 #define BT_EVT_HCISU                0x5000
@@ -199,10 +205,11 @@
 */
 typedef struct
 {
-    UINT16          event;
-    UINT16          len;
-    UINT16          offset;
-    UINT16          layer_specific;
+    uint16_t          event;
+    uint16_t          len;
+    uint16_t          offset;
+    uint16_t          layer_specific;
+    uint8_t           data[];
 } BT_HDR;
 
 #define BT_HDR_SIZE (sizeof (BT_HDR))
@@ -497,6 +504,10 @@
 #define BLE_ADDR_TYPE_MASK      (BLE_ADDR_RANDOM | BLE_ADDR_PUBLIC)
 typedef UINT8 tBLE_ADDR_TYPE;
 
+#define BT_TRANSPORT_BR_EDR    1
+#define BT_TRANSPORT_LE        2
+typedef UINT8 tBT_TRANSPORT;
+
 #define BLE_ADDR_IS_STATIC(x)   ((x[0] & 0xC0) == 0xC0)
 
 typedef struct
diff --git a/stack/include/btm_api.h b/stack/include/btm_api.h
index f4b17d4..dbd0fb2 100644
--- a/stack/include/btm_api.h
+++ b/stack/include/btm_api.h
@@ -200,20 +200,20 @@
 /* BTM_IsInquiryActive return values (Bit Mask)
  * Note: These bit masks are associated with the inquiry modes (BTM_*_INQUIRY) */
 #define BTM_INQUIRY_INACTIVE        0x0     /* no inquiry in progress */
-#define BTM_GENERAL_INQUIRY_ACTIVE  0x1     /* a general inquiry is in progress */
-#define BTM_LIMITED_INQUIRY_ACTIVE  0x2     /* a limited inquiry is in progress */
+#define BTM_GENERAL_INQUIRY_ACTIVE  BTM_GENERAL_INQUIRY     /* a general inquiry is in progress */
+#define BTM_LIMITED_INQUIRY_ACTIVE  BTM_LIMITED_INQUIRY     /* a limited inquiry is in progress */
 #define BTM_PERIODIC_INQUIRY_ACTIVE 0x8     /* a periodic inquiry is active */
 #define BTM_SSP_INQUIRY_ACTIVE      0x4     /* SSP is active, so inquiry is disallowed (work around for FW bug) */
-#define BTM_LE_GENERAL_INQUIRY_ACTIVE  0x10     /* a general inquiry is in progress */
-#define BTM_LE_LIMITED_INQUIRY_ACTIVE  0x20     /* a limited inquiry is in progress */
-#define BTM_LE_SELECT_CONN_ACTIVE	   0x40     /* selection connection is in progress */
-#define BTM_LE_OBSERVE_ACTIVE		   0x80     /* selection connection is in progress */
+#define BTM_LE_GENERAL_INQUIRY_ACTIVE  BTM_BLE_GENERAL_INQUIRY     /* a general inquiry is in progress */
+#define BTM_LE_LIMITED_INQUIRY_ACTIVE  BTM_BLE_LIMITED_INQUIRY      /* a limited inquiry is in progress */
+#define BTM_LE_SELECT_CONN_ACTIVE   0x40     /* selection connection is in progress */
+#define BTM_LE_OBSERVE_ACTIVE       0x80     /* selection connection is in progress */
 
 /* inquiry activity mask */
-#define BTM_BR_INQ_ACTIVE_MASK		   (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE|BTM_PERIODIC_INQUIRY_ACTIVE) /* BR/EDR inquiry activity mask */
-#define BTM_LE_SCAN_ACTIVE_MASK		   0xF0     /* LE scan activity mask */
-#define BTM_LE_INQ_ACTIVE_MASK		   (BTM_LE_GENERAL_INQUIRY_ACTIVE|BTM_LE_LIMITED_INQUIRY_ACTIVE) /* LE inquiry activity mask*/
-#define BTM_INQUIRY_ACTIVE_MASK		   (BTM_BR_INQ_ACTIVE_MASK | BTM_LE_INQ_ACTIVE_MASK) /* inquiry activity mask */
+#define BTM_BR_INQ_ACTIVE_MASK        (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE|BTM_PERIODIC_INQUIRY_ACTIVE) /* BR/EDR inquiry activity mask */
+#define BTM_BLE_SCAN_ACTIVE_MASK      0xF0     /* LE scan activity mask */
+#define BTM_BLE_INQ_ACTIVE_MASK       (BTM_LE_GENERAL_INQUIRY_ACTIVE|BTM_LE_LIMITED_INQUIRY_ACTIVE) /* LE inquiry activity mask*/
+#define BTM_INQUIRY_ACTIVE_MASK       (BTM_BR_INQ_ACTIVE_MASK | BTM_BLE_INQ_ACTIVE_MASK) /* inquiry activity mask */
 
 /* Define scan types */
 #define BTM_SCAN_TYPE_STANDARD      0
@@ -659,6 +659,7 @@
 typedef struct
 {
     UINT16      status;
+    BD_ADDR     bd_addr;
     UINT16      length;
     BD_NAME     remote_bd_name;
 } tBTM_REMOTE_DEV_NAME;
@@ -837,6 +838,10 @@
     DEV_CLASS_PTR   p_dc;       /* The device class */
     BD_NAME_PTR     p_bdn;      /* The device name */
     UINT8          *p_features; /* pointer to the remote device's features page[0] (supported features page) */
+#if BLE_INCLUDED == TRUE
+    UINT16          handle;     /* connection handle */
+    tBT_TRANSPORT   transport; /* link is LE or not */
+#endif
 } tBTM_BL_CONN_DATA;
 
 /* the data type associated with BTM_BL_DISCN_EVT */
@@ -844,6 +849,10 @@
 {
     tBTM_BL_EVENT   event;  /* The event reported. */
     BD_ADDR_PTR     p_bda;  /* The address of the disconnected device */
+#if BLE_INCLUDED == TRUE
+    UINT16          handle; /* disconnected connection handle */
+    tBT_TRANSPORT   transport; /* link is LE link or not */
+#endif
 } tBTM_BL_DISCN_DATA;
 
 /* Busy-Level shall have the inquiry_paging mask set when
@@ -893,10 +902,16 @@
 ** changes. First param is BD address, second is if added or removed.
 ** Registered through BTM_AclRegisterForChanges call.
 */
+#if BLE_INCLUDED == TRUE
+typedef void (tBTM_ACL_DB_CHANGE_CB) (BD_ADDR p_bda, DEV_CLASS p_dc,
+                                      BD_NAME p_bdn, UINT8 *features,
+                                      BOOLEAN is_new, UINT16 handle,
+                                      tBT_TRANSPORT transport);
+#else
 typedef void (tBTM_ACL_DB_CHANGE_CB) (BD_ADDR p_bda, DEV_CLASS p_dc,
                                       BD_NAME p_bdn, UINT8 *features,
                                       BOOLEAN is_new);
-
+#endif
 /*****************************************************************************
 **  SCO CHANNEL MANAGEMENT
 *****************************************************************************/
@@ -1565,7 +1580,8 @@
 **              optional data passed in by BTM_SetEncryption
 **              tBTM_STATUS - result of the operation
 */
-typedef void (tBTM_SEC_CBACK) (BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result);
+typedef void (tBTM_SEC_CBACK) (BD_ADDR bd_addr, tBT_TRANSPORT trasnport,
+                                void *p_ref_data, tBTM_STATUS result);
 
 /* Bond Cancel complete. Parameters are
 **              Result of the cancel operation
@@ -1897,73 +1913,6 @@
 #define BTM_VSC_NFC_SUPPORTED(x) ((x)[BTM_FEATURE_NFC_OFF] & BTM_FEATURE_NFC_MASK)
 
 
-/************************
-**  Dual-Stack support
-*************************/
-/* BTM_SYNC_FAIL_EVT reason codes */
-#define BTM_SYNC_SUCCESS                    0
-#define BTM_SYNC_FAIL_BTE_SWITCH_REJECTED   1
-#define BTM_SYNC_FAIL_TRANS_PAUSE           2
-#define BTM_SYNC_FAIL_CORE_SYNC             3
-#define BTM_SYNC_FAIL_BTA_SYNC              4
-#define BTM_SYNC_FAIL_TRANS_RESUME          5
-#define BTM_SYNC_FAIL_RESYNC                6
-#define BTM_SYNC_FAIL_ERROR                 7
-#define BTM_SYNC_FAIL_UIPC_OPEN             8
-typedef UINT8 tBTM_SYNC_STATUS;
-
-/* Direction of sync (used by BTM_SyncStack) */
-#define BTM_SW_BB_TO_MM     0
-#define BTM_SW_TO_BB        1   /* Switch back to baseband stack (from either MM or BTC host) */
-#define BTM_SW_RESYNC       2
-#define BTM_SW_BB_TO_BTC    3   /* Switch from baseband stack to Bluetooth Controller Host stack */
-#define BTM_SW_MM_TO_BB     4
-#define BTM_SW_BTC_TO_BB    5
-typedef UINT8 tBTM_SW_DIR;
-
-/* Stack synchronization events (returned by tBTM_SYNC_STACK_CBACK callback) */
-#define BTM_SYNC_CPLT_EVT   0
-#define BTM_SYNC_BTA_EVT    1
-#define BTM_RESYNC_CPLT_EVT 2
-#define BTM_UIPC_OPENED_EVT 3
-#define BTM_UIPC_CLOSED_EVT 4
-typedef UINT8 tBTM_SYNC_STACK_EVT;
-
-/* Synchronization info from BTA/application that will be sent when calling BTE sync request functions */
-typedef struct
-{
-    tBTM_SW_DIR dir;
-    UINT16      lcid[BTM_SYNC_INFO_NUM_STR];
-    UINT8       avdt_handle[BTM_SYNC_INFO_NUM_STR];
-} tBTM_SYNC_INFO;
-
-/* Stack synchonization callback function
-** Parameters are
-**              event:  stack synchronization event
-**              status: BTM_SUCCESS if event was successful
-*/
-typedef void (*tBTM_SYNC_STACK_CBACK)(tBTM_SYNC_STACK_EVT event, tBTM_SYNC_STATUS status);
-
-
-/* Sync complete callback function. Called by bte layers after synchronization is complete
-** so that BTM_SYNC can procede with the next step for switching stack to MM
-**
-** Parameters are
-**              status: BTM_SUCCESS if synchronization was successful
-*/
-typedef void (*tBTM_SYNC_CPLT_CBACK)(tBTM_STATUS status);
-
-
-
-/* IPC event callback function. Called by BTM when an IPC event is received.
-** These events are currently sent to DM through the callback function.
-**
-** Parameters are
-**              status: BTM_SUCCESS if synchronization was successful
-**              p_data: Actual message in the IPC
-*/
-typedef void (tBTM_IPC_EVT_CBACK)(tBTM_STATUS status, BT_HDR *p_data);
-
 /* MIP evnets, callbacks    */
 enum
 {
@@ -2027,6 +1976,12 @@
 /* MIP Device query callback function  */
 typedef BOOLEAN (tBTM_MIP_QUERY_CB) (BD_ADDR dev_addr, UINT8 *p_mode, LINK_KEY link_key);
 
+#define BTM_CONTRL_ACTIVE  1       /* ACL link on, SCO link ongoing, sniff mode */
+#define BTM_CONTRL_SCAN    2       /* Scan state - paging/inquiry/trying to connect*/
+#define BTM_CONTRL_IDLE    3       /* Idle state - page scan, LE advt, inquiry scan */
+
+typedef UINT8 tBTM_CONTRL_STATE;
+
 /*****************************************************************************
 **  EXTERNAL FUNCTION DECLARATIONS
 *****************************************************************************/
@@ -2659,7 +2614,8 @@
 **
 *******************************************************************************/
     BTM_API extern tBTM_STATUS  BTM_ReadRemoteDeviceName (BD_ADDR remote_bda,
-                                                          tBTM_CMPL_CB *p_cb);
+                                                          tBTM_CMPL_CB *p_cb,
+                                                          tBT_TRANSPORT transport);
 
 
 /*******************************************************************************
@@ -3187,7 +3143,7 @@
 ** Returns          TRUE if connection is up, else FALSE.
 **
 *******************************************************************************/
-    BTM_API extern BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda);
+    BTM_API extern BOOLEAN BTM_IsAclConnectionUp (BD_ADDR remote_bda, tBT_TRANSPORT transport);
 
 
 /*******************************************************************************
@@ -3273,7 +3229,8 @@
 **                  BTM_BUSY if command is already in progress
 **
 *******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb);
+    BTM_API extern tBTM_STATUS BTM_ReadTxPower (BD_ADDR remote_bda,
+                                                      tBT_TRANSPORT transport, tBTM_CMPL_CB *p_cb);
 
 /*******************************************************************************
 **
@@ -3640,7 +3597,8 @@
 ** Returns          TRUE if registered OK, else FALSE
 **
 *******************************************************************************/
-    BTM_API extern BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback);
+    BTM_API extern BOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (
+                                                        tBTM_LINK_KEY_CALLBACK *p_callback);
 
 
 /*******************************************************************************
@@ -3653,7 +3611,8 @@
 ** Returns          TRUE if registered OK, else FALSE
 **
 *******************************************************************************/
-    BTM_API extern BOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback);
+    BTM_API extern BOOLEAN BTM_SecAddRmtNameNotifyCallback (
+                                                               tBTM_RMT_NAME_CALLBACK *p_callback);
 
 
 /*******************************************************************************
@@ -3666,7 +3625,8 @@
 ** Returns          TRUE if OK, else FALSE
 **
 *******************************************************************************/
-    BTM_API extern BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback);
+    BTM_API extern BOOLEAN BTM_SecDeleteRmtNameNotifyCallback (
+                                                            tBTM_RMT_NAME_CALLBACK *p_callback);
 
 
 /*******************************************************************************
@@ -3709,6 +3669,22 @@
 
 /*******************************************************************************
 **
+** Function         BTM_GetSecurityFlagsByTransport
+**
+** Description      Get security flags for the device on a particular transport
+**
+** Parameters      bd_addr: BD address of remote device
+**                  p_sec_flags : Out parameter to be filled with security flags for the connection
+**                  transport :  Physical transport of the connection (BR/EDR or LE)
+**
+** Returns          BOOLEAN TRUE or FALSE is device found
+**
+*******************************************************************************/
+    BTM_API extern BOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr,
+                                UINT8 * p_sec_flags, tBT_TRANSPORT transport);
+
+/*******************************************************************************
+**
 ** Function         BTM_ReadTrustedMask
 **
 ** Description      Get trusted mask for the device
@@ -3789,9 +3765,10 @@
 ** Returns          TRUE if registered OK, else FALSE
 **
 *******************************************************************************/
-    BTM_API extern BOOLEAN BTM_SetUCDSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
-                                                    UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
-                                                    UINT32 mx_chan_id);
+    BTM_API extern BOOLEAN BTM_SetUCDSecurityLevel (BOOLEAN is_originator, char *p_name,
+                                                          UINT8 service_id, UINT16 sec_level,
+                                                          UINT16 psm, UINT32 mx_proto_id,
+                                                          UINT32 mx_chan_id);
 
 /*******************************************************************************
 **
@@ -3951,10 +3928,37 @@
 **
 ** Description      This function is called to perform bonding with peer device.
 **
+** Parameters:      bd_addr      - Address of the device to bond
+**                  pin_len      - length in bytes of the PIN Code
+**                  p_pin        - pointer to array with the PIN Code
+**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
+
 ** Returns          BTM_CMD_STARTED if successfully initiated, otherwise error
 **
 *******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]);
+    BTM_API extern tBTM_STATUS BTM_SecBond (BD_ADDR bd_addr,
+                                            UINT8 pin_len, UINT8 *p_pin,
+                                            UINT32 trusted_mask[]);
+
+/*******************************************************************************
+**
+** Function         BTM_SecBondByTransport
+**
+** Description      This function is called to perform bonding by designated transport
+**
+** Parameters:      bd_addr      - Address of the device to bond
+**                  pin_len      - length in bytes of the PIN Code
+**                  p_pin        - pointer to array with the PIN Code
+**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
+**                  transport :  Physical transport to use for bonding (BR/EDR or LE)
+**
+** Returns          BTM_CMD_STARTED if successfully initiated, otherwise error
+**
+*******************************************************************************/
+    BTM_API extern tBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr,
+                                            tBT_TRANSPORT transport,
+                                            UINT8 pin_len, UINT8 *p_pin,
+                                            UINT32 trusted_mask[]);
 
 /*******************************************************************************
 **
@@ -3993,8 +3997,8 @@
 **                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
 **
 *******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBTM_SEC_CBACK *p_callback,
-                                                  void *p_ref_data);
+    BTM_API extern tBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport,
+                                                  tBTM_SEC_CBACK *p_callback, void *p_ref_data);
 
 /*******************************************************************************
 **
@@ -4079,7 +4083,8 @@
 **                  r           - simple pairing Randomizer  C.
 **
 *******************************************************************************/
-    BTM_API extern void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r);
+    BTM_API extern void BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr,
+                                                        BT_OCTET16 c, BT_OCTET16 r);
 
 /*******************************************************************************
 **
@@ -4232,7 +4237,7 @@
 ** Returns          the handle of the connection, or 0xFFFF if none.
 **
 *******************************************************************************/
-    BTM_API extern UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda);
+    BTM_API extern UINT16 BTM_GetHCIConnHandle (BD_ADDR remote_bda, tBT_TRANSPORT transport);
 
 
 /*******************************************************************************
@@ -4419,171 +4424,6 @@
     BTM_API extern UINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid,
                                              UINT8 *p_uuid_list, UINT8 max_num_uuid);
 
-/*******************************************************************************
-**
-** Function         BTM_SyncStack
-**
-** Description      For Dual-Stack support. Called to initiate switching to/from
-**                  main stack (running on phone baseband) to mm stack (light
-**                  stack running on multi-media chip)
-**
-** Parameters       sync_dir: BTM_SW_BB_TO_MM: switch from BB to MM stack
-**                            BTM_SW_MM_TO_BB: switch from MM to BB stack
-**                            BTM_SW_RESYNC: resync MM and BB stacks
-**
-**                  p_sync_cback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_SyncStack(tBTM_SW_DIR sync_dir, tBTM_SYNC_STACK_CBACK p_sync_cback);
-
-/*******************************************************************************
-**
-** Function         BTM_SyncBtaRsp
-**
-** Description      For Dual-Stack support. Called to indicate that upper layers
-**                  (e.g. BTA or application) have completed synchronizing bta/app
-**                  specific layers for switching.
-**
-**                  Called in response to 'BTM_SYNC_BTA_EVT'
-**
-** Parameters       status: BTM_SUCESS: bta/app successfully synchronized
-**                          otherwise:  sync was unsuccessfule. Abort switch.
-**
-**                  p_btm_sync_info: information from bta/app that will be needed
-**                                  by BTE (avdt and l2cap) for switching.
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_SyncBtaRsp(tBTM_STATUS status, tBTM_SYNC_INFO *p_btm_sync_info);
-
-/*******************************************************************************
-**
-** Function         BTM_OpenUIPC
-**
-** Description      For Dual-Stack support. Called to open UIPC between
-**                  main stack (running on phone baseband) to embedded light stack
-**                  (running on Multimedia or Bluetooth Controller chip)
-**
-** Parameters       sync_dir: BTM_SW_BB_TO_MM: switch from BB to MM stack
-**                            BTM_SW_BB_TO_BTC:switch from BB to BTC stack
-**
-**                  p_sync_callback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_OpenUIPC(tBTM_SW_DIR sync_dir, tBTM_SYNC_STACK_CBACK p_sync_callback);
-
-/*******************************************************************************
-**
-** Function         BTM_CloseUIPC
-**
-** Description      For Dual-Stack support. Called to close UIPC between
-**                  main stack (running on phone baseband) to embedded light stack
-**                  (running on Multimedia or Bluetooth Controller chip)
-**
-** Parameters
-**                  p_sync_callback: callback function for event notification
-** Returns
-**
-*******************************************************************************/
-    BTM_API extern tBTM_STATUS BTM_CloseUIPC(tBTM_SYNC_STACK_CBACK p_sync_callback);
-
-/*******************************************************************************
-**
-** Function         BTM_IpcSend
-**
-** Description      For Dual-Stack support. Called to send ipc messages from
-**                  full stack to lite stack and vice-versa. This API is
-**                  typically called by bta layers e.g. bta_av.
-**
-**
-** Parameters       len:    Length of the buffer in the ipc message
-**
-**                  buffer: Pointer to the buffer to be passed in the IPC message
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_IpcSend(UINT16 len, UINT8* buffer);
-
-/*******************************************************************************
-**
-** Function         BTM_IpcSendBuf
-**
-** Description      For Dual-Stack support. Called to send ipc messages from
-**                  full stack to lite stack and vice-versa. This API is
-**                  typically called by bta layers e.g. bta_av_sync.
-**
-**
-** Parameters       p_buf: Pointer to the buffer to be passed in the IPC message
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_IpcSendBuf(BT_HDR* p_buf);
-
-/*******************************************************************************
-**
-** Function         BTM_RegIpcEvtHandler
-**
-** Description      registers the DM provided handler for IPC events
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_RegIpcEvtHandler(tBTM_IPC_EVT_CBACK *p_cback);
-
-/*******************************************************************************
-**
-** Function         BTM_RegRTIpcEvtHandler
-**
-** Description      registers the RT(Audio Routing) provided handler for IPC events
-**
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_RegRTIpcEvtHandler(tBTM_IPC_EVT_CBACK *p_cback);
-
-/*****************************************************************************
-**  N2BT
-*****************************************************************************/
-
-/* Data callback for N2BT */
-    typedef void (tBTM_N2BT_DATA_CB) (BD_ADDR bd_addr, UINT16 handle, UINT8 *p_data, UINT16 datalen);
-
-/*******************************************************************************
-**
-** Function         BTM_N2BtAcquire
-**
-** Description      Put controller into acquisition mode
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_N2BtAcquire(BD_ADDR bd_addr, UINT16 timeout,
-                                        UINT8 freq, UINT8 src_addrlen, UINT8 sensor_flags,
-                                        UINT8 sensor_type, UINT8 sensor_clk_accuracy,
-                                        UINT16 add_rx_window, UINT16 init_crc,
-                                        UINT32 ac_low, UINT32 ac_high, UINT16 pkt_hdr,
-                                        UINT16 list_dur, UINT16 list_int,
-                                        UINT8 oor_missed_pkts, tBTM_VSC_CMPL_CB *p_cb,
-                                        tBTM_N2BT_DATA_CB *p_data_cback);
-
-/*******************************************************************************
-**
-** Function         BTM_N2BtDisconnect
-**
-** Description      Disconnects all N2BT devices
-**
-** Returns          void
-**
-*******************************************************************************/
-    BTM_API extern void BTM_N2BtDisconnect(void);
-
 /*****************************************************************************
 **  SCO OVER HCI
 *****************************************************************************/
@@ -4662,6 +4502,18 @@
 *******************************************************************************/
 BTM_API extern void BTM_PCM2Setup_Write (BOOLEAN clk_master, tBTM_VSC_CMPL_CB *p_arc_cb);
 
+
+/*******************************************************************************
+**
+** Function         BTM_PM_ReadControllerState
+**
+** Description      This function is called to obtain the controller state
+**
+** Returns          Controller state (BTM_CONTRL_ACTIVE, BTM_CONTRL_SCAN, and BTM_CONTRL_IDLE)
+**
+*******************************************************************************/
+BTM_API extern tBTM_CONTRL_STATE BTM_PM_ReadControllerState(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/stack/include/btm_ble_api.h b/stack/include/btm_ble_api.h
index 584ce9a..0e76468 100644
--- a/stack/include/btm_ble_api.h
+++ b/stack/include/btm_ble_api.h
@@ -26,25 +26,40 @@
 #define BTM_BLE_API_H
 
 #include "btm_api.h"
+#include "gki.h"
 
 #define CHNL_MAP_LEN    5
 typedef UINT8 tBTM_BLE_CHNL_MAP[CHNL_MAP_LEN];
 
-#define BTM_BLE_CONNECT_EVT     0x00
-#define BTM_BLE_CONNECT_DIR_EVT 0x01
-#define BTM_BLE_DISCOVER_EVT    0x02
-#define BTM_BLE_NON_CONNECT_EVT 0x03
+/* 0x00-0x04 only used for set advertising parameter command */
+#define BTM_BLE_CONNECT_EVT     0x00   /* 0x00-0x04 only used for set advertising
+                                            parameter command */
+#define BTM_BLE_CONNECT_DIR_EVT 0x01   /* Connectable directed advertising */
+#define BTM_BLE_DISCOVER_EVT    0x02  /* Scannable undirected advertising */
+#define BTM_BLE_NON_CONNECT_EVT 0x03  /* Non connectable undirected advertising */
+#define BTM_BLE_CONNECT_LO_DUTY_DIR_EVT 0x04        /* Connectable low duty
+                                                       cycle directed advertising  */
+    /* 0x00 - 0x05 can be received on adv event type */
 #define BTM_BLE_SCAN_RSP_EVT    0x04
-#define BTM_BLE_SCAN_REQ_EVT    0x06
+#define BTM_BLE_SCAN_REQ_EVT    0x05
 #define BTM_BLE_UNKNOWN_EVT     0xff
 
 #define BTM_BLE_UNKNOWN_EVT     0xff
 
+typedef UINT32 tBTM_BLE_REF_VALUE;
+
 #define BTM_BLE_SCAN_MODE_PASS      0
 #define BTM_BLE_SCAN_MODE_ACTI      1
 #define BTM_BLE_SCAN_MODE_NONE      0xff
 typedef UINT8 tBTM_BLE_SCAN_MODE;
 
+#define BTM_BLE_BATCH_SCAN_MODE_DISABLE 0
+#define BTM_BLE_BATCH_SCAN_MODE_PASS  1
+#define BTM_BLE_BATCH_SCAN_MODE_ACTI  2
+#define BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI 3
+
+typedef UINT8 tBTM_BLE_BATCH_SCAN_MODE;
+
 /* advertising channel map */
 #define BTM_BLE_ADV_CHNL_37    (0x01 << 0)
 #define BTM_BLE_ADV_CHNL_38    (0x01 << 1)
@@ -82,6 +97,18 @@
 #define BTM_BLE_ADV_INT_MIN            0x0020
 #define BTM_BLE_ADV_INT_MAX            0x4000
 
+/* Full scan boundary values */
+#define BTM_BLE_ADV_SCAN_FULL_MIN      0x00
+#define BTM_BLE_ADV_SCAN_FULL_MAX      0x64
+
+/* Partial scan boundary values */
+#define BTM_BLE_ADV_SCAN_TRUNC_MIN      BTM_BLE_ADV_SCAN_FULL_MIN
+#define BTM_BLE_ADV_SCAN_TRUNC_MAX      BTM_BLE_ADV_SCAN_FULL_MAX
+
+/* Threshold values */
+#define BTM_BLE_ADV_SCAN_THR_MIN        BTM_BLE_ADV_SCAN_FULL_MIN
+#define BTM_BLE_ADV_SCAN_THR_MAX        BTM_BLE_ADV_SCAN_FULL_MAX
+
 /* connection parameter boundary values */
 #define BTM_BLE_SCAN_INT_MIN            0x0004
 #define BTM_BLE_SCAN_INT_MAX            0x4000
@@ -93,7 +120,6 @@
 #define BTM_BLE_CONN_SUP_TOUT_MIN       0x000A
 #define BTM_BLE_CONN_SUP_TOUT_MAX       0x0C80
 #define BTM_BLE_CONN_PARAM_UNDEF        0xffff      /* use this value when a specific value not to be overwritten */
-#define BTM_BLE_CONN_SUP_TOUT_DEF       700
 
 /* default connection parameters if not configured, use GAP recommend value for auto/selective connection */
 /* default scan interval */
@@ -110,7 +136,7 @@
 #define BTM_BLE_SCAN_SLOW_INT_1    2048    /* 1.28 s   = 2048 *0.625 */
 #endif
 #ifndef BTM_BLE_SCAN_SLOW_WIN_1
-#define BTM_BLE_SCAN_SLOW_WIN_1   18      /* 11.25 ms = 18 *0.625 */
+#define BTM_BLE_SCAN_SLOW_WIN_1   48      /* 30 ms = 48 *0.625 */
 #endif
 
 /* default scan paramter used in reduced power cycle (background scanning) */
@@ -157,6 +183,58 @@
 #define BTM_BLE_SIMULTANEOUS_HOST	0x01
 #endif
 
+/* Appearance Values Reported with BTM_BLE_AD_TYPE_APPEARANCE */
+#define BTM_BLE_APPEARANCE_UKNOWN                  0x0000
+#define BTM_BLE_APPEARANCE_GENERIC_PHONE           0x0040
+#define BTM_BLE_APPEARANCE_GENERIC_COMPUTER        0x0080
+#define BTM_BLE_APPEARANCE_GENERIC_WATCH           0x00C0
+#define BTM_BLE_APPEARANCE_SPORTS_WATCH            0x00C1
+#define BTM_BLE_APPEARANCE_GENERIC_CLOCK           0x0100
+#define BTM_BLE_APPEARANCE_GENERIC_DISPLAY         0x0140
+#define BTM_BLE_APPEARANCE_GENERIC_REMOTE          0x0180
+#define BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES      0x01C0
+#define BTM_BLE_APPEARANCE_GENERIC_TAG             0x0200
+#define BTM_BLE_APPEARANCE_GENERIC_KEYRING         0x0240
+#define BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER    0x0280
+#define BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 0x02C0
+#define BTM_BLE_APPEARANCE_GENERIC_THERMOMETER     0x0300
+#define BTM_BLE_APPEARANCE_THERMOMETER_EAR         0x0301
+#define BTM_BLE_APPEARANCE_GENERIC_HEART_RATE      0x0340
+#define BTM_BLE_APPEARANCE_HEART_RATE_BELT         0x0341
+#define BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE  0x0380
+#define BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM      0x0381
+#define BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST    0x0382
+#define BTM_BLE_APPEARANCE_GENERIC_HID             0x03C0
+#define BTM_BLE_APPEARANCE_HID_KEYBOARD            0x03C1
+#define BTM_BLE_APPEARANCE_HID_MOUSE               0x03C2
+#define BTM_BLE_APPEARANCE_HID_JOYSTICK            0x03C3
+#define BTM_BLE_APPEARANCE_HID_GAMEPAD             0x03C4
+#define BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET    0x03C5
+#define BTM_BLE_APPEARANCE_HID_CARD_READER         0x03C6
+#define BTM_BLE_APPEARANCE_HID_DIGITAL_PEN         0x03C7
+#define BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER     0x03C8
+#define BTM_BLE_APPEARANCE_GENERIC_GLUCOSE         0x0400
+#define BTM_BLE_APPEARANCE_GENERIC_WALKING         0x0440
+#define BTM_BLE_APPEARANCE_WALKING_IN_SHOE         0x0441
+#define BTM_BLE_APPEARANCE_WALKING_ON_SHOE         0x0442
+#define BTM_BLE_APPEARANCE_WALKING_ON_HIP          0x0443
+#define BTM_BLE_APPEARANCE_GENERIC_CYCLING         0x0480
+#define BTM_BLE_APPEARANCE_CYCLING_COMPUTER        0x0481
+#define BTM_BLE_APPEARANCE_CYCLING_SPEED           0x0482
+#define BTM_BLE_APPEARANCE_CYCLING_CADENCE         0x0483
+#define BTM_BLE_APPEARANCE_CYCLING_POWER           0x0484
+#define BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE   0x0485
+#define BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER  0x0C40
+#define BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 0x0C41
+#define BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST    0x0C42
+#define BTM_BLE_APPEARANCE_GENERIC_WEIGHT          0x0C80
+#define BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS  0x1440
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION 0x1441
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV     0x1442
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD         0x1443
+#define BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV 0x1444
+
+
 /* Structure returned with Rand/Encrypt complete callback */
 typedef struct
 {
@@ -179,39 +257,36 @@
 #define BTM_BLE_POLICY_ALLOW_CONN           0x02    /* relevant to advertiser */
 #define BTM_BLE_POLICY_WHITE_ALL            0x03    /* relevant to both */
 
-typedef struct
-{
-    UINT8               adv_int_min;
-    UINT8               adv_int_max;
-    tBTM_BLE_CHNL_MAP   chnl_map;
-
-}tBTM_BLE_ADV_PARAMS;
-
 /* ADV data flag bit definition used for BTM_BLE_AD_TYPE_FLAG */
 #define BTM_BLE_LIMIT_DISC_FLAG         (0x01 << 0)
 #define BTM_BLE_GEN_DISC_FLAG           (0x01 << 1)
 #define BTM_BLE_BREDR_NOT_SPT           (0x01 << 2)
+/* 4.1 spec adv flag for simultaneous BR/EDR+LE connection support */
+#define BTM_BLE_DMT_CONTROLLER_SPT      (0x01 << 3)
+#define BTM_BLE_DMT_HOST_SPT            (0x01 << 4)
 #define BTM_BLE_NON_LIMIT_DISC_FLAG     (0x00 )         /* lowest bit unset */
 #define BTM_BLE_ADV_FLAG_MASK           (BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_BREDR_NOT_SPT | BTM_BLE_GEN_DISC_FLAG)
 #define BTM_BLE_LIMIT_DISC_MASK         (BTM_BLE_LIMIT_DISC_FLAG )
 
-#define BTM_BLE_AD_BIT_DEV_NAME        (0x0001 << 0)
-#define BTM_BLE_AD_BIT_FLAGS           (0x0001 << 1)
-#define BTM_BLE_AD_BIT_MANU            (0x0001 << 2)
-#define BTM_BLE_AD_BIT_TX_PWR          (0x0001 << 3)
-#define BTM_BLE_AD_BIT_INT_RANGE       (0x0001 << 5)
-#define BTM_BLE_AD_BIT_SERVICE         (0x0001 << 6)
-#define BTM_BLE_AD_BIT_SERVICE_SOL     (0x0001 << 7)
-#define BTM_BLE_AD_BIT_SERVICE_DATA    (0x0001 << 8)
-#define BTM_BLE_AD_BIT_SIGN_DATA       (0x0001 << 9)
-#define BTM_BLE_AD_BIT_SERVICE_128SOL  (0x0001 << 10)
-#define BTM_BLE_AD_BIT_APPEARANCE      (0x0001 << 11)
-#define BTM_BLE_AD_BIT_PUBLIC_ADDR      (0x0001 << 12)
-#define BTM_BLE_AD_BIT_RANDOM_ADDR      (0x0001 << 13)
+#define BTM_BLE_AD_BIT_DEV_NAME        (0x00000001 << 0)
+#define BTM_BLE_AD_BIT_FLAGS           (0x00000001 << 1)
+#define BTM_BLE_AD_BIT_MANU            (0x00000001 << 2)
+#define BTM_BLE_AD_BIT_TX_PWR          (0x00000001 << 3)
+#define BTM_BLE_AD_BIT_INT_RANGE       (0x00000001 << 5)
+#define BTM_BLE_AD_BIT_SERVICE         (0x00000001 << 6)
+#define BTM_BLE_AD_BIT_SERVICE_SOL     (0x00000001 << 7)
+#define BTM_BLE_AD_BIT_SERVICE_DATA    (0x00000001 << 8)
+#define BTM_BLE_AD_BIT_SIGN_DATA       (0x00000001 << 9)
+#define BTM_BLE_AD_BIT_SERVICE_128SOL  (0x00000001 << 10)
+#define BTM_BLE_AD_BIT_APPEARANCE      (0x00000001 << 11)
+#define BTM_BLE_AD_BIT_PUBLIC_ADDR      (0x00000001 << 12)
+#define BTM_BLE_AD_BIT_RANDOM_ADDR       (0x00000001 << 13)
+#define BTM_BLE_AD_BIT_SERVICE_32        (0x00000001 << 4)
+#define BTM_BLE_AD_BIT_SERVICE_32SOL     (0x00000001 << 14)
+#define BTM_BLE_AD_BIT_PROPRIETARY     (0x00000001 << 15)
+#define BTM_BLE_AD_BIT_SERVICE_128      (0x00000001 << 16)      /*128-bit Service UUIDs*/
 
-#define BTM_BLE_AD_BIT_PROPRIETARY     (0x0001 << 15)
-
-typedef  UINT16  tBTM_BLE_AD_MASK;
+typedef  UINT32  tBTM_BLE_AD_MASK;
 
 #define BTM_BLE_AD_TYPE_FLAG            HCI_EIR_FLAGS_TYPE                  /* 0x01 */
 #define BTM_BLE_AD_TYPE_16SRV_PART      HCI_EIR_MORE_16BITS_UUID_TYPE       /* 0x02 */
@@ -233,9 +308,35 @@
 #define BTM_BLE_AD_TYPE_PUBLIC_TARGET   0x17
 #define BTM_BLE_AD_TYPE_RANDOM_TARGET   0x18
 #define BTM_BLE_AD_TYPE_APPEARANCE      0x19
+#define BTM_BLE_AD_TYPE_ADV_INT         0x1a
+#define BTM_BLE_AD_TYPE_32SOL_SRV_UUID  0x1b
+#define BTM_BLE_AD_TYPE_32SERVICE_DATA  0x1c
+#define BTM_BLE_AD_TYPE_128SERVICE_DATA 0x1d
+
 #define BTM_BLE_AD_TYPE_MANU            HCI_EIR_MANUFACTURER_SPECIFIC_TYPE      /* 0xff */
 typedef UINT8   tBTM_BLE_AD_TYPE;
 
+/* adv tx power level */
+#define BTM_BLE_ADV_TX_POWER_MIN        0           /* minimum tx power */
+#define BTM_BLE_ADV_TX_POWER_LOW        1           /* low tx power     */
+#define BTM_BLE_ADV_TX_POWER_MID        2           /* middle tx power  */
+#define BTM_BLE_ADV_TX_POWER_UPPER      3           /* upper tx power   */
+#define BTM_BLE_ADV_TX_POWER_MAX        4           /* maximum tx power */
+typedef UINT8 tBTM_BLE_ADV_TX_POWER;
+
+/* adv tx power in dBm */
+typedef struct
+{
+    UINT8 adv_inst_max;         /* max adv instance supported in controller */
+    UINT8 rpa_offloading;
+    UINT16 tot_scan_results_strg;
+    UINT8 max_irk_list_sz;
+    UINT8 filter_support;
+    UINT8 max_filter;
+    UINT8 energy_support;
+    BOOLEAN values_read;
+}tBTM_BLE_VSC_CB;
+
 /* slave preferred connection interval range */
 typedef struct
 {
@@ -252,12 +353,35 @@
     UINT16      *p_uuid;
 }tBTM_BLE_SERVICE;
 
+/* 32 bits Service supported in the device */
+typedef struct
+{
+    UINT8       num_service;
+    BOOLEAN     list_cmpl;
+    UINT32      *p_uuid;
+}tBTM_BLE_32SERVICE;
+
+/* 128 bits Service supported in the device */
+typedef struct
+{
+    BOOLEAN     list_cmpl;
+    UINT8       uuid128[MAX_UUID_SIZE];
+}tBTM_BLE_128SERVICE;
+
 typedef struct
 {
     UINT8       len;
     UINT8      *p_val;
 }tBTM_BLE_MANU;
 
+
+typedef struct
+{
+    tBT_UUID    service_uuid;
+    UINT8       len;
+    UINT8      *p_val;
+}tBTM_BLE_SERVICE_DATA;
+
 typedef struct
 {
     UINT8       adv_type;
@@ -273,14 +397,350 @@
 
 typedef struct
 {
-    tBTM_BLE_MANU           manu;			/* manufactuer data */
     tBTM_BLE_INT_RANGE      int_range;      /* slave prefered conn interval range */
-    tBTM_BLE_SERVICE        services;       /* services */
+    tBTM_BLE_MANU           *p_manu;           /* manufactuer data */
+    tBTM_BLE_SERVICE        *p_services;       /* services */
+    tBTM_BLE_128SERVICE     *p_services_128b;  /* 128 bits service */
+    tBTM_BLE_32SERVICE      *p_service_32b;     /* 32 bits Service UUID */
+    tBTM_BLE_SERVICE        *p_sol_services;    /* 16 bits services Solicitation UUIDs */
+    tBTM_BLE_32SERVICE      *p_sol_service_32b;    /* List of 32 bit Service Solicitation UUIDs */
+    tBTM_BLE_128SERVICE     *p_sol_service_128b;    /* List of 128 bit Service Solicitation UUIDs */
+    tBTM_BLE_PROPRIETARY    *p_proprietary;
+    tBTM_BLE_SERVICE_DATA   *p_service_data;    /* service data */
     UINT16                  appearance;
     UINT8                   flag;
-    tBTM_BLE_PROPRIETARY    *p_proprietary;
+    UINT8                   tx_power;
 }tBTM_BLE_ADV_DATA;
 
+#ifndef BTM_BLE_MULTI_ADV_MAX
+#define BTM_BLE_MULTI_ADV_MAX   10 /* controller returned adv_inst_max should be less
+                                      than this number */
+#endif
+
+#define BTM_BLE_MULTI_ADV_INVALID   0
+
+#define BTM_BLE_MULTI_ADV_ENB_EVT           1
+#define BTM_BLE_MULTI_ADV_DISABLE_EVT       2
+#define BTM_BLE_MULTI_ADV_PARAM_EVT         3
+#define BTM_BLE_MULTI_ADV_DATA_EVT          4
+typedef UINT8 tBTM_BLE_MULTI_ADV_EVT;
+
+#define BTM_BLE_MULTI_ADV_DEFAULT_STD 0
+
+typedef struct
+{
+    UINT16          adv_int_min;
+    UINT16          adv_int_max;
+    UINT8           adv_type;
+    tBTM_BLE_ADV_CHNL_MAP channel_map;
+    tBTM_BLE_AFP    adv_filter_policy;
+    tBTM_BLE_ADV_TX_POWER tx_power;
+}tBTM_BLE_ADV_PARAMS;
+
+typedef struct
+{
+    UINT8   *p_sub_code; /* dynamic array to store sub code */
+    UINT8   *p_inst_id;  /* dynamic array to store instance id */
+    UINT8   pending_idx;
+    UINT8   next_idx;
+}tBTM_BLE_MULTI_ADV_OPQ;
+
+typedef void (tBTM_BLE_MULTI_ADV_CBACK)(tBTM_BLE_MULTI_ADV_EVT evt, UINT8 inst_id,
+                void *p_ref, tBTM_STATUS status);
+
+typedef struct
+{
+    UINT8                       inst_id;
+    UINT8                       adv_evt;
+    BD_ADDR                     rpa;
+    TIMER_LIST_ENT              raddr_timer_ent;
+    tBTM_BLE_MULTI_ADV_CBACK    *p_cback;
+    void                        *p_ref;
+    UINT8                       index;
+}tBTM_BLE_MULTI_ADV_INST;
+
+typedef struct
+{
+    UINT8 inst_index_queue[BTM_BLE_MULTI_ADV_MAX];
+    int front;
+    int rear;
+}tBTM_BLE_MULTI_ADV_INST_IDX_Q;
+
+typedef struct
+{
+    tBTM_BLE_MULTI_ADV_INST *p_adv_inst; /* dynamic array to store adv instance */
+    tBTM_BLE_MULTI_ADV_OPQ  op_q;
+}tBTM_BLE_MULTI_ADV_CB;
+
+typedef void (tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value);
+typedef void (tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, UINT8 report_format,
+                                       UINT8 num_records, UINT16 total_len,
+                                       UINT8* p_rep_data, UINT8 status);
+typedef void (tBTM_BLE_SCAN_SETUP_CBACK)(UINT8 evt, tBTM_BLE_REF_VALUE ref_value, UINT8 status);
+
+#ifndef BTM_BLE_BATCH_SCAN_MAX
+#define BTM_BLE_BATCH_SCAN_MAX   5
+#endif
+
+#ifndef BTM_BLE_BATCH_REP_MAIN_Q_SIZE
+#define BTM_BLE_BATCH_REP_MAIN_Q_SIZE  2
+#endif
+
+typedef enum
+{
+    BTM_BLE_SCAN_INVALID_STATE=0,
+    BTM_BLE_SCAN_ENABLE_CALLED=1,
+    BTM_BLE_SCAN_ENABLED_STATE=2,
+    BTM_BLE_SCAN_DISABLE_CALLED=3,
+    BTM_BLE_SCAN_DISABLED_STATE=4
+}tBTM_BLE_BATCH_SCAN_STATE;
+
+enum
+{
+    BTM_BLE_DISCARD_OLD_ITEMS,
+    BTM_BLE_DISCARD_LOWER_RSSI_ITEMS
+};
+typedef UINT8 tBTM_BLE_DISCARD_RULE;
+
+typedef struct
+{
+    UINT8   sub_code[BTM_BLE_BATCH_SCAN_MAX];
+    tBTM_BLE_BATCH_SCAN_STATE cur_state[BTM_BLE_BATCH_SCAN_MAX];
+    tBTM_BLE_REF_VALUE        ref_value[BTM_BLE_BATCH_SCAN_MAX];
+    UINT8   pending_idx;
+    UINT8   next_idx;
+}tBTM_BLE_BATCH_SCAN_OPQ;
+
+typedef struct
+{
+    UINT8   rep_mode[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+    tBTM_BLE_REF_VALUE  ref_value[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+    UINT8   num_records[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+    UINT16  data_len[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+    UINT8   *p_data[BTM_BLE_BATCH_REP_MAIN_Q_SIZE];
+    UINT8   pending_idx;
+    UINT8   next_idx;
+}tBTM_BLE_BATCH_SCAN_REP_Q;
+
+typedef struct
+{
+    tBTM_BLE_BATCH_SCAN_STATE      cur_state;
+    tBTM_BLE_BATCH_SCAN_MODE scan_mode;
+    UINT32                  scan_interval;
+    UINT32                  scan_window;
+    tBLE_ADDR_TYPE          addr_type;
+    tBTM_BLE_DISCARD_RULE   discard_rule;
+    tBTM_BLE_BATCH_SCAN_OPQ  op_q;
+    tBTM_BLE_BATCH_SCAN_REP_Q main_rep_q;
+    tBTM_BLE_SCAN_SETUP_CBACK     *p_setup_cback;
+    tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback;
+    tBTM_BLE_SCAN_REP_CBACK       *p_scan_rep_cback;
+    tBTM_BLE_REF_VALUE             ref_value;
+}tBTM_BLE_BATCH_SCAN_CB;
+
+/* filter selection bit index  */
+#define BTM_BLE_PF_ADDR_FILTER          0
+#define BTM_BLE_PF_SRVC_DATA            1
+#define BTM_BLE_PF_SRVC_UUID            2
+#define BTM_BLE_PF_SRVC_SOL_UUID        3
+#define BTM_BLE_PF_LOCAL_NAME           4
+#define BTM_BLE_PF_MANU_DATA            5
+#define BTM_BLE_PF_SRVC_DATA_PATTERN    6
+#define BTM_BLE_PF_TYPE_ALL             7  /* when passed in payload filter type all, only clear action is applicable */
+#define BTM_BLE_PF_TYPE_MAX             8
+
+/* max number of filter spot for different filter type */
+#ifndef BTM_BLE_MAX_UUID_FILTER
+#define BTM_BLE_MAX_UUID_FILTER     8
+#endif
+#ifndef BTM_BLE_MAX_ADDR_FILTER
+#define BTM_BLE_MAX_ADDR_FILTER     8
+#endif
+#ifndef BTM_BLE_PF_STR_COND_MAX
+#define BTM_BLE_PF_STR_COND_MAX     4   /* apply to manu data , or local name */
+#endif
+#ifndef BTM_BLE_PF_STR_LEN_MAX
+#define BTM_BLE_PF_STR_LEN_MAX      29  /* match for first 29 bytes */
+#endif
+
+typedef UINT8   tBTM_BLE_PF_COND_TYPE;
+
+#define BTM_BLE_PF_LOGIC_OR              0
+#define BTM_BLE_PF_LOGIC_AND             1
+typedef UINT8 tBTM_BLE_PF_LOGIC_TYPE;
+
+#define BTM_BLE_PF_ENABLE       1
+#define BTM_BLE_PF_CONFIG       2
+typedef UINT8 tBTM_BLE_PF_ACTION;
+
+typedef UINT8 tBTM_BLE_PF_FILT_INDEX;
+
+typedef UINT8 tBTM_BLE_PF_AVBL_SPACE;
+
+#define BTM_BLE_PF_BRDCAST_ADDR_FILT  1
+#define BTM_BLE_PF_SERV_DATA_CHG_FILT 2
+#define BTM_BLE_PF_SERV_UUID          4
+#define BTM_BLE_PF_SERV_SOLC_UUID     8
+#define BTM_BLE_PF_LOC_NAME_CHECK    16
+#define BTM_BLE_PF_MANUF_NAME_CHECK  32
+#define BTM_BLE_PF_SERV_DATA_CHECK   64
+typedef UINT16 tBTM_BLE_PF_FEAT_SEL;
+
+#define BTM_BLE_PF_LIST_LOGIC_OR   1
+#define BTM_BLE_PF_LIST_LOGIC_AND  2
+typedef UINT16 tBTM_BLE_PF_LIST_LOGIC_TYPE;
+
+#define BTM_BLE_PF_FILT_LOGIC_OR   0
+#define BTM_BLE_PF_FILT_LOGIC_AND  1
+typedef UINT16 tBTM_BLE_PF_FILT_LOGIC_TYPE;
+
+typedef UINT8  tBTM_BLE_PF_RSSI_THRESHOLD;
+typedef UINT8  tBTM_BLE_PF_DELIVERY_MODE;
+typedef UINT16 tBTM_BLE_PF_TIMEOUT;
+typedef UINT8  tBTM_BLE_PF_TIMEOUT_CNT;
+
+typedef struct
+{
+    tBTM_BLE_PF_FEAT_SEL feat_seln;
+    tBTM_BLE_PF_LIST_LOGIC_TYPE logic_type;
+    tBTM_BLE_PF_FILT_LOGIC_TYPE filt_logic_type;
+    tBTM_BLE_PF_RSSI_THRESHOLD  rssi_high_thres;
+    tBTM_BLE_PF_RSSI_THRESHOLD  rssi_low_thres;
+    tBTM_BLE_PF_DELIVERY_MODE dely_mode;
+    tBTM_BLE_PF_TIMEOUT found_timeout;
+    tBTM_BLE_PF_TIMEOUT lost_timeout;
+    tBTM_BLE_PF_TIMEOUT_CNT found_timeout_cnt;
+}tBTM_BLE_PF_FILT_PARAMS;
+
+enum
+{
+    BTM_BLE_SCAN_COND_ADD,
+    BTM_BLE_SCAN_COND_DELETE,
+    BTM_BLE_SCAN_COND_CLEAR = 2
+};
+typedef UINT8 tBTM_BLE_SCAN_COND_OP;
+
+enum
+{
+    BTM_BLE_FILT_ENABLE_DISABLE = 1,
+    BTM_BLE_FILT_CFG            = 2,
+    BTM_BLE_FILT_ADV_PARAM      = 3
+};
+
+typedef UINT8 tBTM_BLE_FILT_CB_EVT;
+
+/* BLE adv payload filtering config complete callback */
+typedef void (tBTM_BLE_PF_CFG_CBACK)(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
+                                      tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
+                                      tBTM_BLE_REF_VALUE ref_value);
+
+typedef void (tBTM_BLE_PF_CMPL_CBACK) (tBTM_BLE_PF_CFG_CBACK);
+
+/* BLE adv payload filtering status setup complete callback */
+typedef void (tBTM_BLE_PF_STATUS_CBACK) (UINT8 action, tBTM_STATUS status,
+                                        tBTM_BLE_REF_VALUE ref_value);
+
+/* BLE adv payload filtering param setup complete callback */
+typedef void (tBTM_BLE_PF_PARAM_CBACK) (tBTM_BLE_PF_ACTION action_type,
+                                        tBTM_BLE_PF_AVBL_SPACE avbl_space,
+                                        tBTM_BLE_REF_VALUE ref_value, tBTM_STATUS status);
+
+typedef union
+{
+      UINT16              uuid16_mask;
+      UINT32              uuid32_mask;
+      UINT8               uuid128_mask[LEN_UUID_128];
+}tBTM_BLE_PF_COND_MASK;
+
+typedef struct
+{
+    tBLE_BD_ADDR            *p_target_addr;     /* target address, if NULL, generic UUID filter */
+    tBT_UUID                uuid;           /* UUID condition */
+    tBTM_BLE_PF_LOGIC_TYPE  cond_logic;    /* AND/OR */
+    tBTM_BLE_PF_COND_MASK   *p_uuid_mask;           /* UUID mask */
+}tBTM_BLE_PF_UUID_COND;
+
+typedef struct
+{
+    UINT8                   data_len;       /* <= 20 bytes */
+    UINT8                   *p_data;
+}tBTM_BLE_PF_LOCAL_NAME_COND;
+
+typedef struct
+{
+    UINT16                  company_id;     /* company ID */
+    UINT8                   data_len;       /* <= 20 bytes */
+    UINT8                   *p_pattern;
+    UINT16                  company_id_mask; /* UUID value mask */
+    UINT8                   *p_pattern_mask; /* Manufactuer data matching mask, same length as data pattern,
+                                                set to all 0xff, match exact data */
+}tBTM_BLE_PF_MANU_COND;
+
+typedef struct
+{
+    UINT16                  uuid;     /* service ID */
+    UINT8                   data_len;       /* <= 20 bytes */
+    UINT8                   *p_pattern;
+    UINT8                   *p_pattern_mask; /* Service data matching mask, same length as data pattern,
+                                                set to all 0xff, match exact data */
+}tBTM_BLE_PF_SRVC_PATTERN_COND;
+
+
+typedef union
+{
+    tBLE_BD_ADDR                            target_addr;
+    tBTM_BLE_PF_LOCAL_NAME_COND             local_name; /* lcoal name filtering */
+    tBTM_BLE_PF_MANU_COND                   manu_data;  /* manufactuer data filtering */
+    tBTM_BLE_PF_UUID_COND                   srvc_uuid;  /* service UUID filtering */
+    tBTM_BLE_PF_UUID_COND                   solicitate_uuid;   /* solicitated service UUID filtering */
+    tBTM_BLE_PF_SRVC_PATTERN_COND           srvc_data;      /* service data pattern */
+}tBTM_BLE_PF_COND_PARAM;
+
+typedef struct
+{
+    UINT8   action_ocf[BTM_BLE_PF_TYPE_MAX];
+    tBTM_BLE_REF_VALUE  ref_value[BTM_BLE_PF_TYPE_MAX];
+    tBTM_BLE_PF_PARAM_CBACK  *p_filt_param_cback[BTM_BLE_PF_TYPE_MAX];
+    tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback[BTM_BLE_PF_TYPE_MAX];
+    UINT8   cb_evt[BTM_BLE_PF_TYPE_MAX];
+    UINT8   pending_idx;
+    UINT8   next_idx;
+}tBTM_BLE_ADV_FILTER_ADV_OPQ;
+
+#define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
+
+#ifndef BTM_CS_IRK_LIST_MAX
+#define BTM_CS_IRK_LIST_MAX 0x20
+#endif
+
+typedef struct
+{
+    BOOLEAN    in_use;
+    BD_ADDR    bd_addr;
+    UINT8      pf_counter[BTM_BLE_PF_TYPE_MAX]; /* number of filter indexed by tBTM_BLE_PF_COND_TYPE */
+}tBTM_BLE_PF_COUNT;
+
+typedef struct
+{
+    BOOLEAN             enable;
+    UINT8               op_type;
+    tBTM_BLE_PF_COUNT   *p_addr_filter_count; /* per BDA filter array */
+    tBLE_BD_ADDR        cur_filter_target;
+    tBTM_BLE_PF_STATUS_CBACK *p_filt_stat_cback;
+    tBTM_BLE_ADV_FILTER_ADV_OPQ  op_q;
+}tBTM_BLE_ADV_FILTER_CB;
+
+/* Sub codes */
+#define BTM_BLE_META_PF_ENABLE          0x00
+#define BTM_BLE_META_PF_FEAT_SEL        0x01
+#define BTM_BLE_META_PF_ADDR            0x02
+#define BTM_BLE_META_PF_UUID            0x03
+#define BTM_BLE_META_PF_SOL_UUID        0x04
+#define BTM_BLE_META_PF_LOCAL_NAME      0x05
+#define BTM_BLE_META_PF_MANU_DATA       0x06
+#define BTM_BLE_META_PF_SRVC_DATA       0x07
+#define BTM_BLE_META_PF_ALL             0x08
+
 /* These are the fields returned in each device adv packet.  It
 ** is returned in the results callback if registered.
 */
@@ -303,7 +763,53 @@
 };
 typedef UINT8   tBTM_BLE_CONN_TYPE;
 
+typedef void (tBTM_BLE_TRACK_ADV_CBACK)(int filt_index, tBLE_ADDR_TYPE addr_type, BD_ADDR bda,
+                                        int adv_state, tBTM_BLE_REF_VALUE ref_value);
+
+typedef UINT8 tBTM_BLE_TRACK_ADV_EVT;
+
+typedef struct
+{
+    tBTM_BLE_REF_VALUE             ref_value;
+    tBTM_BLE_TRACK_ADV_CBACK *p_track_cback;
+}tBTM_BLE_ADV_TRACK_CB;
+
+enum
+{
+    BTM_BLE_TRACK_ADV_ADD,
+    BTM_BLE_TRACK_ADV_REMOVE
+};
+
+typedef UINT8 tBTM_BLE_TRACK_ADV_ACTION;
+
+#define BTM_BLE_MULTI_ADV_INVALID   0
+
+#define BTM_BLE_BATCH_SCAN_ENABLE_EVT     1
+#define BTM_BLE_BATCH_SCAN_CFG_STRG_EVT   2
+#define BTM_BLE_BATCH_SCAN_READ_REPTS_EVT 3
+#define BTM_BLE_BATCH_SCAN_THR_EVT        4
+#define BTM_BLE_BATCH_SCAN_PARAM_EVT      5
+#define BTM_BLE_BATCH_SCAN_DISABLE_EVT    6
+
+typedef UINT8 tBTM_BLE_BATCH_SCAN_EVT;
+
+typedef UINT32 tBTM_BLE_TX_TIME_MS;
+typedef UINT32 tBTM_BLE_RX_TIME_MS;
+typedef UINT32 tBTM_BLE_IDLE_TIME_MS;
+typedef UINT32 tBTM_BLE_ENERGY_USED;
+
+typedef void (tBTM_BLE_ENERGY_INFO_CBACK)(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_RX_TIME_MS rx_time,
+                                          tBTM_BLE_IDLE_TIME_MS idle_time,
+                                          tBTM_BLE_ENERGY_USED  energy_used,
+                                          tBTM_STATUS status);
+
+typedef struct
+{
+    tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback;
+}tBTM_BLE_ENERGY_INFO_CB;
+
 typedef BOOLEAN (tBTM_BLE_SEL_CBACK)(BD_ADDR random_bda,     UINT8 *p_remote_name);
+typedef void (tBTM_BLE_CTRL_FEATURES_CBACK)(tBTM_STATUS status);
 
 /* callback function for SMP signing algorithm, signed data in little endian order with tlen bits long */
 typedef void (tBTM_BLE_SIGN_CBACK)(void *p_ref_data, UINT8 *p_signing_data);
@@ -313,6 +819,8 @@
 
 typedef void (tBTM_BLE_SCAN_REQ_CBACK)(BD_ADDR remote_bda, tBLE_ADDR_TYPE addr_type, UINT8 adv_evt);
 
+tBTM_BLE_SCAN_SETUP_CBACK bta_ble_scan_setup_cb;
+
 /*****************************************************************************
 **  EXTERNAL FUNCTION DECLARATIONS
 *****************************************************************************/
@@ -401,6 +909,18 @@
 BTM_API extern void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
                             tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map);
 
+/*******************************************************************************
+**
+** Function         BTM_BleObtainVendorCapabilities
+**
+** Description      This function is called to obatin vendor capabilties
+**
+** Parameters       p_cmn_vsc_cb - Returns the vednor capabilities
+**
+** Returns          void
+**
+*******************************************************************************/
+extern void BTM_BleObtainVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb);
 
 /*******************************************************************************
 **
@@ -417,6 +937,105 @@
 *******************************************************************************/
 BTM_API extern void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window,
                                          tBTM_BLE_SCAN_MODE scan_type);
+/*******************************************************************************
+**
+** Function         BTM_BleGetVendorCapabilities
+**
+** Description      This function reads local LE features
+**
+** Parameters       p_cmn_vsc_cb : Locala LE capability structure
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb);
+/*******************************************************************************
+**
+** Function         BTM_BleSetStorageConfig
+**
+** Description      This function is called to setup storage configuration and setup callbacks.
+**
+** Parameters       UINT8 batch_scan_full_max -Batch scan full maximum
+                    UINT8 batch_scan_trunc_max - Batch scan truncated value maximum
+                    UINT8 batch_scan_notify_threshold - Threshold value
+                    tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback - Setup callback
+                    tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback -Threshold callback
+                    void *p_ref - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max,
+                                        UINT8 batch_scan_trunc_max,
+                                        UINT8 batch_scan_notify_threshold,
+                                        tBTM_BLE_SCAN_SETUP_CBACK *p_setup_cback,
+                                        tBTM_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
+                                        tBTM_BLE_SCAN_REP_CBACK* p_cback,
+                                        tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleEnableBatchScan
+**
+** Description      This function is called to enable batch scan
+**
+** Parameters       tBTM_BLE_BATCH_SCAN_MODE scan_mode - Batch scan mode
+                    UINT32 scan_interval -Scan interval
+                    UINT32 scan_window - Scan window value
+                    tBLE_ADDR_TYPE addr_type - Address type
+                    tBTM_BLE_DISCARD_RULE discard_rule - Data discard rules
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
+                                        UINT32 scan_interval, UINT32 scan_window,
+                                        tBTM_BLE_DISCARD_RULE discard_rule,
+                                        tBLE_ADDR_TYPE addr_type,
+                                        tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleDisableBatchScan
+**
+** Description      This function is called to disable batch scanning
+**
+** Parameters       void
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleReadScanReports
+**
+** Description      This function is called to read batch scan reports
+**
+** Parameters       tBTM_BLE_SCAN_MODE scan_mode - Scan mode report to be read out
+                    tBTM_BLE_SCAN_REP_CBACK* p_cback - Reports callback
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_SCAN_MODE scan_mode,
+                                                  tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleTrackAdvertiser
+**
+** Description      This function is called to read batch scan reports
+**
+** Parameters       p_track_cback - Tracking callback
+**                  ref_value - Reference value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleTrackAdvertiser(tBTM_BLE_TRACK_ADV_CBACK *p_track_cback,
+                                                  tBTM_BLE_REF_VALUE ref_value);
 
 /*******************************************************************************
 **
@@ -434,19 +1053,6 @@
 
 /*******************************************************************************
 **
-** Function         BTM_BleReset
-**
-** Description      This function is called to reset ULP controller.
-**
-** Parameters       None.
-**
-** Returns          void
-**
-*******************************************************************************/
-BTM_API extern void BTM_BleReset(void);
-
-/*******************************************************************************
-**
 ** Function         BTM_BleObserve
 **
 ** Description      This procedure keep the device listening for advertising
@@ -661,6 +1267,20 @@
 *******************************************************************************/
 BTM_API extern BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda);
 
+/*******************************************************************************
+**
+** Function         BTM_BleClearBgConnDev
+**
+** Description      This function is called to clear the whitelist,
+**                  end any pending whitelist connections,
+*                   and reset the local bg device list.
+**
+** Parameters       void
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleClearBgConnDev(void);
 
 /********************************************************
 **
@@ -698,6 +1318,19 @@
 *******************************************************************************/
 BTM_API extern  void BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window);
 
+/******************************************************************************
+**
+** Function         BTM_BleReadControllerFeatures
+**
+** Description      Reads BLE specific controller features
+**
+** Parameters:      tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK  *p_vsc_cback);
+
 /*******************************************************************************
 **
 ** Function         BTM_CheckAdvData
@@ -772,6 +1405,28 @@
 
 /*******************************************************************************
 **
+** Function         BTM_BleLocalPrivacyEnabled
+**
+** Description        Checks if local device supports private address
+**
+** Returns          Return TRUE if local privacy is enabled else FALSE
+**
+*******************************************************************************/
+BTM_API extern BOOLEAN BTM_BleLocalPrivacyEnabled();
+
+/*******************************************************************************
+**
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances  supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount();
+
+/*******************************************************************************
+**
 ** Function         BTM_BleSetConnMode
 **
 ** Description      This function is called to set BLE connectable mode for a
@@ -866,17 +1521,6 @@
 
 /*******************************************************************************
 **
-** Function         BTM_IsBleLink
-**
-** Description      This function is to check the link type is BLE or BR/EDR.
-**
-** Returns          TRUE if BLE link; FALSE if BR/EDR.
-**
-*******************************************************************************/
-BTM_API extern BOOLEAN BTM_IsBleLink (BD_ADDR bd_addr);
-
-/*******************************************************************************
-**
 ** Function         BTM_UseLeLink
 **
 ** Description      This function is to select the underneath physical link to use.
@@ -886,6 +1530,158 @@
 *******************************************************************************/
 BTM_API extern BOOLEAN BTM_UseLeLink (BD_ADDR bd_addr);
 
+/*******************************************************************************
+**
+** Function         BTM_BleStackEnable
+**
+** Description      Enable/Disable BLE functionality on stack regarless controller
+**                  capability.
+**
+** Parameters:      enable: TRUE to enable, FALSE to disable.
+**
+** Returns          TRUE if added OK, else FALSE
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleStackEnable (BOOLEAN enable);
+
+/*******************************************************************************/
+/*                          Multi ADV API                                      */
+/*******************************************************************************
+**
+** Function         BTM_BleEnableAdvInstance
+**
+** Description      This function enable a Multi-ADV instance with the specified
+**                  adv parameters
+**
+** Parameters       p_params: pointer to the adv parameter structure, set as default
+**                            adv parameter when the instance is enabled.
+**                  p_cback: callback function for the adv instance.
+**                  p_ref:  reference data attach to the adv instance to be enabled.
+**
+** Returns          status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
+                                      tBTM_BLE_MULTI_ADV_CBACK *p_cback,
+                                      void *p_ref);
+
+/*******************************************************************************
+**
+** Function         BTM_BleUpdateAdvInstParam
+**
+** Description      This function update a Multi-ADV instance with the specififed
+**                  adv parameters.
+**
+** Parameters       inst_id: adv instance ID
+**                  p_params: pointer to the adv parameter structure.
+**
+** Returns          status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params);
+
+/*******************************************************************************
+**
+** Function         BTM_BleCfgAdvInstData
+**
+** Description      This function configure a Multi-ADV instance with the specified
+**                  adv data or scan response data.
+**
+** Parameters       inst_id: adv instance ID
+**                  is_scan_rsp: is this scacn response, if no set as adv data.
+**                  data_mask: adv data mask.
+**                  p_data: pointer to the adv data structure.
+**
+** Returns          status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+                                    tBTM_BLE_AD_MASK data_mask,
+                                    tBTM_BLE_ADV_DATA *p_data);
+
+/*******************************************************************************
+**
+** Function         BTM_BleDisableAdvInstance
+**
+** Description      This function disable a Multi-ADV instance.
+**
+** Parameters       inst_id: adv instance ID
+**
+** Returns          status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id);
+
+/*******************************************************************************
+**
+** Function         BTM_BleAdvFilterParamSetup
+**
+** Description      This function is called to setup the adv data payload filter
+**                  condition.
+**
+** Parameters       p_target: enabble the filter condition on a target device; if NULL
+**                            enable the generic scan condition.
+**                  enable: enable or disable the filter condition
+**
+** Returns          void
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleAdvFilterParamSetup(int action,
+                                tBTM_BLE_PF_FILT_INDEX filt_index,
+                                tBTM_BLE_PF_FILT_PARAMS *p_filt_params,
+                                tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
+                                tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleCfgFilterCondition
+**
+** Description      This function is called to configure the adv data payload filter
+**                  condition.
+**
+** Parameters       action: to read/write/clear
+**                  cond_type: filter condition type.
+**                  p_cond: filter condition paramter
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
+                                      tBTM_BLE_PF_COND_TYPE cond_type,
+                                      tBTM_BLE_PF_FILT_INDEX filt_index,
+                                      tBTM_BLE_PF_COND_PARAM *p_cond,
+                                      tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
+                                      tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleEnableDisableFilterFeature
+**
+** Description      This function is called to enable or disable the APCF feature
+**
+** Parameters       enable - TRUE - enables the APCF, FALSE - disables the APCF
+**                       ref_value - Ref value
+**
+** Returns          tBTM_STATUS
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
+                                               tBTM_BLE_PF_STATUS_CBACK *p_stat_cback,
+                                               tBTM_BLE_REF_VALUE ref_value);
+
+/*******************************************************************************
+**
+** Function         BTM_BleGetEnergyInfo
+**
+** Description      This function obtains the energy info
+**
+** Parameters       p_ener_cback - Callback pointer
+**
+** Returns          status
+**
+*******************************************************************************/
+BTM_API extern tBTM_STATUS BTM_BleGetEnergyInfo(tBTM_BLE_ENERGY_INFO_CBACK *p_ener_cback);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/stack/include/btu.h b/stack/include/btu.h
index 4f0e162..5526536 100644
--- a/stack/include/btu.h
+++ b/stack/include/btu.h
@@ -153,10 +153,13 @@
 #define BTU_TTYPE_ATT_WAIT_FOR_APP_RSP              104
 #define BTU_TTYPE_ATT_WAIT_FOR_IND_ACK              105
 
-#define BTU_TTYPE_UCD_TO                            106
+#define BTU_TTYPE_BLE_GAP_FAST_ADV                  106
+#define BTU_TTYPE_BLE_OBSERVE                       107
 
-/* BTU timer event for TBFC */
-#define BTU_TTYPE_TBFC_RESUME                       107
+
+#define BTU_TTYPE_UCD_TO                            108
+
+
 
 /* Define the BTU_TASK APPL events
 */
@@ -228,6 +231,7 @@
 
     TIMER_LIST_Q  quick_timer_queue;        /* Timer queue for transport level (100/10 msec)*/
     TIMER_LIST_Q  timer_queue;              /* Timer queue for normal BTU task (1 second)   */
+    TIMER_LIST_Q  timer_queue_oneshot;      /* Timer queue for oneshot BTU tasks */
 
     TIMER_LIST_ENT   cmd_cmpl_timer;        /* Command complete timer */
 
@@ -266,13 +270,11 @@
 */
 BTU_API extern void btu_start_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout);
 BTU_API extern void btu_stop_timer (TIMER_LIST_ENT *p_tle);
-BTU_API extern void btu_register_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout, tBTU_TIMER_CALLBACK timer_cb);
-BTU_API extern void btu_deregister_timer(TIMER_LIST_ENT *p_tle);
+BTU_API extern void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout);
+BTU_API extern void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle);
+
 BTU_API extern UINT32 btu_remaining_time (TIMER_LIST_ENT *p_tle);
 
-
-BTU_API extern void btu_register_event_range (UINT16 range, tBTU_EVENT_CALLBACK event_cb);
-BTU_API extern void btu_deregister_event_range (UINT16 range);
 BTU_API extern void btu_uipc_rx_cback(BT_HDR *p_msg);
 
 BTU_API extern void btu_hcif_flush_cmd_queue(void);
diff --git a/stack/include/gap_api.h b/stack/include/gap_api.h
index a17510f..a210f69 100644
--- a/stack/include/gap_api.h
+++ b/stack/include/gap_api.h
@@ -440,10 +440,16 @@
 **
 ** Description      This function is called to initiate bonding with peer device
 **
+** Parameters:      bd_addr      - Address of the device to bond
+**                  pin_len      - length in bytes of the PIN Code
+**                  p_pin        - pointer to array with the PIN Code
+**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
+**
 ** Returns          tBTM_STATUS - BTM_CMD_STARTED of successfully initiated
 **
 *******************************************************************************/
-GAP_API extern UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]);
+GAP_API extern UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len,
+                               UINT8 *p_pin, UINT32 trusted_mask[]);
 
 /*******************************************************************************
 **
diff --git a/stack/include/gatt_api.h b/stack/include/gatt_api.h
index f3df8b7..392b4b2 100644
--- a/stack/include/gatt_api.h
+++ b/stack/include/gatt_api.h
@@ -25,44 +25,48 @@
 **  Constants
 *****************************************************************************/
 /* Success code and error codes */
-#define  GATT_SUCCESS                        0x0000
-#define  GATT_INVALID_HANDLE                 0x0001
-#define  GATT_READ_NOT_PERMIT                0x0002
-#define  GATT_WRITE_NOT_PERMIT               0x0003
-#define  GATT_INVALID_PDU                    0x0004
-#define  GATT_INSUF_AUTHENTICATION           0x0005
-#define  GATT_REQ_NOT_SUPPORTED              0x0006
-#define  GATT_INVALID_OFFSET                 0x0007
-#define  GATT_INSUF_AUTHORIZATION            0x0008
-#define  GATT_PREPARE_Q_FULL                 0x0009
-#define  GATT_NOT_FOUND                      0x000a
-#define  GATT_NOT_LONG                       0x000b
-#define  GATT_INSUF_KEY_SIZE                 0x000c
-#define  GATT_INVALID_ATTR_LEN               0x000d
-#define  GATT_ERR_UNLIKELY                   0x000e
-#define  GATT_INSUF_ENCRYPTION               0x000f
-#define  GATT_UNSUPPORT_GRP_TYPE             0x0010
-#define  GATT_INSUF_RESOURCE                 0x0011
+#define  GATT_SUCCESS                        0x00
+#define  GATT_INVALID_HANDLE                 0x01
+#define  GATT_READ_NOT_PERMIT                0x02
+#define  GATT_WRITE_NOT_PERMIT               0x03
+#define  GATT_INVALID_PDU                    0x04
+#define  GATT_INSUF_AUTHENTICATION           0x05
+#define  GATT_REQ_NOT_SUPPORTED              0x06
+#define  GATT_INVALID_OFFSET                 0x07
+#define  GATT_INSUF_AUTHORIZATION            0x08
+#define  GATT_PREPARE_Q_FULL                 0x09
+#define  GATT_NOT_FOUND                      0x0a
+#define  GATT_NOT_LONG                       0x0b
+#define  GATT_INSUF_KEY_SIZE                 0x0c
+#define  GATT_INVALID_ATTR_LEN               0x0d
+#define  GATT_ERR_UNLIKELY                   0x0e
+#define  GATT_INSUF_ENCRYPTION               0x0f
+#define  GATT_UNSUPPORT_GRP_TYPE             0x10
+#define  GATT_INSUF_RESOURCE                 0x11
 
 
-#define  GATT_ILLEGAL_PARAMETER              0x0087
-#define  GATT_NO_RESOURCES                   0x0080
-#define  GATT_INTERNAL_ERROR                 0x0081
-#define  GATT_WRONG_STATE                    0x0082
-#define  GATT_DB_FULL                        0x0083
-#define  GATT_BUSY                           0x0084
-#define  GATT_ERROR                          0x0085
-#define  GATT_CMD_STARTED                    0x0086
-#define  GATT_PENDING                        0x0088
-#define  GATT_AUTH_FAIL                      0x0089
-#define  GATT_MORE                           0x008a
-#define  GATT_INVALID_CFG                    0x008b
-#define  GATT_SERVICE_STARTED                0x008c
+#define  GATT_ILLEGAL_PARAMETER              0x87
+#define  GATT_NO_RESOURCES                   0x80
+#define  GATT_INTERNAL_ERROR                 0x81
+#define  GATT_WRONG_STATE                    0x82
+#define  GATT_DB_FULL                        0x83
+#define  GATT_BUSY                           0x84
+#define  GATT_ERROR                          0x85
+#define  GATT_CMD_STARTED                    0x86
+#define  GATT_PENDING                        0x88
+#define  GATT_AUTH_FAIL                      0x89
+#define  GATT_MORE                           0x8a
+#define  GATT_INVALID_CFG                    0x8b
+#define  GATT_SERVICE_STARTED                0x8c
 #define  GATT_ENCRYPED_MITM                  GATT_SUCCESS
-#define  GATT_ENCRYPED_NO_MITM               0x008d
-#define  GATT_NOT_ENCRYPTED                  0x008e
+#define  GATT_ENCRYPED_NO_MITM               0x8d
+#define  GATT_NOT_ENCRYPTED                  0x8e
+#define  GATT_CONGESTED                      0x8f
 
-
+                                             /* 0xE0 ~ 0xFC reserved for future use */
+#define  GATT_CCC_CFG_ERR                    0xFD /* Client Characteristic Configuration Descriptor Improperly Configured */
+#define  GATT_PRC_IN_PROGRESS                0xFE /* Procedure Already in progress */
+#define  GATT_OUT_OF_RANGE                   0xFF /* Attribute value out of range */
 typedef UINT8 tGATT_STATUS;
 
 
@@ -325,12 +329,9 @@
 } tGATTS_RSP;
 
 /* Transports for the primary service  */
-enum
-{
-    GATT_TRANSPORT_LE,
-    GATT_TRANSPORT_BR_EDR,
-    GATT_TRANSPORT_LE_BR_EDR
-};
+#define GATT_TRANSPORT_LE           BT_TRANSPORT_LE
+#define GATT_TRANSPORT_BR_EDR       BT_TRANSPORT_BR_EDR
+#define GATT_TRANSPORT_LE_BR_EDR    (BT_TRANSPORT_LE|BT_TRANSPORT_BR_EDR)
 typedef UINT8 tGATT_TRANSPORT;
 
 #define GATT_PREP_WRITE_CANCEL   0x00
@@ -548,26 +549,33 @@
 
 
 typedef UINT8 tGATT_IF;
-#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP    0 /* start a idle timer for this duration when no application
-                                              need to use the link */
+#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP    0 /* start a idle timer for this duration
+                                                 when no application need to use the link */
 
 #define GATT_LINK_NO_IDLE_TIMEOUT            0xFFFF
 
 #define GATT_INVALID_ACL_HANDLE              0xFFFF
 /* discover result callback function */
-typedef void (tGATT_DISC_RES_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES *p_data);
+typedef void (tGATT_DISC_RES_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type,
+                                    tGATT_DISC_RES *p_data);
 
 /* discover complete callback function */
 typedef void (tGATT_DISC_CMPL_CB) (UINT16 conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status);
 
 /* Define a callback function for when read/write/disc/config operation is completed. */
-typedef void (tGATT_CMPL_CBACK) (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
+typedef void (tGATT_CMPL_CBACK) (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status,
+                tGATT_CL_COMPLETE *p_data);
 
 /* Define a callback function when an initialized connection is established. */
-typedef void (tGATT_CONN_CBACK) (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+typedef void (tGATT_CONN_CBACK) (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+                                    tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
 
 /* attribute request callback for ATT server */
-typedef void  (tGATT_REQ_CBACK )(UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type, tGATTS_DATA *p_data);
+typedef void  (tGATT_REQ_CBACK )(UINT16 conn_id, UINT32 trans_id, tGATTS_REQ_TYPE type,
+                                tGATTS_DATA *p_data);
+
+/* channel congestion/uncongestion callback */
+typedef void (tGATT_CONGESTION_CBACK )(UINT16 conn_id, BOOLEAN congested);
 
 /* Define a callback function when encryption is established. */
 typedef void (tGATT_ENC_CMPL_CB)(tGATT_IF gatt_if, BD_ADDR bda);
@@ -585,6 +593,7 @@
     tGATT_DISC_CMPL_CB              *p_disc_cmpl_cb;
     tGATT_REQ_CBACK                 *p_req_cb;
     tGATT_ENC_CMPL_CB               *p_enc_cmpl_cb;
+    tGATT_CONGESTION_CBACK          *p_congestion_cb;
 } tGATT_CBACK;
 
 /***********************  Start Handle Management Definitions   **********************
@@ -639,7 +648,8 @@
 /* Attibute server handle ranges NV storage callback functions
 */
 typedef void  (tGATTS_NV_SAVE_CBACK)(BOOLEAN is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
-typedef BOOLEAN  (tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp);
+typedef BOOLEAN  (tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
+                                            tGATTS_SRV_CHG_RSP *p_rsp);
 
 typedef struct
 {
@@ -801,7 +811,8 @@
 ** Returns          TRUE if operation succeed, FALSE if handle block was not found.
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid, UINT16 svc_inst);
+    GATT_API extern BOOLEAN GATTS_DeleteService (tGATT_IF gatt_if, tBT_UUID *p_svc_uuid,
+                                                      UINT16 svc_inst);
 
 /*******************************************************************************
 **
@@ -998,11 +1009,13 @@
 **
 ** Parameter        bd_addr:   target device bd address.
 **                  idle_tout: timeout value in seconds.
+**                  transport: trasnport option.
 **
 ** Returns          void
 **
 *******************************************************************************/
-    GATT_API extern void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout);
+    GATT_API extern void GATT_SetIdleTimeout (BD_ADDR bd_addr, UINT16 idle_tout,
+                                            tGATT_TRANSPORT transport);
 
 
 /*******************************************************************************
@@ -1058,11 +1071,13 @@
 ** Parameters       gatt_if: applicaiton interface
 **                  bd_addr: peer device address.
 **                  is_direct: is a direct conenection or a background auto connection
+**                  transport : Physical transport for GATT connection (BR/EDR or LE)
 **
 ** Returns          TRUE if connection started; FALSE if connection start failure.
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct);
+    GATT_API extern BOOLEAN GATT_Connect (tGATT_IF gatt_if, BD_ADDR bd_addr,
+                                          BOOLEAN is_direct, tBT_TRANSPORT transport);
 
 
 /*******************************************************************************
@@ -1080,7 +1095,8 @@
 ** Returns          TRUE if connection started; FALSE if connection start failure.
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr, BOOLEAN is_direct);
+    GATT_API extern BOOLEAN GATT_CancelConnect (tGATT_IF gatt_if, BD_ADDR bd_addr,
+                                                BOOLEAN is_direct);
 
 /*******************************************************************************
 **
@@ -1108,11 +1124,13 @@
 ** Parameters        conn_id: connection id  (input)
 **                   p_gatt_if: applicaiton interface (output)
 **                   bd_addr: peer device address. (output)
+**                   transport :  physical transport of the GATT connection (BR/EDR or LE)
 **
 ** Returns          TRUE the ligical link information is found for conn_id
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if, BD_ADDR bd_addr);
+    GATT_API extern BOOLEAN GATT_GetConnectionInfor(UINT16 conn_id, tGATT_IF *p_gatt_if,
+                                        BD_ADDR bd_addr, tBT_TRANSPORT *p_transport);
 
 
 /*******************************************************************************
@@ -1125,11 +1143,13 @@
 ** Parameters        gatt_if: applicaiton interface (input)
 **                   bd_addr: peer device address. (input)
 **                   p_conn_id: connection id  (output)
+**                   transport :  physical transport of the GATT connection (BR/EDR or LE)
 **
 ** Returns          TRUE the ligical link is connected
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, UINT16 *p_conn_id);
+    GATT_API extern BOOLEAN GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr,
+                                                      UINT16 *p_conn_id, tBT_TRANSPORT transport);
 
 
 /*******************************************************************************
diff --git a/stack/include/hcidefs.h b/stack/include/hcidefs.h
index ad31d52..0349d6a 100644
--- a/stack/include/hcidefs.h
+++ b/stack/include/hcidefs.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 1999-2012 Broadcom Corporation
+ *  Copyright (C) 1999-2014 Broadcom Corporation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -231,11 +231,11 @@
 #define HCI_SET_MWS_PATTERN_CONFIGURATION       (0x0073 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
 
 /* ConnectionLess Broadcast */
-#define HCI_SET_RESERVED_LT_ADDR                (0x0077 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_DELETE_RESERVED_LT_ADDR             (0x0078 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_WRITE_CLB_DATA                      (0x0079 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_WRITE_SYNC_TRAIN_PARAM              (0x007A | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
-#define HCI_READ_SYNC_TRAIN_PARAM               (0x007B | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_SET_RESERVED_LT_ADDR                (0x0074 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_DELETE_RESERVED_LT_ADDR             (0x0075 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_WRITE_CLB_DATA                      (0x0076 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_READ_SYNC_TRAIN_PARAM               (0x0077 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
+#define HCI_WRITE_SYNC_TRAIN_PARAM              (0x0078 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
 
 #define HCI_CONT_BASEBAND_CMDS_FIRST    HCI_SET_EVENT_MASK
 #define HCI_CONT_BASEBAND_CMDS_LAST     HCI_READ_SYNC_TRAIN_PARAM
@@ -323,12 +323,56 @@
 #define HCI_BLE_LTK_REQ_REPLY           (0x001A | HCI_GRP_BLE_CMDS)
 #define HCI_BLE_LTK_REQ_NEG_REPLY       (0x001B | HCI_GRP_BLE_CMDS)
 #define HCI_BLE_READ_SUPPORTED_STATES   (0x001C | HCI_GRP_BLE_CMDS)
+                            /*0x001D, 0x001E and 0x001F are reserved*/
+
+#define HCI_BLE_RC_PARAM_REQ_REPLY      (0x0020 | HCI_GRP_BLE_CMDS)
+#define HCI_BLE_RC_PARAM_REQ_NEG_REPLY  (0x0021 | HCI_GRP_BLE_CMDS)
+
+
 /* BLE TEST COMMANDS */
 #define HCI_BLE_RECEIVER_TEST           (0x001D | HCI_GRP_BLE_CMDS)
 #define HCI_BLE_TRANSMITTER_TEST        (0x001E | HCI_GRP_BLE_CMDS)
 #define HCI_BLE_TEST_END                (0x001F | HCI_GRP_BLE_CMDS)
 
-#define HCI_BLE_RESET                   (0x0020 | HCI_GRP_BLE_CMDS)
+/* LE Get Vendor Capabilities Command OCF */
+#define HCI_BLE_VENDOR_CAP_OCF    (0x0153 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Multi adv OCF */
+#define HCI_BLE_MULTI_ADV_OCF     (0x0154 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Batch scan OCF */
+#define HCI_BLE_BATCH_SCAN_OCF    (0x0156 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* ADV filter OCF */
+#define HCI_BLE_ADV_FILTER_OCF    (0x0157 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Tracking OCF */
+#define HCI_BLE_TRACK_ADV_OCF     (0x0158 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Energy info OCF */
+#define HCI_BLE_ENERGY_INFO_OCF   (0x0159 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* subcode for multi adv feature */
+#define BTM_BLE_MULTI_ADV_SET_PARAM                     0x01
+#define BTM_BLE_MULTI_ADV_WRITE_ADV_DATA                0x02
+#define BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA           0x03
+#define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR               0x04
+#define BTM_BLE_MULTI_ADV_ENB                           0x05
+
+/* multi adv VSE subcode */
+#define HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG       0x55 /* multi adv instance state change */
+
+/* subcode for batch scan feature */
+#define BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE      0x01
+#define BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM           0x02
+#define BTM_BLE_BATCH_SCAN_SET_PARAMS                  0x03
+#define BTM_BLE_BATCH_SCAN_READ_RESULTS                0x04
+
+/* batch scan VSE subcode */
+#define HCI_VSE_SUBCODE_BLE_THRESHOLD_SUB_EVT      0x54 /* Threshold event */
+
+/* tracking sub event */
+#define HCI_VSE_SUBCODE_BLE_TRACKING_SUB_EVT       0x56 /* Tracking event */
 
 /* LE supported states definition */
 #define HCI_LE_ADV_STATE          0x00000001
@@ -344,6 +388,214 @@
 #define HCI_LE_SCAN_SL_STATE      0x00000400
 #define HCI_LE_INIT_MA_STATE      0x00000800
 
+/* LE Supported States */
+/* Non Connectable Adv state is supported. 0x0000000000000001 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK          0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF           0
+#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)
+
+/*Scanneable Connectable Adv state  is supported. 0x0000000000000002 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASK          0x02
+#define HCI_SUPP_LE_STATESSCAN_ADV_OFF           0
+#define HCI_LE_STATES_SCAN_ADV_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATESSCAN_ADV_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_MASK)
+
+/* Connectable Adv state is supported. 0x0000000000000004 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASK          0x04
+#define HCI_SUPP_LE_STATES_CONN_ADV_OFF           0
+#define HCI_LE_STATES_CONN_ADV_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_MASK)
+
+/* Hi duty Cycle Directed Adv state is supported. 0x0000000000000008 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK          0x08
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF           0
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK)
+
+/* Passive Scan state is supported. 0x0000000000000010 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASK          0x10
+#define HCI_SUPP_LE_STATES_PASS_SCAN_OFF           0
+#define HCI_LE_STATES_PASS_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_MASK)
+
+/* Active Scan state is supported. 0x0000000000000020 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK          0x20
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF           0
+#define HCI_LE_STATES_ACTIVE_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK)
+
+/* Initiating state is supported. 0x0000000000000040 (or connection state in master role is also supported) */
+#define HCI_SUPP_LE_STATES_INIT_MASK          0x40
+#define HCI_SUPP_LE_STATES_INIT_OFF           0
+#define HCI_LE_STATES_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_INIT_OFF] & HCI_SUPP_LE_STATES_INIT_MASK)
+
+/*connection state in slave  role is also supported. 0x0000000000000080 */
+#define HCI_SUPP_LE_STATES_SLAVE_MASK          0x80
+#define HCI_SUPP_LE_STATES_SLAVE_OFF           0
+#define HCI_LE_STATES_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SLAVE_OFF] & HCI_SUPP_LE_STATES_SLAVE_MASK)
+
+/* Non Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000000100 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK          0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF           1
+#define HCI_LE_STATES_NON_CONN_ADV_PASS_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK)
+
+/*Scannable Adv state and Passive Scanning State combination is supported. 0x0000000000000200 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK          0x02
+#define HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF           1
+#define HCI_LE_STATES_SCAN_ADV_PASS_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK)
+
+/*Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000000400 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK          0x04
+#define HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF           1
+#define HCI_LE_STATES_CONN_ADV_PASS_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK)
+
+/*High Duty Cycl Directed ADv and Passive Scanning State combination is supported. 0x0000000000000800 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK          0x08
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF           1
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF)
+
+/*Non Connectable Adv state and Passive Scanning State combination is supported. 0x0000000000001000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK          0x10
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF           1
+#define HCI_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK)
+
+/*Scannable Adv state and Active Scanning State combination is supported. 0x0000000000002000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK          0x20
+#define HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF           1
+#define HCI_LE_STATES_SCAN_ADV_ACTIVE_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK)
+
+/*Connectable Adv state and Active Scanning State combination is supported. 0x0000000000004000 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK          0x40
+#define HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF           1
+#define HCI_LE_STATES_CONN_ADV_ACTIVE_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK)
+
+/*High Duty Cycl Directed ADv and ACtive Scanning State combination is supported. 0x0000000000008000 */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK          0x80
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF           1
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF)
+
+/*Non-Connectable Adv state and Initiating State combination is supported. 0x0000000000010000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK          0x01
+#define HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF           2
+#define HCI_LE_STATES_NON_CONN_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF] & HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK)
+
+/* Scannable Adv state and Initiating State combination is supported. 0x0000000000020000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK          0x02
+#define HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF           2
+#define HCI_LE_STATES_SCAN_ADV_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK)
+
+/* Non-Connectable Adv state and Master Role combination is supported. 0x0000000000040000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK          0x04
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF           2
+#define HCI_LE_STATES_NON_CONN_ADV_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK)
+
+/*Scannable Adv state and Master Role combination is supported. 0x0000000000040000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK          0x08
+#define HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF           2
+#define HCI_LE_STATES_SCAN_ADV_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK)
+
+/* Non-Connectable Adv and Slave Role combination is supported. 0x000000000100000 */
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK          0x10
+#define HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF           2
+#define HCI_LE_STATES_NON_CONN_ADV_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK)
+
+/*Scannable Adv and Slave Role combination is supported. 0x000000000200000 */
+#define HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK          0x20
+#define HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF           2
+#define HCI_LE_STATES_SCAN_ADV_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK)
+
+/*Passive Scan and Initiating State combination is supported. 0x000000000400000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK          0x40
+#define HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF           2
+#define HCI_LE_STATES_PASS_SCAN_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK)
+
+/*Active Scan and Initiating State combination is supported. 0x000000000800000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK          0x80
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF           2
+#define HCI_LE_STATES_ACTIVE_SCAN_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK)
+
+/*Passive Scan and Master Role combination is supported. 0x000000001000000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK          0x01
+#define HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF           3
+#define HCI_LE_STATES_PASS_SCAN_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK)
+
+/*Active Scan and Master Role combination is supported. 0x000000002000000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK          0x02
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF           3
+#define HCI_LE_STATES_ACTIVE_SCAN_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK)
+
+/*Passive Scan and Slave Role combination is supported. 0x000000004000000 */
+#define HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK          0x04
+#define HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF           3
+#define HCI_LE_STATES_PASS_SCAN_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF] & HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK)
+
+/*Active Scan and Slave Role combination is supported. 0x000000008000000 */
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK          0x08
+#define HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF           3
+#define HCI_LE_STATES_ACTIVE_SCAN_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF] & HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK)
+
+/*Link Layer Topology Added States Combo */
+/*Initiating State and Master Role combination supported.
+  Master Role and Master Role combination is also supported. 0x0000000010000000 */
+#define HCI_SUPP_LE_STATES_INIT_MASTER_MASK          0x10
+#define HCI_SUPP_LE_STATES_INIT_MASTER_OFF           3
+#define HCI_LE_STATES_INIT_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_INIT_MASTER_OFF] & HCI_SUPP_LE_STATES_INIT_MASTER_MASK)
+
+/* Connectable Advertising State and Initiating State combination supported. 0x0000000100000000 */
+#define HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK          0x01
+#define HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF           4
+#define HCI_LE_STATES_CONN_ADV_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK)
+
+/* High Duty Cycle Directed Advertising State and Initiating State combination supported. */
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK          0x02
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF           4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK)
+
+/* Low Duty Cycle Directed Advertising State and Initiating State combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK          0x04
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF           4
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_INIT_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK)
+
+/* Connectable Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK          0x08
+#define HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF           4
+#define HCI_LE_STATES_CONN_ADV_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK)
+
+/* High Duty Cycle Directed Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK          0x10
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF           4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK)
+
+/* Low Duty Cycle Directed Advertising State and Master Role combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK          0x20
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF           4
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_MASTER_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK)
+
+/* Connectable Advertising State and Slave Role combination supported. */
+#define HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK          0x40
+#define HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF           4
+#define HCI_LE_STATES_CONN_ADV_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK)
+
+/* High Duty Cycle Directed Advertising State and slave Role combination supported.*/
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK          0x80
+#define HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF           4
+#define HCI_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK)
+
+/* Low Duty Cycle Directed Advertising State and slave Role combination supported.*/
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK          0x01
+#define HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF           5
+#define HCI_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF] & HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK)
+
+/* Initiating State and Slave Role combination supported.
+   Master Role and Slave Role combination also supported.
+ */
+#define HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK          0x02
+#define HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF           5
+#define HCI_LE_STATES_INIT_MASTER_SLAVE_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF] & HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK)
+
+#define HCI_BRCM_ENABLE_WBS_MODIFIED        (0x0102 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* ConnectionLess Broadcast Stream VSC */
+#define HCI_BRCM_SET_CLB_STREAM             (0x0111 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_RECEIVE_CLB_STREAM         (0x0112 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_WRITE_CLB_STREAM_DATA      (0x0113 | HCI_GRP_VENDOR_SPECIFIC)
+#define HCI_BRCM_CLB_STREAM_FLUSH           (0x0114 | HCI_GRP_VENDOR_SPECIFIC)
+
 /*
 **  Definitions for HCI Events
 */
@@ -411,6 +663,7 @@
 #define HCI_NUM_COMPL_DATA_BLOCKS_EVT       0x48
 #define HCI_SHORT_RANGE_MODE_COMPLETE_EVT   0x4C
 #define HCI_AMP_STATUS_CHANGE_EVT           0x4D
+#define HCI_SET_TRIGGERED_CLOCK_CAPTURE_EVT 0x4E
 
 /* ULP HCI Event */
 #define HCI_BLE_EVENT                   0x03E
@@ -420,16 +673,11 @@
 #define HCI_BLE_LL_CONN_PARAM_UPD_EVT       0x03
 #define HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT   0x04
 #define HCI_BLE_LTK_REQ_EVT                 0x05
+#define HCI_BLE_RC_PARAM_REQ_EVT            0x06
 
-/* ConnectionLess Broadcast events */
-#define HCI_SYNC_TRAIN_COMP_EVT             0x4F
-#define HCI_SYNC_TRAIN_RECEIVED_EVT         0x50
-#define HCI_CLB_RX_DATA_EVT                 0x51
-#define HCI_CLB_RX_TIMEOUT_EVT              0x52
-#define HCI_TRUNCATED_PAGE_COMP_EVT         0x53
-#define HCI_SLAVE_PAGE_RESP_TIMEOUT_EVT     0x54
-#define HCI_CLB_CHANNEL_CHANGE_EVT          0x55
-#define HCI_INQUIRY_RESPONSE_NOTIF          0x56
+/* Definitions for LE Channel Map */
+#define HCI_BLE_CHNL_MAP_SIZE               5
+
 
 #define HCI_EVENT_RSP_FIRST                 HCI_INQUIRY_COMP_EVT
 #define HCI_EVENT_RSP_LAST                  HCI_CLB_CHANNEL_CHANGE_EVT
@@ -439,6 +687,9 @@
                                                  because conflict w/ TCI_EVT and per
                                                  specification compliant */
 
+/* the event mask for BLE event mask */
+#define HCI_BLE_EVENT_MASK_DEF               "\x00\x00\x00\x00\x00\x00\x00\x3f"
+
 
 
 /*
@@ -1583,6 +1834,10 @@
 #define HCI_EXT_FEATURE_SIMUL_DUMO_HOST_OFF  0
 #define HCI_SIMUL_DUMO_HOST_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SIMUL_DUMO_HOST_OFF] & HCI_EXT_FEATURE_SIMUL_DUMO_HOST_MASK)
 
+#define HCI_EXT_FEATURE_SC_HOST_MASK 0x08
+#define HCI_EXT_FEATURE_SC_HOST_OFF  0
+#define HCI_SC_HOST_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SC_HOST_OFF] & HCI_EXT_FEATURE_SC_HOST_MASK)
+
 /*
 **   LMP features encoding - page 2
 */
@@ -1606,19 +1861,43 @@
 #define HCI_EXT_FEATURE_INQ_RESP_NOTIF_OFF      0
 #define HCI_INQ_RESP_NOTIF_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_INQ_RESP_NOTIF_OFF] & HCI_EXT_FEATURE_INQ_RESP_NOTIF_MASK)
 
+#define HCI_EXT_FEATURE_SC_CTRLR_MASK           0x01
+#define HCI_EXT_FEATURE_SC_CTRLR_OFF            1
+#define HCI_SC_CTRLR_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_SC_CTRLR_OFF] & HCI_EXT_FEATURE_SC_CTRLR_MASK)
+
+#define HCI_EXT_FEATURE_PING_MASK               0x02
+#define HCI_EXT_FEATURE_PING_OFF                1
+#define HCI_PING_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_PING_OFF] & HCI_EXT_FEATURE_PING_MASK)
+
 /*
 **   LE features encoding - page 0 (the only page for now)
 */
+/* LE Encryption */
 #define HCI_LE_FEATURE_LE_ENCRYPTION_MASK       0x01
 #define HCI_LE_FEATURE_LE_ENCRYPTION_OFF        0
 #define HCI_LE_ENCRYPTION_SUPPORTED(x) ((x)[HCI_LE_FEATURE_LE_ENCRYPTION_OFF] & HCI_LE_FEATURE_LE_ENCRYPTION_MASK)
 
+/* Connection Parameters Request Procedure */
+#define HCI_LE_FEATURE_CONN_PARAM_REQ_MASK       0x02
+#define HCI_LE_FEATURE_CONN_PARAM_REQ_OFF        0
+#define HCI_LE_CONN_PARAM_REQ_SUPPORTED(x) ((x)[HCI_LE_FEATURE_CONN_PARAM_REQ_OFF] & HCI_LE_FEATURE_CONN_PARAM_REQ_MASK)
+
+/* Extended Reject Indication */
+#define HCI_LE_FEATURE_EXT_REJ_IND_MASK       0x04
+#define HCI_LE_FEATURE_EXT_REJ_IND_OFF        0
+#define HCI_LE_EXT_REJ_IND_SUPPORTED(x) ((x)[HCI_LE_FEATURE_EXT_REJ_IND_OFF] & HCI_LE_FEATURE_EXT_REJ_IND_MASK)
+
+/* Slave-initiated Features Exchange */
+#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK       0x08
+#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF        0
+#define HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(x) ((x)[HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF] & HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK)
 
 /*
 **   Local Supported Commands encoding
 */
 #define HCI_NUM_SUPP_COMMANDS_BYTES           64
 
+/* Supported Commands Byte 0 */
 #define HCI_SUPP_COMMANDS_INQUIRY_MASK 0x01
 #define HCI_SUPP_COMMANDS_INQUIRY_OFF  0
 #define HCI_INQUIRY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_INQUIRY_OFF] & HCI_SUPP_COMMANDS_INQUIRY_MASK)
@@ -2398,8 +2677,42 @@
 #define HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM_OFF         32
 #define HCI_WRITE_SYNC_TRAIN_PARAM_SUPPORTED(x)   ((x)[HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM_OFF] & HCI_SUPP_COMMANDS_WRITE_SYNC_TRAIN_PARAM)
 
+#define HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_MASK   0x02
+#define HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_OFF    32
+#define HCI_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_OFF] & HCI_SUPP_COMMANDS_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY_MASK)
 
+#define HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_MASK    0x04
+#define HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_OFF     32
+#define HCI_READ_SECURE_CONNS_SUPPORT_SUPPORTED(x)   ((x)[HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_OFF] & HCI_SUPP_COMMANDS_READ_SECURE_CONNS_SUPPORT_MASK)
 
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_MASK   0x08
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_OFF    32
+#define HCI_WRITE_SECURE_CONNS_SUPPORT_SUPPORTED(x)  ((x)[HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_OFF] & HCI_SUPP_COMMANDS_WRITE_SECURE_CONNS_SUPPORT_MASK)
+
+#define HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_MASK    0x10
+#define HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_OFF     32
+#define HCI_READ_AUTHENT_PAYLOAD_TOUT_SUPPORTED(x)   ((x)[HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_OFF] & HCI_SUPP_COMMANDS_READ_AUTHENT_PAYLOAD_TOUT_MASK)
+
+#define HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_MASK   0x20
+#define HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_OFF    32
+#define HCI_WRITE_AUTHENT_PAYLOAD_TOUT_SUPPORTED(x)  ((x)[HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_OFF] & HCI_SUPP_COMMANDS_WRITE_AUTHENT_PAYLOAD_TOUT_MASK)
+
+#define HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_MASK 0x40
+#define HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_OFF  32
+#define HCI_READ_LOCAL_OOB_EXTENDED_DATA_SUPPORTED(x)   ((x)[HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_OFF] & HCI_SUPP_COMMANDS_READ_LOCAL_OOB_EXTENDED_DATA_MASK)
+
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_MASK   0x80
+#define HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_OFF    32
+#define HCI_WRITE_SECURE_CONNECTIONS_TEST_MODE_SUPPORTED(x) ((x)[HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_OFF] & HCI_SUPP_COMMANDS_WRITE_SECURE_CONNECTIONS_TEST_MODE_MASK)
+
+/* supported LE remote control connection parameter request reply */
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_MASK          0x10
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_OFF           33
+#define HCI_LE_RC_CONN_PARAM_UPD_RPY_SUPPORTED(x)      ((x)[HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_OFF] & HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_RPY_MASK)
+
+#define HCI_SUPP_COMMANDS_RLE_RC_CONN_PARAM_UPD_NEG_RPY_MASK          0x20
+#define HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_NEG_RPY_OFF           33
+#define HCI_LE_RC_CONN_PARAM_UPD_NEG_RPY_SUPPORTED(x)      ((x)[HCI_SUPP_COMMANDS_LE_RC_CONN_PARAM_UPD_NEG_RPY_OFF] & HCI_SUPP_COMMANDS_RLE_RC_CONN_PARAM_UPD_NEG_RPY_MASK)
 
 /*
 Commands of HCI_GRP_VENDOR_SPECIFIC group for WIDCOMM SW LM Simulator
diff --git a/stack/include/hcimsgs.h b/stack/include/hcimsgs.h
index cb85cb1..3201f75 100644
--- a/stack/include/hcimsgs.h
+++ b/stack/include/hcimsgs.h
@@ -1252,8 +1252,6 @@
 #define HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA      31
 
 /* ULP HCI command */
-HCI_API extern BOOLEAN btsnd_hcic_ble_reset(void);
-
 HCI_API extern BOOLEAN btsnd_hcic_ble_set_evt_mask (BT_EVENT_MASK event_mask);
 
 HCI_API extern BOOLEAN btsnd_hcic_ble_read_buffer_size (void);
@@ -1267,7 +1265,7 @@
 HCI_API extern BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
                                        UINT8 adv_type, UINT8 addr_type_own,
                                        UINT8 addr_type_dir, BD_ADDR direct_bda,
-                                       UINT8 channel_map, UINT8 adv_filter_policy);
+                                       UINT8 channel_map, UINT8 scan_filter_policy);
 
 HCI_API extern BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void);
 
@@ -1331,6 +1329,20 @@
                                                            UINT8 payload);
 HCI_API extern BOOLEAN btsnd_hcic_ble_test_end(void);
 
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+
+#define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY           14
+HCI_API extern BOOLEAN btsnd_hcic_ble_rc_param_req_reply(UINT16 handle,
+                                                        UINT16 conn_int_min, UINT16 conn_int_max,
+                                                        UINT16 conn_latency, UINT16 conn_timeout,
+                                                        UINT16 min_ce_len, UINT16 max_ce_len);
+
+#define HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY       3
+HCI_API extern BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason);
+
+#endif /* BLE_LLT_INCLUDED */
+
+
 #endif /* BLE_INCLUDED */
 
 #ifdef __cplusplus
diff --git a/stack/include/l2c_api.h b/stack/include/l2c_api.h
index 7679d26..c85d76b 100644
--- a/stack/include/l2c_api.h
+++ b/stack/include/l2c_api.h
@@ -647,7 +647,7 @@
 ** Returns          TRUE if valid Channel, else FALSE
 **
 *******************************************************************************/
-L2C_API extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, BOOLEAN rr_or_rej,
+L2C_API extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, UINT8 sup_type,
                                             UINT8 back_track);
 
 /*******************************************************************************
@@ -919,8 +919,9 @@
 **      BD Address of remote
 **      TRUE if channel is connected, FALSE if disconnected
 **      Reason for connection failure
+**      transport : physical transport, BR/EDR or LE
 */
-typedef void (tL2CA_FIXED_CHNL_CB) (BD_ADDR, BOOLEAN, UINT16);
+typedef void (tL2CA_FIXED_CHNL_CB) (BD_ADDR, BOOLEAN, UINT16, tBT_TRANSPORT);
 
 /* Signalling data received. Parameters are
 **      BD Address of remote
@@ -928,12 +929,21 @@
 */
 typedef void (tL2CA_FIXED_DATA_CB) (BD_ADDR, BT_HDR *);
 
+/* Congestion status callback protype. This callback is optional. If
+** an application tries to send data when the transmit queue is full,
+** the data will anyways be dropped. The parameter is:
+**      remote BD_ADDR
+**      TRUE if congested, FALSE if uncongested
+*/
+typedef void (tL2CA_FIXED_CONGESTION_STATUS_CB) (BD_ADDR, BOOLEAN);
+
 /* Fixed channel registration info (the callback addresses and channel config)
 */
 typedef struct
 {
     tL2CA_FIXED_CHNL_CB    *pL2CA_FixedConn_Cb;
     tL2CA_FIXED_DATA_CB    *pL2CA_FixedData_Cb;
+    tL2CA_FIXED_CONGESTION_STATUS_CB *pL2CA_FixedCong_Cb;
     tL2CAP_FCR_OPTS         fixed_chnl_opts;
 
     UINT16                  default_idle_tout;
@@ -1128,7 +1138,8 @@
 **  Return value:   TRUE if update started
 **
 *******************************************************************************/
-L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout);
+L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int,
+                                                          UINT16 max_int, UINT16 latency, UINT16 timeout);
 
 /*******************************************************************************
 **
@@ -1146,18 +1157,6 @@
 
 /*******************************************************************************
 **
-** Function         L2CA_HandleConnUpdateEvent
-**
-** Description      This function enables the connection update request from remote
-**                  after a successful connection update response is received.
-**
-** Returns          void
-**
-*******************************************************************************/
-L2C_API void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status);
-
-/*******************************************************************************
-**
 ** Function         L2CA_GetBleConnRole
 **
 ** Description      This function returns the connection role.
@@ -1173,10 +1172,13 @@
 **
 ** Description      This function returns the disconnect reason code.
 **
+**  Parameters:     BD Address of remote
+**                         Physical transport for the L2CAP connection (BR/EDR or LE)
+**
 ** Returns          disconnect reason
 **
 *******************************************************************************/
-L2C_API extern UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda);
+L2C_API extern UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport);
 
 #endif /* (BLE_INCLUDED == TRUE) */
 
diff --git a/stack/include/smp_api.h b/stack/include/smp_api.h
index 68c9ebf..e47cce3 100644
--- a/stack/include/smp_api.h
+++ b/stack/include/smp_api.h
@@ -134,9 +134,9 @@
 
 typedef struct
 {
-    UINT8       reason;
-    UINT8       sec_level;
-    BOOLEAN     is_pair_cancel;
+    tSMP_STATUS     reason;
+    tSMP_SEC_LEVEL  sec_level;
+    BOOLEAN         is_pair_cancel;
 } tSMP_CMPL;
 
 typedef union
diff --git a/stack/include/srvc_api.h b/stack/include/srvc_api.h
index e957ff2..d04964a 100644
--- a/stack/include/srvc_api.h
+++ b/stack/include/srvc_api.h
@@ -176,7 +176,8 @@
 ** Returns          void
 **
 *******************************************************************************/
-    GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback);
+    GATT_API extern BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback,
+            tDIS_ATTR_MASK mask);
 
 /*******************************************************************************
 **      BATTERY SERVICE API
diff --git a/stack/include/uipc_msg.h b/stack/include/uipc_msg.h
index 6a9a4ae..53cdccf 100644
--- a/stack/include/uipc_msg.h
+++ b/stack/include/uipc_msg.h
@@ -105,231 +105,6 @@
 } tUIPC_LOG_MSG;
 #define UIPC_LOG_MSGLEN       (IPC_LOG_MSG_LEN + 4)
 
-/********************************
-
-    H5 Sync Message
-
-********************************/
-
-/* op_code */
-#define SLIP_SYNC_TO_LITE_REQ        0
-#define SLIP_SYNC_TO_LITE_RESP       1
-#define SLIP_SYNC_TO_FULL_REQ        2
-#define SLIP_SYNC_TO_FULL_RESP       3
-#define SLIP_SYNC_NOTIFY             4
-
-/* status */
-#define SLIP_SYNC_SUCCESS            0
-#define SLIP_SYNC_FAILURE            1
-
-typedef struct
-{
-    UINT8       op_code;
-    UINT8       status;
-    UINT16      acl_pkt_size;
-    UINT8       state;
-    UINT8       lp_state;           /* Low Power state */
-    UINT8       next_seqno;         /* next send seq */
-    UINT8       ack;                /* next ack seq, expected seq from peer */
-    UINT8       sent_ack;           /* last sent ack */
-    UINT8       sliding_window_size;/* window size */
-    BOOLEAN     oof_flow_control;   /* Out of Frame SW Flow Control */
-    BOOLEAN     data_integrity_type;/* Level of Data Integrity Check */
-    UINT8       rx_state;           /* rx state for incoming packet processing */
-} tSLIP_SYNC_INFO;
-
-/********************************
-
-    L2CAP Sync Message
-
-********************************/
-
-/* op_code */
-#define L2C_SYNC_TO_LITE_REQ        0
-#define L2C_SYNC_TO_LITE_RESP       1
-#define L2C_REMOVE_TO_LITE_REQ      2
-#define L2C_REMOVE_TO_LITE_RESP     3
-#define L2C_FLUSH_TO_FULL_IND       4
-
-/* status */
-#define L2C_SYNC_SUCCESS            0
-#define L2C_SYNC_FAILURE            1
-
-typedef struct t_l2c_stream_info
-{
-    UINT16  local_cid;          /* Local CID                        */
-    UINT16  remote_cid;         /* Remote CID                       */
-    UINT16  out_mtu;            /* Max MTU we will send             */
-    UINT16  handle;             /* The handle used with LM          */
-    UINT16  link_xmit_quota;    /* Num outstanding pkts allowed     */
-    BOOLEAN is_flushable;       /* TRUE if flushable channel        */
-} tL2C_STREAM_INFO;
-
-typedef struct t_l2c_sync_to_lite_req
-{
-    UINT8   op_code;                       /* L2C_SYNC_TO_LITE_REQ */
-    UINT16  light_xmit_quota;              /* Total quota for light stack    */
-    UINT16  acl_data_size;                 /* Max ACL data size across HCI transport    */
-    UINT16  non_flushable_pbf;             /* L2CAP_PKT_START_NON_FLUSHABLE if controller supports */
-                                           /* Otherwise, L2CAP_PKT_START */
-    UINT8   multi_av_data_cong_start;      /* Multi-AV queue size to start congestion */
-    UINT8   multi_av_data_cong_end;        /* Multi-AV queue size to end congestion */
-    UINT8   multi_av_data_cong_discard;    /* Multi-AV queue size to discard */
-    UINT8   num_stream;
-    tL2C_STREAM_INFO stream[BTM_SYNC_INFO_NUM_STR];
-} tL2C_SYNC_TO_LITE_REQ;
-
-typedef struct t_l2c_sync_to_lite_resp_stream
-{
-    UINT16  lcid;
-    UINT8   status;
-} tL2C_SYNC_TO_LITE_RESP_STREAM;
-
-typedef struct t_l2c_sync_to_lite_resp
-{
-    UINT8   op_code;                       /* L2C_SYNC_TO_LITE_RESP */
-    UINT16  light_xmit_unacked;            /* unacked packet more than quota in light stack    */
-    UINT8   num_stream;
-    tL2C_SYNC_TO_LITE_RESP_STREAM stream[BTM_SYNC_INFO_NUM_STR];
-} tL2C_SYNC_TO_LITE_RESP;
-
-typedef struct t_l2c_remove_to_lite_req
-{
-    UINT8   op_code;                       /* L2C_REMOVE_TO_LITE_REQ */
-    UINT16  light_xmit_quota;              /* Total quota for light stack    */
-    UINT8   num_stream;
-    UINT16  lcid[BTM_SYNC_INFO_NUM_STR];
-} tL2C_REMOVE_TO_LITE_REQ;
-
-typedef tL2C_SYNC_TO_LITE_RESP  tL2C_REMOVE_TO_LITE_RESP;
-typedef tL2C_REMOVE_TO_LITE_REQ tL2C_FLUSH_TO_FULL_IND;
-
-typedef union t_l2c_sync_msg
-{
-    UINT8                       op_code;
-    tL2C_SYNC_TO_LITE_REQ       sync_req;
-    tL2C_SYNC_TO_LITE_RESP      sync_resp;
-    tL2C_REMOVE_TO_LITE_REQ     remove_req;
-    tL2C_REMOVE_TO_LITE_RESP    remove_resp;
-    tL2C_FLUSH_TO_FULL_IND      flush_ind;
-} tL2C_SYNC_MSG;
-
-/********************************
-
-    AVDTP Sync Message
-
-********************************/
-
-/* op_code */
-#define AVDT_SYNC_TO_LITE_REQ        0
-#define AVDT_SYNC_TO_LITE_RESP       1
-#define AVDT_RESYNC_TO_LITE_REQ      2
-#define AVDT_RESYNC_TO_LITE_RESP     3
-#define AVDT_SYNC_TO_FULL_REQ        4
-#define AVDT_SYNC_TO_FULL_RESP       5
-#define AVDT_REMOVE_TO_LITE_REQ      6
-#define AVDT_REMOVE_TO_LITE_RESP     7
-#define AVDT_SYNC_TO_BTC_LITE_REQ    8
-#define AVDT_SYNC_TO_BTC_LITE_RESP   9
-
-/* status */
-#define AVDT_SYNC_SUCCESS            0
-#define AVDT_SYNC_FAILURE            1
-
-typedef struct
-{
-    UINT16  lcid;
-    UINT32  ssrc;
-} tAVDT_SYNC_TO_BTC_LITE_REQ_STREAM;
-
-typedef struct
-{
-    UINT8   opcode;                     /* AVDT_SYNC_TO_BTC_LITE_REQ */
-    UINT8   num_stream;
-    tAVDT_SYNC_TO_BTC_LITE_REQ_STREAM  stream[BTM_SYNC_INFO_NUM_STR];
-} tAVDT_SYNC_TO_BTC_LITE_REQ;
-
-typedef struct
-{
-    UINT8   opcode;                     /* AVDT_SYNC_TO_BTC_LITE_RESP */
-    UINT8   status;
-} tAVDT_SYNC_TO_BTC_LITE_RESP;
-
-typedef struct t_avdt_scb_sync_info
-{
-    UINT8   handle;         /* SCB handle */
-    BD_ADDR peer_addr;      /* BD address of peer */
-    UINT16  local_cid;      /* Local CID                        */
-    UINT16  peer_mtu;       /* L2CAP mtu of the peer device */
-    UINT8   mux_tsid_media; /* TSID for media transport session */
-    UINT16  media_seq;      /* media packet sequence number */
-} tAVDT_SCB_SYNC_INFO;
-
-typedef struct t_avdt_sync_info
-{
-    UINT8   op_code;
-    UINT8   status;
-
-    tAVDT_SCB_SYNC_INFO scb_info[BTM_SYNC_INFO_NUM_STR];
-
-} tAVDT_SYNC_INFO;
-
-typedef union t_avdt_sync_msg
-{
-    UINT8                       op_code;
-    tAVDT_SYNC_INFO             sync_info;
-    tAVDT_SYNC_TO_BTC_LITE_REQ  btc_sync_req;
-    tAVDT_SYNC_TO_BTC_LITE_RESP btc_sync_resp;
-} tAVDT_SYNC_MSG;
-
-/********************************
-
-    BTA AV Sync Message
-
-********************************/
-
-/* op_code for MM light stack */
-#define BTA_AV_SYNC_TO_LITE_REQ             0
-#define BTA_AV_SYNC_TO_LITE_RESP            1
-#define BTA_AV_STR_START_TO_LITE_REQ        2
-#define BTA_AV_STR_START_TO_LITE_RESP       3
-#define BTA_AV_STR_STOP_TO_LITE_REQ         4
-#define BTA_AV_STR_STOP_TO_LITE_RESP        5
-#define BTA_AV_STR_CLEANUP_TO_LITE_REQ      6
-#define BTA_AV_STR_CLEANUP_TO_LITE_RESP     7
-#define BTA_AV_STR_SUSPEND_TO_LITE_REQ      8
-#define BTA_AV_STR_SUSPEND_TO_LITE_RESP     9
-#define BTA_AV_SYNC_ERROR_RESP              10
-
-/* op_code for BTC light stack */
-#define A2DP_START_REQ                      11
-#define A2DP_START_RESP                     12
-#define A2DP_STOP_REQ                       13
-#define A2DP_STOP_RESP                      14
-#define A2DP_CLEANUP_REQ                    15
-#define A2DP_CLEANUP_RESP                   16
-#define A2DP_SUSPEND_REQ                    17
-#define A2DP_SUSPEND_RESP                   18
-
-#define A2DP_JITTER_DONE_IND                41  /* For BTSNK */
-
-#define AUDIO_CODEC_CONFIG_REQ              19
-#define AUDIO_CODEC_CONFIG_RESP             20
-#define AUDIO_CODEC_SET_BITRATE_REQ         21
-#define AUDIO_CODEC_FLUSH_REQ               22
-#define AUDIO_ROUTE_CONFIG_REQ              23
-#define AUDIO_ROUTE_CONFIG_RESP             24
-#define AUDIO_MIX_CONFIG_REQ                25
-#define AUDIO_MIX_CONFIG_RESP               26
-#define AUDIO_BURST_FRAMES_IND              27
-#define AUDIO_BURST_END_IND                 28
-#define AUDIO_EQ_MODE_CONFIG_REQ            29
-#define AUDIO_SCALE_CONFIG_REQ              30
-
-/* For TIVO, only applicable for I2S -> DAC */
-#define AUDIO_SUB_ROUTE_REQ                 51
-#define AUDIO_SUB_ROUTE_RESP                52
-
 typedef struct
 {
     UINT8   opcode;     /* A2DP_START_REQ */
@@ -789,96 +564,5 @@
     tMIX_SCALE_CONFIG   mix_scale;
 } tAUDIO_SCALE_CONFIG_REQ;
 
-typedef UINT8 tBTA_AV_DUAL_STACK_EVT;
-
-typedef struct
-{
-    UINT8               avdt_handle;    /* AVDTP handle */
-    UINT8               chnl;           /* the channel: audio/video */
-    UINT8               codec_type;     /* codec type */
-    BOOLEAN             cong;           /* TRUE if AVDTP congested */
-    UINT8               hdi;            /* the index to SCB[] */
-    UINT8               hndl;           /* the handle: ((hdi + 1)|chnl) */
-    UINT8               l2c_bufs;       /* the number of buffers queued to L2CAP */
-    UINT16              l2c_cid;        /* L2CAP channel ID */
-    BD_ADDR             peer_addr;      /* peer BD address */
-}tBTA_AV_SYNC_INFO;
-
-typedef struct
-{
-    tBTA_AV_DUAL_STACK_EVT  event;
-    tBTA_AV_SYNC_INFO       sync_info;
-    UINT16                  curr_mtu;                 /* common mtu shared by all active streams */
-    UINT8                   multi_av_supported;       /* Whether multi-av is supported */
-}tBTA_AV_SYNC_INFO_REQ; /* SYNC_TO_LITE_REQ */
-
-/* Dual stack stream events */
-typedef struct
-{
-    tBTA_AV_DUAL_STACK_EVT          event;
-    UINT8                           scb_idx;
-}tBTA_AV_SCB_EVT;
-
-/* data type for the Audio Codec Information*/
-typedef struct
-{
-    UINT16  bit_rate;                   /* SBC encoder bit rate in kbps */
-    UINT16  bit_rate_busy;              /* SBC encoder bit rate in kbps */
-    UINT16  bit_rate_swampd;            /* SBC encoder bit rate in kbps */
-    UINT8   busy_level;                 /* Busy level indicating the bit-rate to be used */
-    UINT8   codec_info[AVDT_CODEC_SIZE];
-    UINT8   codec_type;                 /* Codec type */
-} tBTA_AV_AUDIO_CODEC_SYNC_INFO;
-
-/* Dual stack stream events */
-typedef struct
-{
-    tBTA_AV_DUAL_STACK_EVT          event;
-    UINT8                           scb_idx;
-    UINT8                           audio_open_cnt;
-    tBTA_AV_AUDIO_CODEC_SYNC_INFO   p_codec_cfg;
-    UINT8                           start_stop_flag;
-}tBTA_AV_SCB_REQ;
-
-typedef struct
-{
-    tBTA_AV_DUAL_STACK_EVT          event;
-    UINT8                           scb_idx;
-    UINT8                           audio_open_cnt;
-    UINT16                          curr_mtu;           /* common mtu shared by all active streams */
-}tBTA_AV_SCB_CLEANUP_REQ;
-
-/* Add request/response structures if needed ...
-typedef struct
-{
-    event;
-    data;
-}tBTA_AV_SYNC_*_REQ/RESP;
-*/
-
-typedef union
-{
-    /* MM light stack */
-    tBTA_AV_DUAL_STACK_EVT          event;
-    tBTA_AV_SYNC_INFO_REQ           sync_info_req;
-    tBTA_AV_SCB_EVT                 scb_evt;
-    tBTA_AV_SCB_REQ                 scb_req;
-    tBTA_AV_SCB_CLEANUP_REQ         scb_cleanup_req;
-
-    /* BTC light stack */
-    UINT8                           opcode;
-    tA2DP_START_REQ                 btc_start_req;
-    tA2DP_STOP_REQ                  btc_stop_req;
-    tA2DP_CLEANUP_REQ               btc_cleanup_req;
-    tA2DP_SUSPEND_REQ               btc_suspend_req;
-
-    tAUDIO_CODEC_CONFIG_REQ         codec_config_req;
-    tAUDIO_CODEC_SET_BITRATE_REQ    codec_bitrate_req;
-    tAUDIO_CODEC_FLUSH_REQ          codec_flush_req;
-    tAUDIO_ROUTE_CONFIG_REQ         route_config_req;
-    tAUDIO_MIX_CONFIG_REQ           mix_config_req;
-    tAUDIO_EQ_MODE_CONFIG_REQ       eq_mode_req;
-    tAUDIO_SCALE_CONFIG_REQ         scale_config_req;
-}tBTA_DUAL_STACK_MSG;
-
 #endif /* UIPC_MSG_H */
+
diff --git a/stack/l2cap/l2c_api.c b/stack/l2cap/l2c_api.c
index 30249a4..3d228d8 100644
--- a/stack/l2cap/l2c_api.c
+++ b/stack/l2cap/l2c_api.c
@@ -54,7 +54,7 @@
     tL2C_RCB    *p_rcb;
     UINT16      vpsm = psm;
 
-    L2CAP_TRACE_API1 ("L2CAP - L2CA_Register() called for PSM: 0x%04x", psm);
+    L2CAP_TRACE_API ("L2CAP - L2CA_Register() called for PSM: 0x%04x", psm);
 
     /* Verify that the required callback info has been filled in
     **      Note:  Connection callbacks are required but not checked
@@ -66,14 +66,14 @@
      || (!p_cb_info->pL2CA_DataInd_Cb)
      || (!p_cb_info->pL2CA_DisconnectInd_Cb))
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - no cb registering PSM: 0x%04x", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - no cb registering PSM: 0x%04x", psm);
         return (0);
     }
 
     /* Verify PSM is valid */
     if (L2C_INVALID_PSM(psm))
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - invalid PSM value, PSM: 0x%04x", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - invalid PSM value, PSM: 0x%04x", psm);
         return (0);
     }
 
@@ -87,7 +87,7 @@
                 break;
         }
 
-        L2CAP_TRACE_API2 ("L2CA_Register - Real PSM: 0x%04x  Virtual PSM: 0x%04x", psm, vpsm);
+        L2CAP_TRACE_API ("L2CA_Register - Real PSM: 0x%04x  Virtual PSM: 0x%04x", psm, vpsm);
     }
 
     /* If registration block already there, just overwrite it */
@@ -95,7 +95,7 @@
     {
         if ((p_rcb = l2cu_allocate_rcb (vpsm)) == NULL)
         {
-            L2CAP_TRACE_WARNING2 ("L2CAP - no RCB available, PSM: 0x%04x  vPSM: 0x%04x", psm, vpsm);
+            L2CAP_TRACE_WARNING ("L2CAP - no RCB available, PSM: 0x%04x  vPSM: 0x%04x", psm, vpsm);
             return (0);
         }
     }
@@ -125,7 +125,7 @@
     tL2C_LCB    *p_lcb;
     int         ii;
 
-    L2CAP_TRACE_API1 ("L2CAP - L2CA_Deregister() called for PSM: 0x%04x", psm);
+    L2CAP_TRACE_API ("L2CAP - L2CA_Deregister() called for PSM: 0x%04x", psm);
 
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) != NULL)
     {
@@ -151,7 +151,7 @@
     }
     else
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - PSM: 0x%04x not found for deregistration", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - PSM: 0x%04x not found for deregistration", psm);
     }
 }
 
@@ -170,7 +170,7 @@
     BOOLEAN done = FALSE;
     UINT16 psm = l2cb.dyn_psm;
 
-    L2CAP_TRACE_API0( "L2CA_AllocatePSM");
+    L2CAP_TRACE_API( "L2CA_AllocatePSM");
     while (!done)
     {
         psm += 2;
@@ -223,6 +223,10 @@
 **                  connection establishment gets started. The callback function
 **                  will be invoked when connection establishes or fails.
 **
+**  Parameters:       PSM: L2CAP PSM for the connection
+**                    BD address of the peer
+**                   Enhaced retransmission mode configurations
+
 ** Returns          the CID of the connection, or 0 if it failed to start
 **
 *******************************************************************************/
@@ -232,32 +236,35 @@
     tL2C_CCB        *p_ccb;
     tL2C_RCB        *p_rcb;
 
-    L2CAP_TRACE_API6 ("L2CA_ErtmConnectReq()  PSM: 0x%04x  BDA: %08x%04x  p_ertm_info: 0x%08x allowed:0x%x preferred:%d", psm,
+    L2CAP_TRACE_API ("L2CA_ErtmConnectReq()  PSM: 0x%04x  BDA: %08x%04x  p_ertm_info: 0x%08x allowed:0x%x preferred:%d", psm,
                       (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
                       (p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info,
-                      (p_ertm_info) ? p_ertm_info->allowed_modes : 0, (p_ertm_info) ? p_ertm_info->preferred_mode : 0);
+                      (p_ertm_info) ? p_ertm_info->allowed_modes : 0,
+                      (p_ertm_info) ? p_ertm_info->preferred_mode : 0);
 
     /* Fail if we have not established communications with the controller */
     if (!BTM_IsDeviceUp())
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP connect req - BTU not ready");
+        L2CAP_TRACE_WARNING ("L2CAP connect req - BTU not ready");
         return (0);
     }
     /* Fail if the PSM is not registered */
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm);
         return (0);
     }
 
     /* First, see if we already have a link to the remote */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+    /* assume all ERTM l2cap connection is going over BR/EDR for now */
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
         /* No link. Get an LCB and start link establishment */
-        if ( ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
-         ||  (l2cu_create_conn(p_lcb) == FALSE) )
+        if ( ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
+             /* currently use BR/EDR for ERTM mode l2cap connection */
+         ||  (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) )
         {
-            L2CAP_TRACE_WARNING2 ("L2CAP - conn not started for PSM: 0x%04x  p_lcb: 0x%08x", psm, p_lcb);
+            L2CAP_TRACE_WARNING ("L2CAP - conn not started for PSM: 0x%04x  p_lcb: 0x%08x", psm, p_lcb);
             return (0);
         }
     }
@@ -265,7 +272,7 @@
     /* Allocate a channel control block */
     if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm);
         return (0);
     }
 
@@ -289,7 +296,8 @@
         if (p_ccb->ertm_info.user_tx_pool_id == L2CAP_DEFAULT_ERM_POOL_ID)
             p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
 
-        p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) - (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN);
+        p_ccb->max_rx_mtu = GKI_get_pool_bufsize (p_ertm_info->user_rx_pool_id) -
+            (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN);
     }
 
     /* If link is up, start the L2CAP connection */
@@ -306,13 +314,13 @@
      */
     else if (p_lcb->link_state == LST_DISCONNECTING)
     {
-        L2CAP_TRACE_DEBUG0 ("L2CAP API - link disconnecting: RETRY LATER");
+        L2CAP_TRACE_DEBUG ("L2CAP API - link disconnecting: RETRY LATER");
 
         /* Save ccb so it can be started after disconnect is finished */
         p_lcb->p_pending_ccb = p_ccb;
     }
 
-    L2CAP_TRACE_API2 ("L2CAP - L2CA_conn_req(psm: 0x%04x) returned CID: 0x%04x", psm, p_ccb->local_cid);
+    L2CAP_TRACE_API ("L2CAP - L2CA_conn_req(psm: 0x%04x) returned CID: 0x%04x", psm, p_ccb->local_cid);
 
     /* Return the local CID as our handle */
     return (p_ccb->local_cid);
@@ -330,7 +338,8 @@
 ** Returns          TRUE for success, FALSE for failure
 **
 *******************************************************************************/
-BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid, UINT16 result, UINT16 status)
+BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid,
+                              UINT16 result, UINT16 status)
 {
     return L2CA_ErtmConnectRsp (p_bd_addr, id, lcid, result, status, NULL);
 }
@@ -353,30 +362,30 @@
     tL2C_LCB        *p_lcb;
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API6 ("L2CA_ErtmConnectRsp()  CID: 0x%04x  Result: %d  Status: %d  BDA: %08x%04x  p_ertm_info:0x%08x",
+    L2CAP_TRACE_API ("L2CA_ErtmConnectRsp()  CID: 0x%04x  Result: %d  Status: %d  BDA: %08x%04x  p_ertm_info:0x%08x",
                       lcid, result, status,
                       (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
                       (p_bd_addr[4]<<8)+p_bd_addr[5], p_ertm_info);
 
     /* First, find the link control block */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
         /* No link. Get an LCB and start link establishment */
-        L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_conn_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_rsp");
         return (FALSE);
     }
 
     /* Now, find the channel control block */
     if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_conn_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_rsp");
         return (FALSE);
     }
 
     /* The IDs must match */
     if (p_ccb->remote_id != id)
     {
-        L2CAP_TRACE_WARNING2 ("L2CAP - bad id in L2CA_conn_rsp. Exp: %d  Got: %d", p_ccb->remote_id, id);
+        L2CAP_TRACE_WARNING ("L2CAP - bad id in L2CA_conn_rsp. Exp: %d  Got: %d", p_ccb->remote_id, id);
         return (FALSE);
     }
 
@@ -436,13 +445,13 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API5 ("L2CA_ConfigReq()  CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d (%d)",
+    L2CAP_TRACE_API ("L2CA_ConfigReq()  CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d (%d)",
         cid, p_cfg->fcr_present, p_cfg->fcr.mode, p_cfg->mtu_present, p_cfg->mtu);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid);
         return (FALSE);
     }
 
@@ -459,7 +468,7 @@
 
         if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) )
         {
-            L2CAP_TRACE_WARNING1 ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
+            L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
             p_cfg->mtu = L2CAP_MTU_SIZE;
         }
     }
@@ -487,13 +496,13 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API6 ("L2CA_ConfigRsp()  CID: 0x%04x  Result: %d MTU present:%d Flush TO:%d FCR:%d FCS:%d",
+    L2CAP_TRACE_API ("L2CA_ConfigRsp()  CID: 0x%04x  Result: %d MTU present:%d Flush TO:%d FCR:%d FCS:%d",
         cid, p_cfg->result, p_cfg->mtu_present, p_cfg->flush_to_present, p_cfg->fcr_present, p_cfg->fcs_present);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid);
         return (FALSE);
     }
 
@@ -531,12 +540,12 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API1 ("L2CA_DisconnectReq()  CID: 0x%04x", cid);
+    L2CAP_TRACE_API ("L2CA_DisconnectReq()  CID: 0x%04x", cid);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid);
         return (FALSE);
     }
 
@@ -559,12 +568,12 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API1 ("L2CA_DisconnectRsp()  CID: 0x%04x", cid);
+    L2CAP_TRACE_API ("L2CA_DisconnectRsp()  CID: 0x%04x", cid);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid);
         return (FALSE);
     }
 
@@ -586,7 +595,7 @@
 {
     tL2C_LCB        *p_lcb;
 
-    L2CAP_TRACE_API6 ("L2CA_Ping()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+    L2CAP_TRACE_API ("L2CA_Ping()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
                       p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], p_bd_addr[4], p_bd_addr[5]);
 
     /* Fail if we have not established communications with the controller */
@@ -594,15 +603,15 @@
         return (FALSE);
 
     /* First, see if we already have a link to the remote */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
         /* No link. Get an LCB and start link establishment */
-        if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
+        if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
         {
-            L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_ping");
+            L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_ping");
             return (FALSE);
         }
-        if (l2cu_create_conn(p_lcb) == FALSE)
+        if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
         {
             return (FALSE);
         }
@@ -615,14 +624,14 @@
     /* We only allow 1 ping outstanding at a time */
     if (p_lcb->p_echo_rsp_cb != NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - rejected second L2CA_ping");
+        L2CAP_TRACE_WARNING ("L2CAP - rejected second L2CA_ping");
         return (FALSE);
     }
 
     /* Have a link control block. If link is disconnecting, tell user to retry later */
     if (p_lcb->link_state == LST_DISCONNECTING)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - L2CA_ping rejected - link disconnecting");
+        L2CAP_TRACE_WARNING ("L2CAP - L2CA_ping rejected - link disconnecting");
         return (FALSE);
     }
 
@@ -654,7 +663,7 @@
     tL2C_LCB    *p_lcb;
     UINT8       *pp;
 
-    L2CAP_TRACE_API2 ("L2CA_Echo() BDA: %08X%04X",
+    L2CAP_TRACE_API ("L2CA_Echo() BDA: %08X%04X",
             ((p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] <<  8) + (p_bd_addr[3])),
             ((p_bd_addr[4] <<  8) + (p_bd_addr[5])));
 
@@ -670,15 +679,15 @@
     }
 
     /* We assume the upper layer will call this function only when the link is established. */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        L2CAP_TRACE_ERROR0 ("L2CA_Echo ERROR : link not established");
+        L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link not established");
         return FALSE;
     }
 
     if (p_lcb->link_state != LST_CONNECTED)
     {
-        L2CAP_TRACE_ERROR0 ("L2CA_Echo ERROR : link is not connected");
+        L2CAP_TRACE_ERROR ("L2CA_Echo ERROR : link is not connected");
         return FALSE;
     }
 
@@ -727,7 +736,7 @@
         /* Find the channel control block. We don't know the link it is on. */
         if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
         {
-            L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", cid);
+            L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", cid);
             return (FALSE);
         }
 
@@ -767,7 +776,7 @@
 
     if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN))
     {
-        p_lcb = l2cu_find_lcb_by_bd_addr( bd_addr );
+        p_lcb = l2cu_find_lcb_by_bd_addr( bd_addr, BT_TRANSPORT_BR_EDR);
         if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED))
             p_lcb->idle_timeout = timeout;
         else
@@ -827,7 +836,7 @@
 *******************************************************************************/
 UINT8 L2CA_SetDesireRole (UINT8 new_role)
 {
-    L2CAP_TRACE_API2 ("L2CA_SetDesireRole() new:x%x, disallow_switch:%d",
+    L2CAP_TRACE_API ("L2CA_SetDesireRole() new:x%x, disallow_switch:%d",
         new_role, l2cb.disallow_switch);
 
     if (L2CAP_ROLE_CHECK_SWITCH != (L2CAP_ROLE_CHECK_SWITCH & new_role))
@@ -864,25 +873,25 @@
     tL2C_CCB        *p_ccb;
     tL2C_RCB        *p_rcb;
 
-    L2CAP_TRACE_API2 ("L2CA_LocalLoopbackReq()  PSM: %d  Handle: 0x%04x", psm, handle);
+    L2CAP_TRACE_API ("L2CA_LocalLoopbackReq()  PSM: %d  Handle: 0x%04x", psm, handle);
 
     /* Fail if we have not established communications with the controller */
     if (!BTM_IsDeviceUp())
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP loop req - BTU not ready");
+        L2CAP_TRACE_WARNING ("L2CAP loop req - BTU not ready");
         return (0);
     }
 
     /* Fail if the PSM is not registered */
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm);
         return (0);
     }
 
-    if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE)) == NULL)
+    if ((p_lcb = l2cu_allocate_lcb (p_bd_addr, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_conn_req");
         return (0);
     }
 
@@ -892,7 +901,7 @@
     /* Allocate a channel control block */
     if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_conn_req");
         return (0);
     }
 
@@ -919,7 +928,7 @@
 *******************************************************************************/
 BOOLEAN L2CA_SetAclPriority (BD_ADDR bd_addr, UINT8 priority)
 {
-    L2CAP_TRACE_API6 ("L2CA_SetAclPriority()  bdaddr: %02x%02x%02x%02x%04x, priority:%d",
+    L2CAP_TRACE_API ("L2CA_SetAclPriority()  bdaddr: %02x%02x%02x%02x%04x, priority:%d",
                     bd_addr[0], bd_addr[1], bd_addr[2],
                     bd_addr[3], (bd_addr[4] << 8) + bd_addr[5], priority);
 
@@ -942,18 +951,18 @@
     tL2C_CCB  *p_ccb;
     BOOLEAN   on_off = !data_enabled;
 
-    L2CAP_TRACE_API2 ("L2CA_FlowControl(%d)  CID: 0x%04x", on_off, cid);
+    L2CAP_TRACE_API ("L2CA_FlowControl(%d)  CID: 0x%04x", on_off, cid);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING2 ("L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x  data_enabled: %d", cid, data_enabled);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x  data_enabled: %d", cid, data_enabled);
         return (FALSE);
     }
 
     if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE)
     {
-        L2CAP_TRACE_EVENT1 ("L2CA_FlowControl()  invalid mode:%d", p_ccb->peer_cfg.fcr.mode);
+        L2CAP_TRACE_EVENT ("L2CA_FlowControl()  invalid mode:%d", p_ccb->peer_cfg.fcr.mode);
         return (FALSE);
     }
     if (p_ccb->fcrb.local_busy != on_off)
@@ -985,12 +994,12 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API3 ("L2CA_SendTestSFrame()  CID: 0x%04x  Type: 0x%02x  back_track: %u", cid, sup_type, back_track);
+    L2CAP_TRACE_API ("L2CA_SendTestSFrame()  CID: 0x%04x  Type: 0x%02x  back_track: %u", cid, sup_type, back_track);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid);
         return (FALSE);
     }
 
@@ -1018,12 +1027,12 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API2 ("L2CA_SetTxPriority()  CID: 0x%04x, priority:%d", cid, priority);
+    L2CAP_TRACE_API ("L2CA_SetTxPriority()  CID: 0x%04x, priority:%d", cid, priority);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid);
         return (FALSE);
     }
 
@@ -1046,12 +1055,12 @@
 {
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API3 ("L2CA_SetChnlDataRate()  CID: 0x%04x, tx:%d, rx:%d", cid, tx, rx);
+    L2CAP_TRACE_API ("L2CA_SetChnlDataRate()  CID: 0x%04x, tx:%d, rx:%d", cid, tx, rx);
 
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", cid);
         return (FALSE);
     }
 
@@ -1118,7 +1127,7 @@
         /* if L2CAP flush_to within range of HCI, set HCI flush timeout */
         if (temp > HCI_MAX_AUTO_FLUSH_TOUT)
         {
-            L2CAP_TRACE_WARNING1("WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", flush_tout);
+            L2CAP_TRACE_WARNING("WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", flush_tout);
             return FALSE;
         }
         else
@@ -1129,7 +1138,7 @@
 
     if (memcmp (BT_BD_ANY, bd_addr, BD_ADDR_LEN))
     {
-        p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+        p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
 
         if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED))
         {
@@ -1137,7 +1146,7 @@
             {
                 p_lcb->link_flush_tout = flush_tout;
 
-                L2CAP_TRACE_API4 ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
+                L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
                                   flush_tout, bd_addr[3], bd_addr[4], bd_addr[5]);
 
                 if (!btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to))
@@ -1146,7 +1155,7 @@
         }
         else
         {
-            L2CAP_TRACE_WARNING3 ("WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]",
+            L2CAP_TRACE_WARNING ("WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]",
                                   bd_addr[3], bd_addr[4], bd_addr[5]);
             return (FALSE);
         }
@@ -1164,7 +1173,7 @@
                 {
                     p_lcb->link_flush_tout = flush_tout;
 
-                    L2CAP_TRACE_API4 ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
+                    L2CAP_TRACE_API ("L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]",
                                       flush_tout, p_lcb->remote_bd_addr[3],
                                       p_lcb->remote_bd_addr[4], p_lcb->remote_bd_addr[5]);
 
@@ -1195,15 +1204,15 @@
     tL2C_LCB        *p_lcb;
 
     /* We must already have a link to the remote */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        L2CAP_TRACE_WARNING2 ("L2CA_GetPeerFeatures() No BDA: %08x%04x",
+        L2CAP_TRACE_WARNING ("L2CA_GetPeerFeatures() No BDA: %08x%04x",
                               (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                               (bd_addr[4]<<8)+bd_addr[5]);
         return (FALSE);
     }
 
-    L2CAP_TRACE_API4 ("L2CA_GetPeerFeatures() BDA: %08x%04x  ExtFea: 0x%08x  Chnl_Mask[0]: 0x%02x",
+    L2CAP_TRACE_API ("L2CA_GetPeerFeatures() BDA: %08x%04x  ExtFea: 0x%08x  Chnl_Mask[0]: 0x%02x",
                       (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8)+bd_addr[3],
                       (bd_addr[4]<<8)+bd_addr[5], p_lcb->peer_ext_fea, p_lcb->peer_chnl_mask[0]);
 
@@ -1258,11 +1267,11 @@
 
     if (p_ccb)
     {
-        L2CAP_TRACE_API1 ("L2CA_GetChnlFcrMode() returns mode %d", p_ccb->peer_cfg.fcr.mode);
+        L2CAP_TRACE_API ("L2CA_GetChnlFcrMode() returns mode %d", p_ccb->peer_cfg.fcr.mode);
         return (p_ccb->peer_cfg.fcr.mode);
     }
 
-    L2CAP_TRACE_API0 ("L2CA_GetChnlFcrMode() returns mode L2CAP_FCR_BASIC_MODE");
+    L2CAP_TRACE_API ("L2CA_GetChnlFcrMode() returns mode L2CAP_FCR_BASIC_MODE");
     return (L2CAP_FCR_BASIC_MODE);
 }
 
@@ -1283,7 +1292,7 @@
 {
     if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL) )
     {
-        L2CAP_TRACE_ERROR1 ("L2CA_RegisterFixedChannel()  Invalid CID: 0x%04x", fixed_cid);
+        L2CAP_TRACE_ERROR ("L2CA_RegisterFixedChannel()  Invalid CID: 0x%04x", fixed_cid);
 
         return (FALSE);
     }
@@ -1307,69 +1316,93 @@
 BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda)
 {
     tL2C_LCB        *p_lcb;
-#if BLE_INCLUDED == TRUE
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
     UINT16          reason;
-#endif
 
-    L2CAP_TRACE_API3  ("L2CA_ConnectFixedChnl()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
+    L2CAP_TRACE_API  ("L2CA_ConnectFixedChnl()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
                     (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
 
     /* Check CID is valid and registered */
     if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
      ||  (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
     {
-        L2CAP_TRACE_ERROR1 ("L2CA_ConnectFixedChnl()  Invalid CID: 0x%04x", fixed_cid);
+        L2CAP_TRACE_ERROR ("L2CA_ConnectFixedChnl()  Invalid CID: 0x%04x", fixed_cid);
         return (FALSE);
     }
 
     /* Fail if BT is not yet up */
     if (!BTM_IsDeviceUp())
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - BTU not ready", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - BTU not ready", fixed_cid);
         return (FALSE);
     }
 
+#if BLE_INCLUDED == TRUE
+    if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+        transport = BT_TRANSPORT_LE;
+#endif
+
     /* If we already have a link to the remote, check if it supports that CID */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) != NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) != NULL)
     {
         if (!(p_lcb->peer_chnl_mask[0] & (1 << fixed_cid)))
         {
-            L2CAP_TRACE_EVENT3  ("L2CA_ConnectFixedChnl()  CID: 0x%04x  BDA: %08x%04x not supported", fixed_cid,
-                                (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
+            L2CAP_TRACE_EVENT  ("L2CA_ConnectFixedChnl() CID:0x%04x  BDA: %08x%04x not supported",
+                fixed_cid,(rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+                (rem_bda[4]<<8)+rem_bda[5]);
             return (FALSE);
         }
         /* Get a CCB and link the lcb to it */
-        if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+        if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid,
+            &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
         {
-            L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - LCB but no CCB", fixed_cid);
+            L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - LCB but no CCB", fixed_cid);
             return (FALSE);
         }
+
+        /* racing with disconnecting, queue the connection request */
+        if (p_lcb->link_state == LST_DISCONNECTING)
+        {
+            L2CAP_TRACE_DEBUG ("L2CAP API - link disconnecting: RETRY LATER");
+            /* Save ccb so it can be started after disconnect is finished */
+            p_lcb->p_pending_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL];
+            return (TRUE);
+        }
+
 #if BLE_INCLUDED == TRUE
-        reason = (p_lcb->is_ble_link) ? 1: 0;
-        (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, reason);
+        (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)
+        (p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport);
 #else
-        (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0);
+        (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)
+        (p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR);
 #endif
         return (TRUE);
     }
 
     /* No link. Get an LCB and start link establishment */
-    if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE)) == NULL)
+    if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, transport)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - no LCB", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - no LCB", fixed_cid);
         return (FALSE);
     }
 
     /* Get a CCB and link the lcb to it */
-    if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+    if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid,
+        &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
     {
         p_lcb->disc_reason = L2CAP_CONN_NO_RESOURCES;
-        L2CAP_TRACE_WARNING1 ("L2CA_ConnectFixedChnl(0x%04x) - no CCB", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl(0x%04x) - no CCB", fixed_cid);
         l2cu_release_lcb (p_lcb);
         return (FALSE);
     }
 
-    return (l2cu_create_conn(p_lcb));
+    if (!l2cu_create_conn(p_lcb, transport))
+    {
+        L2CAP_TRACE_WARNING ("L2CA_ConnectFixedChnl create_conn failed");
+        l2cu_release_lcb (p_lcb);
+        return (FALSE);
+    }
+    return (TRUE);
 }
 
 /*******************************************************************************
@@ -1389,35 +1422,47 @@
 UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf)
 {
     tL2C_LCB        *p_lcb;
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
 
-    L2CAP_TRACE_API3 ("L2CA_SendFixedChnlData()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
+    L2CAP_TRACE_API ("L2CA_SendFixedChnlData()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
                      (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
 
+#if BLE_INCLUDED == TRUE
+    if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+        transport = BT_TRANSPORT_LE;
+#endif
+
     /* Check CID is valid and registered */
     if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
      ||  (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
     {
-        L2CAP_TRACE_ERROR1 ("L2CA_SendFixedChnlData()  Invalid CID: 0x%04x", fixed_cid);
+        L2CAP_TRACE_ERROR ("L2CA_SendFixedChnlData()  Invalid CID: 0x%04x", fixed_cid);
+        GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
 
     /* Fail if BT is not yet up */
     if (!BTM_IsDeviceUp())
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", fixed_cid);
+        GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
 
     /* We need to have a link up */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport)) == NULL ||
+        /* if link is disconnecting, also report data sending failure */
+        p_lcb->link_state == LST_DISCONNECTING)
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid);
+        GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
 
     if ((p_lcb->peer_chnl_mask[0] & (1 << fixed_cid)) == 0)
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", fixed_cid);
+        L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", fixed_cid);
+        GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
 
@@ -1428,11 +1473,23 @@
     {
         if (!l2cu_initialize_fixed_ccb (p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
         {
-            L2CAP_TRACE_WARNING1 ("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", fixed_cid);
+            L2CAP_TRACE_WARNING ("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", fixed_cid);
+            GKI_freebuf (p_buf);
             return (L2CAP_DW_FAILED);
         }
     }
 
+    /* If already congested, do not accept any more packets */
+    if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent)
+    {
+        L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested \
+            xmit_hold_q.count: %u buff_quota: %u", fixed_cid,
+            p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->xmit_hold_q.count,
+            p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->buff_quota);
+        GKI_freebuf (p_buf);
+        return (L2CAP_DW_FAILED);
+    }
+
     l2c_enqueue_peer_data (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL], p_buf);
 
     l2c_link_check_send_pkts (p_lcb, NULL, NULL);
@@ -1443,6 +1500,9 @@
         l2cu_no_dynamic_ccbs (p_lcb);
     }
 
+    if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent)
+        return (L2CAP_DW_CONGESTED);
+
     return (L2CAP_DW_SUCCESS);
 }
 
@@ -1463,25 +1523,32 @@
 {
     tL2C_LCB    *p_lcb;
     tL2C_CCB    *p_ccb;
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
 
     /* Check CID is valid and registered */
     if ( (fixed_cid < L2CAP_FIRST_FIXED_CHNL) || (fixed_cid > L2CAP_LAST_FIXED_CHNL)
      ||  (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == NULL) )
     {
-        L2CAP_TRACE_ERROR1 ("L2CA_RemoveFixedChnl()  Invalid CID: 0x%04x", fixed_cid);
+        L2CAP_TRACE_ERROR ("L2CA_RemoveFixedChnl()  Invalid CID: 0x%04x", fixed_cid);
         return (FALSE);
     }
 
+#if BLE_INCLUDED == TRUE
+    if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+        transport = BT_TRANSPORT_LE;
+#endif
+
     /* Is a fixed channel connected to the remote BDA ?*/
-    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport);
+
     if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) )
     {
-        L2CAP_TRACE_WARNING3 ("L2CA_RemoveFixedChnl()  CID: 0x%04x  BDA: %08x%04x not connected", fixed_cid,
+        L2CAP_TRACE_WARNING ("L2CA_RemoveFixedChnl()  CID: 0x%04x  BDA: %08x%04x not connected", fixed_cid,
                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
         return (FALSE);
     }
 
-    L2CAP_TRACE_API3 ("L2CA_RemoveFixedChnl()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
+    L2CAP_TRACE_API ("L2CA_RemoveFixedChnl()  CID: 0x%04x  BDA: %08x%04x", fixed_cid,
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
 
     /* Release the CCB, starting an inactivity timeout on the LCB if no other CCBs exist */
@@ -1491,7 +1558,14 @@
     p_lcb->disc_reason = HCI_ERR_CONN_CAUSE_LOCAL_HOST;
 
 #if BLE_INCLUDED == TRUE
-    if (fixed_cid == L2CAP_ATT_CID && !p_lcb->ccb_queue.p_first_ccb)
+    /* retain the link for a few more seconds after SMP pairing is done, since Android
+    platformalways do service discovery after pairing complete. This way would avoid
+    the link down (pairing is complete) and an immediate reconnection for service
+    discovery. Some devices do not do auto advertising when link is dropped, thus fail
+    the second connection and service discovery.
+    BEFORE :if ((fixed_cid == L2CAP_ATT_CID || fixed_cid == L2CAP_SMP_CID)
+                       && !p_lcb->ccb_queue.p_first_ccb)*/
+    if ((fixed_cid == L2CAP_ATT_CID ) && !p_lcb->ccb_queue.p_first_ccb)
         p_lcb->idle_timeout = 0;
 #endif
 
@@ -1520,12 +1594,18 @@
 BOOLEAN L2CA_SetFixedChannelTout (BD_ADDR rem_bda, UINT16 fixed_cid, UINT16 idle_tout)
 {
     tL2C_LCB        *p_lcb;
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
+
+#if BLE_INCLUDED == TRUE
+    if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID)
+        transport = BT_TRANSPORT_LE;
+#endif
 
     /* Is a fixed channel connected to the remote BDA ?*/
-    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, transport);
     if ( ((p_lcb) == NULL) || (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) )
     {
-        L2CAP_TRACE_WARNING3 ("L2CA_SetFixedChannelTout()  CID: 0x%04x  BDA: %08x%04x not connected", fixed_cid,
+        L2CAP_TRACE_WARNING ("L2CA_SetFixedChannelTout()  CID: 0x%04x  BDA: %08x%04x not connected", fixed_cid,
                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
         return (FALSE);
     }
@@ -1562,7 +1642,7 @@
 {
     tL2C_CCB    *p_ccb;
 
-    L2CAP_TRACE_API1 ("L2CA_GetCurrentConfig()  CID: 0x%04x", lcid);
+    L2CAP_TRACE_API ("L2CA_GetCurrentConfig()  CID: 0x%04x", lcid);
 
     p_ccb = l2cu_find_ccb_by_cid(NULL, lcid);
 
@@ -1592,7 +1672,7 @@
     }
     else
     {
-        L2CAP_TRACE_ERROR1 ("No CCB for CID:0x%04x", lcid);
+        L2CAP_TRACE_ERROR ("No CCB for CID:0x%04x", lcid);
         return FALSE;
     }
 }
@@ -1614,7 +1694,7 @@
     tL2C_LCB        *p_lcb;
 
     /* Find the link that is associated with this remote bdaddr */
-    p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
 
     /* If no link for this handle, nothing to do. */
     if (!p_lcb)
@@ -1638,7 +1718,7 @@
 *******************************************************************************/
 UINT8 L2CA_DataWrite (UINT16 cid, BT_HDR *p_data)
 {
-    L2CAP_TRACE_API2 ("L2CA_DataWrite()  CID: 0x%04x  Len: %d", cid, p_data->len);
+    L2CAP_TRACE_API ("L2CA_DataWrite()  CID: 0x%04x  Len: %d", cid, p_data->len);
     return l2c_data_write (cid, p_data, L2CAP_FLUSHABLE_CH_BASED);
 }
 
@@ -1661,13 +1741,13 @@
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", cid);
         return (FALSE);
     }
 
     p_ccb->is_flushable = is_flushable;
 
-    L2CAP_TRACE_API2 ("L2CA_SetChnlFlushability()  CID: 0x%04x  is_flushable: %d", cid, is_flushable);
+    L2CAP_TRACE_API ("L2CA_SetChnlFlushability()  CID: 0x%04x  is_flushable: %d", cid, is_flushable);
 
 #endif
 
@@ -1691,7 +1771,7 @@
 *******************************************************************************/
 UINT8 L2CA_DataWriteEx (UINT16 cid, BT_HDR *p_data, UINT16 flags)
 {
-    L2CAP_TRACE_API3 ("L2CA_DataWriteEx()  CID: 0x%04x  Len: %d Flags:0x%04X",
+    L2CAP_TRACE_API ("L2CA_DataWriteEx()  CID: 0x%04x  Len: %d Flags:0x%04X",
                        cid, p_data->len, flags);
     return l2c_data_write (cid, p_data, flags);
 }
@@ -1723,18 +1803,18 @@
 
     if ( !p_ccb || ((p_lcb = p_ccb->p_lcb) == NULL) )
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_FlushChannel()  abnormally returning 0  CID: 0x%04x", lcid);
+        L2CAP_TRACE_WARNING ("L2CA_FlushChannel()  abnormally returning 0  CID: 0x%04x", lcid);
         return (0);
     }
 
     if (num_to_flush != L2CAP_FLUSH_CHANS_GET)
     {
-        L2CAP_TRACE_API4 ("L2CA_FlushChannel (FLUSH)  CID: 0x%04x  NumToFlush: %d  QC: %u  pFirst: 0x%08x",
+        L2CAP_TRACE_API ("L2CA_FlushChannel (FLUSH)  CID: 0x%04x  NumToFlush: %d  QC: %u  pFirst: 0x%08x",
                            lcid, num_to_flush, p_ccb->xmit_hold_q.count, p_ccb->xmit_hold_q.p_first);
     }
     else
     {
-        L2CAP_TRACE_API1 ("L2CA_FlushChannel (QUERY)  CID: 0x%04x", lcid);
+        L2CAP_TRACE_API ("L2CA_FlushChannel (QUERY)  CID: 0x%04x", lcid);
     }
 
     /* Cannot flush eRTM buffers once they have a sequence number */
@@ -1808,7 +1888,7 @@
     num_left += p_ccb->xmit_hold_q.count;
 
     /* Return the local number of buffers left for the CID */
-    L2CAP_TRACE_DEBUG3 ("L2CA_FlushChannel()  flushed: %u + %u,  num_left: %u", num_flushed1, num_flushed2, num_left);
+    L2CAP_TRACE_DEBUG ("L2CA_FlushChannel()  flushed: %u + %u,  num_left: %u", num_flushed1, num_flushed2, num_left);
 
     /* If we were congested, and now we are not, tell the app */
     l2cu_check_channel_congestion (p_ccb);
diff --git a/stack/l2cap/l2c_ble.c b/stack/l2cap/l2c_ble.c
index ba0d7ec..75a2bfb 100644
--- a/stack/l2cap/l2c_ble.c
+++ b/stack/l2cap/l2c_ble.c
@@ -32,7 +32,9 @@
 #include "hcimsgs.h"
 
 #if (BLE_INCLUDED == TRUE)
+static void l2cble_start_conn_update (tL2C_LCB *p_lcb);
 
+#include "vendor_ble.h"
 /*******************************************************************************
 **
 **  Function        L2CA_CancelBleConnectReq
@@ -51,13 +53,13 @@
     /* There can be only one BLE connection request outstanding at a time */
     if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
     {
-        L2CAP_TRACE_WARNING0 ("L2CA_CancelBleConnectReq - no connection pending");
+        L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - no connection pending");
         return(FALSE);
     }
 
     if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN))
     {
-        L2CAP_TRACE_WARNING4 ("L2CA_CancelBleConnectReq - different  BDA Connecting: %08x%04x  Cancel: %08x%04x",
+        L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - different  BDA Connecting: %08x%04x  Cancel: %08x%04x",
                               (l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3],
                               (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5],
                               (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
@@ -68,7 +70,7 @@
     if (btsnd_hcic_ble_create_conn_cancel())
     {
 
-        if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) != NULL)
+        if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE)) != NULL)
         {
             p_lcb->disc_reason = L2CAP_CONN_CANCEL;
             l2cu_release_lcb (p_lcb);
@@ -84,57 +86,6 @@
 
 /*******************************************************************************
 **
-**  Function        L2CA_InternalBleConnUpdate
-**
-**  Description     update BLE connection based on status
-**
-**  Parameters:     lcb
-**
-**  Return value:   none
-**
-*******************************************************************************/
-static void L2CA_InternalBleConnUpdate (tL2C_LCB *p_lcb)
-{
-    if (p_lcb->upd_status & L2C_BLE_UPDATE_PENDING) return;
-
-    if (p_lcb->upd_status & L2C_BLE_CONN_UPDATE_DISABLE)
-    {
-        /* application requests to disable parameters update.
-           If parameters are already updated, lets set them
-           up to what has been requested during connection establishement */
-        if (p_lcb->upd_status & L2C_BLE_NOT_DEFAULT_PARAM)
-        {
-            tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr);
-
-            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle,
-                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
-                         p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
-                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
-                         p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
-                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
-                         p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
-                (UINT16)((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
-                         p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
-                0, 0);
-            p_lcb->upd_status &= ~L2C_BLE_NOT_DEFAULT_PARAM;
-            p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NEW_CONN_PARAM);
-        }
-    }
-    else
-    {
-        /* application allows to do update, if we were delaying one do it now */
-        if (p_lcb->upd_status & L2C_BLE_NEW_CONN_PARAM)
-        {
-            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval,
-                p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0);
-            p_lcb->upd_status &= ~L2C_BLE_NEW_CONN_PARAM;
-            p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NOT_DEFAULT_PARAM);
-        }
-    }
-}
-
-/*******************************************************************************
-**
 **  Function        L2CA_UpdateBleConnParams
 **
 **  Description     Update BLE connection parameters.
@@ -144,41 +95,65 @@
 **  Return value:   TRUE if update started
 **
 *******************************************************************************/
-BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout)
+BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int,
+                                            UINT16 latency, UINT16 timeout)
 {
-    tL2C_LCB            *p_lcb;
+        tL2C_LCB            *p_lcb;
+        tACL_CONN           *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
 
-    /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+        /* See if we have a link control block for the remote device */
+        p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
 
-    /* If we don't have one, create one and accept the connection. */
-    if (!p_lcb)
-    {
-        L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
-                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
-        return(FALSE);
-    }
+        /* If we don't have one, create one and accept the connection. */
+        if (!p_lcb || !p_acl_cb)
+        {
+            L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
+                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+                                  (rem_bda[4]<<8)+rem_bda[5]);
+            return(FALSE);
+        }
 
-    if (!p_lcb->is_ble_link)
-    {
-        L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
-                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
-        return(FALSE);
-    }
+        if (p_lcb->transport != BT_TRANSPORT_LE)
+        {
+            L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
+                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+                                  (rem_bda[4]<<8)+rem_bda[5]);
+            return(FALSE);
+        }
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+        /* if both 4.1 compliant */
+        if ((HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) &&
+         HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)))
+        {
+            p_lcb->min_interval = min_int;
+            p_lcb->max_interval = max_int;
+            p_lcb->latency = latency;
+            p_lcb->timeout = timeout;
+            p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
 
-    if (p_lcb->link_role == HCI_ROLE_MASTER)
-    {
-        p_lcb->min_interval = min_int;
-        p_lcb->max_interval = max_int;
-        p_lcb->latency = latency;
-        p_lcb->timeout = timeout;
-        p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
-        L2CA_InternalBleConnUpdate(p_lcb);
-    }
-    else
-        l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
+            l2cble_start_conn_update(p_lcb);
+        }
+        else
+        /* if either side does not support Connection Parameters Request
+        Link Layer Control Procedure,
+           use Link Layer Connection Update procedure */
+#endif
+        {
+            if (p_lcb->link_role == HCI_ROLE_MASTER)
+        {
+            p_lcb->min_interval = min_int;
+            p_lcb->max_interval = max_int;
+            p_lcb->latency = latency;
+            p_lcb->timeout = timeout;
+            p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
 
-    return(TRUE);
+            l2cble_start_conn_update(p_lcb);
+        }
+            else
+                l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
+        }
+        return(TRUE);
+
 }
 
 
@@ -198,76 +173,38 @@
     tL2C_LCB            *p_lcb;
 
     /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
 
-    /* If we don't have one, create one and accept the connection. */
     if (!p_lcb)
     {
-        L2CAP_TRACE_WARNING2 ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
-            (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
+        L2CAP_TRACE_WARNING ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
+            (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+            (rem_bda[4]<<8)+rem_bda[5]);
         return (FALSE);
     }
 
-    L2CAP_TRACE_API4 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x enable %d upd state %d",
-        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5],
-        enable, p_lcb->upd_status);
+    L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__,
+        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+        (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask);
 
-    if (!p_lcb->is_ble_link || (p_lcb->link_role != HCI_ROLE_MASTER))
+    if (p_lcb->transport != BT_TRANSPORT_LE || (p_lcb->link_role != HCI_ROLE_MASTER))
     {
-        L2CAP_TRACE_WARNING3 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x not LE or not master %d",
-                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
+        L2CAP_TRACE_WARNING ("%s - BD_ADDR %08x%04x not LE or not master %d", __FUNCTION__,
+                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
+                              (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
         return (FALSE);
     }
 
     if (enable)
-    {
-        p_lcb->upd_status &= ~L2C_BLE_CONN_UPDATE_DISABLE;
-    }
+        p_lcb->conn_update_mask &= ~L2C_BLE_CONN_UPDATE_DISABLE;
     else
-    {
-        p_lcb->upd_status |= L2C_BLE_CONN_UPDATE_DISABLE;
-    }
+        p_lcb->conn_update_mask |= L2C_BLE_CONN_UPDATE_DISABLE;
 
-    L2CA_InternalBleConnUpdate(p_lcb);
+    l2cble_start_conn_update(p_lcb);
 
     return (TRUE);
 }
 
-/*******************************************************************************
-**
-** Function         L2CA_HandleConnUpdateEvent
-**
-** Description      This function enables the connection update request from remote
-**                  after a successful connection update response is received.
-**
-** Returns          void
-**
-*******************************************************************************/
-void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status)
-{
-    tL2C_LCB *p_lcb;
-
-    L2CAP_TRACE_DEBUG0("L2CA_HandleConnUpdateEvent");
-
-    /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_handle(handle);
-    if (!p_lcb)
-    {
-        L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Invalid handle: %d", handle);
-        return;
-    }
-
-    p_lcb->upd_status &= ~L2C_BLE_UPDATE_PENDING;
-
-    if (status != HCI_SUCCESS)
-    {
-        L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Error status: %d", status);
-    }
-
-    L2CA_InternalBleConnUpdate(p_lcb);
-
-    L2CAP_TRACE_DEBUG1("L2CA_HandleConnUpdateEvent: upd_status=%d", p_lcb->upd_status);
-}
 
 /*******************************************************************************
 **
@@ -284,7 +221,7 @@
 
     tL2C_LCB *p_lcb;
 
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr)) != NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL)
         role = p_lcb->link_role;
 
     return role;
@@ -298,21 +235,45 @@
 ** Returns          disconnect reason
 **
 *******************************************************************************/
-UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda)
+UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport)
 {
     tL2C_LCB            *p_lcb;
     UINT16              reason = 0;
 
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda)) != NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL)
         reason = p_lcb->disc_reason;
 
-    L2CAP_TRACE_DEBUG1 ("L2CA_GetDisconnectReason=%d ",reason);
+    L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ",reason);
 
     return reason;
 }
 
 /*******************************************************************************
 **
+** Function l2cble_notify_le_connection
+**
+** Description This function notifiy the l2cap connection to the app layer
+**
+** Returns none
+**
+*******************************************************************************/
+void l2cble_notify_le_connection (BD_ADDR bda)
+{
+    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
+    tACL_CONN *p_acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE) ;
+
+    if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED)
+    {
+        /* update link status */
+        btm_establish_continue(p_acl);
+        /* update l2cap link status and send callback */
+        p_lcb->link_state = LST_CONNECTED;
+        l2cu_process_fixed_chnl_resp (p_lcb);
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         l2cble_scanner_conn_comp
 **
 ** Description      This function is called when an HCI Connection Complete
@@ -327,22 +288,22 @@
     tL2C_LCB            *p_lcb;
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (bda);
 
-    L2CAP_TRACE_DEBUG5 ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d",
+    L2CAP_TRACE_DEBUG ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d",
                         handle,  type, conn_interval, conn_latency, conn_timeout);
 
     l2cb.is_ble_connecting = FALSE;
 
     /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
 
     /* If we don't have one, create one. this is auto connection complete. */
     if (!p_lcb)
     {
-        p_lcb = l2cu_allocate_lcb (bda, FALSE);
+        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
         if (!p_lcb)
         {
             btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
-            L2CAP_TRACE_ERROR0 ("l2cble_scanner_conn_comp - failed to allocate LCB");
+            L2CAP_TRACE_ERROR ("l2cble_scanner_conn_comp - failed to allocate LCB");
             return;
         }
         else
@@ -350,14 +311,14 @@
             if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
             {
                 btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
-                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
+                L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB");
                 return ;
             }
         }
     }
     else if (p_lcb->link_state != LST_CONNECTING)
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
+        L2CAP_TRACE_ERROR ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
         return;
     }
     btu_stop_timer(&p_lcb->timer_entry);
@@ -366,9 +327,8 @@
     p_lcb->handle = handle;
 
     /* Connected OK. Change state to connected, we were scanning so we are master */
-    p_lcb->link_state = LST_CONNECTED;
     p_lcb->link_role  = HCI_ROLE_MASTER;
-    p_lcb->is_ble_link = TRUE;
+    p_lcb->transport  = BT_TRANSPORT_LE;
 
     /* If there are any preferred connection parameters, set them now */
     if ( (p_dev_rec->conn_params.min_conn_int     >= BTM_BLE_CONN_INT_MIN ) &&
@@ -384,7 +344,7 @@
           (conn_latency > p_dev_rec->conn_params.slave_latency) ||
           (conn_timeout > p_dev_rec->conn_params.supervision_tout)))
     {
-        L2CAP_TRACE_ERROR5 ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d",
+        L2CAP_TRACE_ERROR ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d",
                             handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int,
                             p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout);
 
@@ -394,21 +354,14 @@
                                            p_dev_rec->conn_params.slave_latency,
                                            p_dev_rec->conn_params.supervision_tout,
                                            0, 0);
-        p_lcb->upd_status |= L2C_BLE_UPDATE_PENDING;
     }
 
     /* Tell BTM Acl management about the link */
-    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, TRUE);
-
-    if (p_lcb->p_echo_rsp_cb)
-    {
-        L2CAP_TRACE_ERROR0 ("l2cu_send_peer_echo_req");
-        l2cu_send_peer_echo_req (p_lcb, NULL, 0);
-    }
+    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
 
     p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
 
-    l2cu_process_fixed_chnl_resp (p_lcb);
+    btm_ble_set_conn_st(BLE_CONN_IDLE);
 }
 
 
@@ -433,16 +386,16 @@
     UNUSED(conn_timeout);
 
     /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
 
     /* If we don't have one, create one and accept the connection. */
     if (!p_lcb)
     {
-        p_lcb = l2cu_allocate_lcb (bda, FALSE);
+        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
         if (!p_lcb)
         {
             btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
-            L2CAP_TRACE_ERROR0 ("l2cble_advertiser_conn_comp - failed to allocate LCB");
+            L2CAP_TRACE_ERROR ("l2cble_advertiser_conn_comp - failed to allocate LCB");
             return;
         }
         else
@@ -450,7 +403,7 @@
             if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
             {
                 btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
-                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
+                L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB");
                 return ;
             }
         }
@@ -460,18 +413,27 @@
     p_lcb->handle = handle;
 
     /* Connected OK. Change state to connected, we were advertising, so we are slave */
-    p_lcb->link_state = LST_CONNECTED;
     p_lcb->link_role  = HCI_ROLE_SLAVE;
-    p_lcb->is_ble_link = TRUE;
+    p_lcb->transport  = BT_TRANSPORT_LE;
 
     /* Tell BTM Acl management about the link */
     p_dev_rec = btm_find_or_alloc_dev (bda);
 
-    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, TRUE);
+    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
 
     p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
 
-    l2cu_process_fixed_chnl_resp (p_lcb);
+    if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(btm_cb.devcb.local_le_features))
+    {
+        p_lcb->link_state = LST_CONNECTED;
+        l2cu_process_fixed_chnl_resp (p_lcb);
+    }
+
+    /* when adv and initiating are both active, cancel the direct connection */
+    if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0)
+    {
+        L2CA_CancelBleConnectReq(bda);
+    }
 }
 
 /*******************************************************************************
@@ -496,6 +458,93 @@
         l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
     }
 }
+
+/*******************************************************************************
+**
+**  Function        l2cble_start_conn_update
+**
+**  Description     start BLE connection parameter update process based on status
+**
+**  Parameters:     lcb : l2cap link control block
+**
+**  Return value:   none
+**
+*******************************************************************************/
+static void l2cble_start_conn_update (tL2C_LCB *p_lcb)
+{
+    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr);
+
+    if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) return;
+
+    if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE)
+    {
+        /* application requests to disable parameters update.
+           If parameters are already updated, lets set them
+           up to what has been requested during connection establishement */
+        if (p_lcb->conn_update_mask & L2C_BLE_NOT_DEFAULT_PARAM)
+        {
+            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle,
+                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
+                         p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
+                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
+                         p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
+                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
+                         p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
+                (UINT16)((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
+                         p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
+                0, 0);
+            p_lcb->conn_update_mask &= ~L2C_BLE_NOT_DEFAULT_PARAM;
+            p_lcb->conn_update_mask |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NEW_CONN_PARAM);
+        }
+    }
+    else
+    {
+        /* application allows to do update, if we were delaying one do it now */
+        if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM)
+        {
+            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval,
+                p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0);
+            p_lcb->conn_update_mask &= ~L2C_BLE_NEW_CONN_PARAM;
+            p_lcb->conn_update_mask |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NOT_DEFAULT_PARAM);
+        }
+    }
+}
+
+/*******************************************************************************
+**
+** Function         l2cble_process_conn_update_evt
+**
+** Description      This function enables the connection update request from remote
+**                  after a successful connection update response is received.
+**
+** Returns          void
+**
+*******************************************************************************/
+void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status)
+{
+    tL2C_LCB *p_lcb;
+
+    L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt");
+
+    /* See if we have a link control block for the remote device */
+    p_lcb = l2cu_find_lcb_by_handle(handle);
+    if (!p_lcb)
+    {
+        L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Invalid handle: %d", handle);
+        return;
+    }
+
+    p_lcb->conn_update_mask &= ~L2C_BLE_UPDATE_PENDING;
+
+    if (status != HCI_SUCCESS)
+    {
+        L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Error status: %d", status);
+    }
+
+    l2cble_start_conn_update(p_lcb);
+
+    L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt: conn_update_mask=%d", p_lcb->conn_update_mask);
+}
 /*******************************************************************************
 **
 ** Function         l2cble_process_sig_cmd
@@ -523,7 +572,7 @@
     /* Check command length does not exceed packet length */
     if ((p + cmd_len) > p_pkt_end)
     {
-        L2CAP_TRACE_WARNING3 ("L2CAP - LE - format error, pkt_len: %d  cmd_len: %d  code: %d", pkt_len, cmd_len, cmd_code);
+        L2CAP_TRACE_WARNING ("L2CAP - LE - format error, pkt_len: %d  cmd_len: %d  code: %d", pkt_len, cmd_len, cmd_code);
         return;
     }
 
@@ -561,12 +610,13 @@
 
                     l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id);
 
-                    p_lcb->min_interval = min_interval;
-                    p_lcb->max_interval = max_interval;
-                    p_lcb->latency = latency;
-                    p_lcb->timeout = timeout;
-                    p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
-                    L2CA_InternalBleConnUpdate(p_lcb);
+                     p_lcb->min_interval = min_interval;
+                     p_lcb->max_interval = max_interval;
+                     p_lcb->latency = latency;
+                     p_lcb->timeout = timeout;
+                     p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM;
+
+                     l2cble_start_conn_update(p_lcb);
                 }
             }
             else
@@ -578,13 +628,12 @@
             break;
 
         default:
-            L2CAP_TRACE_WARNING1 ("L2CAP - LE - unknown cmd code: %d", cmd_code);
+            L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code);
             l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
             return;
     }
 }
 
-
 /*******************************************************************************
 **
 ** Function         l2cble_init_direct_conn
@@ -606,7 +655,7 @@
     /* There can be only one BLE connection request outstanding at a time */
     if (p_dev_rec == NULL)
     {
-        BTM_TRACE_WARNING0 ("unknown device, can not initate connection");
+        L2CAP_TRACE_WARNING ("unknown device, can not initate connection");
         return(FALSE);
     }
 
@@ -616,14 +665,28 @@
     init_addr_type = p_lcb->ble_addr_type;
     memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
 
-#if BTM_BLE_PRIVACY_SPT == TRUE
-    if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
+#if BLE_PRIVACY_SPT == TRUE
+    /* if RPA offloading supported */
+    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
+        btm_random_pseudo_to_public(init_addr, &init_addr_type);
+    /* otherwise, if remote is RPA enabled, use latest RPA */
+    else if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
     {
         init_addr_type = BLE_ADDR_RANDOM;
         memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
     }
+    /* if privacy is on and current do not consider using reconnection address */
+    if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */
+        own_addr_type = BLE_ADDR_RANDOM;
 #endif
 
+    if (!btm_ble_topology_check(BTM_BLE_STATE_INIT))
+    {
+        l2cu_release_lcb (p_lcb);
+        L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation");
+        return FALSE;
+    }
+
     if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int      */
                                         scan_win, /* UINT16 scan_win      */
                                         FALSE,                   /* UINT8 white_list     */
@@ -635,14 +698,14 @@
         (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
         p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),  /* conn_int_max  */
         (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
-        p_dev_rec->conn_params.slave_latency : 0), /* UINT16 conn_latency  */
+        p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency  */
         (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
-        p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_SUP_TOUT_DEF), /* conn_timeout */
+        p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */
                                         0,                       /* UINT16 min_len       */
                                         0))                      /* UINT16 max_len       */
     {
         l2cu_release_lcb (p_lcb);
-        L2CAP_TRACE_ERROR0("initate direct connection fail, no resources");
+        L2CAP_TRACE_ERROR("initate direct connection fail, no resources");
         return (FALSE);
     }
     else
@@ -678,7 +741,7 @@
     }
     else
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
+        L2CAP_TRACE_WARNING ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
 
         btm_ble_enqueue_direct_conn_req(p_lcb);
 
@@ -712,4 +775,170 @@
     l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs;
 }
 
+/*******************************************************************************
+**
+** Function         l2c_ble_link_adjust_allocation
+**
+** Description      This function is called when a link is created or removed
+**                  to calculate the amount of packets each link may send to
+**                  the HCI without an ack coming back.
+**
+**                  Currently, this is a simple allocation, dividing the
+**                  number of Controller Packets by the number of links. In
+**                  the future, QOS configuration should be examined.
+**
+** Returns          void
+**
+*******************************************************************************/
+void l2c_ble_link_adjust_allocation (void)
+{
+    UINT16      qq, yy, qq_remainder;
+    tL2C_LCB    *p_lcb;
+    UINT16      hi_quota, low_quota;
+    UINT16      num_lowpri_links = 0;
+    UINT16      num_hipri_links  = 0;
+    UINT16      controller_xmit_quota = l2cb.num_lm_ble_bufs;
+    UINT16      high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A;
+
+    /* If no links active, reset buffer quotas and controller buffers */
+    if (l2cb.num_ble_links_active == 0)
+    {
+        l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs;
+        l2cb.ble_round_robin_quota = l2cb.ble_round_robin_unacked = 0;
+        return;
+    }
+
+    /* First, count the links */
+    for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
+    {
+        if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE)
+        {
+            if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+                num_hipri_links++;
+            else
+                num_lowpri_links++;
+        }
+    }
+
+    /* now adjust high priority link quota */
+    low_quota = num_lowpri_links ? 1 : 0;
+    while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota )
+        high_pri_link_quota--;
+
+
+    /* Work out the xmit quota and buffer quota high and low priorities */
+    hi_quota  = num_hipri_links * high_pri_link_quota;
+    low_quota = (hi_quota < controller_xmit_quota) ? controller_xmit_quota - hi_quota : 1;
+
+    /* Work out and save the HCI xmit quota for each low priority link */
+
+    /* If each low priority link cannot have at least one buffer */
+    if (num_lowpri_links > low_quota)
+    {
+        l2cb.ble_round_robin_quota = low_quota;
+        qq = qq_remainder = 1;
+    }
+    /* If each low priority link can have at least one buffer */
+    else if (num_lowpri_links > 0)
+    {
+        l2cb.ble_round_robin_quota = 0;
+        l2cb.ble_round_robin_unacked = 0;
+        qq = low_quota / num_lowpri_links;
+        qq_remainder = low_quota % num_lowpri_links;
+    }
+    /* If no low priority link */
+    else
+    {
+        l2cb.ble_round_robin_quota = 0;
+        l2cb.ble_round_robin_unacked = 0;
+        qq = qq_remainder = 1;
+    }
+    L2CAP_TRACE_EVENT ("l2c_ble_link_adjust_allocation  num_hipri: %u  num_lowpri: %u  low_quota: %u  round_robin_quota: %u  qq: %u",
+                        num_hipri_links, num_lowpri_links, low_quota,
+                        l2cb.ble_round_robin_quota, qq);
+
+    /* Now, assign the quotas to each link */
+    for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++)
+    {
+        if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE)
+        {
+            if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+            {
+                p_lcb->link_xmit_quota   = high_pri_link_quota;
+            }
+            else
+            {
+                /* Safety check in case we switched to round-robin with something outstanding */
+                /* if sent_not_acked is added into round_robin_unacked then don't add it again */
+                /* l2cap keeps updating sent_not_acked for exiting from round robin */
+                if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 ))
+                    l2cb.ble_round_robin_unacked += p_lcb->sent_not_acked;
+
+                p_lcb->link_xmit_quota   = qq;
+                if (qq_remainder > 0)
+                {
+                    p_lcb->link_xmit_quota++;
+                    qq_remainder--;
+                }
+            }
+
+            L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d   Priority: %d  XmitQuota: %d",
+                                yy, p_lcb->acl_priority, p_lcb->link_xmit_quota);
+
+            L2CAP_TRACE_EVENT("        SentNotAcked: %d  RRUnacked: %d",
+                                p_lcb->sent_not_acked, l2cb.round_robin_unacked);
+
+            /* There is a special case where we have readjusted the link quotas and  */
+            /* this link may have sent anything but some other link sent packets so  */
+            /* so we may need a timer to kick off this link's transmissions.         */
+            if ( (p_lcb->link_state == LST_CONNECTED)
+              && (p_lcb->link_xmit_data_q.count)
+              && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) )
+                btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT);
+        }
+    }
+}
+
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+/*******************************************************************************
+**
+** Function         l2cble_process_rc_param_request_evt
+**
+** Description      process LE Remote Connection Parameter Request Event.
+**
+** Returns          void
+**
+*******************************************************************************/
+void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
+                                     UINT16 latency, UINT16 timeout)
+{
+    tL2C_LCB    *p_lcb = l2cu_find_lcb_by_handle (handle);
+
+    if (p_lcb != NULL)
+    {
+        p_lcb->min_interval = int_min;
+        p_lcb->max_interval = int_max;
+        p_lcb->latency = latency;
+        p_lcb->timeout = timeout;
+
+        /* if update is enabled, always accept connection parameter update */
+        if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0)
+        {
+            btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0);
+        }
+        else
+        {
+            L2CAP_TRACE_EVENT ("L2CAP - LE - update currently disabled");
+            btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL);
+        }
+
+    }
+    else
+    {
+        L2CAP_TRACE_WARNING("No link to update connection parameter")
+    }
+}
+#endif
+
+
 #endif /* (BLE_INCLUDED == TRUE) */
diff --git a/stack/l2cap/l2c_csm.c b/stack/l2cap/l2c_csm.c
index 4e24c23..fa261b2 100644
--- a/stack/l2cap/l2c_csm.c
+++ b/stack/l2cap/l2c_csm.c
@@ -128,9 +128,9 @@
     if (p_ccb->p_rcb == NULL)
     {
 #if (BT_TRACE_VERBOSE == TRUE)
-        L2CAP_TRACE_ERROR2 ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event));
+        L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s p_rcb == NULL", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-        L2CAP_TRACE_ERROR2 ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
+        L2CAP_TRACE_ERROR ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: 0x%04x p_rcb == NULL", p_ccb->local_cid, event);
 #endif
         return;
     }
@@ -151,15 +151,15 @@
     connect_cfm    = p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CLOSED  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: CLOSED evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: CLOSED evt: %d", event);
 #endif
 
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -175,7 +175,7 @@
         if (p_ci->status != HCI_ERR_CONNECTION_EXISTS
             || !btm_acl_notif_conn_collision(p_ccb->p_lcb->remote_bd_addr))
         {
-            L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, p_ci->status);
+            L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, p_ci->status);
             l2cu_release_ccb (p_ccb);
             (*connect_cfm)(local_cid, p_ci->status);
         }
@@ -230,7 +230,7 @@
         break;
 
     case L2CEVT_SEC_COMP_NEG:                           /* something is really bad with security */
-        L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
+        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
         l2cu_release_ccb (p_ccb);
         (*connect_cfm)(local_cid, L2CAP_CONN_SECURITY_BLOCK);
         break;
@@ -270,7 +270,7 @@
         break;
 
     case L2CEVT_TIMEOUT:
-        L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
+        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, L2CAP_CONN_TIMEOUT);
         l2cu_release_ccb (p_ccb);
         (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
         break;
@@ -304,9 +304,9 @@
     UINT16                  local_cid = p_ccb->local_cid;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: ORIG_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: ORIG_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: ORIG_W4_SEC_COMP evt: %d", event);
 #endif
 
 #if (L2CAP_UCD_INCLUDED == TRUE)
@@ -324,7 +324,7 @@
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                   /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -355,7 +355,7 @@
         break;
 
     case L2CEVT_SEC_COMP_NEG:
-        L2CAP_TRACE_API2 ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
+        L2CAP_TRACE_API ("L2CAP - Calling ConnectCfm_Cb(), CID: 0x%04x  Status: %d", p_ccb->local_cid, HCI_ERR_AUTH_FAILURE);
 
         /* If last channel immediately disconnect the ACL for better security.
            Also prevents a race condition between BTM and L2CAP */
@@ -396,9 +396,9 @@
 static void l2c_csm_term_w4_sec_comp (tL2C_CCB *p_ccb, UINT16 event, void *p_data)
 {
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: TERM_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: TERM_W4_SEC_COMP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: TERM_W4_SEC_COMP evt: %d", event);
 #endif
 
 #if (L2CAP_UCD_INCLUDED == TRUE)
@@ -430,7 +430,7 @@
         {
             /* Don't need to get info from peer or already retrieved so continue */
             btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
-            L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
+            L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
 
             (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr, p_ccb->local_cid,
                                                       p_ccb->p_rcb->psm, p_ccb->remote_id);
@@ -486,7 +486,7 @@
         /* SM4 related. */
         if (!btsnd_hcic_disconnect (p_ccb->p_lcb->handle, HCI_ERR_AUTH_FAILURE))
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
+            L2CAP_TRACE_API ("L2CAP - Calling btsnd_hcic_disconnect for handle %i failed", p_ccb->p_lcb->handle);
             btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, 1);
         }
         break;
@@ -517,9 +517,9 @@
     UINT16                  local_cid = p_ccb->local_cid;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_CON_RSP evt: %d", event);
 #endif
 
     switch (event)
@@ -530,7 +530,7 @@
         p_ccb->chnl_state = CST_CLOSED;
         if ((p_ccb->flags & CCB_FLAG_NO_RETRY) || !p_data || (*((UINT8 *)p_data) != HCI_ERR_PEER_USER))
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
+            L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed",
                               p_ccb->local_cid);
             l2cu_release_ccb (p_ccb);
             (*disconnect_ind)(local_cid, FALSE);
@@ -542,7 +542,7 @@
         p_ccb->remote_cid = p_ci->remote_cid;
         p_ccb->chnl_state = CST_CONFIG;
         btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CFG_TIMEOUT);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Success", p_ccb->local_cid);
 
         (*p_ccb->p_rcb->api.pL2CA_ConnectCfm_Cb)(local_cid, L2CAP_CONN_OK);
         break;
@@ -552,19 +552,19 @@
         btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT_EXT);
         if (p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
+            L2CAP_TRACE_API ("L2CAP - Calling Connect_Pnd_Cb(), CID: 0x%04x", p_ccb->local_cid);
             (*p_ccb->p_rcb->api.pL2CA_ConnectPnd_Cb)(p_ccb->local_cid);
         }
         break;
 
     case L2CEVT_L2CAP_CONNECT_RSP_NEG:              /* Peer rejected connection */
-        L2CAP_TRACE_API2 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
+        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Failure Code: %d", p_ccb->local_cid, p_ci->l2cap_result);
         l2cu_release_ccb (p_ccb);
         (*connect_cfm)(local_cid, p_ci->l2cap_result);
         break;
 
     case L2CEVT_TIMEOUT:
-        L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Connect_Cfm_Cb(), CID: 0x%04x, Timeout", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*connect_cfm)(local_cid, L2CAP_CONN_TIMEOUT);
         break;
@@ -621,15 +621,15 @@
     UINT16                  local_cid = p_ccb->local_cid;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: W4_L2CA_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CA_CON_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_CON_RSP evt: %d", event);
 #endif
 
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -660,7 +660,7 @@
 
     case L2CEVT_TIMEOUT:
         l2cu_send_peer_connect_rsp (p_ccb, L2CAP_CONN_NO_PSM, 0);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -679,7 +679,7 @@
     case L2CEVT_L2CAP_INFO_RSP:
         /* We have feature info, so now give the upper layer connect IND */
         btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_CONNECT_TOUT);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Connect_Ind_Cb(), CID: 0x%04x", p_ccb->local_cid);
 
         (*p_ccb->p_rcb->api.pL2CA_ConnectInd_Cb) (p_ccb->p_lcb->remote_bd_addr,
                                                   p_ccb->local_cid,
@@ -708,15 +708,15 @@
     UINT8                   cfg_result;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: CONFIG  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: CONFIG  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: CONFIG evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: CONFIG evt: %d", event);
 #endif
 
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -725,19 +725,19 @@
 
         if ((cfg_result = l2cu_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_OK)
         {
-            L2CAP_TRACE_EVENT2 ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
+            L2CAP_TRACE_EVENT ("L2CAP - Calling Config_Req_Cb(), CID: 0x%04x, C-bit %d",
                                 p_ccb->local_cid, (p_cfg->flags & L2CAP_CFG_FLAGS_MASK_CONT));
             (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, p_cfg);
         }
         else if (cfg_result == L2CAP_PEER_CFG_DISCONNECT)
         {
             /* Disconnect if channels are incompatible */
-            L2CAP_TRACE_EVENT0 ("L2CAP - incompatible configurations disconnect");
+            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations disconnect");
             l2cu_disconnect_chnl (p_ccb);
         }
         else /* Return error to peer so he can renegotiate if possible */
         {
-            L2CAP_TRACE_EVENT0 ("L2CAP - incompatible configurations trying reconfig");
+            L2CAP_TRACE_EVENT ("L2CAP - incompatible configurations trying reconfig");
             l2cu_send_peer_config_rsp (p_ccb, p_cfg);
         }
         break;
@@ -760,7 +760,7 @@
                 if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
                 {
                     l2cu_send_peer_disc_req (p_ccb);
-                    L2CAP_TRACE_WARNING1 ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+                    L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
                     l2cu_release_ccb (p_ccb);
                     (*disconnect_ind)(local_cid, FALSE);
                     break;
@@ -796,7 +796,7 @@
             }
         }
 
-        L2CAP_TRACE_API1 ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x", p_ccb->local_cid);
         (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
         break;
 
@@ -807,7 +807,7 @@
         /* If failure was channel mode try to renegotiate */
         if (l2c_fcr_renegotiate_chan(p_ccb, p_cfg) == FALSE)
         {
-            L2CAP_TRACE_API2 ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
+            L2CAP_TRACE_API ("L2CAP - Calling Config_Rsp_Cb(), CID: 0x%04x, Failure: %d", p_ccb->local_cid, p_cfg->result);
             (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid, p_cfg);
         }
         break;
@@ -815,7 +815,7 @@
     case L2CEVT_L2CAP_DISCONNECT_REQ:                  /* Peer disconnected request */
         btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
         p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
         (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
         break;
 
@@ -849,7 +849,7 @@
             if (p_ccb->our_cfg.fcr.mode != p_ccb->peer_cfg.fcr.mode)
             {
                 l2cu_send_peer_disc_req (p_ccb);
-                L2CAP_TRACE_WARNING1 ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+                L2CAP_TRACE_WARNING ("L2CAP - Calling Disconnect_Ind_Cb(Incompatible CFG), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
                 l2cu_release_ccb (p_ccb);
                 (*disconnect_ind)(local_cid, FALSE);
                 break;
@@ -890,7 +890,7 @@
         break;
 
     case L2CEVT_L2CAP_DATA:                        /* Peer data packet rcvd    */
-        L2CAP_TRACE_API1 ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling DataInd_Cb(), CID: 0x%04x", p_ccb->local_cid);
 #if (L2CAP_NUM_FIXED_CHNLS > 0)
         if (p_ccb->local_cid >= L2CAP_FIRST_FIXED_CHNL &&
                 p_ccb->local_cid <= L2CAP_LAST_FIXED_CHNL)
@@ -917,7 +917,7 @@
 
     case L2CEVT_TIMEOUT:
         l2cu_send_peer_disc_req (p_ccb);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
@@ -944,9 +944,9 @@
     UINT8                   cfg_result;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: OPEN  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: OPEN  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: OPEN evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: OPEN evt: %d", event);
 #endif
 
 #if (L2CAP_UCD_INCLUDED == TRUE)
@@ -964,7 +964,7 @@
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         if (p_ccb->p_rcb)
             (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(local_cid, FALSE);
@@ -1015,6 +1015,7 @@
 #if BTM_PWR_MGR_INCLUDED == TRUE
         {
             tBTM_PM_PWR_MD settings;
+            memset((void*)&settings, 0, sizeof(settings));
             settings.mode = BTM_PM_MD_ACTIVE;
             BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
         }
@@ -1025,7 +1026,7 @@
 
         p_ccb->chnl_state = CST_W4_L2CA_DISCONNECT_RSP;
         btu_start_timer (&p_ccb->timer_entry, BTU_TTYPE_L2CAP_CHNL, L2CAP_CHNL_DISCONNECT_TOUT);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  Conf Needed", p_ccb->local_cid);
         (*p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb)(p_ccb->local_cid, TRUE);
         break;
 
@@ -1038,6 +1039,7 @@
 #if BTM_PWR_MGR_INCLUDED == TRUE
         {
             tBTM_PM_PWR_MD settings;
+            memset((void*)&settings, 0, sizeof(settings));
             settings.mode = BTM_PM_MD_ACTIVE;
             BTM_SetPowerMode (BTM_PM_SET_ONLY_ID, p_ccb->p_lcb->remote_bd_addr, &settings);
         }
@@ -1092,9 +1094,9 @@
     UINT16                  local_cid = p_ccb->local_cid;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CAP_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CAP_DISC_RSP evt: %d", event);
 #endif
 
     switch (event)
@@ -1103,7 +1105,7 @@
         l2cu_release_ccb (p_ccb);
         if (disconnect_cfm)
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
             (*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
         }
         break;
@@ -1113,7 +1115,7 @@
         l2cu_release_ccb (p_ccb);
         if (disconnect_cfm)
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
             (*disconnect_cfm)(local_cid, L2CAP_DISC_OK);
         }
        break;
@@ -1123,7 +1125,7 @@
         l2cu_release_ccb (p_ccb);
         if (disconnect_cfm)
         {
-            L2CAP_TRACE_API1 ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
+            L2CAP_TRACE_API ("L2CAP - Calling DisconnectCfm_Cb(), CID: 0x%04x", local_cid);
             (*disconnect_cfm)(local_cid, L2CAP_DISC_TIMEOUT);
         }
         break;
@@ -1152,22 +1154,22 @@
     UINT16                  local_cid = p_ccb->local_cid;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    L2CAP_TRACE_EVENT2 ("L2CAP - LCID: 0x%04x  st: W4_L2CA_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
+    L2CAP_TRACE_EVENT ("L2CAP - LCID: 0x%04x  st: W4_L2CA_DISC_RSP  evt: %s", p_ccb->local_cid, l2c_csm_get_event_name (event));
 #else
-    L2CAP_TRACE_EVENT1 ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
+    L2CAP_TRACE_EVENT ("L2CAP - st: W4_L2CA_DISC_RSP evt: %d", event);
 #endif
 
     switch (event)
     {
     case L2CEVT_LP_DISCONNECT_IND:                  /* Link was disconnected */
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
 
     case L2CEVT_TIMEOUT:
         l2cu_send_peer_disc_rsp (p_ccb->p_lcb, p_ccb->remote_id, p_ccb->local_cid, p_ccb->remote_cid);
-        L2CAP_TRACE_API1 ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
+        L2CAP_TRACE_API ("L2CAP - Calling Disconnect_Ind_Cb(), CID: 0x%04x  No Conf Needed", p_ccb->local_cid);
         l2cu_release_ccb (p_ccb);
         (*disconnect_ind)(local_cid, FALSE);
         break;
diff --git a/stack/l2cap/l2c_fcr.c b/stack/l2cap/l2c_fcr.c
index 9685f77..6e12607 100644
--- a/stack/l2cap/l2c_fcr.c
+++ b/stack/l2cap/l2c_fcr.c
@@ -186,7 +186,7 @@
         tout = (UINT32)p_ccb->our_cfg.fcr.rtrans_tout;
     }
 /*
-    L2CAP_TRACE_DEBUG4 ("l2c_fcr_start_timer Tout: %u  Already Running: %u  wait_ack: %u  ack_q_count: %u",
+    L2CAP_TRACE_DEBUG ("l2c_fcr_start_timer Tout: %u  Already Running: %u  wait_ack: %u  ack_q_count: %u",
                         tout, p_ccb->timer_entry.in_use, p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
 */
     /* Only start a timer that was not started */
@@ -208,7 +208,7 @@
     if (p_ccb->fcrb.mon_retrans_timer.in_use)
     {
 /*
-        L2CAP_TRACE_DEBUG2 ("l2c_fcr_stop_timer wait_ack: %u  ack_q_count: %u",
+        L2CAP_TRACE_DEBUG ("l2c_fcr_stop_timer wait_ack: %u  ack_q_count: %u",
                             p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
 */
         btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer);
@@ -254,14 +254,14 @@
         UINT32  throughput_avg, ack_delay_avg, ack_q_count_avg;
 
         dur = GKI_OS_TICKS_TO_MS(dur);
-        BT_TRACE_2(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "---  L2CAP ERTM  Stats for CID: 0x%04x   Duration: %08ums", p_ccb->local_cid, dur);
-        BT_TRACE_4(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "Retransmissions:%08u Times Flow Controlled:%08u Retrans Touts:%08u Ack Touts:%08u",
                     p_ccb->fcrb.pkts_retransmitted, p_ccb->fcrb.xmit_window_closed, p_ccb->fcrb.retrans_touts, p_ccb->fcrb.xmit_ack_touts);
-        BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "Times there is less than 2 packets in controller when flow controlled:%08u", p_ccb->fcrb.controller_idle);
-        BT_TRACE_2(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "max_held_acks:%08u, in_cfg.fcr.tx_win_sz:%08u", p_ccb->fcrb.max_held_acks, p_ccb->peer_cfg.fcr.tx_win_sz );
         if (p_str)
         {
@@ -270,14 +270,14 @@
                 (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[0] * 100) / (dur / 10) : 0),
                 p_ccb->fcrb.s_frames_sent[0], p_ccb->fcrb.s_frames_sent[1], p_ccb->fcrb.s_frames_sent[2], p_ccb->fcrb.s_frames_sent[3]);
 
-            BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+            BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
 
             sprintf(p_str, "Rcvd Pkts:%08u Bytes:%10u(%06u/sec) RR:%08u REJ:%08u RNR:%08u SREJ:%08u",
                 p_ccb->fcrb.ertm_pkt_counts[1], p_ccb->fcrb.ertm_byte_counts[1],
                 (dur >= 10 ? (p_ccb->fcrb.ertm_byte_counts[1] * 100) / (dur / 10) : 0),
                 p_ccb->fcrb.s_frames_rcvd[0], p_ccb->fcrb.s_frames_rcvd[1], p_ccb->fcrb.s_frames_rcvd[2], p_ccb->fcrb.s_frames_rcvd[3]);
 
-            BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+            BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
 
             throughput_avg  = 0;
             ack_delay_avg   = 0;
@@ -287,7 +287,7 @@
             {
                 if (i == p_ccb->fcrb.ack_delay_avg_index )
                 {
-                    BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+                    BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                            "[%02u] collecting data ...", i );
                     continue;
                 }
@@ -297,7 +297,7 @@
                         p_ccb->fcrb.ack_delay_avg[i], p_ccb->fcrb.ack_delay_min[i], p_ccb->fcrb.ack_delay_max[i],
                         p_ccb->fcrb.ack_q_count_avg[i], p_ccb->fcrb.ack_q_count_min[i], p_ccb->fcrb.ack_q_count_max[i] );
 
-                BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
+                BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", p_str);
 
                 throughput_avg  += p_ccb->fcrb.throughput[i];
                 ack_delay_avg   += p_ccb->fcrb.ack_delay_avg[i];
@@ -308,14 +308,14 @@
             ack_delay_avg   /= (L2CAP_ERTM_STATS_NUM_AVG - 1);
             ack_q_count_avg /= (L2CAP_ERTM_STATS_NUM_AVG - 1);
 
-            BT_TRACE_3(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+            BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "throughput_avg: %8u (kbytes/sec), ack_delay_avg: %8u ms, ack_q_count_avg: %8u",
                     throughput_avg, ack_delay_avg, ack_q_count_avg );
 
             GKI_freebuf(p_str);
         }
 
-        BT_TRACE_0(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC,
                    "---");
     }
 #endif
@@ -340,7 +340,7 @@
     /* If using the common pool, should be at least 10% free. */
     if ( (pool == HCI_ACL_POOL_ID) && (GKI_poolutilization (pool) > 90) )
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - failed to clone buffer on HCI_ACL_POOL_ID Utilization: %u", GKI_poolutilization(pool));
+        L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer on HCI_ACL_POOL_ID Utilization: %u", GKI_poolutilization(pool));
         return (NULL);
     }
 
@@ -351,7 +351,7 @@
         /* Make sure buffer fits into buffer pool */
         if ((no_of_bytes + sizeof(BT_HDR) + new_offset) > pool_buf_size)
         {
-            L2CAP_TRACE_ERROR5("##### l2c_fcr_clone_buf (NumBytes %d) -> Exceeds poolsize %d [bytes %d + BT_HDR %d + offset %d]",
+            L2CAP_TRACE_ERROR("##### l2c_fcr_clone_buf (NumBytes %d) -> Exceeds poolsize %d [bytes %d + BT_HDR %d + offset %d]",
                                (no_of_bytes + sizeof(BT_HDR) + new_offset),
                                pool_buf_size, no_of_bytes, sizeof(BT_HDR),
                                new_offset);
@@ -369,7 +369,7 @@
     }
     else
     {
-        L2CAP_TRACE_ERROR2 ("L2CAP - failed to clone buffer, Pool: %u  Count: %u", pool,  GKI_poolfreecount(pool));
+        L2CAP_TRACE_ERROR ("L2CAP - failed to clone buffer, Pool: %u  Count: %u", pool,  GKI_poolfreecount(pool));
     }
 
     return (p_buf2);
@@ -485,7 +485,7 @@
 #if BT_TRACE_VERBOSE == TRUE
     if (is_retransmission)
     {
-        L2CAP_TRACE_EVENT6 ("L2CAP eRTM ReTx I-frame  CID: 0x%04x  Len: %u  SAR: %s  TxSeq: %u  ReqSeq: %u  F: %u",
+        L2CAP_TRACE_EVENT ("L2CAP eRTM ReTx I-frame  CID: 0x%04x  Len: %u  SAR: %s  TxSeq: %u  ReqSeq: %u  F: %u",
                             p_ccb->local_cid, p_buf->len,
                             SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
                             (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -494,7 +494,7 @@
     }
     else
     {
-        L2CAP_TRACE_EVENT6 ("L2CAP eRTM Tx I-frame CID: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
+        L2CAP_TRACE_EVENT ("L2CAP eRTM Tx I-frame CID: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
                             p_ccb->local_cid, p_buf->len,
                             SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
                             (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -590,23 +590,23 @@
         if ((((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 1)
          || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3))
         {
-            L2CAP_TRACE_WARNING6 ("L2CAP eRTM Tx S-frame  CID: 0x%04x  ctrlword: 0x%04x  Type: %s  ReqSeq: %u  P: %u  F: %u",
+            L2CAP_TRACE_WARNING ("L2CAP eRTM Tx S-frame  CID: 0x%04x  ctrlword: 0x%04x  Type: %s  ReqSeq: %u  P: %u  F: %u",
                             p_ccb->local_cid, ctrl_word,
                             SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
                             (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
                             (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT,
                             (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
-            L2CAP_TRACE_WARNING1 ("                  Buf Len: %u", p_buf->len);
+            L2CAP_TRACE_WARNING ("                  Buf Len: %u", p_buf->len);
         }
         else
         {
-            L2CAP_TRACE_EVENT6 ("L2CAP eRTM Tx S-frame  CID: 0x%04x  ctrlword: 0x%04x  Type: %s  ReqSeq: %u  P: %u  F: %u",
+            L2CAP_TRACE_EVENT ("L2CAP eRTM Tx S-frame  CID: 0x%04x  ctrlword: 0x%04x  Type: %s  ReqSeq: %u  P: %u  F: %u",
                             p_ccb->local_cid, ctrl_word,
                             SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
                             (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
                             (ctrl_word & L2CAP_FCR_P_BIT) >> L2CAP_FCR_P_BIT_SHIFT,
                             (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
-            L2CAP_TRACE_EVENT1 ("                  Buf Len: %u", p_buf->len);
+            L2CAP_TRACE_EVENT ("                  Buf Len: %u", p_buf->len);
         }
 #endif  /* BT_TRACE_VERBOSE */
 
@@ -619,7 +619,7 @@
     }
     else
     {
-        L2CAP_TRACE_ERROR2 ("l2c_fcr_send_S_frame(No Resources) cid 0x%04x, Type: 0x%4x",
+        L2CAP_TRACE_ERROR ("l2c_fcr_send_S_frame(No Resources) cid 0x%04x, Type: 0x%4x",
                              p_ccb->local_cid, function_code);
     }
 }
@@ -648,7 +648,7 @@
 
     if (p_buf->len < min_pdu_len)
     {
-        L2CAP_TRACE_WARNING2 ("Rx L2CAP PDU: CID: 0x%04x  Len too short: %u", p_ccb->local_cid, p_buf->len);
+        L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x  Len too short: %u", p_ccb->local_cid, p_buf->len);
         GKI_freebuf (p_buf);
         return;
     }
@@ -670,7 +670,7 @@
          || (((ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT) == 3))
         {
             /* REJ or SREJ */
-            L2CAP_TRACE_WARNING6 ("L2CAP eRTM Rx S-frame: cid: 0x%04x  Len: %u  Type: %s  ReqSeq: %u  P: %u  F: %u",
+            L2CAP_TRACE_WARNING ("L2CAP eRTM Rx S-frame: cid: 0x%04x  Len: %u  Type: %s  ReqSeq: %u  P: %u  F: %u",
                             p_ccb->local_cid, p_buf->len,
                             SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
                             (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
@@ -679,7 +679,7 @@
         }
         else
         {
-            L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx S-frame: cid: 0x%04x  Len: %u  Type: %s  ReqSeq: %u  P: %u  F: %u",
+            L2CAP_TRACE_EVENT ("L2CAP eRTM Rx S-frame: cid: 0x%04x  Len: %u  Type: %s  ReqSeq: %u  P: %u  F: %u",
                             p_ccb->local_cid, p_buf->len,
                             SUP_types[(ctrl_word & L2CAP_FCR_SUP_BITS) >> L2CAP_FCR_SUP_SHIFT],
                             (ctrl_word & L2CAP_FCR_REQ_SEQ_BITS) >> L2CAP_FCR_REQ_SEQ_BITS_SHIFT,
@@ -689,7 +689,7 @@
     }
     else
     {
-        L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx I-frame: cid: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
+        L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
                             p_ccb->local_cid, p_buf->len,
                             SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
                             (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -697,7 +697,7 @@
                             (ctrl_word & L2CAP_FCR_F_BIT) >> L2CAP_FCR_F_BIT_SHIFT);
     }
 
-    L2CAP_TRACE_EVENT6 ("      eRTM Rx Nxt_tx_seq %u, Lst_rx_ack %u, Nxt_seq_exp %u, Lst_ack_snt %u, wt_q.cnt %u, tries %u",
+    L2CAP_TRACE_EVENT ("      eRTM Rx Nxt_tx_seq %u, Lst_rx_ack %u, Nxt_seq_exp %u, Lst_ack_snt %u, wt_q.cnt %u, tries %u",
                         p_ccb->fcrb.next_tx_seq, p_ccb->fcrb.last_rx_ack, p_ccb->fcrb.next_seq_expected,
                         p_ccb->fcrb.last_ack_sent, p_ccb->fcrb.waiting_for_ack_q.count, p_ccb->fcrb.num_tries);
 
@@ -723,7 +723,7 @@
 
         if (l2c_fcr_rx_get_fcs(p_buf) != fcs)
         {
-            L2CAP_TRACE_WARNING1 ("Rx L2CAP PDU: CID: 0x%04x  BAD FCS", p_ccb->local_cid);
+            L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x  BAD FCS", p_ccb->local_cid);
             GKI_freebuf(p_buf);
             return;
         }
@@ -812,7 +812,7 @@
 
                 STREAM_TO_UINT16 (ctrl_word, p);
 
-                L2CAP_TRACE_DEBUG3 ("l2c_fcr_proc_pdu() CID: 0x%04x  Process Buffer from SREJ_Hold_Q   TxSeq: %u  Expected_Seq: %u",
+                L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() CID: 0x%04x  Process Buffer from SREJ_Hold_Q   TxSeq: %u  Expected_Seq: %u",
                                     p_ccb->local_cid, (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
                                     p_ccb->fcrb.next_seq_expected);
 
@@ -838,7 +838,7 @@
             l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RR, 0);
         else
         {
-            L2CAP_TRACE_DEBUG6 ("l2c_fcr_proc_pdu() not sending RR CID: 0x%04x  local_busy:%d rej_sent:%d srej_sent:%d Expected_Seq:%u Last_Ack:%u",
+            L2CAP_TRACE_DEBUG ("l2c_fcr_proc_pdu() not sending RR CID: 0x%04x  local_busy:%d rej_sent:%d srej_sent:%d Expected_Seq:%u Last_Ack:%u",
                                 p_ccb->local_cid, p_ccb->fcrb.local_busy, p_ccb->fcrb.rej_sent, p_ccb->fcrb.srej_sent, p_ccb->fcrb.next_seq_expected,
                                 p_ccb->fcrb.last_ack_sent);
         }
@@ -864,7 +864,7 @@
 *******************************************************************************/
 void l2c_fcr_proc_tout (tL2C_CCB *p_ccb)
 {
-    L2CAP_TRACE_DEBUG5 ("l2c_fcr_proc_tout:  CID: 0x%04x  num_tries: %u (max: %u)  wait_ack: %u  ack_q_count: %u",
+    L2CAP_TRACE_DEBUG ("l2c_fcr_proc_tout:  CID: 0x%04x  num_tries: %u (max: %u)  wait_ack: %u  ack_q_count: %u",
                         p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit,
                         p_ccb->fcrb.wait_ack, p_ccb->fcrb.waiting_for_ack_q.count);
 
@@ -900,7 +900,7 @@
 *******************************************************************************/
 void l2c_fcr_proc_ack_tout (tL2C_CCB *p_ccb)
 {
-    L2CAP_TRACE_DEBUG5 ("l2c_fcr_proc_ack_tout:  CID: 0x%04x State: %u  Wack:%u  Rq:%d  Acked:%d", p_ccb->local_cid,
+    L2CAP_TRACE_DEBUG ("l2c_fcr_proc_ack_tout:  CID: 0x%04x State: %u  Wack:%u  Rq:%d  Acked:%d", p_ccb->local_cid,
                         p_ccb->chnl_state, p_ccb->fcrb.wait_ack, p_ccb->fcrb.next_seq_expected, p_ccb->fcrb.last_ack_sent);
 
     if ( (p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack)
@@ -954,7 +954,7 @@
     if (num_bufs_acked > p_fcrb->waiting_for_ack_q.count)
     {
         /* The channel is closed if ReqSeq is not in range */
-        L2CAP_TRACE_WARNING4 ("L2CAP eRTM Frame BAD Req_Seq - ctrl_word: 0x%04x  req_seq 0x%02x  last_rx_ack: 0x%02x  QCount: %u",
+        L2CAP_TRACE_WARNING ("L2CAP eRTM Frame BAD Req_Seq - ctrl_word: 0x%04x  req_seq 0x%02x  last_rx_ack: 0x%02x  QCount: %u",
                                ctrl_word, req_seq, p_fcrb->last_rx_ack, p_fcrb->waiting_for_ack_q.count);
 
         l2cu_disconnect_chnl (p_ccb);
@@ -962,7 +962,7 @@
     }
 
 /*
-    L2CAP_TRACE_DEBUG3 ("L2CAP process_reqseq 0x%02x  last_rx_ack: 0x%02x  QCount: %u",
+    L2CAP_TRACE_DEBUG ("L2CAP process_reqseq 0x%02x  last_rx_ack: 0x%02x  QCount: %u",
                            req_seq, p_fcrb->last_rx_ack, p_fcrb->waiting_for_ack_q.count);
 */
     p_fcrb->last_rx_ack = req_seq;
@@ -1028,10 +1028,10 @@
 
     if (p_buf->len != 0)
     {
-        L2CAP_TRACE_WARNING1 ("Incorrect S-frame Length (%d)", p_buf->len);
+        L2CAP_TRACE_WARNING ("Incorrect S-frame Length (%d)", p_buf->len);
     }
 
-    L2CAP_TRACE_DEBUG2 ("process_s_frame ctrl_word 0x%04x fcrb_remote_busy:%d", ctrl_word, p_fcrb->remote_busy);
+    L2CAP_TRACE_DEBUG ("process_s_frame ctrl_word 0x%04x fcrb_remote_busy:%d", ctrl_word, p_fcrb->remote_busy);
 
 #if (L2CAP_ERTM_STATS == TRUE)
     p_ccb->fcrb.s_frames_rcvd[s_frame_type]++;
@@ -1086,7 +1086,7 @@
     }
     else
     {
-        L2CAP_TRACE_DEBUG0 ("process_s_frame hit_max_retries");
+        L2CAP_TRACE_DEBUG ("process_s_frame hit_max_retries");
     }
 
     GKI_freebuf (p_buf);
@@ -1128,7 +1128,7 @@
     /* If we have flow controlled the peer, ignore any bad I-frames from him */
     if ( (tx_seq != p_fcrb->next_seq_expected) && (p_fcrb->local_busy) )
     {
-        L2CAP_TRACE_WARNING1 ("Dropping bad I-Frame since we flowed off, tx_seq:%u", tx_seq);
+        L2CAP_TRACE_WARNING ("Dropping bad I-Frame since we flowed off, tx_seq:%u", tx_seq);
         l2c_fcr_send_S_frame (p_ccb, L2CAP_FCR_SUP_RNR, 0);
         GKI_freebuf(p_buf);
         return;
@@ -1138,7 +1138,7 @@
     /* received buffer now before we update any sequence numbers    */
     if (GKI_poolfreecount (p_ccb->ertm_info.user_rx_pool_id) == 0)
     {
-        L2CAP_TRACE_WARNING4 ("L2CAP CID: 0x%04x  Dropping I-Frame seq: %u  User RX Pool: %u  (Size: %u)  has no free buffers!!",
+        L2CAP_TRACE_WARNING ("L2CAP CID: 0x%04x  Dropping I-Frame seq: %u  User RX Pool: %u  (Size: %u)  has no free buffers!!",
                               p_ccb->local_cid, tx_seq, p_ccb->ertm_info.user_rx_pool_id,
                               GKI_poolcount (p_ccb->ertm_info.user_rx_pool_id));
         GKI_freebuf(p_buf);
@@ -1154,12 +1154,12 @@
         if (num_lost >= p_ccb->our_cfg.fcr.tx_win_sz)
         {
             /* Duplicate - simply drop it */
-            L2CAP_TRACE_WARNING2 ("process_i_frame() Dropping Duplicate Frame tx_seq:%u  ExpectedTxSeq %u", tx_seq, p_fcrb->next_seq_expected);
+            L2CAP_TRACE_WARNING ("process_i_frame() Dropping Duplicate Frame tx_seq:%u  ExpectedTxSeq %u", tx_seq, p_fcrb->next_seq_expected);
             GKI_freebuf(p_buf);
         }
         else
         {
-            L2CAP_TRACE_WARNING6 ("process_i_frame() CID: 0x%04x  Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: %u  SRej: %u",
+            L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x  Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: %u  SRej: %u",
                                  p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent, p_fcrb->srej_sent);
 
             if (p_fcrb->srej_sent)
@@ -1188,7 +1188,7 @@
                         p_buf->offset += L2CAP_FCR_OVERHEAD;
                         p_buf->len -= L2CAP_FCR_OVERHEAD;
                     }
-                    L2CAP_TRACE_DEBUG4 ("process_i_frame() Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: %u  SRej1",
+                    L2CAP_TRACE_DEBUG ("process_i_frame() Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: %u  SRej1",
                                          num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent);
 
                     p_buf->layer_specific = tx_seq;
@@ -1196,7 +1196,7 @@
                 }
                 else
                 {
-                    L2CAP_TRACE_WARNING4 ("process_i_frame() CID: 0x%04x  frame dropped in Srej Sent next_srej:%u  hold_q.count:%u  win_sz:%u",
+                    L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x  frame dropped in Srej Sent next_srej:%u  hold_q.count:%u  win_sz:%u",
                                          p_ccb->local_cid, next_srej, p_fcrb->srej_rcv_hold_q.count, p_ccb->our_cfg.fcr.tx_win_sz);
 
                     p_fcrb->rej_after_srej = TRUE;
@@ -1205,7 +1205,7 @@
             }
             else if (p_fcrb->rej_sent)
             {
-                L2CAP_TRACE_WARNING5 ("process_i_frame() CID: 0x%04x  Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: 1  SRej: %u",
+                L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x  Lost: %u  tx_seq:%u  ExpTxSeq %u  Rej: 1  SRej: %u",
                                      p_ccb->local_cid, num_lost, tx_seq, p_fcrb->next_seq_expected, p_fcrb->srej_sent);
 
                 /* If REJ sent, just drop the frame */
@@ -1213,7 +1213,7 @@
             }
             else
             {
-                L2CAP_TRACE_DEBUG4 ("process_i_frame() CID: 0x%04x  tx_seq:%u  ExpTxSeq %u  Rej: %u",
+                L2CAP_TRACE_DEBUG ("process_i_frame() CID: 0x%04x  tx_seq:%u  ExpTxSeq %u  Rej: %u",
                                      p_ccb->local_cid, tx_seq, p_fcrb->next_seq_expected, p_fcrb->rej_sent);
 
                 /* If only one lost, we will send SREJ, otherwise we will send REJ */
@@ -1227,7 +1227,7 @@
                 {
                     if (p_fcrb->srej_rcv_hold_q.count != 0)
                     {
-                        L2CAP_TRACE_ERROR3 ("process_i_frame() CID: 0x%04x  sending SREJ tx_seq:%d hold_q.count:%u",
+                        L2CAP_TRACE_ERROR ("process_i_frame() CID: 0x%04x  sending SREJ tx_seq:%d hold_q.count:%u",
                                              p_ccb->local_cid, tx_seq, p_fcrb->srej_rcv_hold_q.count);
                     }
                     p_buf->layer_specific = tx_seq;
@@ -1251,7 +1251,7 @@
     /* If any SAR problem in eRTM mode, spec says disconnect. */
     if (!do_sar_reassembly (p_ccb, p_buf, ctrl_word))
     {
-        L2CAP_TRACE_WARNING1 ("process_i_frame() CID: 0x%04x  reassembly failed", p_ccb->local_cid);
+        L2CAP_TRACE_WARNING ("process_i_frame() CID: 0x%04x  reassembly failed", p_ccb->local_cid);
         l2cu_disconnect_chnl (p_ccb);
         return;
     }
@@ -1314,7 +1314,7 @@
 
         if (l2c_fcr_rx_get_fcs(p_buf) != fcs)
         {
-            L2CAP_TRACE_WARNING1 ("Rx L2CAP PDU: CID: 0x%04x  BAD FCS", p_ccb->local_cid);
+            L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x  BAD FCS", p_ccb->local_cid);
             GKI_freebuf(p_buf);
             return;
         }
@@ -1331,13 +1331,13 @@
     /* Make sure it is an I-frame */
     if (ctrl_word & L2CAP_FCR_S_FRAME_BIT)
     {
-        L2CAP_TRACE_WARNING2 ("Rx L2CAP PDU: CID: 0x%04x  BAD S-frame in streaming mode  ctrl_word: 0x%04x", p_ccb->local_cid, ctrl_word);
+        L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x  BAD S-frame in streaming mode  ctrl_word: 0x%04x", p_ccb->local_cid, ctrl_word);
         GKI_freebuf (p_buf);
         return;
     }
 
 #if BT_TRACE_VERBOSE == TRUE
-    L2CAP_TRACE_EVENT6 ("L2CAP eRTM Rx I-frame: cid: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
+    L2CAP_TRACE_EVENT ("L2CAP eRTM Rx I-frame: cid: 0x%04x  Len: %u  SAR: %-12s  TxSeq: %u  ReqSeq: %u  F: %u",
                         p_ccb->local_cid, p_buf->len,
                         SAR_types[(ctrl_word & L2CAP_FCR_SAR_BITS) >> L2CAP_FCR_SAR_BITS_SHIFT],
                         (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT,
@@ -1351,7 +1351,7 @@
     /* Check if tx-sequence is the expected one */
     if (tx_seq != p_ccb->fcrb.next_seq_expected)
     {
-        L2CAP_TRACE_WARNING4 ("Rx L2CAP PDU: CID: 0x%04x  Lost frames Exp: %u  Got: %u  p_rx_sdu: 0x%08x",
+        L2CAP_TRACE_WARNING ("Rx L2CAP PDU: CID: 0x%04x  Lost frames Exp: %u  Got: %u  p_rx_sdu: 0x%08x",
                                 p_ccb->local_cid, p_ccb->fcrb.next_seq_expected, tx_seq, p_ccb->fcrb.p_rx_sdu);
 
         /* Lost one or more packets, so flush the SAR queue */
@@ -1397,7 +1397,7 @@
     {
         if (p_fcrb->p_rx_sdu != NULL)
         {
-            L2CAP_TRACE_WARNING2 ("SAR - got unexpected unsegmented or start SDU  Expected len: %u  Got so far: %u",
+            L2CAP_TRACE_WARNING ("SAR - got unexpected unsegmented or start SDU  Expected len: %u  Got so far: %u",
                                   p_fcrb->rx_sdu_len, p_fcrb->p_rx_sdu->len);
 
             packet_ok = FALSE;
@@ -1405,7 +1405,7 @@
         /* Check the length of the packet */
         if ( (sar_type == L2CAP_FCR_START_SDU) && (p_buf->len < L2CAP_SDU_LEN_OVERHEAD) )
         {
-            L2CAP_TRACE_WARNING1 ("SAR start packet too short: %u", p_buf->len);
+            L2CAP_TRACE_WARNING ("SAR start packet too short: %u", p_buf->len);
             packet_ok = FALSE;
         }
     }
@@ -1413,7 +1413,7 @@
     {
         if (p_fcrb->p_rx_sdu == NULL)
         {
-            L2CAP_TRACE_WARNING0 ("SAR - got unexpected cont or end SDU");
+            L2CAP_TRACE_WARNING ("SAR - got unexpected cont or end SDU");
             packet_ok = FALSE;
         }
     }
@@ -1432,12 +1432,12 @@
 
             if (p_fcrb->rx_sdu_len > p_ccb->max_rx_mtu)
             {
-                L2CAP_TRACE_WARNING2 ("SAR - SDU len: %u  larger than MTU: %u", p_fcrb->rx_sdu_len, p_fcrb->rx_sdu_len);
+                L2CAP_TRACE_WARNING ("SAR - SDU len: %u  larger than MTU: %u", p_fcrb->rx_sdu_len, p_fcrb->rx_sdu_len);
                 packet_ok = FALSE;
             }
             else if ((p_fcrb->p_rx_sdu = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_rx_pool_id)) == NULL)
             {
-                L2CAP_TRACE_ERROR1 ("SAR - no buffer for SDU start user_rx_pool_id:%d", p_ccb->ertm_info.user_rx_pool_id);
+                L2CAP_TRACE_ERROR ("SAR - no buffer for SDU start user_rx_pool_id:%d", p_ccb->ertm_info.user_rx_pool_id);
                 packet_ok = FALSE;
             }
             else
@@ -1451,13 +1451,13 @@
         {
             if ((p_fcrb->p_rx_sdu->len + p_buf->len) > p_fcrb->rx_sdu_len)
             {
-                L2CAP_TRACE_ERROR4 ("SAR - SDU len exceeded  Type: %u   Lengths: %u %u %u",
+                L2CAP_TRACE_ERROR ("SAR - SDU len exceeded  Type: %u   Lengths: %u %u %u",
                                     sar_type, p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len);
                 packet_ok = FALSE;
             }
             else if ( (sar_type == L2CAP_FCR_END_SDU) && ((p_fcrb->p_rx_sdu->len + p_buf->len) != p_fcrb->rx_sdu_len) )
             {
-                L2CAP_TRACE_WARNING3 ("SAR - SDU end rcvd but SDU incomplete: %u %u %u",
+                L2CAP_TRACE_WARNING ("SAR - SDU end rcvd but SDU incomplete: %u %u %u",
                                       p_fcrb->p_rx_sdu->len, p_buf->len, p_fcrb->rx_sdu_len);
                 packet_ok = FALSE;
             }
@@ -1521,7 +1521,7 @@
      &&  (p_ccb->peer_cfg.fcr.max_transmit != 0)
      &&  (p_ccb->fcrb.num_tries >= p_ccb->peer_cfg.fcr.max_transmit) )
     {
-        L2CAP_TRACE_EVENT5 ("Max Tries Exceeded:  (last_acq: %d  CID: 0x%04x  num_tries: %u (max: %u) ack_q_count: %u",
+        L2CAP_TRACE_EVENT ("Max Tries Exceeded:  (last_acq: %d  CID: 0x%04x  num_tries: %u (max: %u) ack_q_count: %u",
                 p_ccb->fcrb.last_rx_ack, p_ccb->local_cid, p_ccb->fcrb.num_tries, p_ccb->peer_cfg.fcr.max_transmit,
                 p_ccb->fcrb.waiting_for_ack_q.count);
 
@@ -1543,7 +1543,7 @@
 
             buf_seq = (ctrl_word & L2CAP_FCR_TX_SEQ_BITS) >> L2CAP_FCR_TX_SEQ_BITS_SHIFT;
 
-            L2CAP_TRACE_DEBUG2 ("retransmit_i_frames()   cur seq: %u  looking for: %u", buf_seq, tx_seq);
+            L2CAP_TRACE_DEBUG ("retransmit_i_frames()   cur seq: %u  looking for: %u", buf_seq, tx_seq);
 
             if (tx_seq == buf_seq)
                 break;
@@ -1551,7 +1551,7 @@
 
         if (!p_buf)
         {
-            L2CAP_TRACE_ERROR2 ("retransmit_i_frames() UNKNOWN seq: %u  q_count: %u", tx_seq, p_ccb->fcrb.waiting_for_ack_q.count);
+            L2CAP_TRACE_ERROR ("retransmit_i_frames() UNKNOWN seq: %u  q_count: %u", tx_seq, p_ccb->fcrb.waiting_for_ack_q.count);
             return (TRUE);
         }
     }
@@ -1699,7 +1699,7 @@
         }
         else /* Should never happen if the application has configured buffers correctly */
         {
-            L2CAP_TRACE_ERROR1 ("L2CAP - cannot get buffer, for segmentation, pool: %u", p_ccb->ertm_info.fcr_tx_pool_id);
+            L2CAP_TRACE_ERROR ("L2CAP - cannot get buffer, for segmentation, pool: %u", p_ccb->ertm_info.fcr_tx_pool_id);
             return (NULL);
         }
     }
@@ -1760,7 +1760,7 @@
 
         if (!p_wack)
         {
-            L2CAP_TRACE_ERROR3 ("L2CAP - no buffer for xmit cloning, CID: 0x%04x  Pool: %u  Count: %u",
+            L2CAP_TRACE_ERROR ("L2CAP - no buffer for xmit cloning, CID: 0x%04x  Pool: %u  Count: %u",
                                 p_ccb->local_cid, p_ccb->ertm_info.fcr_tx_pool_id,  GKI_poolfreecount(p_ccb->ertm_info.fcr_tx_pool_id));
 
             /* We will not save the FCS in case we reconfigure and change options */
@@ -1840,7 +1840,7 @@
     /* At least one type needs to be set (Basic, ERTM, STM) to continue */
     if (!p_ccb->ertm_info.allowed_modes)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - Peer does not support our desired channel types");
+        L2CAP_TRACE_WARNING ("L2CAP - Peer does not support our desired channel types");
     }
 
     return (p_ccb->ertm_info.allowed_modes);
@@ -1862,7 +1862,7 @@
 
     if (p_fcr->mode != p_ccb->ertm_info.preferred_mode)
     {
-        L2CAP_TRACE_WARNING2 ("l2c_fcr_adj_our_req_options - preferred_mode (%d), does not match mode (%d)",
+        L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options - preferred_mode (%d), does not match mode (%d)",
                             p_ccb->ertm_info.preferred_mode, p_fcr->mode);
 
         /* The preferred mode is passed in through tL2CAP_ERTM_INFO, so override this one */
@@ -1874,7 +1874,7 @@
     {
         if (p_cfg->fcr_present && p_fcr->mode != L2CAP_FCR_BASIC_MODE)
         {
-            L2CAP_TRACE_WARNING1 ("l2c_fcr_adj_our_req_options (mode %d): ERROR: No FCR options set using BASIC mode", p_fcr->mode);
+            L2CAP_TRACE_WARNING ("l2c_fcr_adj_our_req_options (mode %d): ERROR: No FCR options set using BASIC mode", p_fcr->mode);
         }
         p_fcr->mode = L2CAP_FCR_BASIC_MODE;
     }
@@ -1909,14 +1909,14 @@
             /* If peer does not support STREAMING, try ERTM */
             if (p_fcr->mode == L2CAP_FCR_STREAM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_STREAM))
             {
-                L2CAP_TRACE_DEBUG0 ("L2C CFG: mode is STREAM, but peer does not support; Try ERTM");
+                L2CAP_TRACE_DEBUG ("L2C CFG: mode is STREAM, but peer does not support; Try ERTM");
                 p_fcr->mode = L2CAP_FCR_ERTM_MODE;
             }
 
             /* If peer does not support ERTM, try BASIC (will support this if made it here in the code) */
             if (p_fcr->mode == L2CAP_FCR_ERTM_MODE && !(p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM))
             {
-                L2CAP_TRACE_DEBUG0 ("L2C CFG: mode is ERTM, but peer does not support; Try BASIC");
+                L2CAP_TRACE_DEBUG ("L2C CFG: mode is ERTM, but peer does not support; Try BASIC");
                 p_fcr->mode = L2CAP_FCR_BASIC_MODE;
             }
         }
@@ -1926,7 +1926,7 @@
             /* MTU must be smaller than buffer size */
             if ( (p_cfg->mtu_present) && (p_cfg->mtu > p_ccb->max_rx_mtu) )
             {
-                L2CAP_TRACE_WARNING2 ("L2CAP - MTU: %u  larger than buf size: %u", p_cfg->mtu, p_ccb->max_rx_mtu);
+                L2CAP_TRACE_WARNING ("L2CAP - MTU: %u  larger than buf size: %u", p_cfg->mtu, p_ccb->max_rx_mtu);
                 return (FALSE);
             }
 
@@ -1938,7 +1938,7 @@
             /* MPS must be less than MTU */
             else if (p_fcr->mps > p_ccb->max_rx_mtu)
             {
-                L2CAP_TRACE_WARNING2 ("L2CAP - MPS  %u  invalid  MTU: %u", p_fcr->mps, p_ccb->max_rx_mtu);
+                L2CAP_TRACE_WARNING ("L2CAP - MPS  %u  invalid  MTU: %u", p_fcr->mps, p_ccb->max_rx_mtu);
                 return (FALSE);
             }
 
@@ -1994,7 +1994,7 @@
             p_ccb->our_cfg.fcr.rtrans_tout = 0;
         }
 
-        L2CAP_TRACE_DEBUG2 ("l2c_fcr_adj_monitor_retran_timeout: mon_tout:%d, rtrans_tout:%d",
+        L2CAP_TRACE_DEBUG ("l2c_fcr_adj_monitor_retran_timeout: mon_tout:%d, rtrans_tout:%d",
                              p_ccb->our_cfg.fcr.mon_tout, p_ccb->our_cfg.fcr.rtrans_tout);
     }
 }
@@ -2024,7 +2024,7 @@
         /* Note: peer is not guaranteed to obey our adjustment */
         if (p_ccb->peer_cfg.fcr.tx_win_sz > p_ccb->our_cfg.fcr.tx_win_sz)
         {
-            L2CAP_TRACE_DEBUG3 ("%s: adjusting requested tx_win_sz from %i to %i", __FUNCTION__, p_ccb->peer_cfg.fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz);
+            L2CAP_TRACE_DEBUG ("%s: adjusting requested tx_win_sz from %i to %i", __FUNCTION__, p_ccb->peer_cfg.fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz);
             p_ccb->peer_cfg.fcr.tx_win_sz = p_ccb->our_cfg.fcr.tx_win_sz;
         }
 // btla-specific --
@@ -2070,7 +2070,7 @@
             if ((--p_ccb->fcr_cfg_tries) == 0)
             {
                 p_cfg->result = L2CAP_CFG_FAILED_NO_REASON;
-                L2CAP_TRACE_WARNING0 ("l2c_fcr_renegotiate_chan (Max retries exceeded)");
+                L2CAP_TRACE_WARNING ("l2c_fcr_renegotiate_chan (Max retries exceeded)");
             }
 
             can_renegotiate = FALSE;
@@ -2083,7 +2083,7 @@
                 /* Peer wants ERTM and we support it */
                 if ( (peer_mode == L2CAP_FCR_ERTM_MODE) && (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_ERTM) )
                 {
-                    L2CAP_TRACE_DEBUG0 ("l2c_fcr_renegotiate_chan(Trying ERTM)");
+                    L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying ERTM)");
                     p_ccb->our_cfg.fcr.mode = L2CAP_FCR_ERTM_MODE;
                     can_renegotiate = TRUE;
                 }
@@ -2094,7 +2094,7 @@
                     /* We can try basic for any other peer mode if we support it */
                     if (p_ccb->ertm_info.allowed_modes & L2CAP_FCR_CHAN_OPT_BASIC)
                     {
-                        L2CAP_TRACE_DEBUG0 ("l2c_fcr_renegotiate_chan(Trying Basic)");
+                        L2CAP_TRACE_DEBUG ("l2c_fcr_renegotiate_chan(Trying Basic)");
                         can_renegotiate = TRUE;
                         p_ccb->our_cfg.fcr.mode = L2CAP_FCR_BASIC_MODE;
                     }
@@ -2118,7 +2118,7 @@
                     /* Basic Mode uses ACL Data Pool, make sure the MTU fits */
                     if ( (p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE) )
                     {
-                        L2CAP_TRACE_WARNING1 ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
+                        L2CAP_TRACE_WARNING ("L2CAP - adjust MTU: %u too large", p_cfg->mtu);
                         p_cfg->mtu = L2CAP_MTU_SIZE;
                     }
                 }
@@ -2134,7 +2134,7 @@
     /* Disconnect if the channels do not match */
     if (p_ccb->our_cfg.fcr.mode != peer_mode)
     {
-        L2CAP_TRACE_WARNING2 ("L2C CFG:  Channels incompatible (local %d, peer %d)",
+        L2CAP_TRACE_WARNING ("L2C CFG:  Channels incompatible (local %d, peer %d)",
                               p_ccb->our_cfg.fcr.mode, peer_mode);
         l2cu_disconnect_chnl (p_ccb);
     }
@@ -2161,7 +2161,7 @@
 
     p_ccb->p_lcb->w4_info_rsp = FALSE;      /* Handles T61x SonyEricsson Bug in Info Request */
 
-    L2CAP_TRACE_EVENT5 ("l2c_fcr_process_peer_cfg_req() CFG fcr_present:%d fcr.mode:%d CCB FCR mode:%d preferred: %u allowed:%u",
+    L2CAP_TRACE_EVENT ("l2c_fcr_process_peer_cfg_req() CFG fcr_present:%d fcr.mode:%d CCB FCR mode:%d preferred: %u allowed:%u",
                         p_cfg->fcr_present, p_cfg->fcr.mode, p_ccb->our_cfg.fcr.mode, p_ccb->ertm_info.preferred_mode,
                         p_ccb->ertm_info.allowed_modes);
 
@@ -2240,13 +2240,13 @@
             /* Ensure the MPS is not bigger than our retransmission buffer */
             if (p_cfg->fcr.mps > max_retrans_size)
             {
-                L2CAP_TRACE_DEBUG2("CFG: Overriding MPS to %d (orig %d)", max_retrans_size, p_cfg->fcr.mps);
+                L2CAP_TRACE_DEBUG("CFG: Overriding MPS to %d (orig %d)", max_retrans_size, p_cfg->fcr.mps);
 
                 p_cfg->fcr.mps = max_retrans_size;
                 p_ccb->out_cfg_fcr_present = TRUE;
             }
 
-            if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE)
+            if (p_cfg->fcr.mode == L2CAP_FCR_ERTM_MODE || p_cfg->fcr.mode == L2CAP_FCR_STREAM_MODE)
             {
                 /* Always respond with FCR ERTM parameters */
                 p_ccb->out_cfg_fcr_present = TRUE;
@@ -2314,7 +2314,7 @@
 
     p_cfg = &p_ccb->fcrb.test_cb.cfg;
 #if 0
-    L2CAP_TRACE_DEBUG4 ("testcfg: type: %d, freq: %d (NRM-0, RDM-1), is_rx: %d, count: %d",
+    L2CAP_TRACE_DEBUG ("testcfg: type: %d, freq: %d (NRM-0, RDM-1), is_rx: %d, count: %d",
         p_cfg->type, p_cfg->freq, p_cfg->is_rx, p_cfg->count);
 #endif
     /* If not time to corrupt get out */
@@ -2382,14 +2382,14 @@
     /* Lastly, just drop packet if FCS is not being used or if Tx */
     if (!is_rx || p_ccb->bypass_fcs == L2CAP_BYPASS_FCS)
     {
-        L2CAP_TRACE_ERROR6 ("-=-=-=-=-=-=-=-   Dropping %s packet (0x%04x) tc: %u  Buf Len: %u  xx: %u  count: %d",
+        L2CAP_TRACE_ERROR ("-=-=-=-=-=-=-=-   Dropping %s packet (0x%04x) tc: %u  Buf Len: %u  xx: %u  count: %d",
                         buf, (UINT32)p_buf, tc, p_buf->len, xx, p_cfg->count);
         GKI_freebuf(p_buf);
         return TRUE;
     }
     else
     {
-        L2CAP_TRACE_ERROR6 ("-=-=-=-=-=-=-=-   Corrupting %s packet (0x%04x) tc: %u  Buf Len: %u  xx: %u  count: %d",
+        L2CAP_TRACE_ERROR ("-=-=-=-=-=-=-=-   Corrupting %s packet (0x%04x) tc: %u  Buf Len: %u  xx: %u  count: %d",
                         buf, (UINT32)p_buf, tc, p_buf->len, xx, p_cfg->count);
     }
 
@@ -2451,7 +2451,7 @@
     {
         if (type == L2CAP_FCR_TTYPE_GET_CID)
         {
-            L2CAP_TRACE_API1 ("L2CA_SetupErtmTest (GET_CID): cid = 0x%04x", cid);
+            L2CAP_TRACE_API ("L2CA_SetupErtmTest (GET_CID): cid = 0x%04x", cid);
         }
         return (cid);
     }
@@ -2463,7 +2463,7 @@
     {
         if (p_test_cb->cfg.in_use)
         {
-            L2CAP_TRACE_ERROR1 ("L2CA_SetupErtmTest (OFF): cid 0x%04x", cid);
+            L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (OFF): cid 0x%04x", cid);
         }
         p_test_cb->cfg.in_use = FALSE;
         p_test_cb->cfg.count = 0;
@@ -2475,11 +2475,11 @@
         /* count must be positive unless random is used */
         if (!count && freq != L2CAP_FCR_FREQ_RANDOM)
         {
-            L2CAP_TRACE_ERROR1 ("L2CA_SetupErtmTest (FAIL): Count = 0, freq = %d", freq);
+            L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (FAIL): Count = 0, freq = %d", freq);
             return (cid);
         }
 
-        L2CAP_TRACE_ERROR5 ("L2CA_SetupErtmTest (START): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
+        L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (START): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
                             cid, type, is_rx, freq, count);
 
         p_test_cb->cfg.in_use = TRUE;
@@ -2490,7 +2490,7 @@
     }
     else /* Test already in progress so ignore */
     {
-        L2CAP_TRACE_ERROR5 ("L2CA_SetupErtmTest (ignoring): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
+        L2CAP_TRACE_ERROR ("L2CA_SetupErtmTest (ignoring): cid 0x%04x, type %d, is_rx %d, freq %d, count %d",
                             cid, type, is_rx, freq, count);
     }
 
@@ -2527,7 +2527,7 @@
     }
     else
     {
-        L2CAP_TRACE_ERROR2 ("L2CA_SendPolledSFrame(ERROR): sup_type %u, p_ccb 0x%07x",
+        L2CAP_TRACE_ERROR ("L2CA_SendPolledSFrame(ERROR): sup_type %u, p_ccb 0x%07x",
                             sup_type, (UINT32)p_ccb);
     }
 }
@@ -2548,7 +2548,7 @@
     {
         if (p_ccb->fcrb.test_cb.cfm.skip_sframe_count > 0)
         {
-            L2CAP_TRACE_ERROR1 ("l2c_bypass_sframe_packet (count %d)",
+            L2CAP_TRACE_ERROR ("l2c_bypass_sframe_packet (count %d)",
                                 p_ccb->fcrb.test_cb.cfm.skip_sframe_count);
 
             if (--p_ccb->fcrb.test_cb.cfm.skip_sframe_count == 0)
@@ -2586,7 +2586,7 @@
 
     if (!p_ccb)
     {
-        L2CAP_TRACE_WARNING1 ("L2CA_BypassSFrame(ERROR): no p_ccb (0x%07x)", (UINT32)p_ccb);
+        L2CAP_TRACE_WARNING ("L2CA_BypassSFrame(ERROR): no p_ccb (0x%07x)", (UINT32)p_ccb);
         return;
     }
 
@@ -2600,7 +2600,7 @@
     }
     else
     {
-        L2CAP_TRACE_WARNING0 ("L2CA_BypassSFrame(ERROR): already in use (ignoring...)");
+        L2CAP_TRACE_WARNING ("L2CA_BypassSFrame(ERROR): already in use (ignoring...)");
     }
 }
 
@@ -2690,7 +2690,7 @@
                 p_ccb->fcrb.ack_delay_avg[index], p_ccb->fcrb.ack_delay_min[index], p_ccb->fcrb.ack_delay_max[index],
                 p_ccb->fcrb.ack_q_count_avg[index], p_ccb->fcrb.ack_q_count_min[index], p_ccb->fcrb.ack_q_count_max[index] );
 
-        BT_TRACE_1(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", str);
+        BT_TRACE(TRACE_CTRL_GENERAL | TRACE_LAYER_GKI | TRACE_ORG_GKI , TRACE_TYPE_GENERIC, "%s", str);
 
         index = (index + 1) % L2CAP_ERTM_STATS_NUM_AVG;
         p_ccb->fcrb.ack_delay_avg_index = index;
diff --git a/stack/l2cap/l2c_int.h b/stack/l2cap/l2c_int.h
index 72d5544..b1d0c46 100644
--- a/stack/l2cap/l2c_int.h
+++ b/stack/l2cap/l2c_int.h
@@ -52,6 +52,7 @@
 #define L2CAP_WAIT_UNPARK_TOUT       2            /* 2 seconds */
 #define L2CAP_LINK_INFO_RESP_TOUT    2            /* 2  seconds */
 #define L2CAP_BLE_LINK_CONNECT_TOUT  30           /* 30 seconds */
+#define L2CAP_BLE_CONN_PARAM_UPD_TOUT   30           /* 30 seconds */
 
 /* quick timer uses millisecond unit */
 #define L2CAP_DEFAULT_RETRANS_TOUT   2000         /* 2000 milliseconds */
@@ -393,6 +394,7 @@
 
     UINT8               link_role;                  /* Master or slave                  */
     UINT8               id;
+    UINT8               cur_echo_id;                /* Current id value for echo request */
     tL2CA_ECHO_RSP_CB   *p_echo_rsp_cb;             /* Echo response callback           */
     UINT16              idle_timeout;               /* Idle timeout                     */
     BOOLEAN             is_bonding;                 /* True - link active only for bonding */
@@ -431,15 +433,15 @@
     UINT16              disc_reason;
 #endif
 
+    tBT_TRANSPORT       transport;
 #if (BLE_INCLUDED == TRUE)
-    BOOLEAN             is_ble_link;
     tBLE_ADDR_TYPE      ble_addr_type;
 
 #define L2C_BLE_CONN_UPDATE_DISABLE 0x1  /* disable update connection parameters */
 #define L2C_BLE_NEW_CONN_PARAM      0x2  /* new connection parameter to be set */
 #define L2C_BLE_UPDATE_PENDING      0x4  /* waiting for connection update finished */
 #define L2C_BLE_NOT_DEFAULT_PARAM   0x8  /* not using default connection parameters */
-    UINT8               upd_status;
+    UINT8               conn_update_mask;
 
     UINT16              min_interval; /* parameters as requested by peripheral */
     UINT16              max_interval;
@@ -503,10 +505,14 @@
 #endif
 
 #if (BLE_INCLUDED == TRUE)
+    UINT16                   num_ble_links_active;               /* Number of LE links active           */
     BOOLEAN                  is_ble_connecting;
     BD_ADDR                  ble_connecting_bda;
     UINT16                   controller_le_xmit_window;         /* Total ACL window for all links   */
     UINT16                   num_lm_ble_bufs;                   /* # of ACL buffers on controller   */
+    UINT16                   ble_round_robin_quota;              /* Round-robin link quota           */
+    UINT16                   ble_round_robin_unacked;            /* Round-robin unacked              */
+    BOOLEAN                  ble_check_round_robin;              /* Do a round robin check           */
 #endif
 
     tL2CA_ECHO_DATA_CB      *p_echo_data_cb;                /* Echo data callback */
@@ -578,14 +584,14 @@
 /* Functions provided by l2c_utils.c
 ************************************
 */
-extern tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding);
+extern tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPORT transport);
 extern BOOLEAN  l2cu_start_post_bond_timer (UINT16 handle);
 extern void     l2cu_release_lcb (tL2C_LCB *p_lcb);
-extern tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr);
+extern tL2C_LCB *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport);
 extern tL2C_LCB *l2cu_find_lcb_by_handle (UINT16 handle);
 extern void     l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding);
 
-extern UINT8    l2cu_get_conn_role (BD_ADDR bd_addr);
+extern UINT8    l2cu_get_conn_role (tL2C_LCB *p_this_lcb);
 extern BOOLEAN  l2cu_set_acl_priority (BD_ADDR bd_addr, UINT8 priority, BOOLEAN reset_after_rs);
 
 extern void     l2cu_enqueue_ccb (tL2C_CCB *p_ccb);
@@ -597,6 +603,7 @@
 extern tL2C_CCB *l2cu_find_ccb_by_cid (tL2C_LCB *p_lcb, UINT16 local_cid);
 extern tL2C_CCB *l2cu_find_ccb_by_remote_cid (tL2C_LCB *p_lcb, UINT16 remote_cid);
 extern void     l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask);
+extern BOOLEAN  l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb);
 
 extern void     l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason,
                                            UINT8 rem_id,UINT16 p1, UINT16 p2);
@@ -676,7 +683,7 @@
 extern tL2C_LCB *l2cu_find_lcb_by_state (tL2C_LINK_STATE state);
 extern BOOLEAN  l2cu_lcb_disconnecting (void);
 
-extern BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb);
+extern BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport);
 extern BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb);
 extern BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb);
 extern void    l2cu_resubmit_pending_sec_req (BD_ADDR p_bda);
@@ -699,7 +706,7 @@
 extern void     l2c_link_processs_num_bufs (UINT16 num_lm_acl_bufs);
 extern UINT8    l2c_link_pkts_rcvd (UINT16 *num_pkts, UINT16 *handles);
 extern void     l2c_link_role_changed (BD_ADDR bd_addr, UINT8 new_role, UINT8 hci_status);
-extern void     l2c_link_sec_comp (BD_ADDR p_bda, void *p_ref_data, UINT8 status);
+extern void     l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT trasnport, void *p_ref_data, UINT8 status);
 extern void     l2c_link_segments_xmitted (BT_HDR *p_msg);
 extern void     l2c_pin_code_request (BD_ADDR bd_addr);
 extern void     l2c_link_adjust_chnl_allocation (void);
@@ -762,8 +769,16 @@
 extern void l2cble_conn_comp (UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type,
                               UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout);
 extern BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb);
+extern void l2cble_notify_le_connection (BD_ADDR bda);
+extern void l2c_ble_link_adjust_allocation (void);
+extern void l2cble_process_conn_update_evt (UINT16 handle, UINT8 status);
 
+#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
+extern void l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
+                                                        UINT16 latency, UINT16 timeout);
 #endif
+#endif
+extern void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb);
 
 #ifdef __cplusplus
 }
diff --git a/stack/l2cap/l2c_link.c b/stack/l2cap/l2c_link.c
index fd38ca2..5ee5faa 100644
--- a/stack/l2cap/l2c_link.c
+++ b/stack/l2cap/l2c_link.c
@@ -65,16 +65,16 @@
     BOOLEAN         no_links;
 
     /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+    p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
 
     /* If we don't have one, create one and accept the connection. */
     if (!p_lcb)
     {
-        p_lcb = l2cu_allocate_lcb (bd_addr, FALSE);
+        p_lcb = l2cu_allocate_lcb (bd_addr, FALSE, BT_TRANSPORT_BR_EDR);
         if (!p_lcb)
         {
             btsnd_hcic_reject_conn (bd_addr, HCI_ERR_HOST_REJECT_RESOURCES);
-            L2CAP_TRACE_ERROR0 ("L2CAP failed to allocate LCB");
+            L2CAP_TRACE_ERROR ("L2CAP failed to allocate LCB");
             return FALSE;
         }
 
@@ -99,7 +99,7 @@
             if (!btm_dev_support_switch (bd_addr))
                 p_lcb->link_role = HCI_ROLE_SLAVE;
             else
-                p_lcb->link_role = l2cu_get_conn_role(bd_addr);
+                p_lcb->link_role = l2cu_get_conn_role(p_lcb);
         }
 
         /* Tell the other side we accept the connection */
@@ -120,7 +120,7 @@
         if (!btm_dev_support_switch (bd_addr))
             p_lcb->link_role = HCI_ROLE_SLAVE;
         else
-            p_lcb->link_role = l2cu_get_conn_role(bd_addr);
+            p_lcb->link_role = l2cu_get_conn_role(p_lcb);
 
         btsnd_hcic_accept_conn (bd_addr, p_lcb->link_role);
 
@@ -134,7 +134,7 @@
     }
     else
     {
-        L2CAP_TRACE_ERROR1("L2CAP got conn_req while connected (state:%d). Reject it",
+        L2CAP_TRACE_ERROR("L2CAP got conn_req while connected (state:%d). Reject it",
                 p_lcb->link_state);
         /* Reject the connection with ACL Connection Already exist reason */
         btsnd_hcic_reject_conn (bd_addr, HCI_ERR_CONNECTION_EXISTS);
@@ -168,18 +168,18 @@
     memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
 
     /* See if we have a link control block for the remote device */
-    p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr);
+    p_lcb = l2cu_find_lcb_by_bd_addr (ci.bd_addr, BT_TRANSPORT_BR_EDR);
 
     /* If we don't have one, this is an error */
     if (!p_lcb)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP got conn_comp for unknown BD_ADDR");
+        L2CAP_TRACE_WARNING ("L2CAP got conn_comp for unknown BD_ADDR");
         return (FALSE);
     }
 
     if (p_lcb->link_state != LST_CONNECTING)
     {
-        L2CAP_TRACE_ERROR2 ("L2CAP got conn_comp in bad state: %d  status: 0x%d", p_lcb->link_state, status);
+        L2CAP_TRACE_ERROR ("L2CAP got conn_comp in bad state: %d  status: 0x%d", p_lcb->link_state, status);
 
         if (status != HCI_SUCCESS)
             l2c_link_hci_disc_comp (p_lcb->handle, status);
@@ -202,9 +202,9 @@
         if ((p_dev_info = btm_find_dev (p_bda)) != NULL)
             btm_acl_created (ci.bd_addr, p_dev_info->dev_class,
                              p_dev_info->sec_bd_name, handle,
-                             p_lcb->link_role, FALSE);
+                             p_lcb->link_role, BT_TRANSPORT_BR_EDR);
         else
-            btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, FALSE);
+            btm_acl_created (ci.bd_addr, NULL, NULL, handle, p_lcb->link_role, BT_TRANSPORT_BR_EDR);
 
         BTM_SetLinkSuperTout (ci.bd_addr, btm_cb.btm_def_link_super_tout);
 
@@ -272,7 +272,7 @@
             }
             else
             {
-                l2cu_create_conn(p_lcb);
+                l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
             }
         }
     }
@@ -290,7 +290,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void l2c_link_sec_comp (BD_ADDR p_bda, void *p_ref_data, UINT8 status)
+void l2c_link_sec_comp (BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data, UINT8 status)
 {
     tL2C_CONN_INFO  ci;
     tL2C_LCB        *p_lcb;
@@ -298,7 +298,9 @@
     tL2C_CCB        *p_next_ccb;
     UINT8           event;
 
-    L2CAP_TRACE_DEBUG2 ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data);
+    UNUSED(transport);
+
+    L2CAP_TRACE_DEBUG ("l2c_link_sec_comp: %d, 0x%x", status, p_ref_data);
 
     if (status == BTM_SUCCESS_NO_SECURITY)
         status = BTM_SUCCESS;
@@ -307,12 +309,12 @@
     ci.status       = status;
     memcpy (ci.bd_addr, p_bda, BD_ADDR_LEN);
 
-    p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+    p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
 
     /* If we don't have one, this is an error */
     if (!p_lcb)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP got sec_comp for unknown BD_ADDR");
+        L2CAP_TRACE_WARNING ("L2CAP got sec_comp for unknown BD_ADDR");
         return;
     }
 
@@ -326,7 +328,7 @@
             switch(status)
             {
             case BTM_SUCCESS:
-                L2CAP_TRACE_DEBUG1 ("ccb timer ticks: %u", p_ccb->timer_entry.ticks);
+                L2CAP_TRACE_DEBUG ("ccb timer ticks: %u", p_ccb->timer_entry.ticks);
                 event = L2CEVT_SEC_COMP;
                 break;
 
@@ -361,6 +363,7 @@
     tL2C_CCB    *p_ccb;
     BOOLEAN     status = TRUE;
     BOOLEAN     lcb_is_free = TRUE;
+    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
 
     /* See if we have a link control block for the connection */
     p_lcb = l2cu_find_lcb_by_handle (handle);
@@ -401,35 +404,55 @@
             p_ccb = pn;
         }
 
-#if BTM_SCO_INCLUDED == TRUE
-        /* Tell SCO management to drop any SCOs on this ACL */
-        btm_sco_acl_removed (p_lcb->remote_bd_addr);
+#if (BTM_SCO_INCLUDED == TRUE)
+#if (BLE_INCLUDED == TRUE)
+        if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+#endif
+            /* Tell SCO management to drop any SCOs on this ACL */
+            btm_sco_acl_removed (p_lcb->remote_bd_addr);
 #endif
 
         /* If waiting for disconnect and reconnect is pending start the reconnect now
            race condition where layer above issued connect request on link that was
            disconnecting
          */
-        if (p_lcb->ccb_queue.p_first_ccb != NULL)
+        if (p_lcb->ccb_queue.p_first_ccb != NULL || p_lcb->p_pending_ccb)
         {
-#if (L2CAP_NUM_FIXED_CHNLS > 0)
-            /* If we are going to re-use the LCB without dropping it, release all fixed channels here */
-            int         xx;
-
-            for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+            L2CAP_TRACE_DEBUG("l2c_link_hci_disc_comp: Restarting pending ACL request");
+#if BLE_INCLUDED == TRUE
+            /* for LE link, always drop and re-open to ensure to get LE remote feature */
+            if (p_lcb->transport == BT_TRANSPORT_LE)
             {
-                if (p_lcb->p_fixed_ccbs[xx])
-                {
-                    (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+                l2cu_release_lcb (p_lcb);
+                p_lcb->in_use = TRUE;
+                transport = BT_TRANSPORT_LE;
+            }
+            else
+#endif
+       {
+          #if (L2CAP_NUM_FIXED_CHNLS > 0)
+          /* If we are going to re-use the LCB without dropping it, release all fixed channels
+          here */
+          int xx;
+          for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+          {
+              if (p_lcb->p_fixed_ccbs[xx] && p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
+              {
+#if BLE_INCLUDED == TRUE
+                  (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
+                       p_lcb->disc_reason, p_lcb->transport);
+#else
+                  (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE,
+                       p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
                     l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
 
                     p_lcb->p_fixed_ccbs[xx] = NULL;
-                }
-            }
+              }
+          }
 #endif
-            L2CAP_TRACE_DEBUG0("l2c_link_hci_disc_comp: Restarting pending ACL request");
-
-            if (l2cu_create_conn(p_lcb))
+        }
+            if (l2cu_create_conn(p_lcb, transport))
                 lcb_is_free = FALSE; /* still using this lcb */
         }
 
@@ -444,7 +467,7 @@
     if (lcb_is_free && ((p_lcb = l2cu_find_lcb_by_state(LST_CONNECT_HOLDING)) != NULL))
     {
         /* we found one-- create a connection */
-        l2cu_create_conn(p_lcb);
+        l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR);
     }
 
     return status;
@@ -500,7 +523,7 @@
     UINT16      timeout;
     tBTM_STATUS rc;
 
-     L2CAP_TRACE_EVENT3 ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d",
+     L2CAP_TRACE_EVENT ("L2CAP - l2c_link_timeout() link state %d first CCB %p is_bonding:%d",
          p_lcb->link_state, p_lcb->ccb_queue.p_first_ccb, p_lcb->is_bonding);
 
     /* If link was connecting or disconnecting, clear all channels and drop the LCB */
@@ -545,7 +568,7 @@
 
             (*p_cb) (L2CAP_PING_RESULT_NO_RESP);
 
-             L2CAP_TRACE_WARNING0 ("L2CAP - ping timeout");
+             L2CAP_TRACE_WARNING ("L2CAP - ping timeout");
 
             /* For all channels, send a disconnect indication event through */
             /* their FSMs. The CCBs should remove themselves from the LCB   */
@@ -576,6 +599,7 @@
             }
             else if (rc == BTM_SUCCESS)
             {
+                l2cu_process_fixed_disc_cback(p_lcb);
                 /* BTM SEC will make sure that link is release (probably after pairing is done) */
                 p_lcb->link_state = LST_DISCONNECTING;
                 timeout = 0xFFFF;
@@ -588,6 +612,7 @@
             else if ((p_lcb->is_bonding)
                   && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)))
             {
+                l2cu_process_fixed_disc_cback(p_lcb);
                 p_lcb->link_state = LST_DISCONNECTING;
                 timeout = L2CAP_LINK_DISCONNECT_TOUT;
             }
@@ -718,7 +743,7 @@
     if (num_lowpri_links > low_quota)
     {
         l2cb.round_robin_quota = low_quota;
-        qq = qq_remainder = 0;
+        qq = qq_remainder = 1;
     }
     /* If each low priority link can have at least one buffer */
     else if (num_lowpri_links > 0)
@@ -733,10 +758,10 @@
     {
         l2cb.round_robin_quota = 0;
         l2cb.round_robin_unacked = 0;
-        qq = qq_remainder = 0;
+        qq = qq_remainder = 1;
     }
 
-    L2CAP_TRACE_EVENT5 ("l2c_link_adjust_allocation  num_hipri: %u  num_lowpri: %u  low_quota: %u  round_robin_quota: %u  qq: %u",
+    L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation  num_hipri: %u  num_lowpri: %u  low_quota: %u  round_robin_quota: %u  qq: %u",
                         num_hipri_links, num_lowpri_links, low_quota,
                         l2cb.round_robin_quota, qq);
 
@@ -768,10 +793,10 @@
 #if L2CAP_HOST_FLOW_CTRL
             p_lcb->link_ack_thresh = L2CAP_HOST_FC_ACL_BUFS / l2cb.num_links_active;
 #endif
-            L2CAP_TRACE_EVENT3 ("l2c_link_adjust_allocation LCB %d   Priority: %d  XmitQuota: %d",
+            L2CAP_TRACE_EVENT ("l2c_link_adjust_allocation LCB %d   Priority: %d  XmitQuota: %d",
                                 yy, p_lcb->acl_priority, p_lcb->link_xmit_quota);
 
-            L2CAP_TRACE_EVENT2 ("        SentNotAcked: %d  RRUnacked: %d",
+            L2CAP_TRACE_EVENT ("        SentNotAcked: %d  RRUnacked: %d",
                                 p_lcb->sent_not_acked, l2cb.round_robin_unacked);
 
             /* There is a special case where we have readjusted the link quotas and  */
@@ -809,7 +834,7 @@
     UINT16      quota_per_weighted_chnls[GKI_NUM_TOTAL_BUF_POOLS];
     UINT16      reserved_buff[GKI_NUM_TOTAL_BUF_POOLS];
 
-    L2CAP_TRACE_DEBUG0 ("l2c_link_adjust_chnl_allocation");
+    L2CAP_TRACE_DEBUG ("l2c_link_adjust_chnl_allocation");
 
     /* initialize variables */
     for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++ )
@@ -863,7 +888,7 @@
             else
                 quota_per_weighted_chnls[xx] = 1;
 
-            L2CAP_TRACE_DEBUG5 ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d",
+            L2CAP_TRACE_DEBUG ("POOL ID:%d, GKI_poolcount = %d, reserved_buff = %d, weighted_chnls = %d, quota_per_weighted_chnls = %d",
                                  xx, GKI_poolcount(xx), reserved_buff[xx], weighted_chnls[xx], quota_per_weighted_chnls[xx] );
         }
         else
@@ -883,7 +908,7 @@
         {
             p_ccb->buff_quota = quota_per_weighted_chnls[p_ccb->ertm_info.user_tx_pool_id] * p_ccb->tx_data_rate;
 
-            L2CAP_TRACE_EVENT6 ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u",
+            L2CAP_TRACE_EVENT ("CID:0x%04x FCR Mode:%u UserTxPool:%u Priority:%u TxDataRate:%u Quota:%u",
                                 p_ccb->local_cid, p_ccb->peer_cfg.fcr.mode, p_ccb->ertm_info.user_tx_pool_id,
                                 p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
 
@@ -892,7 +917,7 @@
         {
             p_ccb->buff_quota = quota_per_weighted_chnls[HCI_ACL_POOL_ID] * p_ccb->tx_data_rate;
 
-            L2CAP_TRACE_EVENT4 ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u",
+            L2CAP_TRACE_EVENT ("CID:0x%04x Priority:%u TxDataRate:%u Quota:%u",
                                 p_ccb->local_cid,
                                 p_ccb->ccb_priority, p_ccb->tx_data_rate, p_ccb->buff_quota);
         }
@@ -977,7 +1002,7 @@
     if (bd_addr)
     {
         /* If here came form hci role change event */
-        p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+        p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
         if (p_lcb)
         {
             p_lcb->link_role = new_role;
@@ -1013,7 +1038,7 @@
 *******************************************************************************/
 void l2c_pin_code_request (BD_ADDR bd_addr)
 {
-    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr);
+    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_BR_EDR);
 
     if ( (p_lcb) && (!p_lcb->ccb_queue.p_first_ccb) )
     {
@@ -1063,7 +1088,7 @@
         {
             if ( mode == BTM_PM_STS_PENDING )
             {
-                L2CAP_TRACE_DEBUG1 ("LCB(0x%x) is in PM pending state", p_lcb->handle);
+                L2CAP_TRACE_DEBUG ("LCB(0x%x) is in PM pending state", p_lcb->handle);
 
                 return TRUE;
             }
@@ -1104,7 +1129,14 @@
         GKI_enqueue (&p_lcb->link_xmit_data_q, p_buf);
 
         if (p_lcb->link_xmit_quota == 0)
-            l2cb.check_round_robin = TRUE;
+        {
+#if BLE_INCLUDED == TRUE
+            if (p_lcb->transport == BT_TRANSPORT_LE)
+                l2cb.ble_check_round_robin = TRUE;
+            else
+#endif
+                l2cb.check_round_robin = TRUE;
+        }
     }
 
     /* If this is called from uncongested callback context break recursive calling.
@@ -1129,11 +1161,11 @@
             /* If controller window is full, nothing to do */
             if ( (l2cb.controller_xmit_window == 0
 #if (BLE_INCLUDED == TRUE)
-                  && !p_lcb->is_ble_link
+                  && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
 #endif
                 )
 #if (BLE_INCLUDED == TRUE)
-                || (p_lcb->is_ble_link && l2cb.controller_le_xmit_window == 0 )
+                || (p_lcb->transport == BT_TRANSPORT_LE && l2cb.controller_le_xmit_window == 0 )
 #endif
               || (l2cb.round_robin_unacked >= l2cb.round_robin_quota) )
                 break;
@@ -1167,16 +1199,20 @@
         }
 
         /* If we finished without using up our quota, no need for a safety check */
-#if (BLE_INCLUDED == TRUE)
-        if ( ((l2cb.controller_xmit_window > 0 && !p_lcb->is_ble_link) ||
-             (l2cb.controller_le_xmit_window > 0 && p_lcb->is_ble_link))
-          && (l2cb.round_robin_unacked < l2cb.round_robin_quota) )
-#else
         if ( (l2cb.controller_xmit_window > 0)
-          && (l2cb.round_robin_unacked < l2cb.round_robin_quota) )
-
+          && (l2cb.round_robin_unacked < l2cb.round_robin_quota)
+#if (BLE_INCLUDED == TRUE)
+          && (p_lcb->transport == BT_TRANSPORT_BR_EDR)
 #endif
+          )
             l2cb.check_round_robin = FALSE;
+
+#if (BLE_INCLUDED == TRUE)
+        if ( (l2cb.controller_le_xmit_window > 0)
+          && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)
+          && (p_lcb->transport == BT_TRANSPORT_LE))
+            l2cb.ble_check_round_robin = FALSE;
+#endif
     }
     else /* if this is not round-robin service */
     {
@@ -1188,8 +1224,8 @@
 
         /* See if we can send anything from the link queue */
 #if (BLE_INCLUDED == TRUE)
-        while ( ((l2cb.controller_xmit_window != 0 && !p_lcb->is_ble_link) ||
-                 (l2cb.controller_le_xmit_window != 0 && p_lcb->is_ble_link))
+        while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+                 (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
              && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
 #else
         while ( (l2cb.controller_xmit_window != 0)
@@ -1207,8 +1243,8 @@
         {
             /* See if we can send anything for any channel */
 #if (BLE_INCLUDED == TRUE)
-            while ( ((l2cb.controller_xmit_window != 0 && !p_lcb->is_ble_link) ||
-                    (l2cb.controller_le_xmit_window != 0 && p_lcb->is_ble_link))
+            while ( ((l2cb.controller_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+                    (l2cb.controller_le_xmit_window != 0 && (p_lcb->transport == BT_TRANSPORT_LE)))
                     && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
 #else
             while ((l2cb.controller_xmit_window != 0) && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota))
@@ -1245,21 +1281,29 @@
     UINT16      num_segs;
     UINT16      xmit_window, acl_data_size;
 
+    if ((p_buf->len <= btu_cb.hcit_acl_pkt_size
 #if (BLE_INCLUDED == TRUE)
-    if ((!p_lcb->is_ble_link && (p_buf->len <= btu_cb.hcit_acl_pkt_size)) ||
-        (p_lcb->is_ble_link && (p_buf->len <= btu_cb.hcit_ble_acl_pkt_size)))
+        && (p_lcb->transport == BT_TRANSPORT_BR_EDR)) ||
+        ((p_lcb->transport == BT_TRANSPORT_LE) && (p_buf->len <= btu_cb.hcit_ble_acl_pkt_size))
 #else
-    if (p_buf->len <= btu_cb.hcit_acl_pkt_size)
+        )
 #endif
+        )
     {
         if (p_lcb->link_xmit_quota == 0)
-            l2cb.round_robin_unacked++;
-
+        {
+#if (BLE_INCLUDED == TRUE)
+            if (p_lcb->transport == BT_TRANSPORT_LE)
+                l2cb.ble_round_robin_unacked++;
+            else
+#endif
+                l2cb.round_robin_unacked++;
+        }
         p_lcb->sent_not_acked++;
         p_buf->layer_specific = 0;
 
 #if (BLE_INCLUDED == TRUE)
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             l2cb.controller_le_xmit_window--;
             L2C_LINK_SEND_BLE_ACL_DATA (p_buf);
@@ -1274,7 +1318,7 @@
     else
     {
 #if BLE_INCLUDED == TRUE
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             acl_data_size = btu_cb.hcit_ble_acl_data_size;
             xmit_window = l2cb.controller_le_xmit_window;
@@ -1313,21 +1357,24 @@
 
         p_buf->layer_specific        = num_segs;
 #if BLE_INCLUDED == TRUE
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             l2cb.controller_le_xmit_window -= num_segs;
-
+            if (p_lcb->link_xmit_quota == 0)
+                l2cb.ble_round_robin_unacked += num_segs;
         }
         else
 #endif
-        l2cb.controller_xmit_window -= num_segs;
+        {
+            l2cb.controller_xmit_window -= num_segs;
 
-        if (p_lcb->link_xmit_quota == 0)
-            l2cb.round_robin_unacked += num_segs;
+            if (p_lcb->link_xmit_quota == 0)
+                l2cb.round_robin_unacked += num_segs;
+        }
 
         p_lcb->sent_not_acked += num_segs;
 #if BLE_INCLUDED == TRUE
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             L2C_LINK_SEND_BLE_ACL_DATA(p_buf);
         }
@@ -1340,18 +1387,18 @@
 
 #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
 #if (BLE_INCLUDED == TRUE)
-    if (p_lcb->is_ble_link)
+    if (p_lcb->transport == BT_TRANSPORT_LE)
     {
-        L2CAP_TRACE_DEBUG6 ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
+        L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
                 l2cb.controller_le_xmit_window,
                 p_lcb->handle,
                 p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
-                l2cb.round_robin_quota, l2cb.round_robin_unacked);
+                l2cb.ble_round_robin_quota, l2cb.ble_round_robin_unacked);
     }
     else
 #endif
     {
-        L2CAP_TRACE_DEBUG6 ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
+        L2CAP_TRACE_DEBUG ("TotalWin=%d,Hndl=0x%x,Quota=%d,Unack=%d,RRQuota=%d,RRUnack=%d",
                 l2cb.controller_xmit_window,
                 p_lcb->handle,
                 p_lcb->link_xmit_quota, p_lcb->sent_not_acked,
@@ -1393,18 +1440,16 @@
         /* Originally designed for [3DSG]                   */
         if((p_lcb != NULL) && (p_lcb->p_nocp_cb))
         {
-            L2CAP_TRACE_DEBUG0 ("L2CAP - calling NoCP callback");
+            L2CAP_TRACE_DEBUG ("L2CAP - calling NoCP callback");
             (*p_lcb->p_nocp_cb)(p_lcb->remote_bd_addr);
         }
 
         if (p_lcb)
         {
 #if (BLE_INCLUDED == TRUE)
-            if (p_lcb->is_ble_link)
-            {
-                l2cb.controller_le_xmit_window += num_sent;
-            }
-            else
+        if (p_lcb && (p_lcb->transport == BT_TRANSPORT_LE))
+            l2cb.controller_le_xmit_window += num_sent;
+        else
 #endif
             {
                 /* Maintain the total window to the controller */
@@ -1413,11 +1458,24 @@
             /* If doing round-robin, adjust communal counts */
             if (p_lcb->link_xmit_quota == 0)
             {
-                /* Don't go negative */
-                if (l2cb.round_robin_unacked > num_sent)
-                    l2cb.round_robin_unacked -= num_sent;
+#if BLE_INCLUDED == TRUE
+                if (p_lcb->transport == BT_TRANSPORT_LE)
+                {
+                   /* Don't go negative */
+                    if (l2cb.ble_round_robin_unacked > num_sent)
+                        l2cb.ble_round_robin_unacked -= num_sent;
+                    else
+                        l2cb.ble_round_robin_unacked = 0;
+                }
                 else
-                    l2cb.round_robin_unacked = 0;
+#endif
+                {
+                    /* Don't go negative */
+                    if (l2cb.round_robin_unacked > num_sent)
+                        l2cb.round_robin_unacked -= num_sent;
+                    else
+                        l2cb.round_robin_unacked = 0;
+                }
             }
 
             /* Don't go negative */
@@ -1435,23 +1493,32 @@
             {
               l2c_link_check_send_pkts (NULL, NULL, NULL);
             }
+#if BLE_INCLUDED == TRUE
+            if ((p_lcb->transport == BT_TRANSPORT_LE)
+                && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH)
+                && ((l2cb.ble_check_round_robin)
+                && (l2cb.ble_round_robin_unacked < l2cb.ble_round_robin_quota)))
+            {
+              l2c_link_check_send_pkts (NULL, NULL, NULL);
+            }
+#endif
         }
 
 #if (L2CAP_HCI_FLOW_CONTROL_DEBUG == TRUE)
         if (p_lcb)
         {
 #if (BLE_INCLUDED == TRUE)
-            if (p_lcb->is_ble_link)
+            if (p_lcb->transport == BT_TRANSPORT_LE)
             {
-                L2CAP_TRACE_DEBUG5 ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
+                L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
                     l2cb.controller_le_xmit_window,
                     p_lcb->handle, p_lcb->sent_not_acked,
-                    l2cb.check_round_robin, l2cb.round_robin_unacked);
+                    l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
             }
             else
 #endif
             {
-                L2CAP_TRACE_DEBUG5 ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
+                L2CAP_TRACE_DEBUG ("TotalWin=%d,LinkUnack(0x%x)=%d,RRCheck=%d,RRUnack=%d",
                     l2cb.controller_xmit_window,
                     p_lcb->handle, p_lcb->sent_not_acked,
                     l2cb.check_round_robin, l2cb.round_robin_unacked);
@@ -1461,13 +1528,13 @@
         else
         {
 #if (BLE_INCLUDED == TRUE)
-            L2CAP_TRACE_DEBUG5 ("TotalWin=%d  LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d",
+            L2CAP_TRACE_DEBUG ("TotalWin=%d  LE_Win: %d, Handle=0x%x, RRCheck=%d, RRUnack=%d",
                 l2cb.controller_xmit_window,
                 l2cb.controller_le_xmit_window,
                 handle,
-                l2cb.check_round_robin, l2cb.round_robin_unacked);
+                l2cb.ble_check_round_robin, l2cb.ble_round_robin_unacked);
 #else
-            L2CAP_TRACE_DEBUG4 ("TotalWin=%d  Handle=0x%x  RRCheck=%d  RRUnack=%d",
+            L2CAP_TRACE_DEBUG ("TotalWin=%d  Handle=0x%x  RRCheck=%d  RRUnack=%d",
                 l2cb.controller_xmit_window,
                 handle,
                 l2cb.check_round_robin, l2cb.round_robin_unacked);
@@ -1543,7 +1610,7 @@
         /* a packet, it is incomplete. Drop it.                   */
         if (p_lcb->p_hcit_rcv_acl)
         {
-            L2CAP_TRACE_WARNING0 ("L2CAP - dropping incomplete pkt");
+            L2CAP_TRACE_WARNING ("L2CAP - dropping incomplete pkt");
             GKI_freebuf (p_lcb->p_hcit_rcv_acl);
             p_lcb->p_hcit_rcv_acl = NULL;
         }
@@ -1600,7 +1667,7 @@
             else
             {
                 /* Packet too long. Drop the base packet */
-                L2CAP_TRACE_WARNING3 ("L2CAP - dropping too long pkt BufLen: %d  total_len: %d  hci_len: %d",
+                L2CAP_TRACE_WARNING ("L2CAP - dropping too long pkt BufLen: %d  total_len: %d  hci_len: %d",
                                       p_lcb->p_hcit_rcv_acl->len, total_len, hci_len);
 
                 GKI_freebuf (p_lcb->p_hcit_rcv_acl);
@@ -1687,7 +1754,7 @@
     /* Find the LCB based on the handle */
     if ((p_lcb = l2cu_find_lcb_by_handle (handle)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - rcvd segment complete, unknown handle: %d", handle);
+        L2CAP_TRACE_WARNING ("L2CAP - rcvd segment complete, unknown handle: %d", handle);
         GKI_freebuf (p_msg);
         return;
     }
diff --git a/stack/l2cap/l2c_main.c b/stack/l2cap/l2c_main.c
index 49dd811..5f17e91 100644
--- a/stack/l2cap/l2c_main.c
+++ b/stack/l2cap/l2c_main.c
@@ -67,7 +67,7 @@
     /* Ensure we have enough space in the buffer for the L2CAP and HCI headers */
     if (p_buf->offset < L2CAP_BCST_MIN_OFFSET)
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - cannot send buffer, offset: %d", p_buf->offset);
+        L2CAP_TRACE_ERROR ("L2CAP - cannot send buffer, offset: %d", p_buf->offset);
         GKI_freebuf (p_buf);
         return;
     }
@@ -150,7 +150,7 @@
             if ((p_msg->layer_specific == 0) && (rcv_cid == L2CAP_SIGNALLING_CID)
                 && (cmd_code == L2CAP_CMD_INFO_REQ || cmd_code == L2CAP_CMD_CONN_REQ))
             {
-                L2CAP_TRACE_WARNING5 ("L2CAP - holding ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
+                L2CAP_TRACE_WARNING ("L2CAP - holding ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
                                     handle, p_msg->layer_specific, rcv_cid, cmd_code,
                                     l2cb.rcv_hold_q.count);
                 p_msg->layer_specific = 2;
@@ -163,7 +163,7 @@
             }
             else
             {
-                L2CAP_TRACE_ERROR5 ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
+                L2CAP_TRACE_ERROR ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d opcode:%d cur count:%d",
                                     handle, p_msg->layer_specific, rcv_cid, cmd_code, l2cb.rcv_hold_q.count);
             }
             GKI_freebuf (p_msg);
@@ -172,7 +172,7 @@
     }
     else
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - expected pkt start or complete, got: %d", pkt_type);
+        L2CAP_TRACE_WARNING ("L2CAP - expected pkt start or complete, got: %d", pkt_type);
         GKI_freebuf (p_msg);
         return;
     }
@@ -196,7 +196,7 @@
     {
         if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, rcv_cid)) == NULL)
         {
-            L2CAP_TRACE_WARNING1 ("L2CAP - unknown CID: 0x%04x", rcv_cid);
+            L2CAP_TRACE_WARNING ("L2CAP - unknown CID: 0x%04x", rcv_cid);
             GKI_freebuf (p_msg);
             return;
         }
@@ -209,14 +209,14 @@
     }
     else
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - got incorrect hci header" );
+        L2CAP_TRACE_WARNING ("L2CAP - got incorrect hci header" );
         GKI_freebuf (p_msg);
         return;
     }
 
     if (l2cap_len != p_msg->len)
     {
-        L2CAP_TRACE_WARNING2 ("L2CAP - bad length in pkt. Exp: %d  Act: %d",
+        L2CAP_TRACE_WARNING ("L2CAP - bad length in pkt. Exp: %d  Act: %d",
                               l2cap_len, p_msg->len);
 
         GKI_freebuf (p_msg);
@@ -233,7 +233,7 @@
     {
         /* process_connectionless_data (p_lcb); */
         STREAM_TO_UINT16 (psm, p);
-        L2CAP_TRACE_DEBUG1( "GOT CONNECTIONLESS DATA PSM:%d", psm ) ;
+        L2CAP_TRACE_DEBUG( "GOT CONNECTIONLESS DATA PSM:%d", psm ) ;
 #if (TCS_BCST_SETUP_INCLUDED == TRUE && TCS_INCLUDED == TRUE)
         if (psm == TCS_PSM_INTERCOM || psm == TCS_PSM_CORDLESS)
         {
@@ -267,8 +267,12 @@
              (l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb != NULL) )
     {
         /* If no CCB for this channel, allocate one */
-        if (l2cu_initialize_fixed_ccb (p_lcb, rcv_cid, &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
+        if (p_lcb && l2cu_initialize_fixed_ccb (p_lcb, rcv_cid,
+                &l2cb.fixed_reg[rcv_cid - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
         {
+#if(defined BLE_INCLUDED && (BLE_INCLUDED == TRUE))
+            l2cble_notify_le_connection(p_lcb->remote_bd_addr);
+#endif
             p_ccb = p_lcb->p_fixed_ccbs[rcv_cid - L2CAP_FIRST_FIXED_CHNL];
 
             if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
@@ -320,17 +324,29 @@
     tL2CAP_CFG_INFO cfg_info;
     UINT16          rej_reason, rej_mtu, lcid, rcid, info_type;
     tL2C_CCB        *p_ccb;
-    tL2C_RCB        *p_rcb;
-    BOOLEAN         cfg_rej;
+    tL2C_RCB        *p_rcb, *p_rcb2;
+    BOOLEAN         cfg_rej, pkt_size_rej = FALSE;
     UINT16          cfg_rej_len, cmd_len;
     UINT16          result;
     tL2C_CONN_INFO  ci;
 
 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
     /* if l2cap command received in CID 1 on top of an LE link, ignore this command */
-    if (p_lcb->is_ble_link)
+    if (p_lcb->transport == BT_TRANSPORT_LE)
         return;
 #endif
+
+    /* Reject the packet if it exceeds the default Signalling Channel MTU */
+    if (pkt_len > L2CAP_DEFAULT_MTU)
+    {
+        /* Core Spec requires a single response to the first command found in a multi-command
+        ** L2cap packet.  If only responses in the packet, then it will be ignored.
+        ** Here we simply mark the bad packet and decide which cmd ID to reject later
+        */
+        pkt_size_rej = TRUE;
+        L2CAP_TRACE_ERROR ("L2CAP SIG MTU Pkt Len Exceeded (672) -> pkt_len: %d", pkt_len);
+    }
+
     p_next_cmd = p;
     p_pkt_end  = p + pkt_len;
 
@@ -350,11 +366,23 @@
         /* Check command length does not exceed packet length */
         if ((p_next_cmd = p + cmd_len) > p_pkt_end)
         {
-            L2CAP_TRACE_WARNING3 ("Command len bad  pkt_len: %d  cmd_len: %d  code: %d",
+            L2CAP_TRACE_WARNING ("Command len bad  pkt_len: %d  cmd_len: %d  code: %d",
                                   pkt_len, cmd_len, cmd_code);
             break;
         }
 
+        L2CAP_TRACE_DEBUG ("cmd_code: %d, id:%d, cmd_len:%d", cmd_code, id, cmd_len);
+
+        /* Bad L2CAP packet length, look or cmd to reject */
+        if (pkt_size_rej)
+        {
+            /* If command found rejected it and we're done, otherwise keep looking */
+            if (l2c_is_cmd_rejected(cmd_code, id, p_lcb))
+                return;
+            else
+                continue; /* Look for next cmd/response in current packet */
+        }
+
         switch (cmd_code)
         {
         case L2CAP_CMD_REJECT:
@@ -365,14 +393,14 @@
                 /* What to do with the MTU reject ? We have negotiated an MTU. For now */
                 /* we will ignore it and let a higher protocol timeout take care of it */
 
-                L2CAP_TRACE_WARNING2 ("L2CAP - MTU rej Handle: %d MTU: %d", p_lcb->handle, rej_mtu);
+                L2CAP_TRACE_WARNING ("L2CAP - MTU rej Handle: %d MTU: %d", p_lcb->handle, rej_mtu);
             }
             if (rej_reason == L2CAP_CMD_REJ_INVALID_CID)
             {
                 STREAM_TO_UINT16 (rcid, p);
                 STREAM_TO_UINT16 (lcid, p);
 
-                L2CAP_TRACE_WARNING2 ("L2CAP - rej with CID invalid, LCID: 0x%04x RCID: 0x%04x", lcid, rcid);
+                L2CAP_TRACE_WARNING ("L2CAP - rej with CID invalid, LCID: 0x%04x RCID: 0x%04x", lcid, rcid);
 
                 /* Remote CID invalid. Treat as a disconnect */
                 if (((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL)
@@ -405,7 +433,7 @@
             STREAM_TO_UINT16 (rcid, p);
             if ((p_rcb = l2cu_find_rcb_by_psm (con_info.psm)) == NULL)
             {
-                L2CAP_TRACE_WARNING1 ("L2CAP - rcvd conn req for unknown PSM: %d", con_info.psm);
+                L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for unknown PSM: %d", con_info.psm);
                 l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM);
                 break;
             }
@@ -413,14 +441,14 @@
             {
                 if (!p_rcb->api.pL2CA_ConnectInd_Cb)
                 {
-                    L2CAP_TRACE_WARNING1 ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm);
+                    L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm);
                     l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_PSM);
                     break;
                 }
             }
             if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
             {
-                L2CAP_TRACE_ERROR0 ("L2CAP - unable to allocate CCB");
+                L2CAP_TRACE_ERROR ("L2CAP - unable to allocate CCB");
                 l2cu_reject_connection (p_lcb, rcid, id, L2CAP_CONN_NO_RESOURCES);
                 break;
             }
@@ -439,13 +467,13 @@
 
             if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) == NULL)
             {
-                L2CAP_TRACE_WARNING2 ("L2CAP - no CCB for conn rsp, LCID: %d RCID: %d",
+                L2CAP_TRACE_WARNING ("L2CAP - no CCB for conn rsp, LCID: %d RCID: %d",
                                       lcid, con_info.remote_cid);
                 break;
             }
             if (p_ccb->local_id != id)
             {
-                L2CAP_TRACE_WARNING2 ("L2CAP - con rsp - bad ID. Exp: %d Got: %d",
+                L2CAP_TRACE_WARNING ("L2CAP - con rsp - bad ID. Exp: %d Got: %d",
                                       p_ccb->local_id, id);
                 break;
             }
@@ -633,7 +661,7 @@
             {
                 if (p_ccb->local_id != id)
                 {
-                    L2CAP_TRACE_WARNING2 ("L2CAP - cfg rsp - bad ID. Exp: %d Got: %d",
+                    L2CAP_TRACE_WARNING ("L2CAP - cfg rsp - bad ID. Exp: %d Got: %d",
                                           p_ccb->local_id, id);
                     break;
                 }
@@ -644,7 +672,7 @@
             }
             else
             {
-                L2CAP_TRACE_WARNING1 ("L2CAP - rcvd cfg rsp for unknown CID: 0x%04x", lcid);
+                L2CAP_TRACE_WARNING ("L2CAP - rcvd cfg rsp for unknown CID: 0x%04x", lcid);
             }
             break;
 
@@ -762,7 +790,7 @@
             break;
 
         default:
-            L2CAP_TRACE_WARNING1 ("L2CAP - bad cmd code: %d", cmd_code);
+            L2CAP_TRACE_WARNING ("L2CAP - bad cmd code: %d", cmd_code);
             l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
             return;
         }
@@ -791,11 +819,11 @@
     if (!timed_out)
     {
         btu_stop_timer(&l2cb.rcv_hold_tle);
-        L2CAP_TRACE_WARNING0("L2CAP HOLD CONTINUE");
+        L2CAP_TRACE_WARNING("L2CAP HOLD CONTINUE");
     }
     else
     {
-        L2CAP_TRACE_WARNING0("L2CAP HOLD TIMEOUT");
+        L2CAP_TRACE_WARNING("L2CAP HOLD TIMEOUT");
     }
 
     /* Update the timeouts in the hold queue */
@@ -910,7 +938,6 @@
     case BTU_TTYPE_L2CAP_INFO:
         l2c_info_timeout((tL2C_LCB *)p_tle->param);
         break;
-
     }
 }
 
@@ -932,7 +959,7 @@
     /* Find the channel control block. We don't know the link it is on. */
     if ((p_ccb = l2cu_find_ccb_by_cid (NULL, cid)) == NULL)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no CCB for L2CA_DataWrite, CID: %d", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_DataWrite, CID: %d", cid);
         GKI_freebuf (p_data);
         return (L2CAP_DW_FAILED);
     }
@@ -941,7 +968,7 @@
                   bigger than mtu size of peer is a violation of protocol */
     if (p_data->len > p_ccb->peer_cfg.mtu)
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - CID: 0x%04x  cannot send message bigger than peer's mtu size", cid);
+        L2CAP_TRACE_WARNING ("L2CAP - CID: 0x%04x  cannot send message bigger than peer's mtu size", cid);
         GKI_freebuf (p_data);
         return (L2CAP_DW_FAILED);
     }
@@ -953,7 +980,7 @@
     /* If already congested, do not accept any more packets */
     if (p_ccb->cong_sent)
     {
-        L2CAP_TRACE_ERROR3 ("L2CAP - CID: 0x%04x cannot send, already congested  xmit_hold_q.count: %u  buff_quota: %u",
+        L2CAP_TRACE_ERROR ("L2CAP - CID: 0x%04x cannot send, already congested  xmit_hold_q.count: %u  buff_quota: %u",
                             p_ccb->local_cid, p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
 
         GKI_freebuf (p_data);
diff --git a/stack/l2cap/l2c_ucd.c b/stack/l2cap/l2c_ucd.c
index 4dfc804..2e5f00e 100644
--- a/stack/l2cap/l2c_ucd.c
+++ b/stack/l2cap/l2c_ucd.c
@@ -53,7 +53,7 @@
     tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
     UINT16      xx;
 
-    L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_discover_cback");
+    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_discover_cback");
 
     for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
     {
@@ -93,7 +93,7 @@
     UINT16 psm;
     tL2C_RCB    *p_rcb;
 
-    L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_data_ind_cback");
+    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_data_ind_cback");
 
     p = (UINT8 *)(p_buf + 1) + p_buf->offset;
     STREAM_TO_UINT16(psm, p)
@@ -103,7 +103,7 @@
 
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - no RCB for l2c_ucd_data_ind_cback, PSM: 0x%04x", psm);
         GKI_freebuf (p_buf);
     }
     else
@@ -126,7 +126,7 @@
     tL2C_RCB    *p_rcb = &l2cb.rcb_pool[0];
     UINT16      xx;
 
-    L2CAP_TRACE_DEBUG0 ("L2CAP - l2c_ucd_congestion_status_cback");
+    L2CAP_TRACE_DEBUG ("L2CAP - l2c_ucd_congestion_status_cback");
 
     for (xx = 0; xx < MAX_L2CAP_CLIENTS; xx++, p_rcb++)
     {
@@ -135,7 +135,7 @@
         {
             if ( p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
             {
-                L2CAP_TRACE_DEBUG4 ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,",
+                L2CAP_TRACE_DEBUG ("L2CAP - Calling UCDCongestionStatus_Cb (%d), PSM=0x%04x, BDA: %08x%04x,",
                                     is_congested, p_rcb->psm,
                                     (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                                     (rem_bda[4]<<8)+rem_bda[5]);
@@ -203,18 +203,18 @@
 {
     tL2C_RCB             *p_rcb;
 
-    L2CAP_TRACE_API1  ("L2CA_UcdRegister()  PSM: 0x%04x", psm);
+    L2CAP_TRACE_API  ("L2CA_UcdRegister()  PSM: 0x%04x", psm);
 
     if ((!p_cb_info->pL2CA_UCD_Discover_Cb)
      || (!p_cb_info->pL2CA_UCD_Data_Cb))
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - no callback registering PSM(0x%04x) on UCD", psm);
         return (FALSE);
     }
 
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdRegister, PSM: 0x%04x", psm);
         return (FALSE);
     }
 
@@ -226,7 +226,7 @@
     {
         if ((p_rcb = l2cu_allocate_rcb (L2C_UCD_RCB_ID)) == NULL)
         {
-            L2CAP_TRACE_ERROR0 ("L2CAP - no RCB available for L2CA_UcdRegister");
+            L2CAP_TRACE_ERROR ("L2CAP - no RCB available for L2CA_UcdRegister");
             return (FALSE);
         }
         else
@@ -268,11 +268,11 @@
     tL2C_RCB    *p_rcb;
     UINT16      xx;
 
-    L2CAP_TRACE_API1  ("L2CA_UcdDeregister()  PSM: 0x%04x", psm);
+    L2CAP_TRACE_API  ("L2CA_UcdDeregister()  PSM: 0x%04x", psm);
 
     if ((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
     {
-        L2CAP_TRACE_ERROR1 ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm);
+        L2CAP_TRACE_ERROR ("L2CAP - no RCB for L2CA_UcdDeregister, PSM: 0x%04x", psm);
         return (FALSE);
     }
 
@@ -329,7 +329,7 @@
     tL2C_CCB        *p_ccb;
     tL2C_RCB        *p_rcb;
 
-    L2CAP_TRACE_API4 ("L2CA_UcdDiscover()  PSM: 0x%04x  BDA: %08x%04x, InfoType=0x%02x", psm,
+    L2CAP_TRACE_API ("L2CA_UcdDiscover()  PSM: 0x%04x  BDA: %08x%04x, InfoType=0x%02x", psm,
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                       (rem_bda[4]<<8)+rem_bda[5], info_type);
 
@@ -337,13 +337,13 @@
     if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
         ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDiscover, PSM: 0x%04x", psm);
         return (FALSE);
     }
 
     /* First, see if we already have a link to the remote */
     /* then find the channel control block for UCD. */
-    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
       ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
     {
         if ( l2c_ucd_connect (rem_bda) == FALSE )
@@ -396,7 +396,7 @@
     tL2C_RCB        *p_rcb;
     UINT8           *p;
 
-    L2CAP_TRACE_API3 ("L2CA_UcdDataWrite()  PSM: 0x%04x  BDA: %08x%04x", psm,
+    L2CAP_TRACE_API ("L2CA_UcdDataWrite()  PSM: 0x%04x  BDA: %08x%04x", psm,
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                       (rem_bda[4]<<8)+rem_bda[5]);
 
@@ -404,14 +404,14 @@
     if (((p_rcb = l2cu_find_rcb_by_psm (psm)) == NULL)
         ||( p_rcb->ucd.state == L2C_UCD_STATE_UNUSED ))
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm);
+        L2CAP_TRACE_WARNING ("L2CAP - no RCB for L2CA_UcdDataWrite, PSM: 0x%04x", psm);
         GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
 
     /* First, see if we already have a link to the remote */
     /*  then find the channel control block for UCD */
-    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
       ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
     {
         if ( l2c_ucd_connect (rem_bda) == FALSE )
@@ -421,7 +421,7 @@
         }
 
         /* If we still don't have lcb and ccb after connect attempt, then can't proceed */
-        if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+        if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
             || ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
         {
             GKI_freebuf (p_buf);
@@ -439,7 +439,7 @@
     /* UCD MTU check */
     if ((p_lcb->ucd_mtu) && (p_buf->len > p_lcb->ucd_mtu))
     {
-        L2CAP_TRACE_WARNING1 ("L2CAP - Handle: 0x%04x  UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle);
+        L2CAP_TRACE_WARNING ("L2CAP - Handle: 0x%04x  UCD bigger than peer's UCD mtu size cannot be sent", p_lcb->handle);
         GKI_freebuf (p_buf);
         return (L2CAP_DW_FAILED);
     }
@@ -447,7 +447,7 @@
     /* If already congested, do not accept any more packets */
     if (p_ccb->cong_sent)
     {
-        L2CAP_TRACE_ERROR3 ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u  buff_quota: %u",
+        L2CAP_TRACE_ERROR ("L2CAP - Handle: 0x%04x UCD cannot be sent, already congested count: %u  buff_quota: %u",
                             p_lcb->handle,
                             (p_ccb->xmit_hold_q.count + p_lcb->ucd_out_sec_pending_q.count),
                             p_ccb->buff_quota);
@@ -484,16 +484,16 @@
     tL2C_LCB        *p_lcb;
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API3 ("L2CA_UcdSetIdleTimeout()  Timeout: 0x%04x  BDA: %08x%04x", timeout,
+    L2CAP_TRACE_API ("L2CA_UcdSetIdleTimeout()  Timeout: 0x%04x  BDA: %08x%04x", timeout,
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                       (rem_bda[4]<<8)+rem_bda[5]);
 
     /* First, see if we already have a link to the remote */
     /* then find the channel control block. */
-    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if (((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
       ||((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL))
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no UCD channel");
+        L2CAP_TRACE_WARNING ("L2CAP - no UCD channel");
         return (FALSE);
     }
     else
@@ -517,20 +517,20 @@
     tL2C_LCB        *p_lcb;
     tL2C_CCB        *p_ccb;
 
-    L2CAP_TRACE_API3 ("L2CA_UCDSetTxPriority()  priority: 0x%02x  BDA: %08x%04x", priority,
+    L2CAP_TRACE_API ("L2CA_UCDSetTxPriority()  priority: 0x%02x  BDA: %08x%04x", priority,
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                       (rem_bda[4]<<8)+rem_bda[5]);
 
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_UCDSetTxPriority");
+        L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_UCDSetTxPriority");
         return (FALSE);
     }
 
     /* Find the channel control block */
     if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, L2CAP_CONNECTIONLESS_CID)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for L2CA_UCDSetTxPriority");
+        L2CAP_TRACE_WARNING ("L2CAP - no CCB for L2CA_UCDSetTxPriority");
         return (FALSE);
     }
 
@@ -557,25 +557,25 @@
     tL2C_CCB        *p_ccb;
     tL2C_RCB        *p_rcb;
 
-    L2CAP_TRACE_DEBUG2 ("l2c_ucd_connect()  BDA: %08x%04x",
+    L2CAP_TRACE_DEBUG ("l2c_ucd_connect()  BDA: %08x%04x",
                       (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
                       (rem_bda[4]<<8)+rem_bda[5]);
 
     /* Fail if we have not established communications with the controller */
     if (!BTM_IsDeviceUp())
     {
-        L2CAP_TRACE_WARNING0 ("l2c_ucd_connect - BTU not ready");
+        L2CAP_TRACE_WARNING ("l2c_ucd_connect - BTU not ready");
         return (FALSE);
     }
 
     /* First, see if we already have a link to the remote */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_BR_EDR)) == NULL)
     {
         /* No link. Get an LCB and start link establishment */
-        if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE)) == NULL)
-         ||  (l2cu_create_conn(p_lcb) == FALSE) )
+        if ( ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, BT_TRANSPORT_BR_EDR)) == NULL)
+         ||  (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) )
         {
-            L2CAP_TRACE_WARNING0 ("L2CAP - conn not started l2c_ucd_connect");
+            L2CAP_TRACE_WARNING ("L2CAP - conn not started l2c_ucd_connect");
             return (FALSE);
         }
     }
@@ -583,7 +583,7 @@
     {
         if (!(p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
         {
-            L2CAP_TRACE_WARNING0 ("L2CAP - UCD is not supported by peer, l2c_ucd_connect");
+            L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_connect");
             return (FALSE);
         }
     }
@@ -594,7 +594,7 @@
         /* Allocate a channel control block */
         if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
         {
-            L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for l2c_ucd_connect");
+            L2CAP_TRACE_WARNING ("L2CAP - no CCB for l2c_ucd_connect");
             return (FALSE);
         }
         else
@@ -611,7 +611,7 @@
 
             if ((p_rcb = l2cu_find_rcb_by_psm (L2C_UCD_RCB_ID)) == NULL)
             {
-                L2CAP_TRACE_WARNING0 ("L2CAP - no UCD registered, l2c_ucd_connect");
+                L2CAP_TRACE_WARNING ("L2CAP - no UCD registered, l2c_ucd_connect");
                 return (FALSE);
             }
             /* Save UCD registration info */
@@ -664,7 +664,7 @@
 
     if (p_ccb == NULL)
     {
-        L2CAP_TRACE_ERROR0 ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req");
+        L2CAP_TRACE_ERROR ("L2CAP - NULL p_ccb in l2c_ucd_check_pending_info_req");
         return (FALSE);
     }
 
@@ -680,7 +680,7 @@
                 {
                     if (!(p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_UCD_RECEPTION))
                     {
-                        L2CAP_TRACE_WARNING0 ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req");
+                        L2CAP_TRACE_WARNING ("L2CAP - UCD is not supported by peer, l2c_ucd_check_pending_info_req");
 
                         l2c_ucd_delete_sec_pending_q(p_ccb->p_lcb);
                         l2cu_release_ccb (p_ccb);
@@ -914,7 +914,7 @@
             /* Allocate a channel control block */
             if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL)
             {
-                L2CAP_TRACE_WARNING0 ("L2CAP - no CCB for UCD reception");
+                L2CAP_TRACE_WARNING ("L2CAP - no CCB for UCD reception");
                 GKI_freebuf (p_msg);
                 return TRUE;
             }
diff --git a/stack/l2cap/l2c_utils.c b/stack/l2cap/l2c_utils.c
index 05d5e5d..77849ac 100644
--- a/stack/l2cap/l2c_utils.c
+++ b/stack/l2cap/l2c_utils.c
@@ -37,6 +37,7 @@
 #include "btm_int.h"
 #include "hcidefs.h"
 #include "bd.h"
+#include "bt_utils.h"
 
 /*******************************************************************************
 **
@@ -47,7 +48,7 @@
 ** Returns          LCB address or NULL if none found
 **
 *******************************************************************************/
-tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
+tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPORT transport)
 {
     int         xx;
     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
@@ -69,10 +70,20 @@
             p_lcb->idle_timeout    = l2cb.idle_timeout;
             p_lcb->id              = 1;                     /* spec does not allow '0' */
             p_lcb->is_bonding      = is_bonding;
+#if (BLE_INCLUDED == TRUE)
+            p_lcb->transport       = transport;
 
-            l2cb.num_links_active++;
-
-            l2c_link_adjust_allocation();
+            if (transport == BT_TRANSPORT_LE)
+            {
+                l2cb.num_ble_links_active++;
+                l2c_ble_link_adjust_allocation();
+            }
+            else
+#endif
+            {
+                l2cb.num_links_active++;
+                l2c_link_adjust_allocation();
+            }
             return (p_lcb);
         }
     }
@@ -93,11 +104,11 @@
 *******************************************************************************/
 void l2cu_update_lcb_4_bonding (BD_ADDR p_bd_addr, BOOLEAN is_bonding)
 {
-    tL2C_LCB    *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr);
+    tL2C_LCB    *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR);
 
     if (p_lcb)
     {
-        L2CAP_TRACE_DEBUG3 ("l2cu_update_lcb_4_bonding  BDA: %08x%04x is_bonding: %d",
+        L2CAP_TRACE_DEBUG ("l2cu_update_lcb_4_bonding  BDA: %08x%04x is_bonding: %d",
                           (p_bd_addr[0]<<24)+(p_bd_addr[1]<<16)+(p_bd_addr[2]<<8)+p_bd_addr[3],
                           (p_bd_addr[4]<<8)+p_bd_addr[5], is_bonding);
         p_lcb->is_bonding = is_bonding;
@@ -133,14 +144,17 @@
     }
 
 #if BTM_SCO_INCLUDED == TRUE
-    /* Release all SCO links */
-    btm_remove_sco_links(p_lcb->remote_bd_addr);
+#if (BLE_INCLUDED == TRUE)
+        if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+#endif
+        /* Release all SCO links */
+        btm_remove_sco_links(p_lcb->remote_bd_addr);
 #endif
 
     if (p_lcb->sent_not_acked > 0)
     {
 #if (BLE_INCLUDED == TRUE)
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             l2cb.controller_le_xmit_window += p_lcb->sent_not_acked;
             if (l2cb.controller_le_xmit_window > l2cb.num_lm_ble_bufs)
@@ -160,7 +174,6 @@
     }
 
 #if (BLE_INCLUDED == TRUE)
-    p_lcb->is_ble_link = FALSE;
     l2cb.is_ble_connecting = FALSE;
 #endif
 
@@ -174,11 +187,11 @@
             {
                 l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
                 p_lcb->p_fixed_ccbs[xx] = NULL;
-                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
             }
             else if ( (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
                    && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) )
-                    (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+                    (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
         }
     }
 #endif
@@ -191,8 +204,11 @@
 
     /* Tell BTM Acl management the link was removed */
     if ((p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_DISCONNECTING))
-        btm_acl_removed (p_lcb->remote_bd_addr);
-
+#if (BLE_INCLUDED == TRUE)
+        btm_acl_removed (p_lcb->remote_bd_addr, p_lcb->transport);
+#else
+        btm_acl_removed (p_lcb->remote_bd_addr, BT_TRANSPORT_BR_EDR);
+#endif
     /* Release any held buffers */
     while (p_lcb->link_xmit_data_q.p_first)
         GKI_freebuf (GKI_dequeue (&p_lcb->link_xmit_data_q));
@@ -202,11 +218,23 @@
     l2c_ucd_delete_sec_pending_q(p_lcb);
 #endif
 
+#if BLE_INCLUDED == TRUE
     /* Re-adjust flow control windows make sure it does not go negative */
-    if (l2cb.num_links_active >= 1)
-        l2cb.num_links_active--;
+    if (p_lcb->transport == BT_TRANSPORT_LE)
+    {
+        if (l2cb.num_ble_links_active >= 1)
+            l2cb.num_ble_links_active--;
 
-    l2c_link_adjust_allocation();
+        l2c_ble_link_adjust_allocation();
+    }
+    else
+#endif
+    {
+        if (l2cb.num_links_active >= 1)
+            l2cb.num_links_active--;
+
+        l2c_link_adjust_allocation();
+    }
 
     /* Check for ping outstanding */
     if (p_lcb->p_echo_rsp_cb)
@@ -231,14 +259,18 @@
 ** Returns          pointer to matched LCB, or NULL if no match
 **
 *******************************************************************************/
-tL2C_LCB  *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr)
+tL2C_LCB  *l2cu_find_lcb_by_bd_addr (BD_ADDR p_bd_addr, tBT_TRANSPORT transport)
 {
     int         xx;
     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
 
     for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
     {
-        if ((p_lcb->in_use) && (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
+        if ((p_lcb->in_use) &&
+#if BLE_INCLUDED == TRUE
+            p_lcb->transport == transport &&
+#endif
+            (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
         {
             return (p_lcb);
         }
@@ -253,8 +285,6 @@
 ** Function         l2cu_get_conn_role
 **
 ** Description      Determine the desired role (master or slave) of a link.
-**                  If it is the previous connected remote device, use the same
-**                  role as previous used role.
 **                  If already got a slave link, this one must be a master. If
 **                  already got at least 1 link where we are the master, make this
 **                  also a master.
@@ -262,22 +292,46 @@
 ** Returns          HCI_ROLE_MASTER or HCI_ROLE_SLAVE
 **
 *******************************************************************************/
-UINT8 l2cu_get_conn_role (BD_ADDR bd_addr)
+UINT8 l2cu_get_conn_role (tL2C_LCB *p_this_lcb)
 {
-    UINT8 i;
-    for (i = 0; i < BTM_ROLE_DEVICE_NUM; i++) {
-        if ((btm_cb.previous_connected_role[i] != BTM_ROLE_UNDEFINED) &&
-            (!bdcmp(bd_addr, btm_cb.previous_connected_remote_addr[i]))) {
-            L2CAP_TRACE_WARNING1 ("l2cu_get_conn_role %d",
-                                  btm_cb.previous_connected_role[i]);
-            return btm_cb.previous_connected_role[i];
-        }
-    }
     return l2cb.desire_role;
 }
 
 /*******************************************************************************
 **
+** Function         l2c_is_cmd_rejected
+**
+** Description      Checks if cmd_code is command or response
+**                  If a command it will be rejected per spec.
+**                  This function is used when a illegal packet length is detected
+**
+** Returns          BOOLEAN - TRUE if cmd_code is a command and it is rejected,
+**                            FALSE if response code. (command not rejected)
+**
+*******************************************************************************/
+BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb)
+{
+    switch(cmd_code)
+    {
+    case L2CAP_CMD_CONN_REQ:
+    case L2CAP_CMD_CONFIG_REQ:
+    case L2CAP_CMD_DISC_REQ:
+    case L2CAP_CMD_ECHO_REQ:
+    case L2CAP_CMD_INFO_REQ:
+    case L2CAP_CMD_AMP_CONN_REQ:
+    case L2CAP_CMD_AMP_MOVE_REQ:
+    case L2CAP_CMD_BLE_UPDATE_REQ:
+        l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_MTU_EXCEEDED, id, L2CAP_DEFAULT_MTU, 0);
+        L2CAP_TRACE_WARNING ("Dumping first Command (%d)", cmd_code);
+        return TRUE;
+
+    default:    /* Otherwise a response */
+        return FALSE;
+    }
+}
+
+/*******************************************************************************
+**
 ** Function         l2cu_build_header
 **
 ** Description      Builds the L2CAP command packet header
@@ -292,7 +346,7 @@
 
     if (!p_buf)
     {
-        L2CAP_TRACE_ERROR0 ("l2cu_build_header - no buffer");
+        L2CAP_TRACE_ERROR ("l2cu_build_header - no buffer");
         return (NULL);
     }
 
@@ -301,17 +355,26 @@
     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET;
 
     /* Put in HCI header - handle + pkt boundary */
-#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
-    UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
-#else
-    UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
+#if (BLE_INCLUDED == TRUE)
+    if (p_lcb->transport == BT_TRANSPORT_LE)
+    {
+        UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
+    }
+    else
 #endif
+    {
+#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
+        UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
+#else
+        UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
+#endif
+    }
 
     UINT16_TO_STREAM (p, len + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD);
     UINT16_TO_STREAM (p, len + L2CAP_CMD_OVERHEAD);
 
 #if (BLE_INCLUDED == TRUE)
-    if (p_lcb->is_ble_link)
+    if (p_lcb->transport == BT_TRANSPORT_LE)
     {
         UINT16_TO_STREAM (p, L2CAP_BLE_SIGNALLING_CID);
     }
@@ -374,7 +437,7 @@
 
     if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer cmd_rej");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer cmd_rej");
         return;
     }
 
@@ -417,7 +480,7 @@
     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
                                     p_ccb->local_id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
         return;
     }
 
@@ -457,7 +520,7 @@
 
     if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_rsp");
         return;
     }
 
@@ -491,7 +554,7 @@
 
     if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
         return;
     }
 
@@ -543,7 +606,7 @@
     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
         L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
         return;
     }
 
@@ -643,7 +706,7 @@
     if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
                                     L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for conn_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for conn_req");
         return;
     }
 
@@ -717,14 +780,27 @@
 *******************************************************************************/
 void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, UINT16 rej_len)
 {
-    BT_HDR  *p_buf = (BT_HDR *)GKI_getpoolbuf (L2CAP_CMD_POOL_ID);
-    UINT16  len, cfg_len;
+    BT_HDR  *p_buf;
+    UINT16  len, cfg_len, buf_space, len1;
     UINT8   *p, *p_hci_len, *p_data_end;
     UINT8   cfg_code;
 
+    L2CAP_TRACE_DEBUG("l2cu_send_peer_config_rej: data_len=%d, rej_len=%d", data_len, rej_len);
+
+
+    len = BT_HDR_SIZE + HCI_DATA_PREAMBLE_SIZE + L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD + L2CAP_CONFIG_RSP_LEN;
+    len1 = 0xFFFF - len;
+    if (rej_len > len1)
+    {
+        L2CAP_TRACE_ERROR ("L2CAP - cfg_rej pkt size exceeds buffer design max limit.");
+        return;
+    }
+
+    p_buf = (BT_HDR *)GKI_getbuf (len + rej_len);
+
     if (!p_buf)
     {
-        L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for cfg_rej");
+        L2CAP_TRACE_ERROR ("L2CAP - no buffer for cfg_rej");
         return;
     }
 
@@ -761,6 +837,8 @@
     UINT16_TO_STREAM (p, 0);                    /* Flags = 0 (no continuation) */
     UINT16_TO_STREAM (p, L2CAP_CFG_UNKNOWN_OPTIONS);
 
+    buf_space = rej_len;
+
     /* Now, put the rejected options */
     p_data_end = p_data + data_len;
     while (p_data < p_data_end)
@@ -784,8 +862,18 @@
                 {
                     if ((cfg_code & 0x80) == 0)
                     {
-                        memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
-                        p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
+                        if (buf_space >= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD))
+                        {
+                            memcpy(p, p_data, cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
+                            p += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
+                            buf_space -= (cfg_len + L2CAP_CFG_OPTION_OVERHEAD);
+                        }
+                        else
+                        {
+                            L2CAP_TRACE_WARNING("L2CAP - cfg_rej exceeds allocated buffer");
+                            p_data = p_data_end; /* force loop exit */
+                            break;
+                        }
                     }
                     p_data += cfg_len + L2CAP_CFG_OPTION_OVERHEAD;
                 }
@@ -803,6 +891,9 @@
 
     p_buf->len = len + 4;
 
+    L2CAP_TRACE_DEBUG ("L2CAP - cfg_rej pkt hci_len=%d, l2cap_len=%d",
+                        len, (L2CAP_CMD_OVERHEAD+L2CAP_CONFIG_RSP_LEN+rej_len));
+
     l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
 }
 
@@ -829,7 +920,7 @@
 
     if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_req");
         return;
     }
 
@@ -877,7 +968,7 @@
 
     if ((p_buf=l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for disc_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for disc_rsp");
         return;
     }
 
@@ -911,7 +1002,7 @@
 
     if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_req");
         return;
     }
 
@@ -941,6 +1032,21 @@
     BT_HDR  *p_buf;
     UINT8   *p;
     UINT16   maxlen;
+    /* Filter out duplicate IDs or if available buffers are low (intruder checking) */
+    if (!id || id == p_lcb->cur_echo_id)
+    {
+        /* Dump this request since it is illegal */
+        L2CAP_TRACE_WARNING ("L2CAP ignoring duplicate echo request (%d)", id);
+        return;
+    }
+    else
+        p_lcb->cur_echo_id = id;
+     /* Don't respond if we more than 10% of our buffers are used */
+    if (GKI_poolutilization (L2CAP_CMD_POOL_ID) > 10)
+    {
+        L2CAP_TRACE_WARNING ("L2CAP gki pool used up to more than 10%%, ignore echo response");
+        return;
+    }
 
     /* Don't return data if it does not fit in ACL and L2CAP MTU */
     maxlen = (GKI_get_pool_bufsize(L2CAP_CMD_POOL_ID) > btu_cb.hcit_acl_pkt_size) ?
@@ -953,7 +1059,7 @@
 
     if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for echo_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for echo_rsp");
         return;
     }
 
@@ -988,11 +1094,11 @@
 
     if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_req");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_req");
         return;
     }
 
-    L2CAP_TRACE_EVENT1 ("l2cu_send_peer_info_req: type 0x%04x", info_type);
+    L2CAP_TRACE_EVENT ("l2cu_send_peer_info_req: type 0x%04x", info_type);
 
     p = (UINT8 *)(p_buf + 1) + L2CAP_SEND_CMD_OFFSET+HCI_DATA_PREAMBLE_SIZE +
         L2CAP_PKT_OVERHEAD + L2CAP_CMD_OVERHEAD;
@@ -1048,7 +1154,7 @@
 
     if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no buffer for info_rsp");
+        L2CAP_TRACE_WARNING ("L2CAP - no buffer for info_rsp");
         return;
     }
 
@@ -1069,7 +1175,7 @@
     {
         UINT16_TO_STREAM (p, L2CAP_INFO_RESP_RESULT_SUCCESS);
 #if (BLE_INCLUDED == TRUE)
-        if (p_lcb->is_ble_link)
+        if (p_lcb->transport == BT_TRANSPORT_LE)
         {
             /* optional data are not added for now */
             UINT32_TO_STREAM (p, L2CAP_BLE_EXTFEA_MASK);
@@ -1143,12 +1249,12 @@
 
     if ( (!p_ccb->in_use) || (p_q == NULL) )
     {
-        L2CAP_TRACE_ERROR3 ("l2cu_enqueue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x",
+        L2CAP_TRACE_ERROR ("l2cu_enqueue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x",
                             p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
         return;
     }
 
-    L2CAP_TRACE_DEBUG2 ("l2cu_enqueue_ccb CID: 0x%04x  priority: %d",
+    L2CAP_TRACE_DEBUG ("l2cu_enqueue_ccb CID: 0x%04x  priority: %d",
                         p_ccb->local_cid, p_ccb->ccb_priority);
 
     /* If the queue is empty, we go at the front */
@@ -1227,7 +1333,7 @@
 {
     tL2C_CCB_Q      *p_q = NULL;
 
-    L2CAP_TRACE_DEBUG1 ("l2cu_dequeue_ccb  CID: 0x%04x", p_ccb->local_cid);
+    L2CAP_TRACE_DEBUG ("l2cu_dequeue_ccb  CID: 0x%04x", p_ccb->local_cid);
 
     /* Find out which queue the channel is on
     */
@@ -1236,7 +1342,7 @@
 
     if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) )
     {
-        L2CAP_TRACE_ERROR5 ("l2cu_dequeue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x  p_q: 0x%08x  p_q->p_first_ccb: 0x%08x",
+        L2CAP_TRACE_ERROR ("l2cu_dequeue_ccb  CID: 0x%04x ERROR in_use: %u  p_lcb: 0x%08x  p_q: 0x%08x  p_q->p_first_ccb: 0x%08x",
                             p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
         return;
     }
@@ -1314,7 +1420,7 @@
         /* If CCB is not the only guy on the queue */
         if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) )
         {
-            L2CAP_TRACE_DEBUG0 ("Update CCB list in logical link");
+            L2CAP_TRACE_DEBUG ("Update CCB list in logical link");
 
             /* Remove CCB from queue and re-queue it at new priority */
             l2cu_dequeue_ccb (p_ccb);
@@ -1358,7 +1464,7 @@
     tL2C_CCB    *p_ccb;
     tL2C_CCB    *p_prev;
 
-    L2CAP_TRACE_DEBUG1 ("l2cu_allocate_ccb: cid 0x%04x", cid);
+    L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x", cid);
 
     if (!l2cb.p_free_ccb_first)
         return (NULL);
@@ -1393,7 +1499,7 @@
             }
             if (p_prev == NULL)
             {
-                L2CAP_TRACE_ERROR1 ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid);
+                L2CAP_TRACE_ERROR ("l2cu_allocate_ccb: could not find CCB for CID 0x%04x in the free list", cid);
                 return NULL;
             }
         }
@@ -1473,7 +1579,7 @@
         p_ccb->config_done  = 0;
     else
     {
-        L2CAP_TRACE_DEBUG2 ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
+        L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
     }
 
     p_ccb->chnl_state   = CST_CLOSED;
@@ -1563,7 +1669,7 @@
     tL2C_LCB    *p_lcb = p_ccb->p_lcb;
     tL2C_RCB    *p_rcb = p_ccb->p_rcb;
 
-    L2CAP_TRACE_DEBUG2 ("l2cu_release_ccb: cid 0x%04x  in_use: %u", p_ccb->local_cid, p_ccb->in_use);
+    L2CAP_TRACE_DEBUG ("l2cu_release_ccb: cid 0x%04x  in_use: %u", p_ccb->local_cid, p_ccb->in_use);
 
     /* If already released, could be race condition */
     if (!p_ccb->in_use)
@@ -1728,7 +1834,7 @@
     {
         tL2CA_DISCONNECT_IND_CB   *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
 
-        L2CAP_TRACE_WARNING1 ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid);
+        L2CAP_TRACE_WARNING ("L2CAP - disconnect_chnl CID: 0x%04x", local_cid);
 
         l2cu_send_peer_disc_req (p_ccb);
 
@@ -1739,7 +1845,7 @@
     else
     {
         /* failure on the AMP channel, probably need to disconnect ACL */
-        L2CAP_TRACE_ERROR1 ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid);
+        L2CAP_TRACE_ERROR ("L2CAP - disconnect_chnl CID: 0x%04x Ignored", local_cid);
     }
 }
 
@@ -1943,7 +2049,7 @@
         else
             p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3;
 
-        L2CAP_TRACE_DEBUG3 ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d",
+        L2CAP_TRACE_DEBUG ("l2cu_process_peer_cfg_rsp(): peer tx_win_sz: %d, our tx_win_sz: %d, max_held_acks: %d",
                              p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks);
     }
 }
@@ -2104,7 +2210,7 @@
 ** Returns          TRUE if successful, FALSE if gki get buffer fails.
 **
 *******************************************************************************/
-BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb)
+BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport)
 {
     int             xx;
     tL2C_LCB        *p_lcb_cur = &l2cb.lcb_pool[0];
@@ -2116,15 +2222,16 @@
     tBT_DEVICE_TYPE     dev_type;
     tBLE_ADDR_TYPE      addr_type;
 
+
     BTM_ReadDevInfo(p_lcb->remote_bd_addr, &dev_type, &addr_type);
 
-    if (dev_type == BT_DEVICE_TYPE_BLE)
+    if (transport == BT_TRANSPORT_LE)
     {
         if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
             return FALSE;
 
         p_lcb->ble_addr_type = addr_type;
-        p_lcb->is_ble_link   = TRUE;
+        p_lcb->transport = BT_TRANSPORT_LE;
 
         return (l2cble_create_conn(p_lcb));
     }
@@ -2148,13 +2255,13 @@
             /* Check if there is any SCO Active on this BD Address */
             is_sco_active = btm_is_sco_active_by_bdaddr(p_lcb_cur->remote_bd_addr);
 
-            L2CAP_TRACE_API1 ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \
+            L2CAP_TRACE_API ("l2cu_create_conn - btm_is_sco_active_by_bdaddr() is_sco_active = %s", \
                 (is_sco_active == TRUE) ? "TRUE":"FALSE");
 
             if (is_sco_active == TRUE)
                 continue; /* No Master Slave switch not allowed when SCO Active */
 #endif
-
+            /*4_1_TODO check  if btm_cb.devcb.local_features to be used instead */
             if (HCI_SWITCH_SUPPORTED(BTM_ReadLocalFeatures()))
             {
                 /* mark this lcb waiting for switch to be completed and
@@ -2227,7 +2334,7 @@
 
     p_features = BTM_ReadLocalFeatures();
 
-    L2CAP_TRACE_DEBUG4 ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d",
+    L2CAP_TRACE_DEBUG ("l2cu_create_conn_after_switch :%d num_acl:%d no_hi: %d is_bonding:%d",
         l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding);
     /* FW team says that we can participant in 4 piconets
      * typically 3 piconet + 1 for scanning.
@@ -2271,14 +2378,16 @@
 #endif
 
     if (!btsnd_hcic_create_conn (p_lcb->remote_bd_addr,
-                                 HCI_PKT_TYPES_MASK_DM1 + HCI_PKT_TYPES_MASK_DH1,
+                                 ( HCI_PKT_TYPES_MASK_DM1 | HCI_PKT_TYPES_MASK_DH1
+                                 | HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3
+                                 | HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5 ),
                                  page_scan_rep_mode,
                                  page_scan_mode,
                                  clock_offset,
                                  allow_switch))
 
     {
-        L2CAP_TRACE_ERROR0 ("L2CAP - no buffer for l2cu_create_conn");
+        L2CAP_TRACE_ERROR ("L2CAP - no buffer for l2cu_create_conn");
         l2cu_release_lcb (p_lcb);
         return (FALSE);
     }
@@ -2391,12 +2500,12 @@
     UINT8                command[HCI_BRCM_ACL_PRIORITY_PARAM_SIZE];
     UINT8                vs_param;
 
-    APPL_TRACE_EVENT1("SET ACL PRIORITY %d", priority);
+    APPL_TRACE_EVENT("SET ACL PRIORITY %d", priority);
 
     /* Find the link control block for the acl channel */
-    if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr)) == NULL)
+    if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
     {
-        L2CAP_TRACE_WARNING0 ("L2CAP - no LCB for L2CA_SetAclPriority");
+        L2CAP_TRACE_WARNING ("L2CAP - no LCB for L2CA_SetAclPriority");
         return (FALSE);
     }
 
@@ -2463,12 +2572,12 @@
     tL2C_CCB        *p_next_ccb;
     int             xx;
 
-    L2CAP_TRACE_DEBUG1 ("l2cu_resubmit_pending_sec_req  p_bda: 0x%08x", p_bda);
+    L2CAP_TRACE_DEBUG ("l2cu_resubmit_pending_sec_req  p_bda: 0x%08x", p_bda);
 
     /* If we are called with a BDA, only resubmit for that BDA */
     if (p_bda)
     {
-        p_lcb = l2cu_find_lcb_by_bd_addr (p_bda);
+        p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
 
         /* If we don't have one, this is an error */
         if (p_lcb)
@@ -2482,7 +2591,7 @@
         }
         else
         {
-            L2CAP_TRACE_WARNING0 ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR");
+            L2CAP_TRACE_WARNING ("l2cu_resubmit_pending_sec_req - unknown BD_ADDR");
         }
     }
     else
@@ -2539,7 +2648,7 @@
     if (packet_size <= (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + L2CAP_FCS_LEN))
     {
         /* something is very wrong */
-        L2CAP_TRACE_ERROR2 ("l2cu_adjust_out_mps bad packet size: %u  will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
+        L2CAP_TRACE_ERROR ("l2cu_adjust_out_mps bad packet size: %u  will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
         p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
     }
     else
@@ -2559,7 +2668,7 @@
         else
             p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
 
-        L2CAP_TRACE_DEBUG3 ("l2cu_adjust_out_mps use %d   Based on peer_cfg.fcr.mps: %u  packet_size: %u",
+        L2CAP_TRACE_DEBUG ("l2cu_adjust_out_mps use %d   Based on peer_cfg.fcr.mps: %u  packet_size: %u",
                             p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size);
     }
 }
@@ -2658,16 +2767,18 @@
 
     if (timeout == 0)
     {
-        L2CAP_TRACE_DEBUG0 ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link");
+        L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() IDLE timer 0, disconnecting link");
 
         rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
         if (rc == BTM_CMD_STARTED)
         {
+            l2cu_process_fixed_disc_cback(p_lcb);
             p_lcb->link_state = LST_DISCONNECTING;
             timeout = L2CAP_LINK_DISCONNECT_TOUT;
         }
         else if (rc == BTM_SUCCESS)
         {
+            l2cu_process_fixed_disc_cback(p_lcb);
             /* BTM SEC will make sure that link is release (probably after pairing is done) */
             p_lcb->link_state = LST_DISCONNECTING;
             timeout = 0xFFFF;
@@ -2675,6 +2786,7 @@
         else if ( (p_lcb->is_bonding)
             &&   (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) )
         {
+            l2cu_process_fixed_disc_cback(p_lcb);
             p_lcb->link_state = LST_DISCONNECTING;
             timeout = L2CAP_LINK_DISCONNECT_TOUT;
         }
@@ -2687,7 +2799,7 @@
 
     if (timeout != 0xFFFF)
     {
-        L2CAP_TRACE_DEBUG1 ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout);
+        L2CAP_TRACE_DEBUG ("l2cu_no_dynamic_ccbs() starting IDLE timeout: %d", timeout);
         btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, timeout);
     }
     else
@@ -2709,27 +2821,43 @@
 void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb)
 {
     int     xx;
-#if BLE_INCLUDED == TRUE
-    UINT16  reason = (p_lcb->is_ble_link ) ? 1 : 0;
-#else
-    UINT16 reason =0;
+#if (BLE_INCLUDED == TRUE)
+    /* always exclude LE fixed channel on BR/EDR fix channel capability */
+    if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
+        p_lcb->peer_chnl_mask[0] &= ~(L2CAP_FIXED_CHNL_ATT_BIT| \
+                                      L2CAP_FIXED_CHNL_BLE_SIG_BIT| \
+                                      L2CAP_FIXED_CHNL_SMP_BIT);
 #endif
 
     /* Tell all registered fixed channels about the connection */
     for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
     {
+#if BLE_INCLUDED == TRUE
+        /* skip sending LE fix channel callbacks on BR/EDR links */
+        if (p_lcb->transport == BT_TRANSPORT_BR_EDR &&
+            xx + L2CAP_FIRST_FIXED_CHNL >= L2CAP_ATT_CID &&
+            xx + L2CAP_FIRST_FIXED_CHNL <= L2CAP_SMP_CID)
+            continue;
+#endif
         if (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL)
         {
             if (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
             {
                 if (p_lcb->p_fixed_ccbs[xx])
                     p_lcb->p_fixed_ccbs[xx]->chnl_state = CST_OPEN;
-
-                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, reason);
+#if BLE_INCLUDED == TRUE
+                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport);
+#else
+                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR);
+#endif
             }
             else
             {
-                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason);
+#if BLE_INCLUDED == TRUE
+                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+                (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
 
                 if (p_lcb->p_fixed_ccbs[xx])
                 {
@@ -2742,6 +2870,48 @@
 }
 #endif
 
+
+/*******************************************************************************
+**
+** Function         l2cu_process_fixed_disc_cback
+**
+** Description      send l2cap fixed channel disconnection callback to application
+**
+**
+** Returns          void
+**
+*******************************************************************************/
+void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb)
+{
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+    int         xx;
+
+    for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx++)
+    {
+        if (p_lcb->p_fixed_ccbs[xx])
+        {
+            if (p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
+            {
+                l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
+                p_lcb->p_fixed_ccbs[xx] = NULL;
+#if BLE_INCLUDED == TRUE
+            (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+            (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
+           }
+        }
+        else if ( (p_lcb->peer_chnl_mask[0] & (1 << (xx + L2CAP_FIRST_FIXED_CHNL)))
+               && (l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb != NULL) )
+#if BLE_INCLUDED == TRUE
+            (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
+#else
+            (*l2cb.fixed_reg[xx].pL2CA_FixedConn_Cb)(p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
+#endif
+    }
+#endif
+}
+
 #if (BLE_INCLUDED == TRUE)
 /*******************************************************************************
 **
@@ -2764,7 +2934,7 @@
 
     if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_REQ_LEN, L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_req - no buffer");
+        L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_req - no buffer");
         return;
     }
 
@@ -2796,7 +2966,7 @@
 
     if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_RSP_LEN, L2CAP_CMD_BLE_UPDATE_RSP, rem_id)) == NULL )
     {
-        L2CAP_TRACE_WARNING0 ("l2cu_send_peer_ble_par_rsp - no buffer");
+        L2CAP_TRACE_WARNING ("l2cu_send_peer_ble_par_rsp - no buffer");
         return;
     }
 
@@ -2933,11 +3103,11 @@
 
             if (!p_ccb)
             {
-                L2CAP_TRACE_ERROR1("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
+                L2CAP_TRACE_ERROR("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
                 return NULL;
             }
 
-            L2CAP_TRACE_DEBUG3("RR scan pri=%d, lcid=0x%04x, q_cout=%d",
+            L2CAP_TRACE_DEBUG("RR scan pri=%d, lcid=0x%04x, q_cout=%d",
                                 p_ccb->ccb_priority, p_ccb->local_cid, p_ccb->xmit_hold_q.count );
 
             /* store the next serving channel */
@@ -3001,7 +3171,7 @@
 
     if (p_serve_ccb)
     {
-        L2CAP_TRACE_DEBUG3("RR service pri=%d, quota=%d, lcid=0x%04x",
+        L2CAP_TRACE_DEBUG("RR service pri=%d, quota=%d, lcid=0x%04x",
                             p_serve_ccb->ccb_priority,
                             p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota,
                             p_serve_ccb->local_cid );
@@ -3105,6 +3275,7 @@
 
             if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL)
             {
+                l2cu_check_channel_congestion (p_ccb);
                 l2cu_set_acl_hci_header (p_buf, p_ccb);
                 return (p_buf);
             }
@@ -3116,9 +3287,10 @@
                 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
                 if(NULL == p_buf)
                 {
-                    L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send: No data to be sent");
+                    L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send: No data to be sent");
                     return (NULL);
                 }
+                l2cu_check_channel_congestion (p_ccb);
                 l2cu_set_acl_hci_header (p_buf, p_ccb);
                 return (p_buf);
             }
@@ -3147,7 +3319,7 @@
         p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
         if(NULL == p_buf)
         {
-            L2CAP_TRACE_ERROR0("l2cu_get_buffer_to_send() #2: No data to be sent");
+            L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send() #2: No data to be sent");
             return (NULL);
         }
     }
@@ -3179,22 +3351,11 @@
     /* Set the pointer to the beginning of the data minus 4 bytes for the packet header */
     p = (UINT8 *)(p_buf + 1) + p_buf->offset - HCI_DATA_PREAMBLE_SIZE;
 
-#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
-    if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
-            || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) )
-    {
-        UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
-    }
-    else
-    {
-        UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
-    }
-#else
-    UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
-#endif
 #if (BLE_INCLUDED == TRUE)
-    if (p_ccb->p_lcb->is_ble_link)
+    if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
     {
+        UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT));
+
         /* The HCI transport will segment the buffers. */
         if (p_buf->len > btu_cb.hcit_ble_acl_data_size)
         {
@@ -3208,6 +3369,19 @@
     else
 #endif
     {
+#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
+        if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
+                || ((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_PKT) )
+        {
+            UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
+        }
+        else
+        {
+            UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
+        }
+#else
+        UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
+#endif
 
         /* The HCI transport will segment the buffers. */
         if (p_buf->len > btu_cb.hcit_acl_data_size)
@@ -3246,7 +3420,7 @@
     /* If the CCB queue limit is subject to a quota, check for congestion */
 
     /* if this channel has outgoing traffic */
-    if ((p_ccb->p_rcb)&&(p_ccb->buff_quota != 0))
+    if (p_ccb->buff_quota != 0)
     {
         /* If this channel was congested */
         if ( p_ccb->cong_sent )
@@ -3255,9 +3429,9 @@
             if (q_count <= (p_ccb->buff_quota / 2))
             {
                 p_ccb->cong_sent = FALSE;
-                if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
+                if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
                 {
-                    L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x  xmit_hold_q.count: %u  buff_quota: %u",
+                    L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (FALSE), CID: 0x%04x  xmit_hold_q.count: %u  buff_quota: %u",
                                       p_ccb->local_cid, q_count, p_ccb->buff_quota);
 
                     /* Prevent recursive calling */
@@ -3266,17 +3440,32 @@
                     l2cb.is_cong_cback_context = FALSE;
                 }
 #if (L2CAP_UCD_INCLUDED == TRUE)
-                else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
+                else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
                 {
                     if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
                     {
-                        L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
+                        L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (FALSE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
                                              p_ccb->p_lcb->ucd_out_sec_pending_q.count,
                                              p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
                         p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
                     }
                 }
 #endif
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+                else
+                {
+                    UINT8 xx;
+                    for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++)
+                    {
+                        if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
+                        {
+                            if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL)
+                                (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, FALSE);
+                            break;
+                        }
+                    }
+                }
+#endif
             }
         }
         else
@@ -3285,25 +3474,40 @@
             if (q_count > p_ccb->buff_quota)
             {
                 p_ccb->cong_sent = TRUE;
-                if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
+                if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
                 {
-                    L2CAP_TRACE_DEBUG3 ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u",
+                    L2CAP_TRACE_DEBUG ("L2CAP - Calling CongestionStatus_Cb (TRUE),CID:0x%04x,XmitQ:%u,Quota:%u",
                         p_ccb->local_cid, q_count, p_ccb->buff_quota);
 
                     (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE);
                 }
 #if (L2CAP_UCD_INCLUDED == TRUE)
-                else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
+                else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
                 {
                     if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
                     {
-                        L2CAP_TRACE_DEBUG3 ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
+                        L2CAP_TRACE_DEBUG ("L2CAP - Calling UCD CongestionStatus_Cb (TRUE), SecPendingQ:%u,XmitQ:%u,Quota:%u",
                                              p_ccb->p_lcb->ucd_out_sec_pending_q.count,
                                              p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
                         p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );
                     }
                 }
 #endif
+#if (L2CAP_NUM_FIXED_CHNLS > 0)
+                else
+                {
+                    UINT8 xx;
+                    for (xx = 0; xx < L2CAP_NUM_FIXED_CHNLS; xx ++)
+                    {
+                        if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
+                        {
+                            if (l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb != NULL)
+                                (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, TRUE);
+                            break;
+                        }
+                    }
+                }
+#endif
             }
         }
     }
diff --git a/stack/mcap/mca_api.c b/stack/mcap/mca_api.c
index 1792f8c..2a2ff8c 100644
--- a/stack/mcap/mca_api.c
+++ b/stack/mcap/mca_api.c
@@ -128,7 +128,7 @@
     WC_ASSERT(p_reg != NULL );
     WC_ASSERT(p_cback != NULL );
 
-    MCA_TRACE_API2 ("MCA_Register: ctrl_psm:0x%x, data_psm:0x%x", p_reg->ctrl_psm, p_reg->data_psm);
+    MCA_TRACE_API ("MCA_Register: ctrl_psm:0x%x, data_psm:0x%x", p_reg->ctrl_psm, p_reg->data_psm);
 
     if ( (p_rcb = mca_rcb_alloc (p_reg)) != NULL)
     {
@@ -136,7 +136,7 @@
         {
             if (L2C_INVALID_PSM(p_reg->ctrl_psm) || L2C_INVALID_PSM(p_reg->data_psm))
             {
-                MCA_TRACE_ERROR0 ("INVALID_PSM");
+                MCA_TRACE_ERROR ("INVALID_PSM");
                 return 0;
             }
 
@@ -161,7 +161,7 @@
             }
             else
             {
-                MCA_TRACE_ERROR0 ("Failed to register to L2CAP");
+                MCA_TRACE_ERROR ("Failed to register to L2CAP");
                 return 0;
             }
         }
@@ -190,7 +190,7 @@
 {
     tMCA_RCB *p_rcb = mca_rcb_by_handle(handle);
 
-    MCA_TRACE_API1 ("MCA_Deregister: %d", handle);
+    MCA_TRACE_API ("MCA_Deregister: %d", handle);
     if (p_rcb && p_rcb->reg.ctrl_psm)
     {
         L2CA_Deregister(p_rcb->reg.ctrl_psm);
@@ -225,12 +225,12 @@
     WC_ASSERT(p_cs != NULL );
     WC_ASSERT(p_cs->p_data_cback != NULL );
 
-    MCA_TRACE_API1 ("MCA_CreateDep: %d", handle);
+    MCA_TRACE_API ("MCA_CreateDep: %d", handle);
     if (p_rcb)
     {
         if (p_cs->max_mdl > MCA_NUM_MDLS)
         {
-            MCA_TRACE_ERROR1 ("max_mdl: %d is too big", p_cs->max_mdl );
+            MCA_TRACE_ERROR ("max_mdl: %d is too big", p_cs->max_mdl );
             result = MCA_BAD_PARAMS;
         }
         else
@@ -240,7 +240,7 @@
             {
                 if (p_depcs->p_data_cback)
                 {
-                    MCA_TRACE_ERROR0 ("Already has ECHO MDEP");
+                    MCA_TRACE_ERROR ("Already has ECHO MDEP");
                     return MCA_NO_RESOURCES;
                 }
                 memcpy (p_depcs, p_cs, sizeof (tMCA_CS));
@@ -292,7 +292,7 @@
     int      i, max;
     tMCA_CS  *p_depcs;
 
-    MCA_TRACE_API2 ("MCA_DeleteDep: %d dep:%d", handle, dep);
+    MCA_TRACE_API ("MCA_DeleteDep: %d dep:%d", handle, dep);
     if (p_rcb)
     {
         if (dep < MCA_NUM_DEPS && p_rcb->dep[dep].p_data_cback)
@@ -339,12 +339,12 @@
     tMCA_CCB    *p_ccb;
     tMCA_TC_TBL *p_tbl;
 
-    MCA_TRACE_API2 ("MCA_ConnectReq: %d psm:0x%x", handle, ctrl_psm);
+    MCA_TRACE_API ("MCA_ConnectReq: %d psm:0x%x", handle, ctrl_psm);
     if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL)
         p_ccb = mca_ccb_alloc(handle, bd_addr);
     else
     {
-        MCA_TRACE_ERROR0 ("control channel already exists");
+        MCA_TRACE_ERROR ("control channel already exists");
         return MCA_BUSY;
     }
 
@@ -393,7 +393,7 @@
     tMCA_RESULT result = MCA_BAD_HANDLE;
     tMCA_CCB *p_ccb = mca_ccb_by_hdl(mcl);
 
-    MCA_TRACE_API1 ("MCA_DisconnectReq: %d ", mcl);
+    MCA_TRACE_API ("MCA_DisconnectReq: %d ", mcl);
     if (p_ccb)
     {
         result = MCA_SUCCESS;
@@ -429,24 +429,24 @@
     tMCA_CCB_MSG    *p_evt_data;
     tMCA_DCB        *p_dcb;
 
-    MCA_TRACE_API4 ("MCA_CreateMdl: %d dep=%d mdl_id=%d peer_dep_id=%d", mcl, dep, mdl_id, peer_dep_id);
+    MCA_TRACE_API ("MCA_CreateMdl: %d dep=%d mdl_id=%d peer_dep_id=%d", mcl, dep, mdl_id, peer_dep_id);
     if (p_ccb)
     {
         if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("pending req");
+            MCA_TRACE_ERROR ("pending req");
             return MCA_BUSY;
         }
 
         if ((peer_dep_id > MCA_MAX_MDEP_ID) || (!MCA_IS_VALID_MDL_ID(mdl_id)))
         {
-            MCA_TRACE_ERROR2 ("bad peer dep id:%d or bad mdl id: %d ", peer_dep_id, mdl_id);
+            MCA_TRACE_ERROR ("bad peer dep id:%d or bad mdl id: %d ", peer_dep_id, mdl_id);
             return MCA_BAD_PARAMS;
         }
 
         if (mca_ccb_uses_mdl_id(p_ccb, mdl_id))
         {
-            MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id);
+            MCA_TRACE_ERROR ("mdl id: %d is used in the control link", mdl_id);
             return MCA_BAD_MDL_ID;
         }
 
@@ -507,13 +507,13 @@
     tMCA_CCB_MSG    evt_data;
     tMCA_DCB        *p_dcb;
 
-    MCA_TRACE_API5 ("MCA_CreateMdlRsp: %d dep=%d mdl_id=%d cfg=%d rsp_code=%d", mcl, dep, mdl_id, cfg, rsp_code);
+    MCA_TRACE_API ("MCA_CreateMdlRsp: %d dep=%d mdl_id=%d cfg=%d rsp_code=%d", mcl, dep, mdl_id, cfg, rsp_code);
     WC_ASSERT(p_chnl_cfg != NULL );
     if (p_ccb)
     {
         if (p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("congested");
+            MCA_TRACE_ERROR ("congested");
             return MCA_BUSY;
         }
         if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdep_id == dep )
@@ -548,7 +548,7 @@
         }
         else
         {
-            MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_CreateMdlRsp with the given parameters" );
+            MCA_TRACE_ERROR ("The given MCL is not expecting a MCA_CreateMdlRsp with the given parameters" );
             result = MCA_BAD_PARAMS;
         }
     }
@@ -571,7 +571,7 @@
     tMCA_RESULT     result = MCA_BAD_HANDLE;
     tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
 
-    MCA_TRACE_API1 ("MCA_CloseReq: %d ", mdl);
+    MCA_TRACE_API ("MCA_CloseReq: %d ", mdl);
     if (p_dcb)
     {
         result = MCA_SUCCESS;
@@ -604,25 +604,25 @@
     tMCA_CCB_MSG    *p_evt_data;
     tMCA_DCB        *p_dcb;
 
-    MCA_TRACE_API1 ("MCA_ReconnectMdl: %d ", mcl);
+    MCA_TRACE_API ("MCA_ReconnectMdl: %d ", mcl);
     WC_ASSERT(p_chnl_cfg != NULL );
     if (p_ccb)
     {
         if (p_ccb->p_tx_req || p_ccb->p_rx_msg || p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("pending req");
+            MCA_TRACE_ERROR ("pending req");
             return MCA_BUSY;
         }
 
         if (!MCA_IS_VALID_MDL_ID(mdl_id))
         {
-            MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id);
+            MCA_TRACE_ERROR ("bad mdl id: %d ", mdl_id);
             return MCA_BAD_PARAMS;
         }
 
         if (mca_ccb_uses_mdl_id(p_ccb, mdl_id))
         {
-            MCA_TRACE_ERROR1 ("mdl id: %d is used in the control link", mdl_id);
+            MCA_TRACE_ERROR ("mdl id: %d is used in the control link", mdl_id);
             return MCA_BAD_MDL_ID;
         }
 
@@ -673,13 +673,13 @@
     tMCA_CCB_MSG    evt_data;
     tMCA_DCB        *p_dcb;
 
-    MCA_TRACE_API1 ("MCA_ReconnectMdlRsp: %d ", mcl);
+    MCA_TRACE_API ("MCA_ReconnectMdlRsp: %d ", mcl);
     WC_ASSERT(p_chnl_cfg != NULL );
     if (p_ccb)
     {
         if (p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("congested");
+            MCA_TRACE_ERROR ("congested");
             return MCA_BUSY;
         }
         if (p_ccb->p_rx_msg && (p_ccb->p_rx_msg->mdl_id == mdl_id) &&
@@ -698,7 +698,7 @@
                 }
                 else
                 {
-                    MCA_TRACE_ERROR0 ("Out of MDL for this MDEP");
+                    MCA_TRACE_ERROR ("Out of MDL for this MDEP");
                     rsp_code = MCA_RSP_MDEP_BUSY;
                     result = MCA_NO_RESOURCES;
                 }
@@ -711,7 +711,7 @@
         }
         else
         {
-            MCA_TRACE_ERROR0 ("The given MCL is not expecting a MCA_ReconnectMdlRsp with the given parameters" );
+            MCA_TRACE_ERROR ("The given MCL is not expecting a MCA_ReconnectMdlRsp with the given parameters" );
             result = MCA_BAD_PARAMS;
         }
     }
@@ -738,7 +738,7 @@
     tMCA_DCB        *p_dcb;
     tMCA_TC_TBL *p_tbl;
 
-    MCA_TRACE_API1 ("MCA_DataChnlCfg: %d ", mcl);
+    MCA_TRACE_API ("MCA_DataChnlCfg: %d ", mcl);
     WC_ASSERT(p_chnl_cfg != NULL );
     if (p_ccb)
     {
@@ -746,7 +746,7 @@
         if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) ||
             ((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL))
         {
-            MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status);
+            MCA_TRACE_ERROR ("The given MCL is not expecting this API:%d", p_ccb->status);
             return result;
         }
 
@@ -785,7 +785,7 @@
     tMCA_CCB_MSG    *p_evt_data;
     tMCA_DCB        *p_dcb;
 
-    MCA_TRACE_API1 ("MCA_Abort: %d", mcl);
+    MCA_TRACE_API ("MCA_Abort: %d", mcl);
     if (p_ccb)
     {
         result = MCA_NO_RESOURCES;
@@ -793,13 +793,13 @@
         if ((p_ccb->p_tx_req == NULL) || (p_ccb->status != MCA_CCB_STAT_PENDING) ||
             ((p_dcb = mca_dcb_by_hdl(p_ccb->p_tx_req->dcb_idx)) == NULL))
         {
-            MCA_TRACE_ERROR1 ("The given MCL is not expecting this API:%d", p_ccb->status);
+            MCA_TRACE_ERROR ("The given MCL is not expecting this API:%d", p_ccb->status);
             return result;
         }
 
         if (p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("congested");
+            MCA_TRACE_ERROR ("congested");
             return MCA_BUSY;
         }
 
@@ -834,17 +834,17 @@
     tMCA_CCB        *p_ccb = mca_ccb_by_hdl(mcl);
     tMCA_CCB_MSG    *p_evt_data;
 
-    MCA_TRACE_API1 ("MCA_Delete: %d ", mcl);
+    MCA_TRACE_API ("MCA_Delete: %d ", mcl);
     if (p_ccb)
     {
         if (p_ccb->cong)
         {
-            MCA_TRACE_ERROR0 ("congested");
+            MCA_TRACE_ERROR ("congested");
             return MCA_BUSY;
         }
         if (!MCA_IS_VALID_MDL_ID(mdl_id) && (mdl_id != MCA_ALL_MDL_ID))
         {
-            MCA_TRACE_ERROR1 ("bad mdl id: %d ", mdl_id);
+            MCA_TRACE_ERROR ("bad mdl id: %d ", mdl_id);
             return MCA_BAD_PARAMS;
         }
         p_evt_data = (tMCA_CCB_MSG *)GKI_getbuf (sizeof(tMCA_CCB_MSG));
@@ -886,7 +886,7 @@
     tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
     tMCA_DCB_EVT    evt_data;
 
-    MCA_TRACE_API1 ("MCA_WriteReq: %d ", mdl);
+    MCA_TRACE_API ("MCA_WriteReq: %d ", mdl);
     if (p_dcb)
     {
         if (p_dcb->cong)
@@ -917,7 +917,7 @@
     UINT16  lcid = 0;
     tMCA_DCB *p_dcb = mca_dcb_by_hdl(mdl);
 
-    MCA_TRACE_API1 ("MCA_GetL2CapChannel: %d ", mdl);
+    MCA_TRACE_API ("MCA_GetL2CapChannel: %d ", mdl);
     if (p_dcb)
         lcid = p_dcb->lcid;
     return lcid;
diff --git a/stack/mcap/mca_cact.c b/stack/mcap/mca_cact.c
index 16a8cec..bab3c76 100644
--- a/stack/mcap/mca_cact.c
+++ b/stack/mcap/mca_cact.c
@@ -101,7 +101,7 @@
     BOOLEAN is_abort = FALSE;
     tMCA_DCB *p_dcb;
 
-    MCA_TRACE_DEBUG2 ("mca_ccb_snd_req cong=%d req=%d", p_ccb->cong, p_msg->op_code);
+    MCA_TRACE_DEBUG ("mca_ccb_snd_req cong=%d req=%d", p_ccb->cong, p_msg->op_code);
     /* check for abort request */
     if ((p_ccb->status == MCA_CCB_STAT_PENDING) && (p_msg->op_code == MCA_OP_MDL_ABORT_REQ))
     {
@@ -144,7 +144,7 @@
     }
     else
     {
-        MCA_TRACE_WARNING0 ("dropping api req");
+        MCA_TRACE_WARNING ("dropping api req");
         GKI_freebuf (p_data);
     }
 }
@@ -167,7 +167,7 @@
     BOOLEAN chk_mdl = FALSE;
     tMCA_DCB    *p_dcb;
 
-    MCA_TRACE_DEBUG2 ("mca_ccb_snd_rsp cong=%d req=%d", p_ccb->cong, p_msg->op_code);
+    MCA_TRACE_DEBUG ("mca_ccb_snd_rsp cong=%d req=%d", p_ccb->cong, p_msg->op_code);
     /* assume that API functions verified the parameters */
     p_pkt = (BT_HDR *)GKI_getbuf (MCA_CTRL_MTU);
     if (p_pkt)
@@ -232,7 +232,7 @@
 *******************************************************************************/
 void mca_ccb_cong(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
 {
-    MCA_TRACE_DEBUG2 ("mca_ccb_cong cong=%d/%d", p_ccb->cong, p_data->llcong);
+    MCA_TRACE_DEBUG ("mca_ccb_cong cong=%d/%d", p_ccb->cong, p_data->llcong);
     p_ccb->cong = p_data->llcong;
     if (!p_ccb->cong)
     {
@@ -270,17 +270,17 @@
     BOOLEAN         check_req = FALSE;
     UINT8           reject_opcode;
 
-    MCA_TRACE_DEBUG1 ("mca_ccb_hdl_req status:%d", p_ccb->status);
+    MCA_TRACE_DEBUG ("mca_ccb_hdl_req status:%d", p_ccb->status);
     p_rx_msg = (tMCA_CCB_MSG *)p_pkt;
     p = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
     evt_data.hdr.op_code = *p++;
     BE_STREAM_TO_UINT16 (evt_data.hdr.mdl_id, p);
     reject_opcode = evt_data.hdr.op_code+1;
 
-    MCA_TRACE_DEBUG1 ("received mdl id: %d ", evt_data.hdr.mdl_id);
+    MCA_TRACE_DEBUG ("received mdl id: %d ", evt_data.hdr.mdl_id);
     if (p_ccb->status == MCA_CCB_STAT_PENDING)
     {
-        MCA_TRACE_DEBUG0 ("received req inpending state");
+        MCA_TRACE_DEBUG ("received req inpending state");
         /* allow abort in pending state */
         if ((p_ccb->status == MCA_CCB_STAT_PENDING) && (evt_data.hdr.op_code == MCA_OP_MDL_ABORT_REQ))
         {
@@ -299,17 +299,17 @@
     }
     else if (p_ccb->p_rx_msg)
     {
-        MCA_TRACE_DEBUG0 ("still handling prev req");
+        MCA_TRACE_DEBUG ("still handling prev req");
         /* still holding previous message, reject this new one ?? */
 
     }
     else if (p_ccb->p_tx_req)
     {
-        MCA_TRACE_DEBUG1 ("still waiting for a response ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
+        MCA_TRACE_DEBUG ("still waiting for a response ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
         /* sent a request; waiting for response */
         if (p_ccb->ctrl_vpsm == 0)
         {
-            MCA_TRACE_DEBUG0 ("local is ACP. accept the cmd from INT");
+            MCA_TRACE_DEBUG ("local is ACP. accept the cmd from INT");
             /* local is acceptor, need to handle the request */
             check_req = TRUE;
             reject_code = MCA_RSP_SUCCESS;
@@ -366,12 +366,12 @@
                     p_rx_msg->mdep_id = evt_data.create_ind.dep_id;
                     if (!mca_is_valid_dep_id(p_ccb->p_rcb, p_rx_msg->mdep_id))
                     {
-                        MCA_TRACE_ERROR0 ("not a valid local mdep id");
+                        MCA_TRACE_ERROR ("not a valid local mdep id");
                         reject_code = MCA_RSP_BAD_MDEP;
                     }
                     else if (mca_ccb_uses_mdl_id(p_ccb, evt_data.hdr.mdl_id))
                     {
-                        MCA_TRACE_DEBUG0 ("the mdl_id is currently used in the CL(create)");
+                        MCA_TRACE_DEBUG ("the mdl_id is currently used in the CL(create)");
                         mca_dcb_close_by_mdl_id(p_ccb, evt_data.hdr.mdl_id);
                     }
                     else
@@ -379,7 +379,7 @@
                         /* check if this dep still have MDL available */
                         if (mca_dep_free_mdl(p_ccb, evt_data.create_ind.dep_id) == 0)
                         {
-                            MCA_TRACE_ERROR0 ("the mdep is currently using max_mdl");
+                            MCA_TRACE_ERROR ("the mdep is currently using max_mdl");
                             reject_code = MCA_RSP_MDEP_BUSY;
                         }
                     }
@@ -388,7 +388,7 @@
                 case MCA_OP_MDL_RECONNECT_REQ:
                     if (mca_ccb_uses_mdl_id(p_ccb, evt_data.hdr.mdl_id))
                     {
-                        MCA_TRACE_ERROR0 ("the mdl_id is currently used in the CL(reconn)");
+                        MCA_TRACE_ERROR ("the mdl_id is currently used in the CL(reconn)");
                         reject_code = MCA_RSP_MDL_BUSY;
                     }
                     break;
@@ -494,7 +494,7 @@
                 {
                     if (evt_data.hdr.mdl_id != p_dcb->mdl_id)
                     {
-                        MCA_TRACE_ERROR2 ("peer's mdl_id=%d != our mdl_id=%d", evt_data.hdr.mdl_id, p_dcb->mdl_id);
+                        MCA_TRACE_ERROR ("peer's mdl_id=%d != our mdl_id=%d", evt_data.hdr.mdl_id, p_dcb->mdl_id);
                         /* change the response code to be an error */
                         if (evt_data.rsp.rsp_code == MCA_RSP_SUCCESS)
                         {
@@ -544,7 +544,7 @@
     else
     {
         /* not expecting any response. drop it */
-        MCA_TRACE_WARNING0 ("dropping received rsp (not expecting a response)");
+        MCA_TRACE_WARNING ("dropping received rsp (not expecting a response)");
     }
     GKI_freebuf (p_data);
 }
diff --git a/stack/mcap/mca_csm.c b/stack/mcap/mca_csm.c
index af43bef..0077f35 100644
--- a/stack/mcap/mca_csm.c
+++ b/stack/mcap/mca_csm.c
@@ -190,9 +190,9 @@
     UINT8              action;
 
 #if (BT_TRACE_VERBOSE == TRUE)
-    MCA_TRACE_EVENT3("CCB ccb=%d event=%s state=%s", mca_ccb_to_hdl(p_ccb), mca_ccb_evt_str[event], mca_ccb_st_str[p_ccb->state]);
+    MCA_TRACE_EVENT("CCB ccb=%d event=%s state=%s", mca_ccb_to_hdl(p_ccb), mca_ccb_evt_str[event], mca_ccb_st_str[p_ccb->state]);
 #else
-    MCA_TRACE_EVENT3("CCB ccb=%d event=%d state=%d", mca_ccb_to_hdl(p_ccb), event, p_ccb->state);
+    MCA_TRACE_EVENT("CCB ccb=%d event=%d state=%d", mca_ccb_to_hdl(p_ccb), event, p_ccb->state);
 #endif
 
     /* look up the state table for the current state */
@@ -260,7 +260,7 @@
     tMCA_CCB *p_ccb_tmp;
     int       i;
 
-    MCA_TRACE_DEBUG1("mca_ccb_alloc handle:0x%x", handle);
+    MCA_TRACE_DEBUG("mca_ccb_alloc handle:0x%x", handle);
     if (p_rcb)
     {
         i = handle-1;
@@ -295,7 +295,7 @@
 {
     tMCA_CTRL   evt_data;
 
-    MCA_TRACE_DEBUG1("mca_ccb_dealloc ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
+    MCA_TRACE_DEBUG("mca_ccb_dealloc ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
     mca_dcb_close_by_mdl_id (p_ccb, MCA_ALL_MDL_ID);
     if (p_ccb->ctrl_vpsm)
     {
diff --git a/stack/mcap/mca_dsm.c b/stack/mcap/mca_dsm.c
index 255b5d4..8b57a69 100644
--- a/stack/mcap/mca_dsm.c
+++ b/stack/mcap/mca_dsm.c
@@ -142,9 +142,9 @@
     if (p_dcb == NULL)
         return;
 #if (BT_TRACE_VERBOSE == TRUE)
-    MCA_TRACE_EVENT3("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]);
+    MCA_TRACE_EVENT("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]);
 #else
-    MCA_TRACE_EVENT3("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state);
+    MCA_TRACE_EVENT("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state);
 #endif
 
     /* look up the state table for the current state */
@@ -238,7 +238,7 @@
     else
     {
         max = 0;
-        MCA_TRACE_WARNING0("Invalid Dep ID");
+        MCA_TRACE_WARNING("Invalid Dep ID");
     }
     left = max - count;
     return left;
@@ -259,7 +259,7 @@
     UINT8    event = MCA_CLOSE_IND_EVT;
     tMCA_CTRL   evt_data;
 
-    MCA_TRACE_DEBUG0("mca_dcb_dealloc");
+    MCA_TRACE_DEBUG("mca_dcb_dealloc");
     mca_free_buf ((void **)&p_dcb->p_data);
     if (p_data)
     {
@@ -325,7 +325,7 @@
     tMCA_DCB *p_dcb;
     int       i;
 
-    MCA_TRACE_DEBUG1("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id);
+    MCA_TRACE_DEBUG("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id);
     i = mca_ccb_to_hdl(p_ccb)-1;
     p_dcb = &mca_cb.dcb[i*MCA_NUM_MDLS];
     for (i=0; i<MCA_NUM_MDLS; i++, p_dcb++)
diff --git a/stack/mcap/mca_l2c.c b/stack/mcap/mca_l2c.c
index bc6fe09..fdd9d09 100644
--- a/stack/mcap/mca_l2c.c
+++ b/stack/mcap/mca_l2c.c
@@ -70,17 +70,19 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void mca_sec_check_complete_term (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void mca_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tMCA_TC_TBL     *p_tbl = (tMCA_TC_TBL *)p_ref_data;
     tL2CAP_CFG_INFO cfg;
     tL2CAP_ERTM_INFO ertm_info;
 
-    MCA_TRACE_DEBUG1("mca_sec_check_complete_term res: %d", res);
+    UNUSED(transport);
+
+    MCA_TRACE_DEBUG("mca_sec_check_complete_term res: %d", res);
 
     if ( res == BTM_SUCCESS )
     {
-        MCA_TRACE_DEBUG2 ("lcid:x%x id:x%x", p_tbl->lcid, p_tbl->id);
+        MCA_TRACE_DEBUG ("lcid:x%x id:x%x", p_tbl->lcid, p_tbl->id);
         /* Set the FCR options: control channel mandates ERTM */
         ertm_info.preferred_mode    = mca_l2c_fcr_opts_def.mode;
         ertm_info.allowed_modes     = L2CAP_FCR_CHAN_OPT_ERTM;
@@ -115,13 +117,14 @@
 ** Returns          void
 **
 *******************************************************************************/
-static void mca_sec_check_complete_orig (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+static void mca_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tMCA_TC_TBL     *p_tbl = (tMCA_TC_TBL *)p_ref_data;
     tL2CAP_CFG_INFO cfg;
     UNUSED(bd_addr);
+    UNUSED(transport);
 
-    MCA_TRACE_DEBUG1("mca_sec_check_complete_orig res: %d", res);
+    MCA_TRACE_DEBUG("mca_sec_check_complete_orig res: %d", res);
 
     if ( res == BTM_SUCCESS )
     {
@@ -157,7 +160,7 @@
     tL2CAP_ERTM_INFO ertm_info, *p_ertm_info = NULL;
     tL2CAP_CFG_INFO  cfg;
 
-    MCA_TRACE_EVENT3 ("mca_l2c_cconn_ind_cback: lcid:x%x psm:x%x id:x%x", lcid, psm, id);
+    MCA_TRACE_EVENT ("mca_l2c_cconn_ind_cback: lcid:x%x psm:x%x id:x%x", lcid, psm, id);
 
     /* do we already have a control channel for this peer? */
     if ((p_ccb = mca_ccb_by_bd(handle, bd_addr)) == NULL)
@@ -234,7 +237,7 @@
     tL2CAP_ERTM_INFO *p_ertm_info = NULL, ertm_info;
     const tMCA_CHNL_CFG   *p_chnl_cfg;
 
-    MCA_TRACE_EVENT2 ("mca_l2c_dconn_ind_cback: lcid:x%x psm:x%x ", lcid, psm);
+    MCA_TRACE_EVENT ("mca_l2c_dconn_ind_cback: lcid:x%x psm:x%x ", lcid, psm);
 
     if (((p_ccb = mca_ccb_by_bd(handle, bd_addr)) != NULL) && /* find the CCB */
         (p_ccb->status == MCA_CCB_STAT_PENDING) &&  /* this CCB is expecting a MDL */
@@ -296,12 +299,12 @@
     tL2CAP_CFG_INFO cfg;
     tMCA_CCB *p_ccb;
 
-    MCA_TRACE_DEBUG2("mca_l2c_connect_cfm_cback lcid: x%x, result: %d",
+    MCA_TRACE_DEBUG("mca_l2c_connect_cfm_cback lcid: x%x, result: %d",
                      lcid, result);
     /* look up info for this channel */
     if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
     {
-        MCA_TRACE_DEBUG2("p_tbl state: %d, tcid: %d", p_tbl->state, p_tbl->tcid);
+        MCA_TRACE_DEBUG("p_tbl state: %d, tcid: %d", p_tbl->state, p_tbl->tcid);
         /* if in correct state */
         if (p_tbl->state == MCA_TC_ST_CONN)
         {
@@ -423,7 +426,7 @@
         {
             p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
         }
-        MCA_TRACE_DEBUG3("peer_mtu: %d, lcid: x%x mtu_present:%d",p_tbl->peer_mtu, lcid, p_cfg->mtu_present);
+        MCA_TRACE_DEBUG("peer_mtu: %d, lcid: x%x mtu_present:%d",p_tbl->peer_mtu, lcid, p_cfg->mtu_present);
 
         /* send L2CAP configure response */
         memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO));
@@ -460,7 +463,7 @@
     tMCA_TC_TBL    *p_tbl;
     UINT16         reason = L2CAP_DISC_TIMEOUT;
 
-    MCA_TRACE_DEBUG2("mca_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
+    MCA_TRACE_DEBUG("mca_l2c_disconnect_ind_cback lcid: %d, ack_needed: %d",
                      lcid, ack_needed);
     /* look up info for this channel */
     if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
@@ -492,7 +495,7 @@
 {
     tMCA_TC_TBL    *p_tbl;
 
-    MCA_TRACE_DEBUG2("mca_l2c_disconnect_cfm_cback lcid: x%x, result: %d",
+    MCA_TRACE_DEBUG("mca_l2c_disconnect_cfm_cback lcid: x%x, result: %d",
                      lcid, result);
     /* look up info for this channel */
     if ((p_tbl = mca_tc_tbl_by_lcid(lcid)) != NULL)
diff --git a/stack/mcap/mca_main.c b/stack/mcap/mca_main.c
index d09319d..60b99d9 100644
--- a/stack/mcap/mca_main.c
+++ b/stack/mcap/mca_main.c
@@ -145,7 +145,7 @@
     p_tbl->state    = MCA_TC_ST_IDLE;
     p_tbl->lcid     = p_ccb->lcid;
     mca_cb.tc.lcid_tbl[p_ccb->lcid - L2CAP_BASE_APPL_CID] = i;
-    MCA_TRACE_DEBUG1("mca_tc_tbl_calloc cb_idx: %d", p_tbl->cb_idx);
+    MCA_TRACE_DEBUG("mca_tc_tbl_calloc cb_idx: %d", p_tbl->cb_idx);
 
     return p_tbl;
 }
@@ -186,7 +186,7 @@
     p_tbl->state    = MCA_TC_ST_IDLE;
     p_tbl->lcid     = p_dcb->lcid;
     mca_cb.tc.lcid_tbl[p_dcb->lcid - L2CAP_BASE_APPL_CID] = i;
-    MCA_TRACE_DEBUG2("mca_tc_tbl_dalloc tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+    MCA_TRACE_DEBUG("mca_tc_tbl_dalloc tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
 
     return p_tbl;
 }
@@ -303,7 +303,7 @@
     close.reason = reason;
     close.lcid   = p_tbl->lcid;
 
-    MCA_TRACE_DEBUG3("mca_tc_close_ind tcid: %d, cb_idx:%d, old: %d",
+    MCA_TRACE_DEBUG("mca_tc_close_ind tcid: %d, cb_idx:%d, old: %d",
                      p_tbl->tcid, p_tbl->cb_idx, p_tbl->state);
 
     /* Check if the transport channel is in use */
@@ -352,7 +352,7 @@
     tMCA_DCB   *p_dcb;
     tMCA_OPEN  open;
 
-    MCA_TRACE_DEBUG2("mca_tc_open_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+    MCA_TRACE_DEBUG("mca_tc_open_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
     p_tbl->state = MCA_TC_ST_OPEN;
 
     open.peer_mtu = p_tbl->peer_mtu;
@@ -406,7 +406,7 @@
     tMCA_CCB   *p_ccb;
     tMCA_DCB   *p_dcb;
 
-    MCA_TRACE_DEBUG2("mca_tc_cong_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+    MCA_TRACE_DEBUG("mca_tc_cong_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
     /* if control channel, notify ccb of congestion */
     if (p_tbl->tcid == MCA_CTRL_TCID)
     {
@@ -445,7 +445,7 @@
     UINT8       *p;
     UINT8       rej_rsp_code = MCA_RSP_SUCCESS;
 
-    MCA_TRACE_DEBUG2("mca_tc_data_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
+    MCA_TRACE_DEBUG("mca_tc_data_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
 
 
     /* if control channel, handle control message */
@@ -463,19 +463,19 @@
             {
                 if (p_buf->len != mca_std_msg_len[*p])
                 {
-                    MCA_TRACE_ERROR3 ("opcode: %d required len:%d, got len:%d", *p, mca_std_msg_len[*p], p_buf->len);
+                    MCA_TRACE_ERROR ("opcode: %d required len:%d, got len:%d", *p, mca_std_msg_len[*p], p_buf->len);
                     rej_rsp_code = MCA_RSP_BAD_PARAM;
                 }
             }
             else if ((*p >= MCA_FIRST_SYNC_OP) && (*p <= MCA_LAST_SYNC_OP))
             {
-                MCA_TRACE_ERROR2 ("unsupported SYNC opcode: %d len:%d", *p, p_buf->len);
+                MCA_TRACE_ERROR ("unsupported SYNC opcode: %d len:%d", *p, p_buf->len);
                 /* reject unsupported request */
                 rej_rsp_code = MCA_RSP_NO_SUPPORT;
             }
             else
             {
-                MCA_TRACE_ERROR2 ("bad opcode: %d len:%d", *p, p_buf->len);
+                MCA_TRACE_ERROR ("bad opcode: %d len:%d", *p, p_buf->len);
                 /* reject unsupported request */
                 rej_rsp_code = MCA_RSP_BAD_OPCODE;
             }
@@ -563,7 +563,7 @@
             if (done)
             {
                 memset (p_rcb, 0, sizeof(tMCA_RCB));
-                MCA_TRACE_DEBUG1("Reset MCA_RCB index=%d",handle);
+                MCA_TRACE_DEBUG("Reset MCA_RCB index=%d",handle);
             }
         }
     }
diff --git a/stack/pan/pan_api.c b/stack/pan/pan_api.c
index d08e527..6ba97b2 100644
--- a/stack/pan/pan_api.c
+++ b/stack/pan/pan_api.c
@@ -147,14 +147,14 @@
     if ((!(role & (PAN_ROLE_CLIENT | PAN_ROLE_GN_SERVER | PAN_ROLE_NAP_SERVER))) &&
         role != PAN_ROLE_INACTIVE)
     {
-        PAN_TRACE_ERROR1 ("PAN role %d is invalid", role);
+        PAN_TRACE_ERROR ("PAN role %d is invalid", role);
         return PAN_FAILURE;
     }
 
     /* If the current active role is same as the role being set do nothing */
     if (pan_cb.role == role)
     {
-        PAN_TRACE_EVENT1 ("PAN role already was set to: %d", role);
+        PAN_TRACE_EVENT ("PAN role already was set to: %d", role);
         return PAN_SUCCESS;
     }
 
@@ -164,7 +164,7 @@
         p_sec = sec_mask;
 
     /* Register all the roles with SDP */
-    PAN_TRACE_API1 ("PAN_SetRole() called with role 0x%x", role);
+    PAN_TRACE_API ("PAN_SetRole() called with role 0x%x", role);
 #if (defined (PAN_SUPPORTS_ROLE_NAP) && PAN_SUPPORTS_ROLE_NAP == TRUE)
     /* Check the service name */
     if ((p_nap_name == NULL) || (*p_nap_name == 0))
@@ -265,7 +265,7 @@
         pan_close_all_connections ();
 
     pan_cb.role = role;
-    PAN_TRACE_EVENT1 ("PAN role set to: %d", role);
+    PAN_TRACE_EVENT ("PAN role set to: %d", role);
     return PAN_SUCCESS;
 }
 
@@ -311,7 +311,7 @@
     /* Check if PAN is active or not */
     if (!(pan_cb.role & src_role))
     {
-        PAN_TRACE_ERROR1 ("PAN is not active for the role %d", src_role);
+        PAN_TRACE_ERROR ("PAN is not active for the role %d", src_role);
         return PAN_FAILURE;
     }
 
@@ -319,7 +319,7 @@
     if ((src_role != PAN_ROLE_CLIENT && src_role != PAN_ROLE_GN_SERVER && src_role != PAN_ROLE_NAP_SERVER) ||
         (dst_role != PAN_ROLE_CLIENT && dst_role != PAN_ROLE_GN_SERVER && dst_role != PAN_ROLE_NAP_SERVER))
     {
-        PAN_TRACE_ERROR2 ("Either source %d or destination role %d is invalid", src_role, dst_role);
+        PAN_TRACE_ERROR ("Either source %d or destination role %d is invalid", src_role, dst_role);
         return PAN_FAILURE;
     }
 
@@ -336,7 +336,7 @@
             ** because if there is already a connection we cannot accept
             ** another connection in PANU role
             */
-            PAN_TRACE_ERROR0 ("Cannot make PANU connections when there are more than one connection");
+            PAN_TRACE_ERROR ("Cannot make PANU connections when there are more than one connection");
             return PAN_INVALID_SRC_ROLE;
         }
 
@@ -363,7 +363,7 @@
     {
         if (pan_cb.num_conns && pan_cb.active_role == PAN_ROLE_CLIENT && !pcb)
         {
-            PAN_TRACE_ERROR0 ("Device already have a connection in PANU role");
+            PAN_TRACE_ERROR ("Device already have a connection in PANU role");
             return PAN_INVALID_SRC_ROLE;
         }
 
@@ -383,7 +383,7 @@
     /* The role combination is not valid */
     else
     {
-        PAN_TRACE_ERROR2 ("Source %d and Destination roles %d are not valid combination",
+        PAN_TRACE_ERROR ("Source %d and Destination roles %d are not valid combination",
             src_role, dst_role);
         return PAN_FAILURE;
     }
@@ -393,12 +393,12 @@
         pcb = pan_allocate_pcb (rem_bda, BNEP_INVALID_HANDLE);
     if (!pcb)
     {
-        PAN_TRACE_ERROR0 ("PAN Connection failed because of no resources");
+        PAN_TRACE_ERROR ("PAN Connection failed because of no resources");
         return PAN_NO_RESOURCES;
     }
     BTM_SetOutService(rem_bda, BTM_SEC_SERVICE_BNEP_PANU, mx_chan_id);
 
-    PAN_TRACE_API6 ("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x",
+    PAN_TRACE_API ("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x",
         rem_bda[0], rem_bda[1], rem_bda[2], rem_bda[3], rem_bda[4], rem_bda[5]);
     if (pcb->con_state == PAN_STATE_IDLE)
     {
@@ -429,7 +429,7 @@
         return result;
     }
 
-    PAN_TRACE_DEBUG1 ("PAN_Connect() current active role set to %d", src_role);
+    PAN_TRACE_DEBUG ("PAN_Connect() current active role set to %d", src_role);
     pan_cb.prv_active_role = pan_cb.active_role;
     pan_cb.active_role = src_role;
     *handle = pcb->handle;
@@ -461,7 +461,7 @@
     pcb = pan_get_pcb_by_handle (handle);
     if(!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+        PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
         return PAN_FAILURE;
     }
 
@@ -476,11 +476,11 @@
 
     if (result != BNEP_SUCCESS)
     {
-        PAN_TRACE_EVENT0 ("Error in closing PAN connection");
+        PAN_TRACE_EVENT ("Error in closing PAN connection");
         return PAN_FAILURE;
     }
 
-    PAN_TRACE_EVENT0 ("PAN connection closed");
+    PAN_TRACE_EVENT ("PAN connection closed");
     return PAN_SUCCESS;
 }
 
@@ -512,7 +512,7 @@
     BT_HDR *buffer;
 
     if (pan_cb.role == PAN_ROLE_INACTIVE || !pan_cb.num_conns) {
-        PAN_TRACE_ERROR1("%s PAN is not active, data write failed.", __func__);
+        PAN_TRACE_ERROR("%s PAN is not active, data write failed.", __func__);
         return PAN_FAILURE;
     }
 
@@ -531,7 +531,7 @@
 
     buffer = (BT_HDR *)GKI_getpoolbuf(PAN_POOL_ID);
     if (!buffer) {
-        PAN_TRACE_ERROR1("%s unable to acquire buffer from pool.", __func__);
+        PAN_TRACE_ERROR("%s unable to acquire buffer from pool.", __func__);
         return PAN_NO_RESOURCES;
     }
 
@@ -574,7 +574,7 @@
 
     if (pan_cb.role == PAN_ROLE_INACTIVE || (!(pan_cb.num_conns)))
     {
-        PAN_TRACE_ERROR0 ("PAN is not active Data write failed");
+        PAN_TRACE_ERROR ("PAN is not active Data write failed");
         GKI_freebuf (p_buf);
         return PAN_FAILURE;
     }
@@ -604,7 +604,7 @@
 
         if (i == MAX_PAN_CONNS)
         {
-            PAN_TRACE_ERROR0 ("PAN Don't have any user connections");
+            PAN_TRACE_ERROR ("PAN Don't have any user connections");
             GKI_freebuf (p_buf);
             return PAN_FAILURE;
         }
@@ -612,16 +612,16 @@
         result = BNEP_WriteBuf (pan_cb.pcb[i].handle, dst, p_buf, protocol, src, ext);
         if (result == BNEP_IGNORE_CMD)
         {
-            PAN_TRACE_DEBUG0 ("PAN ignored data write for PANU connection");
+            PAN_TRACE_DEBUG ("PAN ignored data write for PANU connection");
             return result;
         }
         else if (result != BNEP_SUCCESS)
         {
-            PAN_TRACE_ERROR0 ("PAN failed to write data for the PANU connection");
+            PAN_TRACE_ERROR ("PAN failed to write data for the PANU connection");
             return result;
         }
 
-        PAN_TRACE_DEBUG0 ("PAN successfully wrote data for the PANU connection");
+        PAN_TRACE_DEBUG ("PAN successfully wrote data for the PANU connection");
         return PAN_SUCCESS;
     }
 
@@ -629,14 +629,14 @@
     pcb = pan_get_pcb_by_handle (handle);
     if (!pcb)
     {
-        PAN_TRACE_ERROR0 ("PAN Buf write for wrong handle");
+        PAN_TRACE_ERROR ("PAN Buf write for wrong handle");
         GKI_freebuf (p_buf);
         return PAN_FAILURE;
     }
 
     if (pcb->con_state != PAN_STATE_CONNECTED)
     {
-        PAN_TRACE_ERROR0 ("PAN Buf write when conn is not active");
+        PAN_TRACE_ERROR ("PAN Buf write when conn is not active");
         GKI_freebuf (p_buf);
         return PAN_FAILURE;
     }
@@ -644,16 +644,16 @@
     result = BNEP_WriteBuf (pcb->handle, dst, p_buf, protocol, src, ext);
     if (result == BNEP_IGNORE_CMD)
     {
-        PAN_TRACE_DEBUG0 ("PAN ignored data buf write to PANU");
+        PAN_TRACE_DEBUG ("PAN ignored data buf write to PANU");
         return result;
     }
     else if (result != BNEP_SUCCESS)
     {
-        PAN_TRACE_ERROR0 ("PAN failed to send data buf to the PANU");
+        PAN_TRACE_ERROR ("PAN failed to send data buf to the PANU");
         return result;
     }
 
-    PAN_TRACE_DEBUG0 ("PAN successfully sent data buf to the PANU");
+    PAN_TRACE_DEBUG ("PAN successfully sent data buf to the PANU");
     return PAN_SUCCESS;
 }
 
@@ -687,18 +687,18 @@
     pcb = pan_get_pcb_by_handle (handle);
     if(!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+        PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
         return PAN_FAILURE;
     }
 
     result = BNEP_SetProtocolFilters (pcb->handle, num_filters, p_start_array, p_end_array);
     if (result != BNEP_SUCCESS)
     {
-        PAN_TRACE_ERROR1 ("PAN failed to set protocol filters for handle %d", handle);
+        PAN_TRACE_ERROR ("PAN failed to set protocol filters for handle %d", handle);
         return result;
     }
 
-    PAN_TRACE_API1 ("PAN successfully sent protocol filters for handle %d", handle);
+    PAN_TRACE_API ("PAN successfully sent protocol filters for handle %d", handle);
     return PAN_SUCCESS;
 #else
     return PAN_FAILURE;
@@ -736,7 +736,7 @@
     pcb = pan_get_pcb_by_handle (handle);
     if(!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN connection not found for the handle %d", handle);
+        PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle);
         return PAN_FAILURE;
     }
 
@@ -744,11 +744,11 @@
                             num_mcast_filters, p_start_array, p_end_array);
     if (result != BNEP_SUCCESS)
     {
-        PAN_TRACE_ERROR1 ("PAN failed to set multicast filters for handle %d", handle);
+        PAN_TRACE_ERROR ("PAN failed to set multicast filters for handle %d", handle);
         return result;
     }
 
-    PAN_TRACE_API1 ("PAN successfully sent multicast filters for handle %d", handle);
+    PAN_TRACE_API ("PAN successfully sent multicast filters for handle %d", handle);
     return PAN_SUCCESS;
 #else
     return PAN_FAILURE;
diff --git a/stack/pan/pan_main.c b/stack/pan/pan_main.c
index bfaced6..8306df3 100644
--- a/stack/pan/pan_main.c
+++ b/stack/pan/pan_main.c
@@ -141,7 +141,7 @@
 
     if (wrong_uuid)
     {
-        PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong remote UUID ");
+        PAN_TRACE_ERROR ("PAN Connection failed because of wrong remote UUID ");
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
         return;
     }
@@ -175,17 +175,17 @@
 
     if (wrong_uuid)
     {
-        PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong local UUID ");
+        PAN_TRACE_ERROR ("PAN Connection failed because of wrong local UUID ");
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
         return;
     }
 
-    PAN_TRACE_EVENT5 ("pan_conn_ind_cb - for handle %d, current role %d, dst uuid 0x%x, src uuid 0x%x, role change %s",
+    PAN_TRACE_EVENT ("pan_conn_ind_cb - for handle %d, current role %d, dst uuid 0x%x, src uuid 0x%x, role change %s",
         handle, pan_cb.role, local_uuid->uu.uuid16, remote_uuid->uu.uuid16, is_role_change?"YES":"NO");
     /* The acceptable UUID size is only 2 */
     if (remote_uuid->len != 2)
     {
-        PAN_TRACE_ERROR1 ("PAN Connection failed because of wrong UUID size %d", remote_uuid->len);
+        PAN_TRACE_ERROR ("PAN Connection failed because of wrong UUID size %d", remote_uuid->len);
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_UUID_SIZE);
         return;
     }
@@ -196,7 +196,7 @@
         remote_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
         remote_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
     {
-        PAN_TRACE_ERROR1 ("Src UUID 0x%x is not valid", remote_uuid->uu.uuid16);
+        PAN_TRACE_ERROR ("Src UUID 0x%x is not valid", remote_uuid->uu.uuid16);
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
         return;
     }
@@ -206,7 +206,7 @@
         local_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
         local_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
     {
-        PAN_TRACE_ERROR1 ("Dst UUID 0x%x is not valid", remote_uuid->uu.uuid16);
+        PAN_TRACE_ERROR ("Dst UUID 0x%x is not valid", remote_uuid->uu.uuid16);
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
         return;
     }
@@ -219,7 +219,7 @@
         ((!(pan_cb.role & UUID_SERVCLASS_NAP))
         && local_uuid->uu.uuid16 == UUID_SERVCLASS_NAP))
     {
-        PAN_TRACE_ERROR1 ("PAN Connection failed because of unsupported destination UUID 0x%x", local_uuid->uu.uuid16);
+        PAN_TRACE_ERROR ("PAN Connection failed because of unsupported destination UUID 0x%x", local_uuid->uu.uuid16);
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
         return;
     }
@@ -243,7 +243,7 @@
             /* There are connections other than this one
             ** so we cann't accept PANU role. Reject
             */
-            PAN_TRACE_ERROR0 ("Dst UUID should be either GN or NAP only because there are other connections");
+            PAN_TRACE_ERROR ("Dst UUID should be either GN or NAP only because there are other connections");
             BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
             return;
         }
@@ -251,7 +251,7 @@
         /* If it is already in connected state check for bridging status */
         if (pcb->con_state == PAN_STATE_CONNECTED)
         {
-            PAN_TRACE_EVENT2 ("PAN Role changing New Src 0x%x Dst 0x%x",
+            PAN_TRACE_EVENT ("PAN Role changing New Src 0x%x Dst 0x%x",
                 remote_uuid->uu.uuid16, local_uuid->uu.uuid16);
 
             pcb->prv_src_uuid = pcb->src_uuid;
@@ -282,23 +282,23 @@
             (local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU ||
             pan_cb.active_role == PAN_ROLE_CLIENT))
         {
-            PAN_TRACE_ERROR0 ("PAN already have a connection and can't be user");
+            PAN_TRACE_ERROR ("PAN already have a connection and can't be user");
             BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
             return;
         }
     }
 
     /* This is a new connection */
-    PAN_TRACE_DEBUG1 ("New connection indication for handle %d", handle);
+    PAN_TRACE_DEBUG ("New connection indication for handle %d", handle);
     pcb = pan_allocate_pcb (p_bda, handle);
     if (!pcb)
     {
-        PAN_TRACE_ERROR0 ("PAN no control block for new connection");
+        PAN_TRACE_ERROR ("PAN no control block for new connection");
         BNEP_ConnectResp (handle, BNEP_CONN_FAILED);
         return;
     }
 
-    PAN_TRACE_EVENT1 ("PAN connection destination UUID is 0x%x", local_uuid->uu.uuid16);
+    PAN_TRACE_EVENT ("PAN connection destination UUID is 0x%x", local_uuid->uu.uuid16);
     /* Set the latest active PAN role */
     pan_cb.active_role = req_role;
     pcb->src_uuid = local_uuid->uu.uuid16;
@@ -336,11 +336,11 @@
     UINT8            peer_role;
     UNUSED(rem_bda);
 
-    PAN_TRACE_EVENT2 ("pan_connect_state_cb - for handle %d, result %d", handle, result);
+    PAN_TRACE_EVENT ("pan_connect_state_cb - for handle %d, result %d", handle, result);
     pcb = pan_get_pcb_by_handle (handle);
     if (!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN State change indication for wrong handle %d", handle);
+        PAN_TRACE_ERROR ("PAN State change indication for wrong handle %d", handle);
         return;
     }
 
@@ -356,7 +356,7 @@
             (pcb->con_flags & PAN_FLAGS_CONN_COMPLETED))
         {
             /* restore the original values */
-            PAN_TRACE_EVENT0 ("restoring the connection state to active");
+            PAN_TRACE_EVENT ("restoring the connection state to active");
             pcb->con_state = PAN_STATE_CONNECTED;
             pcb->con_flags &= (~PAN_FLAGS_CONN_COMPLETED);
 
@@ -406,7 +406,7 @@
     /* Create bridge if the destination role is NAP */
     if (pan_cb.pan_bridge_req_cb && pcb->src_uuid == UUID_SERVCLASS_NAP)
     {
-        PAN_TRACE_EVENT0 ("PAN requesting for bridge");
+        PAN_TRACE_EVENT ("PAN requesting for bridge");
         (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, TRUE);
     }
 }
@@ -455,17 +455,17 @@
     ** send it to the host system
     */
 
-    PAN_TRACE_EVENT1 ("pan_data_ind_cb - for handle %d", handle);
+    PAN_TRACE_EVENT ("pan_data_ind_cb - for handle %d", handle);
     pcb = pan_get_pcb_by_handle (handle);
     if (!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN Data indication for wrong handle %d", handle);
+        PAN_TRACE_ERROR ("PAN Data indication for wrong handle %d", handle);
         return;
     }
 
     if (pcb->con_state != PAN_STATE_CONNECTED)
     {
-        PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
+        PAN_TRACE_ERROR ("PAN Data indication in wrong state %d for handle %d",
             pcb->con_state, handle);
         return;
     }
@@ -473,7 +473,7 @@
     /* Check if it is broadcast packet */
     if (dst[0] & 0x01)
     {
-        PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
+        PAN_TRACE_DEBUG ("PAN received broadcast packet on handle %d, src uuid 0x%x",
             handle, pcb->src_uuid);
         for (i=0; i<MAX_PAN_CONNS; i++)
         {
@@ -554,14 +554,14 @@
     pcb = pan_get_pcb_by_handle (handle);
     if (!pcb)
     {
-        PAN_TRACE_ERROR1 ("PAN Data buffer indication for wrong handle %d", handle);
+        PAN_TRACE_ERROR ("PAN Data buffer indication for wrong handle %d", handle);
         GKI_freebuf (p_buf);
         return;
     }
 
     if (pcb->con_state != PAN_STATE_CONNECTED)
     {
-        PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
+        PAN_TRACE_ERROR ("PAN Data indication in wrong state %d for handle %d",
             pcb->con_state, handle);
         GKI_freebuf (p_buf);
         return;
@@ -570,7 +570,7 @@
     p_data = (UINT8 *)(p_buf + 1) + p_buf->offset;
     len    = p_buf->len;
 
-    PAN_TRACE_EVENT4 ("pan_data_buf_ind_cb - for handle %d, protocol 0x%x, length %d, ext %d",
+    PAN_TRACE_EVENT ("pan_data_buf_ind_cb - for handle %d, protocol 0x%x, length %d, ext %d",
         handle, protocol, len, ext);
 
    if (pcb->src_uuid == UUID_SERVCLASS_NAP)
@@ -583,7 +583,7 @@
     {
         if (dst[0] & 0x01)
         {
-            PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
+            PAN_TRACE_DEBUG ("PAN received broadcast packet on handle %d, src uuid 0x%x",
                 handle, pcb->src_uuid);
             for (i=0; i<MAX_PAN_CONNS; i++)
             {
@@ -610,10 +610,10 @@
         dst_pcb = pan_get_pcb_by_addr (dst);
         if (dst_pcb)
         {
-            PAN_TRACE_EVENT0 ("pan_data_buf_ind_cb - destination PANU found and sending the data");
+            PAN_TRACE_EVENT ("pan_data_buf_ind_cb - destination PANU found and sending the data");
             result = BNEP_WriteBuf (dst_pcb->handle, dst, p_buf, protocol, src, ext);
             if (result != BNEP_SUCCESS && result != BNEP_IGNORE_CMD)
-                PAN_TRACE_ERROR1 ("Failed to write data for PAN connection handle %d", dst_pcb->handle);
+                PAN_TRACE_ERROR ("Failed to write data for PAN connection handle %d", dst_pcb->handle);
             return;
         }
     }
@@ -682,7 +682,7 @@
                             UINT8 *p_filters)
 {
 #if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE)
-    PAN_TRACE_EVENT4 ("pan_proto_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
+    PAN_TRACE_EVENT ("pan_proto_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
                             handle, indication, result, num_filters);
 
     if (pan_cb.pan_pfilt_ind_cb)
@@ -720,7 +720,7 @@
                             UINT8 *p_filters)
 {
 #if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE)
-    PAN_TRACE_EVENT4 ("pan_mcast_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
+    PAN_TRACE_EVENT ("pan_mcast_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
                             handle, indication, result, num_filters);
 
     if (pan_cb.pan_mfilt_ind_cb)
diff --git a/stack/pan/pan_utils.c b/stack/pan/pan_utils.c
index 9ebbb75..7a550fa 100644
--- a/stack/pan/pan_utils.c
+++ b/stack/pan/pan_utils.c
@@ -71,7 +71,7 @@
 
     if (sdp_handle == 0)
     {
-        PAN_TRACE_ERROR0 ("PAN_SetRole - could not create SDP record");
+        PAN_TRACE_ERROR ("PAN_SetRole - could not create SDP record");
         return 0;
     }
 
@@ -133,7 +133,7 @@
          || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_NAP,
                                     sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_NAP)))
         {
-            PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU");
+            PAN_TRACE_ERROR ("PAN Security Registration failed for PANU");
         }
     }
 #endif
@@ -145,7 +145,7 @@
          || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_GN,
                                     sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_GN)))
         {
-            PAN_TRACE_ERROR0 ("PAN Security Registration failed for GN");
+            PAN_TRACE_ERROR ("PAN Security Registration failed for GN");
         }
     }
 #endif
@@ -157,7 +157,7 @@
          || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_PANU,
                                     sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_PANU)))
         {
-            PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU");
+            PAN_TRACE_ERROR ("PAN Security Registration failed for PANU");
         }
     }
 #endif
@@ -332,7 +332,7 @@
     char            buff[200];
     tPAN_CONN      *p_pcb;
 
-    PAN_TRACE_DEBUG3 ("PAN role %x, active role %d, num_conns %d",
+    PAN_TRACE_DEBUG ("PAN role %x, active role %d, num_conns %d",
         pan_cb.role, pan_cb.active_role, pan_cb.num_conns);
 
     for (i = 0, p_pcb = pan_cb.pcb; i < MAX_PAN_CONNS; i++, p_pcb++)
@@ -342,7 +342,7 @@
             p_pcb->rem_bda[0], p_pcb->rem_bda[1], p_pcb->rem_bda[2],
             p_pcb->rem_bda[3], p_pcb->rem_bda[4], p_pcb->rem_bda[5]);
 
-        PAN_TRACE_DEBUG0 (buff);
+        PAN_TRACE_DEBUG (buff);
     }
 #endif
 }
diff --git a/stack/rfcomm/port_api.c b/stack/rfcomm/port_api.c
index 9ea1fca..3643088 100644
--- a/stack/rfcomm/port_api.c
+++ b/stack/rfcomm/port_api.c
@@ -84,7 +84,7 @@
     tRFC_MCB   *p_mcb = port_find_mcb (bd_addr);
     UINT16     rfcomm_mtu;
 
-    RFCOMM_TRACE_API6 ("RFCOMM_CreateConnection()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
+    RFCOMM_TRACE_API ("RFCOMM_CreateConnection()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
                        bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
 
     *p_handle = 0;
@@ -92,7 +92,7 @@
     if (( scn == 0 )||(scn >= PORT_MAX_RFC_PORTS ))
     {
         /* Server Channel Number(SCN) should be in range 1...30 */
-        RFCOMM_TRACE_ERROR0 ("RFCOMM_CreateConnection - invalid SCN");
+        RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - invalid SCN");
         return (PORT_INVALID_SCN);
     }
 
@@ -102,7 +102,7 @@
         dlci = (scn << 1) + 1;
     else
         dlci = (scn << 1);
-    RFCOMM_TRACE_API5("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p",
+    RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p",
                        scn, dlci, is_server, mtu, p_mcb);
 
     /* For the server side always allocate a new port.  On the client side */
@@ -112,7 +112,7 @@
         /* if existing port is also a client port */
         if (p_port->is_server == FALSE)
         {
-            RFCOMM_TRACE_ERROR3 ("RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, MCB state:%d",
+            RFCOMM_TRACE_ERROR ("RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, MCB state:%d",
                 p_port->state, p_port->rfc.state, p_port->rfc.p_mcb ? p_port->rfc.p_mcb->state : 0);
             return (PORT_ALREADY_OPENED);
         }
@@ -120,10 +120,10 @@
 
     if ((p_port = port_allocate_port (dlci, bd_addr)) == NULL)
     {
-        RFCOMM_TRACE_WARNING0 ("RFCOMM_CreateConnection - no resources");
+        RFCOMM_TRACE_WARNING ("RFCOMM_CreateConnection - no resources");
         return (PORT_NO_RESOURCES);
     }
-   RFCOMM_TRACE_API6("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p",
+   RFCOMM_TRACE_API("RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, p_mcb:%p, p_port:%p",
                        scn, dlci, is_server, mtu, p_mcb, p_port);
 
     p_port->default_signal_state = (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON);
@@ -145,7 +145,7 @@
         break;
     }
 
-    RFCOMM_TRACE_EVENT2 ("RFCOMM_CreateConnection dlci:%d signal state:0x%x", dlci, p_port->default_signal_state);
+    RFCOMM_TRACE_EVENT ("RFCOMM_CreateConnection dlci:%d signal state:0x%x", dlci, p_port->default_signal_state);
 
     *p_handle = p_port->inx;
 
@@ -209,19 +209,19 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API1 ("RFCOMM_RemoveConnection() handle:%d", handle);
+    RFCOMM_TRACE_API ("RFCOMM_RemoveConnection() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_RemoveConnection() BAD handle:%d", handle);
+        RFCOMM_TRACE_ERROR ("RFCOMM_RemoveConnection() BAD handle:%d", handle);
         return (PORT_BAD_HANDLE);
     }
     p_port = &rfc_cb.port.port[handle - 1];
 
     if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
     {
-        RFCOMM_TRACE_EVENT1 ("RFCOMM_RemoveConnection() Not opened:%d", handle);
+        RFCOMM_TRACE_EVENT ("RFCOMM_RemoveConnection() Not opened:%d", handle);
         return (PORT_SUCCESS);
     }
 
@@ -245,12 +245,12 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API1 ("RFCOMM_RemoveServer() handle:%d", handle);
+    RFCOMM_TRACE_API ("RFCOMM_RemoveServer() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_RemoveServer() BAD handle:%d", handle);
+        RFCOMM_TRACE_ERROR ("RFCOMM_RemoveServer() BAD handle:%d", handle);
         return (PORT_BAD_HANDLE);
     }
     p_port = &rfc_cb.port.port[handle - 1];
@@ -260,7 +260,7 @@
 
     if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
     {
-        RFCOMM_TRACE_EVENT1 ("RFCOMM_RemoveServer() Not opened:%d", handle);
+        RFCOMM_TRACE_EVENT ("RFCOMM_RemoveServer() Not opened:%d", handle);
         return (PORT_SUCCESS);
     }
 
@@ -305,7 +305,7 @@
         return (PORT_NOT_OPENED);
     }
 
-    RFCOMM_TRACE_API1 ("PORT_SetEventCallback() handle:%d", port_handle);
+    RFCOMM_TRACE_API ("PORT_SetEventCallback() handle:%d", port_handle);
 
     p_port->p_callback = p_port_cb;
 
@@ -353,7 +353,7 @@
 {
     tPORT  *p_port;
 
-    RFCOMM_TRACE_API2 ("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
+    RFCOMM_TRACE_API ("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
 
     /* Check if handle is valid to avoid crashing */
     if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -389,7 +389,7 @@
 {
     tPORT  *p_port;
 
-    RFCOMM_TRACE_API2 ("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
+    RFCOMM_TRACE_API ("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle, p_port_cb);
 
     /* Check if handle is valid to avoid crashing */
     if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -425,7 +425,7 @@
 {
     tPORT  *p_port;
 
-    RFCOMM_TRACE_API2 ("PORT_SetEventMask() handle:%d mask:0x%x", port_handle, mask);
+    RFCOMM_TRACE_API ("PORT_SetEventMask() handle:%d mask:0x%x", port_handle, mask);
 
     /* Check if handle is valid to avoid crashing */
     if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS))
@@ -462,7 +462,7 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API1 ("PORT_CheckConnection() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_CheckConnection() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -565,7 +565,7 @@
     tPORT      *p_port;
     UINT8       baud_rate;
 
-    RFCOMM_TRACE_API1 ("PORT_SetState() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_SetState() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -585,7 +585,7 @@
         return (PORT_LINE_ERR);
     }
 
-    RFCOMM_TRACE_API2 ("PORT_SetState() handle:%d FC_TYPE:0x%x", handle,
+    RFCOMM_TRACE_API ("PORT_SetState() handle:%d FC_TYPE:0x%x", handle,
                        p_settings->fc_type);
 
     baud_rate = p_port->user_port_pars.baud_rate;
@@ -613,7 +613,7 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API1 ("PORT_GetRxQueueCnt() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -635,7 +635,7 @@
 
     *p_rx_queue_count = p_port->rx.queue_size;
 
-	RFCOMM_TRACE_API2 ("PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
+	RFCOMM_TRACE_API ("PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
 		                                     *p_rx_queue_count, p_port->rx.queue_size);
 
     return (PORT_SUCCESS);
@@ -657,7 +657,7 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API1 ("PORT_GetState() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_GetState() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -698,7 +698,7 @@
     tPORT      *p_port;
     UINT8      old_modem_signal;
 
-    RFCOMM_TRACE_API2 ("PORT_Control() handle:%d signal:0x%x", handle, signal);
+    RFCOMM_TRACE_API ("PORT_Control() handle:%d signal:0x%x", handle, signal);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -758,7 +758,7 @@
 
     port_start_control (p_port);
 
-    RFCOMM_TRACE_EVENT4 ("PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
+    RFCOMM_TRACE_EVENT ("PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
         ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
         ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
         ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
@@ -786,7 +786,7 @@
     BOOLEAN    old_fc;
     UINT32     events;
 
-    RFCOMM_TRACE_API2 ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
+    RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -865,7 +865,7 @@
     BOOLEAN    old_fc;
     UINT32     events;
 
-    RFCOMM_TRACE_API2 ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
+    RFCOMM_TRACE_API ("PORT_FlowControl() handle:%d enable: %d", handle, enable);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -957,7 +957,7 @@
 
     *p_signal = p_port->peer_ctrl.modem_signal;
 
-    RFCOMM_TRACE_API2 ("PORT_GetModemStatus() handle:%d signal:%x", handle, *p_signal);
+    RFCOMM_TRACE_API ("PORT_GetModemStatus() handle:%d signal:%x", handle, *p_signal);
 
     return (PORT_SUCCESS);
 }
@@ -983,7 +983,7 @@
 {
     tPORT  *p_port;
 
-    RFCOMM_TRACE_API1 ("PORT_ClearError() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_ClearError() handle:%d", handle);
 
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
@@ -1022,7 +1022,7 @@
 {
     tPORT      *p_port;
 
-    RFCOMM_TRACE_API2 ("PORT_SendError() handle:%d errors:0x%x", handle, errors);
+    RFCOMM_TRACE_API ("PORT_SendError() handle:%d errors:0x%x", handle, errors);
 
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
@@ -1061,7 +1061,7 @@
 {
     tPORT      *p_port;
 
-    /* RFCOMM_TRACE_API1 ("PORT_GetQueueStatus() handle:%d", handle); */
+    /* RFCOMM_TRACE_API ("PORT_GetQueueStatus() handle:%d", handle); */
 
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
@@ -1113,7 +1113,7 @@
     UINT16      count;
     UINT32     events;
 
-    RFCOMM_TRACE_API2 ("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
+    RFCOMM_TRACE_API ("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1190,7 +1190,7 @@
     BT_HDR     *p_buf;
     UINT16      count;
 
-    RFCOMM_TRACE_API2 ("PORT_ReadData() handle:%d max_len:%d", handle, max_len);
+    RFCOMM_TRACE_API ("PORT_ReadData() handle:%d max_len:%d", handle, max_len);
 
     /* Initialize this in case of an error */
     *p_len = 0;
@@ -1264,11 +1264,11 @@
 
     if (*p_len == 1)
     {
-        RFCOMM_TRACE_EVENT3 ("PORT_ReadData queue:%d returned:%d %x", p_port->rx.queue_size, *p_len, (p_data[0]));
+        RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d %x", p_port->rx.queue_size, *p_len, (p_data[0]));
     }
     else
     {
-        RFCOMM_TRACE_EVENT2 ("PORT_ReadData queue:%d returned:%d", p_port->rx.queue_size, *p_len);
+        RFCOMM_TRACE_EVENT ("PORT_ReadData queue:%d returned:%d", p_port->rx.queue_size, *p_len);
     }
 
     /* If rfcomm suspended traffic from the peer based on the rx_queue_size */
@@ -1295,7 +1295,7 @@
     tPORT      *p_port;
     BT_HDR     *p_buf;
 
-    RFCOMM_TRACE_API1 ("PORT_Read() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_Read() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1370,7 +1370,7 @@
         if ((p_port->tx.queue_size  > PORT_TX_CRITICAL_WM)
          || (p_port->tx.queue.count > PORT_TX_BUF_CRITICAL_WM))
         {
-            RFCOMM_TRACE_WARNING1 ("PORT_Write: Queue size: %d",
+            RFCOMM_TRACE_WARNING ("PORT_Write: Queue size: %d",
                                    p_port->tx.queue_size);
 
             GKI_freebuf (p_buf);
@@ -1381,7 +1381,7 @@
             return (PORT_TX_FULL);
         }
 
-        RFCOMM_TRACE_EVENT4 ("PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d ctrl_state %x",
+        RFCOMM_TRACE_EVENT ("PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d ctrl_state %x",
                              p_port->tx.peer_fc,
                              (p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready),
                              p_port->rfc.state,
@@ -1394,7 +1394,7 @@
     }
     else
     {
-        RFCOMM_TRACE_EVENT0 ("PORT_Write : Data is being sent");
+        RFCOMM_TRACE_EVENT ("PORT_Write : Data is being sent");
 
         RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf);
         return (PORT_SUCCESS);
@@ -1418,7 +1418,7 @@
     UINT32 event = 0;
     int    rc;
 
-    RFCOMM_TRACE_API1 ("PORT_Write() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_Write() handle:%d", handle);
 
     /* Check if handle is valid to avoid crashing */
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
@@ -1437,7 +1437,7 @@
 
     if (p_port->line_status)
     {
-        RFCOMM_TRACE_WARNING1 ("PORT_Write: Data dropped line_status:0x%x",
+        RFCOMM_TRACE_WARNING ("PORT_Write: Data dropped line_status:0x%x",
                                p_port->line_status);
         GKI_freebuf (p_buf);
         return (PORT_LINE_ERR);
@@ -1486,7 +1486,7 @@
     int        rc = 0;
     UINT16     length;
 
-    RFCOMM_TRACE_API1 ("PORT_WriteDataCO() handle:%d", handle);
+    RFCOMM_TRACE_API ("PORT_WriteDataCO() handle:%d", handle);
     int written;
     *p_len = 0;
 
@@ -1499,13 +1499,13 @@
 
     if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
     {
-        RFCOMM_TRACE_WARNING1 ("PORT_WriteDataByFd() no port state:%d", p_port->state);
+        RFCOMM_TRACE_WARNING ("PORT_WriteDataByFd() no port state:%d", p_port->state);
         return (PORT_NOT_OPENED);
     }
 
     if (!p_port->peer_mtu)
     {
-        RFCOMM_TRACE_ERROR1 ("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu);
+        RFCOMM_TRACE_ERROR ("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu);
         return (PORT_UNKNOWN_ERROR);
     }
     int available = 0;
@@ -1513,7 +1513,7 @@
     if(p_port->p_data_co_callback(handle, (UINT8*)&available, sizeof(available),
                                 DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE) == FALSE)
     {
-        RFCOMM_TRACE_ERROR1("p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, available:%d", available);
+        RFCOMM_TRACE_ERROR("p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, available:%d", available);
         return (PORT_UNKNOWN_ERROR);
     }
     if(available == 0)
@@ -1561,7 +1561,13 @@
         /* if we're over buffer high water mark, we're done */
         if ((p_port->tx.queue_size  > PORT_TX_HIGH_WM)
          || (p_port->tx.queue.count > PORT_TX_BUF_HIGH_WM))
+        {
+            port_flow_control_user(p_port);
+            event |= PORT_EV_FC;
+            debug("tx queue is full,tx.queue_size:%d,tx.queue.count:%d,available:%d",
+                    p_port->tx.queue_size, p_port->tx.queue.count, available);
             break;
+         }
 
         /* continue with rfcomm data write */
         p_buf = (BT_HDR *)GKI_getpoolbuf (RFCOMM_DATA_POOL_ID);
@@ -1588,7 +1594,7 @@
         }
 
 
-        RFCOMM_TRACE_EVENT1 ("PORT_WriteData %d bytes", length);
+        RFCOMM_TRACE_EVENT ("PORT_WriteData %d bytes", length);
 
         rc = port_write (p_port, p_buf);
 
@@ -1640,7 +1646,7 @@
     int        rc = 0;
     UINT16     length;
 
-    RFCOMM_TRACE_API1 ("PORT_WriteData() max_len:%d", max_len);
+    RFCOMM_TRACE_API ("PORT_WriteData() max_len:%d", max_len);
 
     *p_len = 0;
 
@@ -1653,13 +1659,13 @@
 
     if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED))
     {
-        RFCOMM_TRACE_WARNING1 ("PORT_WriteData() no port state:%d", p_port->state);
+        RFCOMM_TRACE_WARNING ("PORT_WriteData() no port state:%d", p_port->state);
         return (PORT_NOT_OPENED);
     }
 
     if (!max_len || !p_port->peer_mtu)
     {
-        RFCOMM_TRACE_ERROR1 ("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu);
+        RFCOMM_TRACE_ERROR ("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu);
         return (PORT_UNKNOWN_ERROR);
     }
 
@@ -1712,7 +1718,7 @@
 
         memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, length);
 
-        RFCOMM_TRACE_EVENT1 ("PORT_WriteData %d bytes", length);
+        RFCOMM_TRACE_EVENT ("PORT_WriteData %d bytes", length);
 
         rc = port_write (p_port, p_buf);
 
@@ -1760,7 +1766,7 @@
     BT_HDR   *p_buf;
     tPORT    *p_port;
 
-    RFCOMM_TRACE_API1 ("PORT_Test() len:%d", len);
+    RFCOMM_TRACE_API ("PORT_Test() len:%d", len);
 
     if ((handle == 0) || (handle > MAX_RFC_PORTS))
     {
diff --git a/stack/rfcomm/port_rfc.c b/stack/rfcomm/port_rfc.c
index 003cbb5..5704c01 100644
--- a/stack/rfcomm/port_rfc.c
+++ b/stack/rfcomm/port_rfc.c
@@ -56,12 +56,12 @@
 {
     tRFC_MCB *p_mcb;
 
-    RFCOMM_TRACE_EVENT1 ("port_open_continue, p_port:%p", p_port);
+    RFCOMM_TRACE_EVENT ("port_open_continue, p_port:%p", p_port);
 
     /* Check if multiplexer channel has already been established */
     if ((p_mcb = rfc_alloc_multiplexer_channel (p_port->bd_addr, TRUE)) == NULL)
     {
-        RFCOMM_TRACE_WARNING0 ("port_open_continue no mx channel");
+        RFCOMM_TRACE_WARNING ("port_open_continue no mx channel");
         port_release_port (p_port);
         return (PORT_NO_RESOURCES);
     }
@@ -89,7 +89,7 @@
     {
         /* MX state machine ignores RFC_MX_EVENT_START_REQ in these states */
         /* When it enters RFC_MX_STATE_CONNECTED, it will check any openning ports */
-        RFCOMM_TRACE_DEBUG1 ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state);
+        RFCOMM_TRACE_DEBUG ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state);
     }
     return (PORT_SUCCESS);
 }
@@ -203,7 +203,7 @@
     int     i;
     BOOLEAN no_ports_up = TRUE;
 
-    RFCOMM_TRACE_EVENT1 ("PORT_StartCnf result:%d", result);
+    RFCOMM_TRACE_EVENT ("PORT_StartCnf result:%d", result);
 
     p_port = &rfc_cb.port.port[0];
     for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -216,7 +216,7 @@
                 RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu);
             else
             {
-                RFCOMM_TRACE_WARNING1 ("PORT_StartCnf failed result:%d", result);
+                RFCOMM_TRACE_WARNING ("PORT_StartCnf failed result:%d", result);
 
                 /* Warning: result is also set to 4 when l2cap connection
                    fails due to l2cap connect cnf (no_resources) */
@@ -264,7 +264,7 @@
     tPORT *p_port;
     int   i;
 
-    RFCOMM_TRACE_EVENT0 ("PORT_StartInd");
+    RFCOMM_TRACE_EVENT ("PORT_StartInd");
 
     p_port = &rfc_cb.port.port[0];
     for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -272,7 +272,7 @@
         if ((p_port->rfc.p_mcb == NULL)
          || (p_port->rfc.p_mcb == p_mcb))
         {
-            RFCOMM_TRACE_DEBUG1("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb);
+            RFCOMM_TRACE_DEBUG("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb);
             RFCOMM_StartRsp (p_mcb, RFCOMM_SUCCESS);
             return;
         }
@@ -297,7 +297,7 @@
     UINT8 our_cl;
     UINT8 our_k;
 
-    RFCOMM_TRACE_EVENT2 ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu);
+    RFCOMM_TRACE_EVENT ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu);
 
     if (!p_port)
     {
@@ -310,7 +310,7 @@
             /* check if this is the last port open, some headsets have
             problem, they don't disconnect if we send DM */
             rfc_check_mcb_active( p_mcb );
-            RFCOMM_TRACE_EVENT0( "PORT_ParNegInd: port not found" );
+            RFCOMM_TRACE_EVENT( "PORT_ParNegInd: port not found" );
             return;
         }
         p_mcb->port_inx[dlci] = p_port->inx;
@@ -386,7 +386,7 @@
 {
     tPORT   *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
 
-    RFCOMM_TRACE_EVENT4 ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k);
+    RFCOMM_TRACE_EVENT ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k);
 
     if (!p_port)
         return;
@@ -447,8 +447,8 @@
 {
     tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
 
-    RFCOMM_TRACE_DEBUG4 ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port);
-    RFCOMM_TRACE_DEBUG6 ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x",
+    RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port);
+    RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x",
                          p_mcb->bd_addr[0], p_mcb->bd_addr[1], p_mcb->bd_addr[2],
                          p_mcb->bd_addr[3], p_mcb->bd_addr[4], p_mcb->bd_addr[5]);
 
@@ -499,7 +499,7 @@
 {
     tPORT  *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
 
-    RFCOMM_TRACE_EVENT3 ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result);
+    RFCOMM_TRACE_EVENT ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result);
 
     if (!p_port)
         return;
@@ -551,7 +551,7 @@
 {
     tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
 
-    RFCOMM_TRACE_EVENT0 ("PORT_PortNegInd");
+    RFCOMM_TRACE_EVENT ("PORT_PortNegInd");
 
     if (!p_port)
     {
@@ -584,11 +584,11 @@
     tPORT  *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
     UNUSED(p_pars);
 
-    RFCOMM_TRACE_EVENT0 ("PORT_PortNegCnf");
+    RFCOMM_TRACE_EVENT ("PORT_PortNegCnf");
 
     if (!p_port)
     {
-        RFCOMM_TRACE_WARNING0 ("PORT_PortNegCnf no port");
+        RFCOMM_TRACE_WARNING ("PORT_PortNegCnf no port");
         return;
     }
     /* Port negotiation failed. Drop the connection */
@@ -608,7 +608,7 @@
     }
     else
     {
-        RFCOMM_TRACE_WARNING0 ("PORT_PortNegCnf Control Already sent");
+        RFCOMM_TRACE_WARNING ("PORT_PortNegCnf Control Already sent");
     }
 }
 
@@ -627,7 +627,7 @@
     UINT32 event;
     UINT8  old_signals;
 
-    RFCOMM_TRACE_EVENT0 ("PORT_ControlInd");
+    RFCOMM_TRACE_EVENT ("PORT_ControlInd");
 
     if (!p_port)
         return;
@@ -663,7 +663,7 @@
     if (event && p_port->p_callback)
         (p_port->p_callback)(event, p_port->inx);
 
-    RFCOMM_TRACE_EVENT4 ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
+    RFCOMM_TRACE_EVENT ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
         ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
         ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
         ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
@@ -686,7 +686,7 @@
     UINT32 event = 0;
     UNUSED(p_pars);
 
-    RFCOMM_TRACE_EVENT0 ("PORT_ControlCnf");
+    RFCOMM_TRACE_EVENT ("PORT_ControlCnf");
 
     if (!p_port)
         return;
@@ -723,7 +723,7 @@
     tPORT  *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
     UINT32 event = 0;
 
-    RFCOMM_TRACE_EVENT0 ("PORT_LineStatusInd");
+    RFCOMM_TRACE_EVENT ("PORT_LineStatusInd");
 
     if (!p_port)
         return;
@@ -756,7 +756,7 @@
 {
     tPORT  *p_port = port_find_mcb_dlci_port (p_mcb, dlci);
 
-    RFCOMM_TRACE_EVENT0 ("PORT_DlcReleaseInd");
+    RFCOMM_TRACE_EVENT ("PORT_DlcReleaseInd");
 
     if (!p_port)
         return;
@@ -778,7 +778,7 @@
     tPORT  *p_port;
     int    i;
 
-    RFCOMM_TRACE_EVENT0 ("PORT_CloseInd");
+    RFCOMM_TRACE_EVENT ("PORT_CloseInd");
 
     p_port = &rfc_cb.port.port[0];
     for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -804,7 +804,7 @@
     tPORT  *p_port;
     int    i;
 
-    RFCOMM_TRACE_EVENT0 ("Port_TimeOutCloseMux");
+    RFCOMM_TRACE_EVENT ("Port_TimeOutCloseMux");
 
     p_port = &rfc_cb.port.port[0];
     for (i = 0; i < MAX_RFC_PORTS; i++, p_port++)
@@ -833,7 +833,7 @@
     UINT8  *p;
     int    i;
 
-    RFCOMM_TRACE_EVENT4("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d",
+    RFCOMM_TRACE_EVENT("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d",
                         p_buf->len, p_mcb, p_port, dlci);
     if (!p_port)
     {
@@ -851,7 +851,7 @@
         //GKI_freebuf (p_buf);
         return;
     }
-    else RFCOMM_TRACE_ERROR1("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port);
+    else RFCOMM_TRACE_ERROR("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port);
     /* If client registered callback we can just deliver receive data */
     if (p_port->p_data_callback)
     {
@@ -867,7 +867,7 @@
     if ((p_port->rx.queue_size + p_buf->len > PORT_RX_CRITICAL_WM)
      || (p_port->rx.queue.count + 1 > p_port->rx_buf_critical))
     {
-        RFCOMM_TRACE_EVENT0 ("PORT_DataInd. Buffer over run. Dropping the buffer");
+        RFCOMM_TRACE_EVENT ("PORT_DataInd. Buffer over run. Dropping the buffer");
         GKI_freebuf (p_buf);
 
         RFCOMM_LineStatusReq (p_mcb, dlci, LINE_STATUS_OVERRUN);
@@ -932,7 +932,7 @@
     UINT32 events = 0;
     int    i;
 
-    RFCOMM_TRACE_EVENT1 ("PORT_FlowInd fc:%d", enable_data);
+    RFCOMM_TRACE_EVENT ("PORT_FlowInd fc:%d", enable_data);
 
     if (dlci == 0)
     {
@@ -1006,7 +1006,7 @@
 
                 PORT_SCHEDULE_UNLOCK;
 
-                RFCOMM_TRACE_DEBUG1 ("Sending RFCOMM_DataReq tx.queue_size=%d", p_port->tx.queue_size);
+                RFCOMM_TRACE_DEBUG ("Sending RFCOMM_DataReq tx.queue_size=%d", p_port->tx.queue_size);
 
                 RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf);
 
@@ -1050,7 +1050,7 @@
     if ((p_port->state == PORT_STATE_OPENING) && (p_port->is_server))
     {
         /* The servr side has not been informed that connection is up, ignore */
-        RFCOMM_TRACE_EVENT0 ("port_rfc_closed in OPENING state ignored");
+        RFCOMM_TRACE_EVENT ("port_rfc_closed in OPENING state ignored");
 
         rfc_port_timer_stop (p_port);
         p_port->rfc.state = RFC_STATE_CLOSED;
@@ -1085,7 +1085,7 @@
         if(p_port->ev_mask & PORT_EV_CONNECT_ERR)
             events |= PORT_EV_CONNECT_ERR;
     }
-    RFCOMM_TRACE_EVENT2 ("port_rfc_closed state:%d sending events:%x", p_port->state, events);
+    RFCOMM_TRACE_EVENT ("port_rfc_closed state:%d sending events:%x", p_port->state, events);
 
     if ((p_port->p_callback != NULL) && events)
         p_port->p_callback (events, p_port->inx);
diff --git a/stack/rfcomm/port_utils.c b/stack/rfcomm/port_utils.c
index 0f7c03b..642ddb8 100644
--- a/stack/rfcomm/port_utils.c
+++ b/stack/rfcomm/port_utils.c
@@ -85,8 +85,8 @@
             port_set_defaults (p_port);
 
             rfc_cb.rfc.last_port = yy;
-            RFCOMM_TRACE_DEBUG3("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port);
-            RFCOMM_TRACE_DEBUG6("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+            RFCOMM_TRACE_DEBUG("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port);
+            RFCOMM_TRACE_DEBUG("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                 bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
             return (p_port);
         }
@@ -152,7 +152,7 @@
         if (packet_size == 0)
         {
             /* something is very wrong */
-            RFCOMM_TRACE_WARNING0 ("port_select_mtu bad packet size");
+            RFCOMM_TRACE_WARNING ("port_select_mtu bad packet size");
             p_port->mtu = RFCOMM_DEFAULT_MTU;
         }
         else
@@ -168,18 +168,18 @@
             if ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) >= packet_size)
             {
                 p_port->mtu = ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) / packet_size * packet_size) - RFCOMM_DATA_OVERHEAD - L2CAP_PKT_OVERHEAD;
-                RFCOMM_TRACE_DEBUG1 ("port_select_mtu selected %d based on connection speed", p_port->mtu);
+                RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on connection speed", p_port->mtu);
             }
             else
             {
                 p_port->mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD;
-                RFCOMM_TRACE_DEBUG1 ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu);
+                RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu);
             }
         }
     }
     else
     {
-        RFCOMM_TRACE_DEBUG1 ("port_select_mtu application selected %d", p_port->mtu);
+        RFCOMM_TRACE_DEBUG ("port_select_mtu application selected %d", p_port->mtu);
     }
     p_port->credit_rx_max  = (PORT_RX_HIGH_WM / p_port->mtu);
     if( p_port->credit_rx_max > PORT_RX_BUF_HIGH_WM )
@@ -190,7 +190,7 @@
     p_port->rx_buf_critical = (PORT_RX_CRITICAL_WM / p_port->mtu);
     if( p_port->rx_buf_critical > PORT_RX_BUF_CRITICAL_WM )
         p_port->rx_buf_critical = PORT_RX_BUF_CRITICAL_WM;
-    RFCOMM_TRACE_DEBUG3 ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d",
+    RFCOMM_TRACE_DEBUG ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d",
                           p_port->credit_rx_max, p_port->credit_rx_low, p_port->rx_buf_critical);
 }
 
@@ -212,7 +212,7 @@
     tPORT_STATE user_port_pars;
 
     PORT_SCHEDULE_LOCK;
-    RFCOMM_TRACE_DEBUG1("port_release_port, p_port:%p", p_port);
+    RFCOMM_TRACE_DEBUG("port_release_port, p_port:%p", p_port);
     while ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->rx.queue)) != NULL)
         GKI_freebuf (p_buf);
 
@@ -229,7 +229,7 @@
 
     if (p_port->rfc.state == RFC_STATE_CLOSED)
     {
-        RFCOMM_TRACE_DEBUG0 ("rfc_port_closed DONE");
+        RFCOMM_TRACE_DEBUG ("rfc_port_closed DONE");
         if (p_port->rfc.p_mcb)
         {
             p_port->rfc.p_mcb->port_inx[p_port->dlci] = 0;
@@ -238,10 +238,10 @@
             rfc_check_mcb_active (p_port->rfc.p_mcb);
         }
         rfc_port_timer_stop (p_port);
-        RFCOMM_TRACE_DEBUG1 ("port_release_port:p_port->keep_port_handle:%d", p_port->keep_port_handle);
+        RFCOMM_TRACE_DEBUG ("port_release_port:p_port->keep_port_handle:%d", p_port->keep_port_handle);
         if( p_port->keep_port_handle )
         {
-            RFCOMM_TRACE_DEBUG1 ("port_release_port:Initialize handle:%d", p_port->inx);
+            RFCOMM_TRACE_DEBUG ("port_release_port:Initialize handle:%d", p_port->inx);
             /* save event mask and callback */
             mask = p_port->ev_mask;
             p_port_cb = p_port->p_callback;
@@ -264,7 +264,7 @@
         }
         else
         {
-            RFCOMM_TRACE_DEBUG1 ("port_release_port:Clean-up handle:%d", p_port->inx);
+            RFCOMM_TRACE_DEBUG ("port_release_port:Clean-up handle:%d", p_port->inx);
             memset (p_port, 0, sizeof (tPORT));
         }
     }
@@ -289,14 +289,14 @@
          && !memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN))
         {
             /* Multiplexer channel found do not change anything */
-            RFCOMM_TRACE_DEBUG6("port_find_mcb: found  bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+            RFCOMM_TRACE_DEBUG("port_find_mcb: found  bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                 bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
-            RFCOMM_TRACE_DEBUG3("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d",
+            RFCOMM_TRACE_DEBUG("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d",
                                 i, &rfc_cb.port.rfc_mcb[i], rfc_cb.port.rfc_mcb[i].lcid);
             return (&rfc_cb.port.rfc_mcb[i]);
         }
     }
-    RFCOMM_TRACE_DEBUG6("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+    RFCOMM_TRACE_DEBUG("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                          bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
     return (NULL);
 }
@@ -327,7 +327,7 @@
     inx = p_mcb->port_inx[dlci];
     if (inx == 0)
     {
-        RFCOMM_TRACE_DEBUG2("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci);
+        RFCOMM_TRACE_DEBUG("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci);
         return (NULL);
     }
     else
@@ -576,7 +576,7 @@
                      || (p_port->rx.queue.count > PORT_RX_BUF_HIGH_WM))
                      && !p_port->rx.peer_fc)
             {
-                RFCOMM_TRACE_EVENT0 ("PORT_DataInd Data reached HW. Sending FC set.");
+                RFCOMM_TRACE_EVENT ("PORT_DataInd Data reached HW. Sending FC set.");
 
                 p_port->rx.peer_fc = TRUE;
                 RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, FALSE);
diff --git a/stack/rfcomm/rfc_int.h b/stack/rfcomm/rfc_int.h
index 83a63e3..302a8af 100644
--- a/stack/rfcomm/rfc_int.h
+++ b/stack/rfcomm/rfc_int.h
@@ -315,7 +315,7 @@
 extern void      rfc_save_lcid_mcb (tRFC_MCB *p_rfc_mcb, UINT16 lcid);
 extern void      rfc_check_mcb_active (tRFC_MCB *p_mcb);
 extern void      rfc_port_closed (tPORT *p_port);
-extern void      rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res);
+extern void      rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport,void *p_ref_data, UINT8 res);
 extern void      rfc_inc_credit (tPORT *p_port, UINT8 credit);
 extern void      rfc_dec_credit (tPORT *p_port);
 extern void      rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf);
diff --git a/stack/rfcomm/rfc_l2cap_if.c b/stack/rfcomm/rfc_l2cap_if.c
index 9137a66..5889257 100644
--- a/stack/rfcomm/rfc_l2cap_if.c
+++ b/stack/rfcomm/rfc_l2cap_if.c
@@ -101,7 +101,7 @@
             /* wait random timeout (2 - 12) to resolve collision */
             /* if peer gives up then local device rejects incoming connection and continues as initiator */
             /* if timeout, local device disconnects outgoing connection and continues as acceptor */
-            RFCOMM_TRACE_DEBUG2 ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)",
+            RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectInd start timer for collision, initiator's LCID(0x%x), acceptor's LCID(0x%x)",
                                   p_mcb->lcid, p_mcb->pending_lcid);
 
             rfc_timer_start(p_mcb, (UINT16)(GKI_get_tick_count()%10 + 2));
@@ -146,7 +146,7 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConnectCnf LCID:0x%x", lcid);
+        RFCOMM_TRACE_ERROR ("RFCOMM_ConnectCnf LCID:0x%x", lcid);
         return;
     }
 
@@ -158,7 +158,7 @@
             UINT16 i;
             UINT8  idx;
 
-            RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid);
+            RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf retry as acceptor on pending LCID(0x%x)", p_mcb->pending_lcid);
 
             /* remove mcb from mapping table */
             rfc_save_lcid_mcb (NULL, p_mcb->lcid);
@@ -178,7 +178,7 @@
                     p_mcb->port_inx[i] = 0;
                     p_mcb->port_inx[i+1] = idx;
                     rfc_cb.port.port[idx - 1].dlci += 1;
-                    RFCOMM_TRACE_DEBUG2 ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
+                    RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
                 }
             }
 
@@ -187,7 +187,7 @@
         }
         else
         {
-            RFCOMM_TRACE_DEBUG1 ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid);
+            RFCOMM_TRACE_DEBUG ("RFCOMM_ConnectCnf peer gave up pending LCID(0x%x)", p_mcb->pending_lcid);
 
             /* Peer gave up his connection request, make sure cleaning up L2CAP channel */
             L2CA_ConnectRsp (p_mcb->bd_addr, p_mcb->pending_id, p_mcb->pending_lcid, L2CAP_CONN_NO_RESOURCES, 0);
@@ -218,7 +218,7 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigInd LCID:0x%x", lcid);
+        RFCOMM_TRACE_ERROR ("RFCOMM_ConfigInd LCID:0x%x", lcid);
         return;
     }
 
@@ -241,7 +241,7 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid);
+        RFCOMM_TRACE_ERROR ("RFCOMM_ConfigCnf no MCB LCID:0x%x", lcid);
         return;
     }
 
@@ -282,7 +282,7 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_WARNING1 ("RFCOMM_DisconnectInd LCID:0x%x", lcid);
+        RFCOMM_TRACE_WARNING ("RFCOMM_DisconnectInd LCID:0x%x", lcid);
         return;
     }
 
@@ -309,7 +309,7 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_WARNING1 ("RFCOMM_BufDataInd LCID:0x%x", lcid);
+        RFCOMM_TRACE_WARNING ("RFCOMM_BufDataInd LCID:0x%x", lcid);
         GKI_freebuf (p_buf);
         return;
     }
@@ -392,12 +392,12 @@
 
     if (!p_mcb)
     {
-        RFCOMM_TRACE_ERROR1 ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid);
+        RFCOMM_TRACE_ERROR ("RFCOMM_CongestionStatusInd dropped LCID:0x%x", lcid);
         return;
     }
     else
     {
-        RFCOMM_TRACE_EVENT1 ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid);
+        RFCOMM_TRACE_EVENT ("RFCOMM_CongestionStatusInd LCID:0x%x", lcid);
     }
     rfc_process_l2cap_congestion (p_mcb, is_congested);
 }
@@ -415,7 +415,7 @@
 
     if (lcid - L2CAP_BASE_APPL_CID >= MAX_L2CAP_CHANNELS)
     {
-        RFCOMM_TRACE_ERROR1 ("rfc_find_lcid_mcb LCID:0x%x", lcid);
+        RFCOMM_TRACE_ERROR ("rfc_find_lcid_mcb LCID:0x%x", lcid);
         return (NULL);
     }
     else
@@ -424,7 +424,7 @@
         {
             if (p_mcb->lcid != lcid)
             {
-                RFCOMM_TRACE_WARNING2 ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid);
+                RFCOMM_TRACE_WARNING ("rfc_find_lcid_mcb LCID reused LCID:0x%x current:0x%x", lcid, p_mcb->lcid);
                 return (NULL);
             }
         }
diff --git a/stack/rfcomm/rfc_mx_fsm.c b/stack/rfcomm/rfc_mx_fsm.c
index 6d8bb06..a7ffca5 100644
--- a/stack/rfcomm/rfc_mx_fsm.c
+++ b/stack/rfcomm/rfc_mx_fsm.c
@@ -113,7 +113,7 @@
 *******************************************************************************/
 void rfc_mx_sm_state_idle (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
 {
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_idle - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_idle - evt:%d", event);
     switch (event)
     {
     case RFC_MX_EVENT_START_REQ:
@@ -136,7 +136,7 @@
     case RFC_MX_EVENT_CONN_CNF:
     case RFC_MX_EVENT_CONF_IND:
     case RFC_MX_EVENT_CONF_CNF:
-        RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
         return;
 
     case RFC_MX_EVENT_CONN_IND:
@@ -164,7 +164,7 @@
         rfc_send_dm (p_mcb, RFCOMM_MX_DLCI, FALSE);
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -180,11 +180,11 @@
 *******************************************************************************/
 void rfc_mx_sm_state_wait_conn_cnf (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
 {
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_conn_cnf - evt:%d", event);
     switch (event)
     {
     case RFC_MX_EVENT_START_REQ:
-        RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
         return;
 
     /* There is some new timing so that Config Ind comes before security is completed
@@ -220,7 +220,7 @@
             UINT16 i;
             UINT8  idx;
 
-            RFCOMM_TRACE_DEBUG2 ("RFCOMM MX retry as acceptor in collision case - evt:%d in state:%d", event, p_mcb->state);
+            RFCOMM_TRACE_DEBUG ("RFCOMM MX retry as acceptor in collision case - evt:%d in state:%d", event, p_mcb->state);
 
             rfc_save_lcid_mcb (NULL, p_mcb->lcid);
             p_mcb->lcid = p_mcb->pending_lcid;
@@ -236,7 +236,7 @@
                     p_mcb->port_inx[i] = 0;
                     p_mcb->port_inx[i+1] = idx;
                     rfc_cb.port.port[idx - 1].dlci += 1;
-                    RFCOMM_TRACE_DEBUG2 ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
+                    RFCOMM_TRACE_DEBUG ("RFCOMM MX - DLCI:%d -> %d", i, rfc_cb.port.port[idx - 1].dlci);
                 }
             }
 
@@ -248,7 +248,7 @@
         }
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -264,13 +264,13 @@
 *******************************************************************************/
 void rfc_mx_sm_state_configure (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
 {
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_configure - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_configure - evt:%d", event);
     switch (event)
     {
     case RFC_MX_EVENT_START_REQ:
     case RFC_MX_EVENT_CONN_CNF:
 
-        RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
         return;
 
     case RFC_MX_EVENT_CONF_IND:
@@ -293,7 +293,7 @@
         PORT_StartCnf (p_mcb, RFCOMM_ERROR);
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -311,12 +311,12 @@
 {
     UNUSED(p_data);
 
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_sabme_wait_ua - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_sabme_wait_ua - evt:%d", event);
     switch (event)
     {
     case RFC_MX_EVENT_START_REQ:
     case RFC_MX_EVENT_CONN_CNF:
-        RFCOMM_TRACE_ERROR2 ("Mx error state %d event %d", p_mcb->state, event);
+        RFCOMM_TRACE_ERROR ("Mx error state %d event %d", p_mcb->state, event);
         return;
 
     /* workaround: we don't support reconfig */
@@ -357,7 +357,7 @@
         PORT_StartCnf (p_mcb, RFCOMM_ERROR);
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 /*******************************************************************************
@@ -372,7 +372,7 @@
 *******************************************************************************/
 void rfc_mx_sm_state_wait_sabme (tRFC_MCB *p_mcb, UINT16 event, void *p_data)
 {
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_wait_sabme - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_wait_sabme - evt:%d", event);
     switch (event)
     {
     case RFC_MX_EVENT_DISC_IND:
@@ -423,7 +423,7 @@
         PORT_CloseInd (p_mcb);
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -441,7 +441,7 @@
 {
     UNUSED(p_data);
 
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_connected - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_connected - evt:%d", event);
 
     switch (event)
     {
@@ -469,7 +469,7 @@
         PORT_CloseInd (p_mcb);
         return;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -487,7 +487,7 @@
 {
     BT_HDR *p_buf;
 
-    RFCOMM_TRACE_EVENT1 ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event);
+    RFCOMM_TRACE_EVENT ("rfc_mx_sm_state_disc_wait_ua - evt:%d", event);
     switch (event)
     {
     case RFC_EVENT_UA:
@@ -547,7 +547,7 @@
     case RFC_MX_EVENT_QOS_VIOLATION_IND:
         break;
     }
-    RFCOMM_TRACE_EVENT2 ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
+    RFCOMM_TRACE_EVENT ("RFCOMM MX ignored - evt:%d in state:%d", event, p_mcb->state);
 }
 
 
@@ -563,7 +563,7 @@
 {
     tL2CAP_CFG_INFO cfg;
 
-    RFCOMM_TRACE_EVENT0 ("rfc_mx_send_config_req");
+    RFCOMM_TRACE_EVENT ("rfc_mx_send_config_req");
 
     memset (&cfg, 0, sizeof (tL2CAP_CFG_INFO));
 
@@ -594,7 +594,7 @@
 *******************************************************************************/
 static void rfc_mx_conf_cnf (tRFC_MCB *p_mcb, tL2CAP_CFG_INFO *p_cfg)
 {
-    RFCOMM_TRACE_EVENT2 ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0);
+    RFCOMM_TRACE_EVENT ("rfc_mx_conf_cnf p_cfg:%08x res:%d ", p_cfg, (p_cfg) ? p_cfg->result : 0);
 
     if (p_cfg->result != L2CAP_CFG_OK)
     {
diff --git a/stack/rfcomm/rfc_port_fsm.c b/stack/rfcomm/rfc_port_fsm.c
index e519a98..a998b6e 100644
--- a/stack/rfcomm/rfc_port_fsm.c
+++ b/stack/rfcomm/rfc_port_fsm.c
@@ -62,7 +62,7 @@
 {
     if (!p_port)
     {
-        RFCOMM_TRACE_WARNING1 ("NULL port event %d", event);
+        RFCOMM_TRACE_WARNING ("NULL port event %d", event);
         return;
     }
 
@@ -156,11 +156,11 @@
 
     case RFC_EVENT_TIMEOUT:
         Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
     }
 
-    RFCOMM_TRACE_WARNING1 ("Port state closed Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state closed Event ignored %d", event);
     return;
 }
 
@@ -180,7 +180,7 @@
     {
     case RFC_EVENT_OPEN:
     case RFC_EVENT_ESTABLISH_RSP:
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
 
     case RFC_EVENT_CLOSE:
@@ -230,7 +230,7 @@
         PORT_DlcEstablishCnf (p_port->rfc.p_mcb, p_port->dlci, p_port->rfc.p_mcb->peer_l2cap_mtu, RFCOMM_ERROR);
         return;
     }
-    RFCOMM_TRACE_WARNING1 ("Port state sabme_wait_ua Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state sabme_wait_ua Event ignored %d", event);
 }
 
 
@@ -270,7 +270,7 @@
 
     case RFC_EVENT_OPEN:
     case RFC_EVENT_CLOSE:
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
 
     case RFC_EVENT_CLEAR:
@@ -279,7 +279,7 @@
         return;
 
     case RFC_EVENT_DATA:
-        RFCOMM_TRACE_ERROR0 ("Port error state Term Wait Sec event Data");
+        RFCOMM_TRACE_ERROR ("Port error state Term Wait Sec event Data");
         GKI_freebuf (p_data);
         return;
 
@@ -312,7 +312,7 @@
         }
         return;
     }
-    RFCOMM_TRACE_WARNING1 ("Port state term_wait_sec_check Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state term_wait_sec_check Event ignored %d", event);
 }
 
 
@@ -346,7 +346,7 @@
 
     case RFC_EVENT_OPEN:
     case RFC_EVENT_SABME:       /* Peer should not use the same dlci */
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
 
     case RFC_EVENT_CLOSE:
@@ -355,7 +355,7 @@
         return;
 
     case RFC_EVENT_DATA:
-        RFCOMM_TRACE_ERROR0 ("Port error state Orig Wait Sec event Data");
+        RFCOMM_TRACE_ERROR ("Port error state Orig Wait Sec event Data");
         GKI_freebuf (p_data);
         return;
 
@@ -363,7 +363,7 @@
         GKI_freebuf (p_data);
         return;
     }
-    RFCOMM_TRACE_WARNING1 ("Port state orig_wait_sec_check Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state orig_wait_sec_check Event ignored %d", event);
 }
 
 
@@ -382,7 +382,7 @@
     switch (event)
     {
     case RFC_EVENT_OPEN:
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
 
     case RFC_EVENT_CLOSE:
@@ -434,7 +434,7 @@
         if(p_port->rx.queue.count)
         {
             /* give a chance to upper stack to close port properly */
-            RFCOMM_TRACE_DEBUG0("port queue is not empty");
+            RFCOMM_TRACE_DEBUG("port queue is not empty");
             rfc_port_timer_start (p_port, RFC_DISC_TIMEOUT);
         }
         else
@@ -447,10 +447,10 @@
 
     case RFC_EVENT_TIMEOUT:
         Port_TimeOutCloseMux( p_port->rfc.p_mcb ) ;
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
     }
-    RFCOMM_TRACE_WARNING1 ("Port state opened Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state opened Event ignored %d", event);
 }
 
 
@@ -470,7 +470,7 @@
     {
     case RFC_EVENT_OPEN:
     case RFC_EVENT_ESTABLISH_RSP:
-        RFCOMM_TRACE_ERROR2 ("Port error state %d event %d", p_port->rfc.state, event);
+        RFCOMM_TRACE_ERROR ("Port error state %d event %d", p_port->rfc.state, event);
         return;
 
     case RFC_EVENT_CLEAR:
@@ -507,7 +507,7 @@
         return;
     }
 
-    RFCOMM_TRACE_WARNING1 ("Port state disc_wait_ua Event ignored %d", event);
+    RFCOMM_TRACE_WARNING ("Port state disc_wait_ua Event ignored %d", event);
 }
 
 
@@ -548,7 +548,7 @@
         else
         {
             rfc_send_dm(p_mcb, dlci, FALSE);
-            RFCOMM_TRACE_WARNING0("***** MX PN while disconnecting *****");
+            RFCOMM_TRACE_WARNING("***** MX PN while disconnecting *****");
         }
 
         return;
diff --git a/stack/rfcomm/rfc_ts_frames.c b/stack/rfcomm/rfc_ts_frames.c
index 4690200..6b15831 100644
--- a/stack/rfcomm/rfc_ts_frames.c
+++ b/stack/rfcomm/rfc_ts_frames.c
@@ -576,14 +576,14 @@
 
     if (p_buf->len < RFCOMM_CTRL_FRAME_LEN)
     {
-        RFCOMM_TRACE_ERROR1 ("Bad Length1: %d", p_buf->len);
+        RFCOMM_TRACE_ERROR ("Bad Length1: %d", p_buf->len);
         return (RFC_EVENT_BAD_FRAME);
     }
 
     RFCOMM_PARSE_CTRL_FIELD (ead, p_frame->cr, p_frame->dlci, p_data);
     if( !ead )
     {
-        RFCOMM_TRACE_ERROR0 ("Bad Address(EA must be 1)");
+        RFCOMM_TRACE_ERROR ("Bad Address(EA must be 1)");
         return (RFC_EVENT_BAD_FRAME);
     }
     RFCOMM_PARSE_TYPE_FIELD (p_frame->type, p_frame->pf, p_data);
@@ -605,7 +605,7 @@
 
     if (p_buf->len != len)
     {
-        RFCOMM_TRACE_ERROR2 ("Bad Length2 %d %d", p_buf->len, len);
+        RFCOMM_TRACE_ERROR ("Bad Length2 %d %d", p_buf->len, len);
         return (RFC_EVENT_BAD_FRAME);
     }
 
@@ -622,7 +622,7 @@
          || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci)
          || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad SABME");
+            RFCOMM_TRACE_ERROR ("Bad SABME");
             return (RFC_EVENT_BAD_FRAME);
         }
         else
@@ -633,7 +633,7 @@
           || !p_frame->pf || len || !RFCOMM_VALID_DLCI (p_frame->dlci)
           || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad UA");
+            RFCOMM_TRACE_ERROR ("Bad UA");
             return (RFC_EVENT_BAD_FRAME);
         }
         else
@@ -644,7 +644,7 @@
          || len || !RFCOMM_VALID_DLCI(p_frame->dlci)
          || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad DM");
+            RFCOMM_TRACE_ERROR ("Bad DM");
             return (RFC_EVENT_BAD_FRAME);
         }
         else
@@ -655,7 +655,7 @@
           || !p_frame->pf || len || !RFCOMM_VALID_DLCI(p_frame->dlci)
           || !rfc_check_fcs (RFCOMM_CTRL_FRAME_LEN, p_start, fcs))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad DISC");
+            RFCOMM_TRACE_ERROR ("Bad DISC");
             return (RFC_EVENT_BAD_FRAME);
         }
         else
@@ -664,18 +664,18 @@
     case RFCOMM_UIH:
         if (!RFCOMM_VALID_DLCI(p_frame->dlci))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad UIH - invalid DLCI");
+            RFCOMM_TRACE_ERROR ("Bad UIH - invalid DLCI");
             return (RFC_EVENT_BAD_FRAME);
         }
         else if (!rfc_check_fcs (2, p_start, fcs))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad UIH - FCS");
+            RFCOMM_TRACE_ERROR ("Bad UIH - FCS");
             return (RFC_EVENT_BAD_FRAME);
         }
         else if (RFCOMM_FRAME_IS_RSP(p_mcb->is_initiator, p_frame->cr))
         {
             /* we assume that this is ok to allow bad implementations to work */
-            RFCOMM_TRACE_ERROR0 ("Bad UIH - response");
+            RFCOMM_TRACE_ERROR ("Bad UIH - response");
             return (RFC_EVENT_UIH);
         }
         else
@@ -708,7 +708,7 @@
 
     if (!p_rx_frame->ea || !length)
     {
-        RFCOMM_TRACE_ERROR2 ("Illegal MX Frame ea:%d len:%d", p_rx_frame->ea, length);
+        RFCOMM_TRACE_ERROR ("Illegal MX Frame ea:%d len:%d", p_rx_frame->ea, length);
         GKI_freebuf (p_buf);
         return;
     }
@@ -730,7 +730,7 @@
 
     if (mx_len != length)
     {
-        RFCOMM_TRACE_ERROR0 ("Bad MX frame");
+        RFCOMM_TRACE_ERROR ("Bad MX frame");
         GKI_freebuf (p_buf);
         return;
     }
@@ -756,7 +756,7 @@
          || (p_rx_frame->u.pn.mtu < RFCOMM_MIN_MTU)
          || (p_rx_frame->u.pn.mtu > RFCOMM_MAX_MTU))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad PN frame");
+            RFCOMM_TRACE_ERROR ("Bad PN frame");
             break;
         }
 
@@ -808,7 +808,7 @@
         if (!ea || !cr || !p_rx_frame->dlci
          || !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad MSC frame");
+            RFCOMM_TRACE_ERROR ("Bad MSC frame");
             break;
         }
 
@@ -853,7 +853,7 @@
         if (!ea || !cr || !p_rx_frame->dlci
          || !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad RPN frame");
+            RFCOMM_TRACE_ERROR ("Bad RPN frame");
             break;
         }
 
@@ -890,7 +890,7 @@
         if (!ea || !cr || !p_rx_frame->dlci
          || !RFCOMM_VALID_DLCI (p_rx_frame->dlci))
         {
-            RFCOMM_TRACE_ERROR0 ("Bad RPN frame");
+            RFCOMM_TRACE_ERROR ("Bad RPN frame");
             break;
         }
 
diff --git a/stack/rfcomm/rfc_utils.c b/stack/rfcomm/rfc_utils.c
index d2b02fc..e2cff28 100644
--- a/stack/rfcomm/rfc_utils.c
+++ b/stack/rfcomm/rfc_utils.c
@@ -134,15 +134,15 @@
 {
     int i, j;
     tRFC_MCB *p_mcb = NULL;
-    RFCOMM_TRACE_DEBUG6("rfc_alloc_multiplexer_channel: bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+    RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel: bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                 bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
-    RFCOMM_TRACE_DEBUG1("rfc_alloc_multiplexer_channel:is_initiator:%d", is_initiator);
+    RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d", is_initiator);
 
     for (i = 0; i < MAX_BD_CONNECTIONS; i++)
     {
-        RFCOMM_TRACE_DEBUG2("rfc_alloc_multiplexer_channel rfc_cb.port.rfc_mcb[%d].state:%d",
+        RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel rfc_cb.port.rfc_mcb[%d].state:%d",
                             i, rfc_cb.port.rfc_mcb[i].state);
-        RFCOMM_TRACE_DEBUG6("(rfc_cb.port.rfc_mcb[i].bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
+        RFCOMM_TRACE_DEBUG("(rfc_cb.port.rfc_mcb[i].bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                 rfc_cb.port.rfc_mcb[i].bd_addr[0], rfc_cb.port.rfc_mcb[i].bd_addr[1],
                                 rfc_cb.port.rfc_mcb[i].bd_addr[2], rfc_cb.port.rfc_mcb[i].bd_addr[3],
                                 rfc_cb.port.rfc_mcb[i].bd_addr[4], rfc_cb.port.rfc_mcb[i].bd_addr[5]);
@@ -154,7 +154,7 @@
             /* If there was an inactivity timer running stop it now */
             if (rfc_cb.port.rfc_mcb[i].state == RFC_MX_STATE_CONNECTED)
                 rfc_timer_stop (&rfc_cb.port.rfc_mcb[i]);
-            RFCOMM_TRACE_DEBUG3("rfc_alloc_multiplexer_channel:is_initiator:%d, found, state:%d, p_mcb:%p",
+            RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, found, state:%d, p_mcb:%p",
                                 is_initiator, rfc_cb.port.rfc_mcb[i].state, &rfc_cb.port.rfc_mcb[i]);
             return (&rfc_cb.port.rfc_mcb[i]);
         }
@@ -172,7 +172,7 @@
             /* New multiplexer control block */
             memset (p_mcb, 0, sizeof (tRFC_MCB));
             memcpy (p_mcb->bd_addr, bd_addr, BD_ADDR_LEN);
-            RFCOMM_TRACE_DEBUG3("rfc_alloc_multiplexer_channel:is_initiator:%d, create new p_mcb:%p, index:%d",
+            RFCOMM_TRACE_DEBUG("rfc_alloc_multiplexer_channel:is_initiator:%d, create new p_mcb:%p, index:%d",
                                 is_initiator, &rfc_cb.port.rfc_mcb[j], j);
 
             GKI_init_q(&p_mcb->cmd_q);
@@ -222,7 +222,7 @@
 {
     TIMER_LIST_ENT *p_tle = &p_mcb->tle;
 
-    RFCOMM_TRACE_EVENT1 ("rfc_timer_start - timeout:%d", timeout);
+    RFCOMM_TRACE_EVENT ("rfc_timer_start - timeout:%d", timeout);
 
     p_tle->param = (UINT32)p_mcb;
 
@@ -239,7 +239,7 @@
 *******************************************************************************/
 void rfc_timer_stop (tRFC_MCB *p_mcb)
 {
-    RFCOMM_TRACE_EVENT0 ("rfc_timer_stop");
+    RFCOMM_TRACE_EVENT ("rfc_timer_stop");
 
     btu_stop_timer (&p_mcb->tle);
 }
@@ -256,7 +256,7 @@
 {
     TIMER_LIST_ENT *p_tle = &p_port->rfc.tle;
 
-    RFCOMM_TRACE_EVENT1 ("rfc_port_timer_start - timeout:%d", timeout);
+    RFCOMM_TRACE_EVENT ("rfc_port_timer_start - timeout:%d", timeout);
 
     p_tle->param = (UINT32)p_port;
 
@@ -273,7 +273,7 @@
 *******************************************************************************/
 void rfc_port_timer_stop (tPORT *p_port)
 {
-    RFCOMM_TRACE_EVENT0 ("rfc_port_timer_stop");
+    RFCOMM_TRACE_EVENT ("rfc_port_timer_stop");
 
     btu_stop_timer (&p_port->rfc.tle);
 }
@@ -350,10 +350,11 @@
 ** Returns          void
 **
 *******************************************************************************/
-void rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
+void rfc_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
 {
     tPORT *p_port = (tPORT *)p_ref_data;
     UNUSED(bd_addr);
+    UNUSED(transport);
 
     /* Verify that PORT is still waiting for Security to complete */
     if (!p_port->in_use
@@ -380,7 +381,7 @@
 {
     tRFC_MCB *p_mcb = p_port->rfc.p_mcb;
 
-    RFCOMM_TRACE_DEBUG0 ("rfc_port_closed");
+    RFCOMM_TRACE_DEBUG ("rfc_port_closed");
 
     rfc_port_timer_stop (p_port);
 
@@ -416,7 +417,7 @@
     {
         p_port->credit_tx += credit;
 
-        RFCOMM_TRACE_EVENT1 ("rfc_inc_credit:%d", p_port->credit_tx);
+        RFCOMM_TRACE_EVENT ("rfc_inc_credit:%d", p_port->credit_tx);
 
         if (p_port->tx.peer_fc == TRUE)
             PORT_FlowInd(p_port->rfc.p_mcb, p_port->dlci, TRUE);
diff --git a/stack/sdp/sdp_api.c b/stack/sdp/sdp_api.c
index af35cc8..9b3628c 100644
--- a/stack/sdp/sdp_api.c
+++ b/stack/sdp/sdp_api.c
@@ -79,7 +79,7 @@
     if (p_db == NULL || (sizeof (tSDP_DISCOVERY_DB) > len) ||
         num_attr > SDP_MAX_ATTR_FILTERS || num_uuid > SDP_MAX_UUID_FILTERS)
     {
-        SDP_TRACE_ERROR4("SDP_InitDiscoveryDb Illegal param: p_db 0x%x, len %d, num_uuid %d, num_attr %d",
+        SDP_TRACE_ERROR("SDP_InitDiscoveryDb Illegal param: p_db 0x%x, len %d, num_uuid %d, num_attr %d",
                          (UINT32)p_db, len, num_uuid, num_attr);
 
         return(FALSE);
@@ -513,12 +513,13 @@
 
                     if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
                      && (SDP_DISC_ATTR_LEN(p_sattr->attr_len_type) == 2) ) {
-                        SDP_TRACE_DEBUG2("SDP_FindServiceInDb - p_sattr value = 0x%x serviceuuid = 0x%x\r\n", p_sattr->attr_value.v.u16, service_uuid);
+                        SDP_TRACE_DEBUG("SDP_FindServiceInDb - p_sattr value = 0x%x serviceuuid = 0x%x\r\n",
+                                        p_sattr->attr_value.v.u16, service_uuid);
                         if(service_uuid == UUID_SERVCLASS_HDP_PROFILE)
                         {
                             if( (p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SOURCE) || ( p_sattr->attr_value.v.u16==UUID_SERVCLASS_HDP_SINK))
                             {
-                                SDP_TRACE_DEBUG0("SDP_FindServiceInDb found HDP source or sink\n" );
+                                SDP_TRACE_DEBUG("SDP_FindServiceInDb found HDP source or sink\n" );
                                 return (p_rec);
                             }
                         }
@@ -686,14 +687,14 @@
                     if (SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
                     {
 
-                        SDP_TRACE_DEBUG1("uuid len=%d ", p_uuid->len);
+                        SDP_TRACE_DEBUG("uuid len=%d ", p_uuid->len);
                         if (p_uuid->len == 2)
                         {
-                            SDP_TRACE_DEBUG1("uuid=0x%x \n", p_uuid->uu.uuid16);
+                            SDP_TRACE_DEBUG("uuid=0x%x \n", p_uuid->uu.uuid16);
                         }
                         else
                         {
-                            SDP_TRACE_DEBUG0("\n");
+                            SDP_TRACE_DEBUG("\n");
                         }
 
                         if (sdpu_compare_uuid_with_attr (p_uuid, p_sattr))
@@ -747,7 +748,7 @@
         /* Now, see if the entry contains the layer we are interested in */
         for (p_sattr = p_attr->attr_value.v.p_sub_attr; p_sattr; p_sattr = p_sattr->p_next_attr)
         {
-            /* SDP_TRACE_DEBUG3 ("SDP - p_sattr 0x%x, layer_uuid:0x%x, u16:0x%x####",
+            /* SDP_TRACE_DEBUG ("SDP - p_sattr 0x%x, layer_uuid:0x%x, u16:0x%x####",
                 p_sattr, layer_uuid, p_sattr->attr_value.v.u16); */
 
             if ((SDP_DISC_ATTR_TYPE(p_sattr->attr_len_type) == UUID_DESC_TYPE)
diff --git a/stack/sdp/sdp_db.c b/stack/sdp/sdp_db.c
index 318a8cc..322e27d 100644
--- a/stack/sdp/sdp_db.c
+++ b/stack/sdp/sdp_db.c
@@ -300,7 +300,7 @@
         p_db->record[p_db->num_records].record_handle = handle;
 
         p_db->num_records++;
-        SDP_TRACE_DEBUG1("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
+        SDP_TRACE_DEBUG("SDP_CreateRecord ok, num_records:%d", p_db->num_records);
         /* Add the first attribute (the handle) automatically */
         UINT32_TO_BE_FIELD (buf, handle);
         SDP_AddAttribute (handle, ATTR_ID_SERVICE_RECORD_HDL, UINT_DESC_TYPE,
@@ -308,7 +308,7 @@
 
         return (p_db->record[p_db->num_records - 1].record_handle);
     }
-    else SDP_TRACE_ERROR1("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
+    else SDP_TRACE_ERROR("SDP_CreateRecord fail, exceed maximum records:%d", SDP_MAX_RECORDS);
 #endif
         return (0);
 }
@@ -363,7 +363,7 @@
 
                 sdp_cb.server_db.num_records--;
 
-                SDP_TRACE_DEBUG1("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
+                SDP_TRACE_DEBUG("SDP_DeleteRecord ok, num_records:%d", sdp_cb.server_db.num_records);
                 /* if we're deleting the primary DI record, clear the */
                 /* value in the control block */
                 if( sdp_cb.server_db.di_primary_handle == handle )
@@ -420,17 +420,17 @@
             {
                 sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_val[i]));
             }
-            SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
+            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
                             handle,attr_id,attr_type,attr_len,p_val,num_array);
         }
         else if (attr_type == BOOLEAN_DESC_TYPE)
         {
-            SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
+            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%d",
                              handle,attr_id,attr_type,attr_len,p_val,*p_val);
         }
         else
         {
-            SDP_TRACE_DEBUG6("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
+            SDP_TRACE_DEBUG("SDP_AddAttribute: handle:%X, id:%04X, type:%d, len:%d, p_val:%p, *p_val:%s",
                 handle,attr_id,attr_type,attr_len,p_val,p_val);
         }
     }
@@ -478,7 +478,7 @@
                 /* do truncate only for text string type descriptor */
                 if (attr_type == TEXT_STR_DESC_TYPE)
                 {
-                    SDP_TRACE_WARNING2("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
+                    SDP_TRACE_WARNING("SDP_AddAttribute: attr_len:%d too long. truncate to (%d)",
                         attr_len, SDP_MAX_PAD_LEN - p_rec->free_pad_ptr );
 
                     attr_len = SDP_MAX_PAD_LEN - p_rec->free_pad_ptr;
@@ -499,7 +499,7 @@
             else if ((attr_len == 0 && p_attr->len != 0) || /* if truncate to 0 length, simply don't add */
                       p_val == 0)
             {
-                SDP_TRACE_ERROR2("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
+                SDP_TRACE_ERROR("SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ",
                     attr_id, attr_len );
                 p_attr->id   = p_attr->type = p_attr->len  = 0;
                 return (FALSE);
@@ -545,7 +545,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddSequence cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddSequence cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff;
@@ -586,12 +586,12 @@
             if(p_head == p_buff)
             {
                 /* the first element exceed the max length */
-                SDP_TRACE_ERROR0 ("SDP_AddSequence - too long(attribute is not added)!!");
+                SDP_TRACE_ERROR ("SDP_AddSequence - too long(attribute is not added)!!");
                 GKI_freebuf(p_buff);
                 return FALSE;
             }
             else
-                SDP_TRACE_ERROR2 ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
+                SDP_TRACE_ERROR ("SDP_AddSequence - too long, add %d elements of %d", xx, num_elem);
             break;
         }
     }
@@ -628,7 +628,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddUuidSequence cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddUuidSequence cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff;
@@ -641,7 +641,7 @@
 
         if((p - p_buff) > max_len)
         {
-            SDP_TRACE_WARNING2 ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
+            SDP_TRACE_WARNING ("SDP_AddUuidSequence - too long, add %d uuids of %d", xx, num_uuids);
             break;
         }
     }
@@ -676,7 +676,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddProtocolList cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddProtocolList cannot get a buffer!");
         return (FALSE);
     }
 
@@ -715,7 +715,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddAdditionProtoLists cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddAdditionProtoLists cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff;
@@ -764,7 +764,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddProfileDescriptorList cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddProfileDescriptorList cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff+2;
@@ -813,7 +813,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddLanguageBaseAttrIDList cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff;
@@ -862,7 +862,7 @@
 
     if ((p_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN * 2)) == NULL)
     {
-        SDP_TRACE_ERROR0("SDP_AddServiceClassIdList cannot get a buffer!");
+        SDP_TRACE_ERROR("SDP_AddServiceClassIdList cannot get a buffer!");
         return (FALSE);
     }
     p = p_buff;
@@ -908,7 +908,7 @@
         {
             tSDP_ATTRIBUTE  *p_attr = &p_rec->attribute[0];
 
-            SDP_TRACE_API2("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
+            SDP_TRACE_API("Deleting attr_id 0x%04x for handle 0x%x", attr_id, handle);
             /* Found it. Now, find the attribute */
             for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++)
             {
diff --git a/stack/sdp/sdp_discovery.c b/stack/sdp/sdp_discovery.c
index 4f1db1b..3fca831 100644
--- a/stack/sdp/sdp_discovery.c
+++ b/stack/sdp/sdp_discovery.c
@@ -171,7 +171,7 @@
     p_cmd->len = (UINT16)(p - p_start);
 
 #if (SDP_DEBUG_RAW == TRUE)
-    SDP_TRACE_WARNING2("sdp_snd_service_search_req cont_len :%d disc_state:%d",cont_len, p_ccb->disc_state);
+    SDP_TRACE_WARNING("sdp_snd_service_search_req cont_len :%d disc_state:%d",cont_len, p_ccb->disc_state);
 #endif
 
 
@@ -245,7 +245,7 @@
     BOOLEAN         invalid_pdu = TRUE;
 
 #if (SDP_DEBUG_RAW == TRUE)
-    SDP_TRACE_WARNING1("sdp_disc_server_rsp disc_state:%d", p_ccb->disc_state);
+    SDP_TRACE_WARNING("sdp_disc_server_rsp disc_state:%d", p_ccb->disc_state);
 #endif
 
     /* stop inactivity timer when we receive a response */
@@ -302,7 +302,7 @@
 
     if (invalid_pdu)
     {
-        SDP_TRACE_WARNING2 ("SDP - Unexp. PDU: %d in state: %d", rsp_pdu, p_ccb->disc_state);
+        SDP_TRACE_WARNING ("SDP - Unexp. PDU: %d in state: %d", rsp_pdu, p_ccb->disc_state);
         sdp_disconnect (p_ccb, SDP_GENERIC_ERROR);
     }
 }
@@ -332,7 +332,7 @@
     p_ccb->num_handles += cur_handles;
     if (p_ccb->num_handles == 0)
     {
-        SDP_TRACE_WARNING0 ("SDP - Rcvd ServiceSearchRsp, no matches");
+        SDP_TRACE_WARNING ("SDP - Rcvd ServiceSearchRsp, no matches");
         sdp_disconnect (p_ccb, SDP_NO_RECS_MATCH);
         return;
     }
@@ -395,7 +395,7 @@
     {
         sprintf((char *)&num_array[i*2],"%02X",(UINT8)(p_ccb->rsp_list[i]));
     }
-    SDP_TRACE_WARNING1("result :%s",num_array);
+    SDP_TRACE_WARNING("result :%s",num_array);
 #endif
 
     if(p_ccb->p_db->raw_data)
@@ -414,7 +414,7 @@
             cpy_len = list_len;
         }
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING4("list_len :%d cpy_len:%d raw_size:%d raw_used:%d",
+        SDP_TRACE_WARNING("list_len :%d cpy_len:%d raw_size:%d raw_used:%d",
             list_len, cpy_len, p_ccb->p_db->raw_size, p_ccb->p_db->raw_used);
 #endif
         memcpy (&p_ccb->p_db->raw_data[p_ccb->p_db->raw_used], p, cpy_len);
@@ -440,14 +440,14 @@
     BOOLEAN         cont_request_needed = FALSE;
 
 #if (SDP_DEBUG_RAW == TRUE)
-    SDP_TRACE_WARNING2("process_service_attr_rsp raw inc:%d",
+    SDP_TRACE_WARNING("process_service_attr_rsp raw inc:%d",
         SDP_RAW_DATA_INCLUDED);
 #endif
     /* If p_reply is NULL, we were called after the records handles were read */
     if (p_reply)
     {
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING4("ID & len: 0x%02x-%02x-%02x-%02x",
+        SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
             p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
 #endif
         /* Skip transaction ID and length */
@@ -455,7 +455,7 @@
 
         BE_STREAM_TO_UINT16 (list_byte_count, p_reply);
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING1("list_byte_count:%d", list_byte_count);
+        SDP_TRACE_WARNING("list_byte_count:%d", list_byte_count);
 #endif
 
         /* Copy the response to the scratchpad. First, a safety check on the length */
@@ -466,7 +466,7 @@
         }
 
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING2("list_len: %d, list_byte_count: %d",
+        SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
             p_ccb->list_len, list_byte_count);
 #endif
         if (p_ccb->rsp_list == NULL)
@@ -474,7 +474,7 @@
             p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT);
             if (p_ccb->rsp_list == NULL)
             {
-                SDP_TRACE_ERROR0 ("SDP - no gki buf to save rsp");
+                SDP_TRACE_ERROR ("SDP - no gki buf to save rsp");
                 sdp_disconnect (p_ccb, SDP_NO_RESOURCES);
                 return;
             }
@@ -483,10 +483,10 @@
         p_ccb->list_len += list_byte_count;
         p_reply         += list_byte_count;
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING1("list_len: %d(attr_rsp)", p_ccb->list_len);
+        SDP_TRACE_WARNING("list_len: %d(attr_rsp)", p_ccb->list_len);
 
         /* Check if we need to request a continuation */
-        SDP_TRACE_WARNING2("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
+        SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
 #endif
         if (*p_reply)
         {
@@ -501,7 +501,7 @@
         {
 
 #if (SDP_RAW_DATA_INCLUDED == TRUE)
-            SDP_TRACE_WARNING0("process_service_attr_rsp");
+            SDP_TRACE_WARNING("process_service_attr_rsp");
             sdp_copy_raw_data (p_ccb, FALSE);
 #endif
 
@@ -600,13 +600,13 @@
     BOOLEAN         cont_request_needed = FALSE;
 
 #if (SDP_DEBUG_RAW == TRUE)
-    SDP_TRACE_WARNING1("process_service_search_attr_rsp");
+    SDP_TRACE_WARNING("process_service_search_attr_rsp");
 #endif
     /* If p_reply is NULL, we were called for the initial read */
     if (p_reply)
     {
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING4("ID & len: 0x%02x-%02x-%02x-%02x",
+        SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
             p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
 #endif
         /* Skip transaction ID and length */
@@ -614,7 +614,7 @@
 
         BE_STREAM_TO_UINT16 (lists_byte_count, p_reply);
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING1("lists_byte_count:%d", lists_byte_count);
+        SDP_TRACE_WARNING("lists_byte_count:%d", lists_byte_count);
 #endif
 
         /* Copy the response to the scratchpad. First, a safety check on the length */
@@ -625,7 +625,7 @@
         }
 
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING2("list_len: %d, list_byte_count: %d",
+        SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
             p_ccb->list_len, lists_byte_count);
 #endif
         if (p_ccb->rsp_list == NULL)
@@ -633,7 +633,7 @@
             p_ccb->rsp_list = (UINT8 *)GKI_getbuf (SDP_MAX_LIST_BYTE_COUNT);
             if (p_ccb->rsp_list == NULL)
             {
-                SDP_TRACE_ERROR0 ("SDP - no gki buf to save rsp");
+                SDP_TRACE_ERROR ("SDP - no gki buf to save rsp");
                 sdp_disconnect (p_ccb, SDP_NO_RESOURCES);
                 return;
             }
@@ -642,10 +642,10 @@
         p_ccb->list_len += lists_byte_count;
         p_reply         += lists_byte_count;
 #if (SDP_DEBUG_RAW == TRUE)
-        SDP_TRACE_WARNING1("list_len: %d(search_attr_rsp)", p_ccb->list_len);
+        SDP_TRACE_WARNING("list_len: %d(search_attr_rsp)", p_ccb->list_len);
 
         /* Check if we need to request a continuation */
-        SDP_TRACE_WARNING2("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
+        SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
 #endif
         if (*p_reply)
         {
@@ -660,7 +660,7 @@
     }
 
 #if (SDP_DEBUG_RAW == TRUE)
-    SDP_TRACE_WARNING1("cont_request_needed:%d", cont_request_needed);
+    SDP_TRACE_WARNING("cont_request_needed:%d", cont_request_needed);
 #endif
     /* If continuation request (or first time request) */
     if ((cont_request_needed) || (!p_reply))
@@ -733,7 +733,7 @@
     /*******************************************************************/
 
 #if (SDP_RAW_DATA_INCLUDED == TRUE)
-    SDP_TRACE_WARNING0("process_service_search_attr_rsp");
+    SDP_TRACE_WARNING("process_service_search_attr_rsp");
     sdp_copy_raw_data (p_ccb, TRUE);
 #endif
 
@@ -744,7 +744,7 @@
 
     if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
     {
-        SDP_TRACE_WARNING1 ("SDP - Wrong type: 0x%02x in attr_rsp", type);
+        SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
         return;
     }
     p = sdpu_get_len_from_type (p, type, &seq_len);
@@ -792,14 +792,14 @@
 
     if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
     {
-        SDP_TRACE_WARNING1 ("SDP - Wrong type: 0x%02x in attr_rsp", type);
+        SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
         return (NULL);
     }
 
     p = sdpu_get_len_from_type (p, type, &seq_len);
     if ((p + seq_len) > p_msg_end)
     {
-        SDP_TRACE_WARNING1 ("SDP - Bad len in attr_rsp %d", seq_len);
+        SDP_TRACE_WARNING ("SDP - Bad len in attr_rsp %d", seq_len);
         return (NULL);
     }
 
@@ -807,7 +807,7 @@
     p_rec = add_record (p_ccb->p_db, p_ccb->device_address);
     if (!p_rec)
     {
-        SDP_TRACE_WARNING0 ("SDP - DB full add_record");
+        SDP_TRACE_WARNING ("SDP - DB full add_record");
         return (NULL);
     }
 
@@ -820,7 +820,7 @@
         p = sdpu_get_len_from_type (p, type, &attr_len);
         if (((type >> 3) != UINT_DESC_TYPE) || (attr_len != 2))
         {
-            SDP_TRACE_WARNING2 ("SDP - Bad type: 0x%02x or len: %d in attr_rsp", type, attr_len);
+            SDP_TRACE_WARNING ("SDP - Bad type: 0x%02x or len: %d in attr_rsp", type, attr_len);
             return (NULL);
         }
         BE_STREAM_TO_UINT16 (attr_id, p);
@@ -830,7 +830,7 @@
 
         if (!p)
         {
-            SDP_TRACE_WARNING0 ("SDP - DB full add_attr");
+            SDP_TRACE_WARNING ("SDP - DB full add_attr");
             return (NULL);
         }
     }
@@ -947,10 +947,10 @@
                 p_end             = p + attr_len;
                 total_len         = 0;
 
-                /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:%d(list)", nest_level); */
+                /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d(list)", nest_level); */
                 if (nest_level >= MAX_NEST_LEVELS)
                 {
-                    SDP_TRACE_ERROR0 ("SDP - attr nesting too deep");
+                    SDP_TRACE_ERROR ("SDP - attr nesting too deep");
                     return (p_end);
                 }
 
@@ -1027,7 +1027,7 @@
             }
             break;
         default:
-            SDP_TRACE_WARNING1 ("SDP - bad len in UUID attr: %d", attr_len);
+            SDP_TRACE_WARNING ("SDP - bad len in UUID attr: %d", attr_len);
             return (p + attr_len);
         }
         break;
@@ -1040,15 +1040,15 @@
         p_end             = p + attr_len;
         total_len         = 0;
 
-        /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:%d", nest_level); */
+        /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d", nest_level); */
         if (nest_level >= MAX_NEST_LEVELS)
         {
-            SDP_TRACE_ERROR0 ("SDP - attr nesting too deep");
+            SDP_TRACE_ERROR ("SDP - attr nesting too deep");
             return (p_end);
         }
         if(is_additional_list != 0 || attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS)
             nest_level |= SDP_ADDITIONAL_LIST_MASK;
-        /* SDP_TRACE_DEBUG1 ("SDP - attr nest level:0x%x(finish)", nest_level); */
+        /* SDP_TRACE_DEBUG ("SDP - attr nest level:0x%x(finish)", nest_level); */
 
         while (p < p_end)
         {
@@ -1072,7 +1072,7 @@
             p_attr->attr_value.v.u8 = *p++;
             break;
         default:
-            SDP_TRACE_WARNING1 ("SDP - bad len in boolean attr: %d", attr_len);
+            SDP_TRACE_WARNING ("SDP - bad len in boolean attr: %d", attr_len);
             return (p + attr_len);
         }
         break;
@@ -1104,20 +1104,20 @@
         if (!p_parent_attr->attr_value.v.p_sub_attr)
         {
             p_parent_attr->attr_value.v.p_sub_attr = p_attr;
-            /* SDP_TRACE_DEBUG4 ("parent:0x%x(id:%d), ch:0x%x(id:%d)",
+            /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch:0x%x(id:%d)",
                 p_parent_attr, p_parent_attr->attr_id, p_attr, p_attr->attr_id); */
         }
         else
         {
             tSDP_DISC_ATTR  *p_attr1 = p_parent_attr->attr_value.v.p_sub_attr;
-            /* SDP_TRACE_DEBUG4 ("parent:0x%x(id:%d), ch1:0x%x(id:%d)",
+            /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch1:0x%x(id:%d)",
                 p_parent_attr, p_parent_attr->attr_id, p_attr1, p_attr1->attr_id); */
 
             while (p_attr1->p_next_attr)
                 p_attr1 = p_attr1->p_next_attr;
 
             p_attr1->p_next_attr = p_attr;
-            /* SDP_TRACE_DEBUG2 ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */
+            /* SDP_TRACE_DEBUG ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */
         }
     }
 
diff --git a/stack/sdp/sdp_main.c b/stack/sdp/sdp_main.c
index d43c634..1e0c22a 100644
--- a/stack/sdp/sdp_main.c
+++ b/stack/sdp/sdp_main.c
@@ -97,7 +97,7 @@
     if (!BTM_SetSecurityLevel (FALSE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
                                SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
     {
-        SDP_TRACE_ERROR0 ("Security Registration Server failed");
+        SDP_TRACE_ERROR ("Security Registration Server failed");
         return;
     }
 #endif
@@ -107,7 +107,7 @@
     if (!BTM_SetSecurityLevel (TRUE, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER,
                                SDP_SECURITY_LEVEL, SDP_PSM, 0, 0))
     {
-        SDP_TRACE_ERROR0 ("Security Registration for Client failed");
+        SDP_TRACE_ERROR ("Security Registration for Client failed");
         return;
     }
 #endif
@@ -133,7 +133,7 @@
     /* Now, register with L2CAP */
     if (!L2CA_Register (SDP_PSM, &sdp_cb.reg_info))
     {
-        SDP_TRACE_ERROR0 ("SDP Registration failed");
+        SDP_TRACE_ERROR ("SDP Registration failed");
     }
 }
 
@@ -193,7 +193,7 @@
 
         if (cfg.fcr_present)
         {
-            SDP_TRACE_DEBUG6("sdp_connect_ind:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
+            SDP_TRACE_DEBUG("sdp_connect_ind:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
                         cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
                         cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
         }
@@ -208,7 +208,7 @@
         }
     }
 
-    SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", p_ccb->connection_id);
+    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", p_ccb->connection_id);
 #else   /* No server */
     /* Reject the connection */
     L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_PSM, 0);
@@ -235,7 +235,7 @@
     /* Find CCB based on CID */
     if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd conn cnf for unknown CID 0x%x", l2cap_cid);
         return;
     }
 
@@ -249,7 +249,7 @@
 
         if (cfg.fcr_present)
         {
-            SDP_TRACE_DEBUG6("sdp_connect_cfm:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
+            SDP_TRACE_DEBUG("sdp_connect_cfm:  mode %u, txwinsz %u, max_trans %u, rtrans_tout %u, mon_tout %u, mps %u",
                         cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit,
                         cfg.fcr.rtrans_tout,cfg.fcr.mon_tout, cfg.fcr.mps);
         }
@@ -263,11 +263,11 @@
             L2CA_ConfigReq (l2cap_cid, &cfg);
         }
 
-        SDP_TRACE_EVENT1 ("SDP - got conn cnf, sent cfg req, CID: 0x%x", p_ccb->connection_id);
+        SDP_TRACE_EVENT ("SDP - got conn cnf, sent cfg req, CID: 0x%x", p_ccb->connection_id);
     }
     else
     {
-        SDP_TRACE_WARNING2 ("SDP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result, p_ccb->connection_id);
+        SDP_TRACE_WARNING ("SDP - Rcvd conn cnf with error: 0x%x  CID 0x%x", result, p_ccb->connection_id);
 
         /* Tell the user if he has a callback */
         if (p_ccb->p_cb || p_ccb->p_cb2)
@@ -312,7 +312,7 @@
     /* Find CCB based on CID */
     if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
@@ -346,7 +346,7 @@
             {
                 p_cfg->fcr.tx_win_sz = sdp_cb.l2cap_my_cfg.fcr.tx_win_sz;
                 p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
-                SDP_TRACE_DEBUG0("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW");
+                SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with SMALLER TX WINDOW");
             }
 
             /* Reject if locally we want basic and they don't */
@@ -355,12 +355,12 @@
                 /* Ask for a new setup */
                 p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE;
                 p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS;
-                SDP_TRACE_DEBUG0("sdp_config_ind(CONFIG) -> Please try again with BASIC mode");
+                SDP_TRACE_DEBUG("sdp_config_ind(CONFIG) -> Please try again with BASIC mode");
             }
             /* Remain in configure state and give the peer our desired configuration */
             if (p_cfg->result != L2CAP_CFG_OK)
             {
-                SDP_TRACE_WARNING1 ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x", l2cap_cid);
+                SDP_TRACE_WARNING ("SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: 0x%x", l2cap_cid);
                 L2CA_ConfigRsp (l2cap_cid, p_cfg);
                 return;
             }
@@ -371,7 +371,7 @@
 
     L2CA_ConfigRsp (l2cap_cid, p_cfg);
 
-    SDP_TRACE_EVENT1 ("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
+    SDP_TRACE_EVENT ("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
 
     p_ccb->con_flags |= SDP_FLAGS_HIS_CFG_DONE;
 
@@ -403,12 +403,12 @@
 {
     tCONN_CB    *p_ccb;
 
-    SDP_TRACE_EVENT2 ("SDP - Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
+    SDP_TRACE_EVENT ("SDP - Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
 
     /* Find CCB based on CID */
     if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
@@ -464,14 +464,14 @@
     /* Find CCB based on CID */
     if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
     if (ack_needed)
         L2CA_DisconnectRsp (l2cap_cid);
 
-    SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
+    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
 #if SDP_CLIENT_ENABLED == TRUE
     /* Tell the user if he has a callback */
     if (p_ccb->p_cb)
@@ -516,13 +516,13 @@
         }
         else
         {
-            SDP_TRACE_WARNING2 ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x",
+            SDP_TRACE_WARNING ("SDP - Ignored L2CAP data while in state: %d, CID: 0x%x",
                                 p_ccb->con_state, l2cap_cid);
         }
     }
     else
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
     }
 
     GKI_freebuf (p_msg);
@@ -548,11 +548,11 @@
     /* Allocate a new CCB. Return if none available. */
     if ((p_ccb = sdpu_allocate_ccb()) == NULL)
     {
-        SDP_TRACE_WARNING0 ("SDP - no spare CCB for orig");
+        SDP_TRACE_WARNING ("SDP - no spare CCB for orig");
         return (NULL);
     }
 
-    SDP_TRACE_EVENT0 ("SDP - Originate started");
+    SDP_TRACE_EVENT ("SDP - Originate started");
 
     /* We are the originator of this connection */
     p_ccb->con_flags |= SDP_FLAGS_IS_ORIG;
@@ -580,7 +580,7 @@
     }
     else
     {
-        SDP_TRACE_WARNING0 ("SDP - Originate failed");
+        SDP_TRACE_WARNING ("SDP - Originate failed");
         sdpu_release_ccb (p_ccb);
         return (NULL);
     }
@@ -624,7 +624,7 @@
 
             p_ccb->cur_handle = 0;
 
-            SDP_TRACE_EVENT1 ("SDP - looking for for more,  CID: 0x%x",
+            SDP_TRACE_EVENT ("SDP - looking for for more,  CID: 0x%x",
                               p_ccb->connection_id);
 
             sdp_disc_connected (p_ccb);
@@ -637,7 +637,7 @@
 
 #endif
 
-    SDP_TRACE_EVENT1 ("SDP - disconnect  CID: 0x%x", p_ccb->connection_id);
+    SDP_TRACE_EVENT ("SDP - disconnect  CID: 0x%x", p_ccb->connection_id);
 
     /* Check if we have a connection ID */
     if (p_ccb->connection_id != 0)
@@ -678,11 +678,11 @@
     /* Find CCB based on CID */
     if ((p_ccb = sdpu_find_ccb_by_cid (l2cap_cid)) == NULL)
     {
-        SDP_TRACE_WARNING1 ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
+        SDP_TRACE_WARNING ("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
         return;
     }
 
-    SDP_TRACE_EVENT1 ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
+    SDP_TRACE_EVENT ("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
 
     /* Tell the user if he has a callback */
     if (p_ccb->p_cb)
@@ -708,7 +708,7 @@
 *******************************************************************************/
 void sdp_conn_timeout (tCONN_CB*p_ccb)
 {
-    SDP_TRACE_EVENT2 ("SDP - CCB timeout in state: %d  CID: 0x%x",
+    SDP_TRACE_EVENT ("SDP - CCB timeout in state: %d  CID: 0x%x",
                       p_ccb->con_state, p_ccb->connection_id);
 
     L2CA_DisconnectReq (p_ccb->connection_id);
diff --git a/stack/sdp/sdp_server.c b/stack/sdp/sdp_server.c
index 5d11cb4..de42097 100644
--- a/stack/sdp/sdp_server.c
+++ b/stack/sdp/sdp_server.c
@@ -97,6 +97,10 @@
 #define SDP_TEXT_BAD_CONT_INX   NULL
 #endif
 
+#ifndef SDP_TEXT_BAD_MAX_RECORDS_LIST
+#define SDP_TEXT_BAD_MAX_RECORDS_LIST   NULL
+#endif
+
 /*******************************************************************************
 **
 ** Function         sdp_server_handle_client_req
@@ -148,7 +152,7 @@
 
     default:
         sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_PDU);
-        SDP_TRACE_WARNING1 ("SDP - server got unknown PDU: 0x%x", pdu_id);
+        SDP_TRACE_WARNING ("SDP - server got unknown PDU: 0x%x", pdu_id);
         break;
     }
 }
@@ -194,6 +198,14 @@
     if (max_replies > SDP_MAX_RECORDS)
         max_replies = SDP_MAX_RECORDS;
 
+
+    if ((!p_req) || (p_req > p_req_end))
+    {
+        sdpu_build_n_send_error (p_ccb, trans_num, SDP_INVALID_REQ_SYNTAX, SDP_TEXT_BAD_MAX_RECORDS_LIST);
+        return;
+    }
+
+
     /* Get a list of handles that match the UUIDs given to us */
     for (num_rsp_handles = 0; num_rsp_handles < max_replies; )
     {
@@ -245,7 +257,7 @@
     /* Get a buffer to use to build the response */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
     {
-        SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+        SDP_TRACE_ERROR ("SDP - no buf for search rsp");
         return;
     }
     p_buf->offset = L2CAP_MIN_OFFSET;
@@ -263,7 +275,7 @@
     UINT16_TO_BE_STREAM (p_rsp, num_rsp_handles);
     UINT16_TO_BE_STREAM (p_rsp, cur_handles);
 
-/*    SDP_TRACE_DEBUG5("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d",
+/*    SDP_TRACE_DEBUG("SDP Service Rsp: tothdl %d, curhdlr %d, start %d, end %d, cont %d",
                      num_rsp_handles, cur_handles, cont_offset,
                      cont_offset + cur_handles-1, is_cont); */
     for (xx = cont_offset; xx < cont_offset + cur_handles; xx++)
@@ -380,12 +392,18 @@
     else
     {
         /* Get a scratch buffer to store response */
-        if (!p_ccb->rsp_list)
+        if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len))
         {
+            /* Free and reallocate if the earlier allocated buffer is small */
+            if (p_ccb->rsp_list)
+            {
+                GKI_freebuf (p_ccb->rsp_list);
+            }
+
             p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len);
             if (p_ccb->rsp_list == NULL)
             {
-                SDP_TRACE_ERROR0 ("SDP - no scratch buf for search rsp");
+                SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp");
                 return;
             }
         }
@@ -434,7 +452,7 @@
             {
                 if (attr_len >= SDP_MAX_ATTR_LEN)
                 {
-                    SDP_TRACE_ERROR2("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
+                    SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
                     sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL);
                     return;
                 }
@@ -493,7 +511,7 @@
     /* Get a buffer to use to build the response */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
     {
-        SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+        SDP_TRACE_ERROR ("SDP - no buf for search rsp");
         return;
     }
     p_buf->offset = L2CAP_MIN_OFFSET;
@@ -624,12 +642,18 @@
     else
     {
         /* Get a scratch buffer to store response */
-        if (!p_ccb->rsp_list)
+        if (!p_ccb->rsp_list || (GKI_get_buf_size(p_ccb->rsp_list) < max_list_len))
         {
+            /* Free and reallocate if the earlier allocated buffer is small */
+            if (p_ccb->rsp_list)
+            {
+                GKI_freebuf (p_ccb->rsp_list);
+            }
+
             p_ccb->rsp_list = (UINT8 *)GKI_getbuf (max_list_len);
             if (p_ccb->rsp_list == NULL)
             {
-                SDP_TRACE_ERROR0 ("SDP - no scratch buf for search rsp");
+                SDP_TRACE_ERROR ("SDP - no scratch buf for search rsp");
                 return;
             }
         }
@@ -702,7 +726,7 @@
                 {
                     if (attr_len >= SDP_MAX_ATTR_LEN)
                     {
-                        SDP_TRACE_ERROR2("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
+                        SDP_TRACE_ERROR("SDP attr too big: max_list_len=%d,attr_len=%d", max_list_len, attr_len);
                         sdpu_build_n_send_error (p_ccb, trans_num, SDP_NO_RESOURCES, NULL);
                         return;
                     }
@@ -789,7 +813,7 @@
     /* Get a buffer to use to build the response */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
     {
-        SDP_TRACE_ERROR0 ("SDP - no buf for search rsp");
+        SDP_TRACE_ERROR ("SDP - no buf for search rsp");
         return;
     }
     p_buf->offset = L2CAP_MIN_OFFSET;
diff --git a/stack/sdp/sdp_utils.c b/stack/sdp/sdp_utils.c
index 842e757..7cc9404 100644
--- a/stack/sdp/sdp_utils.c
+++ b/stack/sdp/sdp_utils.c
@@ -156,7 +156,7 @@
     /* Free the response buffer */
     if (p_ccb->rsp_list)
     {
-       SDP_TRACE_DEBUG0("releasing SDP rsp_list");
+       SDP_TRACE_DEBUG("releasing SDP rsp_list");
 
         GKI_freebuf(p_ccb->rsp_list);
         p_ccb->rsp_list = NULL;
@@ -317,13 +317,13 @@
     BT_HDR          *p_buf;
 
 
-    SDP_TRACE_WARNING2 ("SDP - sdpu_build_n_send_error  code: 0x%x  CID: 0x%x",
+    SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error  code: 0x%x  CID: 0x%x",
                         error_code, p_ccb->connection_id);
 
     /* Get a buffer to use to build and send the packet to L2CAP */
     if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
     {
-        SDP_TRACE_ERROR0 ("SDP - no buf for err msg");
+        SDP_TRACE_ERROR ("SDP - no buf for err msg");
         return;
     }
     p_buf->offset = L2CAP_MIN_OFFSET;
@@ -1006,7 +1006,7 @@
 
     if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL)
     {
-        SDP_TRACE_ERROR0("sdpu_build_partial_attrib_entry cannot get a buffer!");
+        SDP_TRACE_ERROR("sdpu_build_partial_attrib_entry cannot get a buffer!");
         return NULL;
     }
     p_tmp_attr = p_attr_buff;
diff --git a/stack/smp/aes.c b/stack/smp/aes.c
index 65cddf5..d2e86cd 100644
--- a/stack/smp/aes.c
+++ b/stack/smp/aes.c
@@ -510,6 +510,7 @@
         keylen = 24;
         break;
     case 32:
+    /*    case 256:           length in bits (256 = 8*32) */
         keylen = 32;
         break;
     default:
diff --git a/stack/smp/smp_act.c b/stack/smp/smp_act.c
index 47cd2c9..6568316 100644
--- a/stack/smp/smp_act.c
+++ b/stack/smp/smp_act.c
@@ -26,6 +26,7 @@
     #include "l2c_api.h"
     #include "smp_int.h"
 
+#define MAX_KEY_DISTRIBUTION_TYPES   3
 
 const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] =
 {
@@ -57,8 +58,8 @@
 *******************************************************************************/
 static void smp_update_key_mask (tSMP_CB *p_cb, UINT8 key_type, BOOLEAN recv)
 {
-    SMP_TRACE_DEBUG0 ("smp_update_key_mask ");
-    SMP_TRACE_DEBUG4("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
+    SMP_TRACE_DEBUG ("smp_update_key_mask ");
+    SMP_TRACE_DEBUG("before update role=%d recv=%d loc_i_key = %02x, loc_r_key = %02x", p_cb->role, recv, p_cb->loc_i_key, p_cb->loc_r_key);
     if (p_cb->role == HCI_ROLE_SLAVE)
     {
         if (recv)
@@ -74,7 +75,7 @@
             p_cb->loc_i_key &= ~key_type;
     }
 
-    SMP_TRACE_DEBUG2("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
+    SMP_TRACE_DEBUG("updated loc_i_key = %02x, loc_r_key = %02x", p_cb->loc_i_key, p_cb->loc_r_key);
 }
 /*******************************************************************************
 ** Function     smp_io_cap_req
@@ -86,7 +87,7 @@
     tSMP_STATUS callback_rc;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG1 ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
+    SMP_TRACE_DEBUG ("smp_send_app_cback p_cb->cb_evt=%d", p_cb->cb_evt );
     if (p_cb->p_callback && p_cb->cb_evt != 0)
     {
         if (p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
@@ -98,28 +99,22 @@
             cb_data.io_req.init_keys = p_cb->loc_i_key ;
             cb_data.io_req.resp_keys = p_cb->loc_r_key ;
 
-            SMP_TRACE_WARNING1( "io_cap = %d",cb_data.io_req.io_cap);
+            SMP_TRACE_WARNING( "io_cap = %d",cb_data.io_req.io_cap);
         }
         callback_rc = (*p_cb->p_callback)(p_cb->cb_evt, p_cb->pairing_bda, &cb_data);
 
-        SMP_TRACE_DEBUG2 ("callback_rc=%d  p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
+        SMP_TRACE_DEBUG ("callback_rc=%d  p_cb->cb_evt=%d",callback_rc, p_cb->cb_evt );
 
         if (callback_rc == SMP_SUCCESS && p_cb->cb_evt == SMP_IO_CAP_REQ_EVT)
         {
             p_cb->loc_auth_req   = cb_data.io_req.auth_req;
             p_cb->loc_io_caps    = cb_data.io_req.io_cap;
-#if (defined(BLE_PERIPHERAL_DISPLAYONLY) && (BLE_PERIPHERAL_DISPLAYONLY == TRUE))
-            if (p_cb->role == HCI_ROLE_SLAVE)
-            {
-                p_cb->loc_io_caps    = SMP_IO_CAP_OUT;
-            }
-#endif
             p_cb->loc_oob_flag   = cb_data.io_req.oob_data;
             p_cb->loc_enc_size   = cb_data.io_req.max_key_size;
             p_cb->loc_i_key      = cb_data.io_req.init_keys;
             p_cb->loc_r_key      = cb_data.io_req.resp_keys;
 
-            SMP_TRACE_WARNING2( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
+            SMP_TRACE_WARNING( "new io_cap = %d p_cb->loc_enc_size = %d",p_cb->loc_io_caps, p_cb->loc_enc_size);
 
             smp_sm_event(p_cb, SMP_IO_RSP_EVT, NULL);
         }
@@ -130,7 +125,7 @@
         p_cb->discard_sec_req = FALSE;
         smp_sm_event(p_cb, SMP_DISCARD_SEC_REQ_EVT, NULL);
     }
-    SMP_TRACE_DEBUG0 ("smp_send_app_cback return");
+    SMP_TRACE_DEBUG ("smp_send_app_cback return");
 }
 /*******************************************************************************
 ** Function     smp_send_pair_fail
@@ -141,7 +136,7 @@
     p_cb->status = *(UINT8 *)p_data;
     p_cb->failure = *(UINT8 *)p_data;
 
-    SMP_TRACE_DEBUG2 ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
+    SMP_TRACE_DEBUG ("smp_send_pair_fail status=%d failure=%d ",p_cb->status, p_cb->failure);
 
     if (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS)
     {
@@ -158,14 +153,18 @@
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_pair_req  ");
+    SMP_TRACE_DEBUG ("smp_send_pair_req  ");
 
 #if BLE_INCLUDED == TRUE
     /* Disable L2CAP connection parameter updates while bonding since
        some peripherals are not able to revert to fast connection parameters
        during the start of service discovery. Connection paramter updates
        get enabled again once service discovery completes. */
-    L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
+    if (L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE) == FALSE)
+    {
+        SMP_TRACE_ERROR ("smp pair failed...!");
+        return;
+    }
 #endif
 
     /* erase all keys when master sends pairing req*/
@@ -183,7 +182,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_pair_rsp  ");
+    SMP_TRACE_DEBUG ("smp_send_pair_rsp  ");
 
     p_cb->loc_i_key &= p_cb->peer_i_key;
     p_cb->loc_r_key &= p_cb->peer_r_key;
@@ -202,7 +201,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_confirm  ");
+    SMP_TRACE_DEBUG ("smp_send_confirm  ");
     smp_send_cmd(SMP_OPCODE_CONFIRM, p_cb);
 }
 /*******************************************************************************
@@ -213,12 +212,12 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_init  ");
+    SMP_TRACE_DEBUG ("smp_send_init  ");
 
 #if SMP_CONFORMANCE_TESTING == TRUE
     if (p_cb->enable_test_rand_val)
     {
-        SMP_TRACE_DEBUG0 ("Use rand value from script");
+        SMP_TRACE_DEBUG ("Use rand value from script");
         memcpy(p_cb->rand, p_cb->test_rand, BT_OCTET16_LEN);
     }
 #endif
@@ -234,7 +233,7 @@
     tBTM_LE_LENC_KEYS   le_key;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG1 ("smp_send_enc_info  p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
+    SMP_TRACE_DEBUG ("smp_send_enc_info  p_cb->loc_enc_size = %d", p_cb->loc_enc_size);
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, FALSE);
 
     smp_send_cmd(SMP_OPCODE_ENCRYPT_INFO, p_cb);
@@ -246,7 +245,7 @@
     le_key.sec_level = p_cb->sec_level;
     btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, (tBTM_LE_KEY_VALUE *)&le_key, TRUE);
 
-    SMP_TRACE_WARNING0( "smp_send_enc_info");
+    SMP_TRACE_WARNING( "smp_send_enc_info");
 
     smp_key_distribution(p_cb, NULL);
 }
@@ -258,13 +257,13 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_id_info  ");
+    SMP_TRACE_DEBUG ("smp_send_id_info  ");
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, FALSE);
 
     smp_send_cmd(SMP_OPCODE_IDENTITY_INFO, p_cb);
     smp_send_cmd(SMP_OPCODE_ID_ADDR, p_cb);
 
-    SMP_TRACE_WARNING0( "smp_send_id_info");
+    SMP_TRACE_WARNING( "smp_send_id_info");
 
     smp_key_distribution(p_cb, NULL);
 }
@@ -277,7 +276,7 @@
     tBTM_LE_KEY_VALUE   key;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_send_csrk_info ");
+    SMP_TRACE_DEBUG ("smp_send_csrk_info ");
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, FALSE);
 
     if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb))
@@ -297,7 +296,7 @@
 *******************************************************************************/
 void smp_send_ltk_reply(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
-    SMP_TRACE_DEBUG0 ("smp_send_ltk_reply ");
+    SMP_TRACE_DEBUG ("smp_send_ltk_reply ");
     /* send stk as LTK response */
     btm_ble_ltk_request_reply(p_cb->pairing_bda, TRUE, p_data->key.p_data);
 }
@@ -311,27 +310,30 @@
     tBTM_BLE_SEC_REQ_ACT    sec_req_act;
 
 
-    SMP_TRACE_DEBUG1 ("smp_proc_sec_req  auth_req=0x%x",auth_req);
+    SMP_TRACE_DEBUG ("smp_proc_sec_req  auth_req=0x%x",auth_req);
 
     p_cb->cb_evt = 0;
 
     btm_ble_link_sec_check(p_cb->pairing_bda, auth_req,  &sec_req_act);
 
-    SMP_TRACE_DEBUG1 ("smp_proc_sec_req  sec_req_act=0x%x",sec_req_act);
+    SMP_TRACE_DEBUG ("smp_proc_sec_req  sec_req_act=0x%x",sec_req_act);
 
     switch (sec_req_act)
     {
         case  BTM_BLE_SEC_REQ_ACT_ENCRYPT:
-            SMP_TRACE_DEBUG0 ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_ENCRYPT");
+            SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_ENCRYPT");
             smp_sm_event(p_cb, SMP_ENC_REQ_EVT, NULL);
             break;
 
         case BTM_BLE_SEC_REQ_ACT_PAIR:
             /* initialize local i/r key to be default keys */
-            SMP_TRACE_DEBUG0 ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_PAIR");
+            SMP_TRACE_DEBUG ("smp_proc_sec_req BTM_BLE_SEC_REQ_ACT_PAIR");
             p_cb->peer_auth_req = auth_req;
             p_cb->loc_r_key = p_cb->loc_i_key = SMP_SEC_DEFAULT_KEY ;
             p_cb->cb_evt = SMP_SEC_REQUEST_EVT;
+            btu_stop_timer (&p_cb->rsp_timer_ent);
+            btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
+                   SMP_WAIT_FOR_RSP_TOUT);
             break;
 
         case BTM_BLE_SEC_REQ_ACT_DISCARD:
@@ -350,7 +352,7 @@
 void smp_proc_sec_grant(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
     UINT8 res= *(UINT8 *)p_data;
-    SMP_TRACE_DEBUG0 ("smp_proc_sec_grant ");
+    SMP_TRACE_DEBUG ("smp_proc_sec_grant ");
     if (res != SMP_SUCCESS)
     {
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, p_data);
@@ -367,7 +369,7 @@
 *******************************************************************************/
 void smp_proc_pair_fail(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
-    SMP_TRACE_DEBUG0 ("smp_proc_pair_fail   ");
+    SMP_TRACE_DEBUG ("smp_proc_pair_fail   ");
     p_cb->status = *(UINT8 *)p_data;
 }
 /*******************************************************************************
@@ -380,7 +382,7 @@
     UINT8   reason = SMP_ENC_KEY_SIZE;
     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_cb->pairing_bda);
 
-    SMP_TRACE_DEBUG0 ("smp_proc_pair_cmd  ");
+    SMP_TRACE_DEBUG ("smp_proc_pair_cmd  ");
     /* erase all keys if it is slave proc pairing req*/
     if (p_dev_rec && (p_cb->role == HCI_ROLE_SLAVE))
         btm_sec_clear_ble_keys(p_dev_rec);
@@ -397,7 +399,7 @@
 #if SMP_CONFORMANCE_TESTING == TRUE
     if (p_cb->enable_test_pair_fail)
     {
-        SMP_TRACE_DEBUG0 ("Forced pair fair");
+        SMP_TRACE_DEBUG ("Forced pair fair");
         if (p_cb->peer_enc_size < SMP_MIN_ENC_KEY_SIZE)
         {
             smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
@@ -439,7 +441,7 @@
 {
     UINT8 *p = (UINT8 *)p_data;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_confirm  ");
+    SMP_TRACE_DEBUG ("smp_proc_confirm  ");
     if (p != NULL)
     {
         /* save the SConfirm for comparison later */
@@ -456,7 +458,7 @@
 void smp_proc_init(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
     UINT8 *p = (UINT8 *)p_data;
-    SMP_TRACE_DEBUG0 ("smp_proc_init ");
+    SMP_TRACE_DEBUG ("smp_proc_init ");
     /* save the SRand for comparison */
     STREAM_TO_ARRAY(p_cb->rrand, p, BT_OCTET16_LEN);
 
@@ -469,7 +471,7 @@
 {
     UINT8   *p = (UINT8 *)p_data;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_enc_info  ");
+    SMP_TRACE_DEBUG ("smp_proc_enc_info  ");
     STREAM_TO_ARRAY(p_cb->ltk, p, BT_OCTET16_LEN);
 
     smp_key_distribution(p_cb, NULL);
@@ -483,7 +485,7 @@
     UINT8   *p = (UINT8 *)p_data;
     tBTM_LE_PENC_KEYS   le_key;
 
-    SMP_TRACE_DEBUG0 (" smp_proc_master_id");
+    SMP_TRACE_DEBUG (" smp_proc_master_id");
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ENC, TRUE);
 
     STREAM_TO_UINT16(le_key.ediv, p);
@@ -505,7 +507,7 @@
 {
     UINT8   *p = (UINT8 *)p_data;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_id_info ");
+    SMP_TRACE_DEBUG ("smp_proc_id_info ");
     STREAM_TO_ARRAY (p_cb->tk, p, BT_OCTET16_LEN);   /* reuse TK for IRK */
 
     smp_key_distribution(p_cb, NULL);
@@ -519,7 +521,7 @@
     UINT8   *p = (UINT8 *)p_data;
     tBTM_LE_PID_KEYS    pid_key;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_id_addr  ");
+    SMP_TRACE_DEBUG ("smp_proc_id_addr  ");
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_ID, TRUE);
 
     STREAM_TO_UINT8(pid_key.addr_type, p);
@@ -539,7 +541,7 @@
 {
     tBTM_LE_PCSRK_KEYS   le_key;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_srk_info ");
+    SMP_TRACE_DEBUG ("smp_proc_srk_info ");
     smp_update_key_mask (p_cb, SMP_SEC_KEY_TYPE_CSRK, TRUE);
 
     /* save CSRK to security record */
@@ -559,7 +561,7 @@
 {
     UINT8   reason;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_compare  ");
+    SMP_TRACE_DEBUG ("smp_proc_compare  ");
     if (
 #if SMP_CONFORMANCE_TESTING == TRUE
         p_cb->skip_test_compare_check ||
@@ -596,7 +598,7 @@
 {
     UINT8 key_type = p_data->key.key_type;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_sl_keysmp_proc_sl_key  ");
+    SMP_TRACE_DEBUG ("smp_proc_sl_keysmp_proc_sl_key  ");
     if (key_type == SMP_KEY_TYPE_TK)
     {
         smp_generate_confirm(p_cb, NULL);
@@ -616,16 +618,16 @@
 *******************************************************************************/
 void smp_start_enc(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
-    BOOLEAN cmd;
+    tBTM_STATUS cmd;
     UINT8 reason = SMP_ENC_FAIL;
 
-    SMP_TRACE_DEBUG0 ("smp_start_enc ");
+    SMP_TRACE_DEBUG ("smp_start_enc ");
     if (p_data != NULL)
         cmd = btm_ble_start_encrypt(p_cb->pairing_bda, TRUE, p_data->key.p_data);
     else
         cmd = btm_ble_start_encrypt(p_cb->pairing_bda, FALSE, NULL);
 
-    if (!cmd)
+    if (cmd != BTM_CMD_STARTED && cmd != BTM_BUSY)
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
 
 }
@@ -638,8 +640,9 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_proc_discard ");
-    smp_reset_control_value(p_cb);
+    SMP_TRACE_DEBUG ("smp_proc_discard ");
+    if (!(p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD))
+        smp_reset_control_value(p_cb);
 }
 /*******************************************************************************
 ** Function     smp_proc_release_delay
@@ -649,7 +652,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_proc_release_delay ");
+    SMP_TRACE_DEBUG ("smp_proc_release_delay ");
     btu_stop_timer (&p_cb->rsp_timer_ent);
     btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
                      SMP_WAIT_FOR_REL_DELAY_TOUT);
@@ -663,7 +666,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_proc_release_delay_tout ");
+    SMP_TRACE_DEBUG ("smp_proc_release_delay_tout ");
     btu_stop_timer (&p_cb->rsp_timer_ent);
     smp_proc_pairing_cmpl(p_cb);
 }
@@ -678,7 +681,7 @@
     UINT8 enc_enable = *(UINT8 *)p_data;
     UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
 
-    SMP_TRACE_DEBUG0 ("smp_enc_cmpl ");
+    SMP_TRACE_DEBUG ("smp_enc_cmpl ");
     smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason);
 }
 
@@ -692,7 +695,7 @@
     UINT8 enc_enable = *(UINT8 *)p_data;
     UINT8 reason = enc_enable ? SMP_SUCCESS : SMP_ENC_FAIL;
 
-    SMP_TRACE_DEBUG3 ("smp_check_auth_req enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
+    SMP_TRACE_DEBUG ("smp_check_auth_req enc_enable=%d i_keys=0x%x r_keys=0x%x (i-initiator r-responder)",
                       enc_enable, p_cb->loc_i_key, p_cb->loc_r_key);
     if (enc_enable == 1)
     {
@@ -728,14 +731,14 @@
     UINT8   key_to_dist = (p_cb->role == HCI_ROLE_SLAVE) ? p_cb->loc_r_key : p_cb->loc_i_key;
     UINT8   i = 0;
 
-    SMP_TRACE_DEBUG1 ("smp_key_pick_key key_to_dist=0x%x", key_to_dist);
-    while (i < 3)
+    SMP_TRACE_DEBUG ("smp_key_pick_key key_to_dist=0x%x", key_to_dist);
+    while (i < MAX_KEY_DISTRIBUTION_TYPES)
     {
-        SMP_TRACE_DEBUG2("key to send = %02x, i = %d",  key_to_dist, i);
+        SMP_TRACE_DEBUG("key to send = %02x, i = %d",  key_to_dist, i);
 
         if (key_to_dist & (1 << i))
         {
-            SMP_TRACE_DEBUG1 ("smp_distribute_act[%d]", i);
+            SMP_TRACE_DEBUG ("smp_distribute_act[%d]", i);
             (* smp_distribute_act[i])(p_cb, p_data);
             break;
         }
@@ -749,7 +752,7 @@
 void smp_key_distribution(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
     UINT8   reason = SMP_SUCCESS;
-    SMP_TRACE_DEBUG3 ("smp_key_distribution role=%d (0-master) r_keys=0x%x i_keys=0x%x",
+    SMP_TRACE_DEBUG ("smp_key_distribution role=%d (0-master) r_keys=0x%x i_keys=0x%x",
                       p_cb->role, p_cb->loc_r_key, p_cb->loc_i_key);
 
     if (p_cb->role == HCI_ROLE_SLAVE||
@@ -780,7 +783,7 @@
     tSMP_INT_DATA   *p = NULL;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG3 ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
+    SMP_TRACE_DEBUG ("smp_decide_asso_model p_cb->peer_io_caps = %d p_cb->loc_io_caps = %d \
                        p_cb->peer_auth_req = %02x",
                        p_cb->peer_io_caps, p_cb->loc_io_caps, p_cb->peer_auth_req);
 
@@ -806,13 +809,13 @@
         }
     }
 
-    SMP_TRACE_DEBUG1("Association Model = %d", model);
+    SMP_TRACE_DEBUG("Association Model = %d", model);
 
     if (model == SMP_MODEL_OOB)
     {
-        SMP_TRACE_ERROR0("Association Model = SMP_MODEL_OOB");
+        SMP_TRACE_ERROR("Association Model = SMP_MODEL_OOB");
         p_cb->sec_level = SMP_SEC_AUTHENTICATED;
-        SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
+        SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
         p_cb->cb_evt = SMP_OOB_REQ_EVT;
 
         int_evt = SMP_TK_REQ_EVT;
@@ -820,7 +823,7 @@
     else if (model == SMP_MODEL_PASSKEY)
     {
         p_cb->sec_level = SMP_SEC_AUTHENTICATED;
-        SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
+        SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_AUTHENTICATED) ", p_cb->sec_level );
 
         p_cb->cb_evt = SMP_PASSKEY_REQ_EVT;
         int_evt = SMP_TK_REQ_EVT;
@@ -829,7 +832,7 @@
     {
         p_cb->sec_level = SMP_SEC_AUTHENTICATED;
 
-        SMP_TRACE_DEBUG0("Need to generate Passkey");
+        SMP_TRACE_DEBUG("Need to generate Passkey");
         /* generate passkey and notify application */
         smp_generate_passkey(p_cb, NULL);
     }
@@ -839,7 +842,7 @@
             ((p_cb->peer_auth_req & SMP_AUTH_YN_BIT) != 0) &&
             ((p_cb->loc_auth_req & SMP_AUTH_YN_BIT) == 0))
         {
-            SMP_TRACE_ERROR0("IO capability does not meet authentication requirement");
+            SMP_TRACE_ERROR("IO capability does not meet authentication requirement");
             failure = SMP_PAIR_AUTH_FAIL;
             p = (tSMP_INT_DATA *)&failure;
             int_evt = SMP_AUTH_CMPL_EVT;
@@ -847,7 +850,7 @@
         else
         {
             p_cb->sec_level = SMP_SEC_UNAUTHENTICATE;
-            SMP_TRACE_EVENT1 ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
+            SMP_TRACE_EVENT ("p_cb->sec_level =%d (SMP_SEC_UNAUTHENTICATE) ", p_cb->sec_level );
 
             key.key_type = SMP_KEY_TYPE_TK;
             key.p_data = p_cb->tk;
@@ -860,12 +863,12 @@
     }
     else if (model == SMP_MODEL_MAX)
     {
-        SMP_TRACE_ERROR0("Association Model = SMP_MODEL_MAX (failed)");
+        SMP_TRACE_ERROR("Association Model = SMP_MODEL_MAX (failed)");
         p = (tSMP_INT_DATA *)&failure;
         int_evt = SMP_AUTH_CMPL_EVT;
     }
 
-    SMP_TRACE_EVENT1 ("sec_level=%d ", p_cb->sec_level );
+    SMP_TRACE_EVENT ("sec_level=%d ", p_cb->sec_level );
     if (int_evt)
         smp_sm_event(p_cb, int_evt, p);
 }
@@ -878,7 +881,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_proc_io_rsp ");
+    SMP_TRACE_DEBUG ("smp_proc_io_rsp ");
     if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
     {
         smp_set_state(SMP_ST_SEC_REQ_PENDING);
@@ -897,7 +900,7 @@
 void smp_pairing_cmpl(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
 
-    SMP_TRACE_DEBUG0 ("smp_pairing_cmpl ");
+    SMP_TRACE_DEBUG ("smp_pairing_cmpl ");
 
     if ((p_cb->status == SMP_SUCCESS) ||
         (p_cb->status <= SMP_REPEATED_ATTEMPTS && p_cb->status != SMP_SUCCESS))
@@ -920,7 +923,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_pair_terminate ");
+    SMP_TRACE_DEBUG ("smp_pair_terminate ");
 
     p_cb->status = SMP_CONN_TOUT;
 
@@ -934,7 +937,7 @@
 *******************************************************************************/
 void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
-    SMP_TRACE_DEBUG0 ("smp_delay_terminate ");
+    SMP_TRACE_DEBUG ("smp_delay_terminate ");
 
     btu_stop_timer (&p_cb->rsp_timer_ent);
 
@@ -955,11 +958,23 @@
     UNUSED(p_data);
     if (p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
     {
-        SMP_TRACE_DEBUG0("Pairing terminated at IDLE state.");
+        SMP_TRACE_DEBUG("Pairing terminated at IDLE state.");
         p_cb->status = SMP_FAIL;
         smp_proc_pairing_cmpl(p_cb);
     }
 }
+
+/*******************************************************************************
+** Function     smp_fast_conn_param
+** Description  apply default connection parameter for pairing process
+*******************************************************************************/
+void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
+{
+    /* disable connection parameter update */
+    (void)L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, FALSE);
+}
+
+
 /*******************************************************************************
 **
 ** Function         smp_link_encrypted
@@ -976,7 +991,7 @@
 {
     tSMP_CB *p_cb = &smp_cb;
 
-    SMP_TRACE_DEBUG1 ("smp_link_encrypted encr_enable=%d",encr_enable);
+    SMP_TRACE_DEBUG ("smp_link_encrypted encr_enable=%d",encr_enable);
 
     if (memcmp(&smp_cb.pairing_bda[0], bda, BD_ADDR_LEN) == 0)
     {
@@ -1003,7 +1018,7 @@
 *******************************************************************************/
 BOOLEAN smp_proc_ltk_request(BD_ADDR bda)
 {
-    SMP_TRACE_DEBUG1 ("smp_proc_ltk_request state = %d", smp_cb.state);
+    SMP_TRACE_DEBUG ("smp_proc_ltk_request state = %d", smp_cb.state);
     if ( smp_cb.state == SMP_ST_ENC_PENDING &&
          !memcmp(bda, smp_cb.pairing_bda, BD_ADDR_LEN))
     {
diff --git a/stack/smp/smp_api.c b/stack/smp/smp_api.c
index 64644da..85d1054 100644
--- a/stack/smp/smp_api.c
+++ b/stack/smp/smp_api.c
@@ -49,7 +49,7 @@
 void SMP_Init(void)
 {
 
-    SMP_TRACE_EVENT0 ("SMP_Init");
+    SMP_TRACE_EVENT ("SMP_Init");
     memset(&smp_cb, 0, sizeof(tSMP_CB));
 
 #if defined(SMP_INITIAL_TRACE_LEVEL)
@@ -102,11 +102,11 @@
 *******************************************************************************/
 BOOLEAN SMP_Register (tSMP_CALLBACK *p_cback)
 {
-    SMP_TRACE_EVENT1 ("SMP_Register state=%d", smp_cb.state);
+    SMP_TRACE_EVENT ("SMP_Register state=%d", smp_cb.state);
 
     if (smp_cb.p_callback != NULL)
     {
-        SMP_TRACE_ERROR0 ("SMP_Register: duplicate registration, overwrite it");
+        SMP_TRACE_ERROR ("SMP_Register: duplicate registration, overwrite it");
     }
     smp_cb.p_callback = p_cback;
 
@@ -131,7 +131,7 @@
     tSMP_CB   *p_cb = &smp_cb;
     UINT8     status = SMP_PAIR_INTERNAL_ERR;
 
-    BTM_TRACE_EVENT2 ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
+    BTM_TRACE_EVENT ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
     if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD)
     {
         /* pending security on going, reject this one */
@@ -145,7 +145,7 @@
 
         if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr))
         {
-            SMP_TRACE_ERROR0("SMP_Pair: L2C connect fixed channel failed.");
+            SMP_TRACE_ERROR("SMP_Pair: L2C connect fixed channel failed.");
             smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
             return status;
         }
@@ -172,12 +172,12 @@
     UINT8     err_code = SMP_PAIR_FAIL_UNKNOWN;
     BOOLEAN   status = FALSE;
 
-    BTM_TRACE_EVENT2 ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
+    BTM_TRACE_EVENT ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags);
     if ( (p_cb->state != SMP_ST_IDLE)  &&
          (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) )
     {
         p_cb->is_pair_cancel = TRUE;
-        SMP_TRACE_DEBUG0("Cancel Pairing: set fail reason Unknown");
+        SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code);
         status = TRUE;
     }
@@ -199,7 +199,7 @@
 *******************************************************************************/
 void SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res)
 {
-    SMP_TRACE_EVENT0 ("SMP_SecurityGrant ");
+    SMP_TRACE_EVENT ("SMP_SecurityGrant ");
     if (smp_cb.state != SMP_ST_WAIT_APP_RSP ||
         smp_cb.cb_evt != SMP_SEC_REQUEST_EVT ||
         memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN))
@@ -230,32 +230,32 @@
     UINT8   failure = SMP_PASSKEY_ENTRY_FAIL;
     tBTM_SEC_DEV_REC *p_dev_rec;
 
-    SMP_TRACE_EVENT2 ("SMP_PasskeyReply: Key: %d  Result:%d",
+    SMP_TRACE_EVENT ("SMP_PasskeyReply: Key: %d  Result:%d",
                       passkey, res);
 
     /* If timeout already expired or has been canceled, ignore the reply */
     if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT)
     {
-        SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
+        SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state);
         return;
     }
 
     if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0)
     {
-        SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - Wrong BD Addr");
+        SMP_TRACE_ERROR ("SMP_PasskeyReply() - Wrong BD Addr");
         return;
     }
 
     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
     {
-        SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - no dev CB");
+        SMP_TRACE_ERROR ("SMP_PasskeyReply() - no dev CB");
         return;
     }
 
 
     if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS)
     {
-        SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
+        SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey);
         /* send pairing failure */
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
 
@@ -287,7 +287,7 @@
     tSMP_KEY        key;
     UNUSED(bd_addr);
 
-    SMP_TRACE_EVENT2 ("SMP_OobDataReply State: %d  res:%d",
+    SMP_TRACE_EVENT ("SMP_OobDataReply State: %d  res:%d",
                       smp_cb.state, res);
 
     /* If timeout already expired or has been canceled, ignore the reply */
diff --git a/stack/smp/smp_cmac.c b/stack/smp/smp_cmac.c
index 44e776e..138c6f1 100644
--- a/stack/smp/smp_cmac.c
+++ b/stack/smp/smp_cmac.c
@@ -53,11 +53,11 @@
     UINT8  *p = (UINT8 *)x;
     UINT8  i;
 
-    SMP_TRACE_WARNING1("%s(MSB ~ LSB) = ", key_name);
+    SMP_TRACE_WARNING("%s(MSB ~ LSB) = ", key_name);
 
     for (i = 0; i < 4; i ++)
     {
-        SMP_TRACE_WARNING4("%02x %02x %02x %02x",
+        SMP_TRACE_WARNING("%02x %02x %02x %02x",
                            p[BT_OCTET16_LEN - i*4 -1], p[BT_OCTET16_LEN - i*4 -2],
                            p[BT_OCTET16_LEN - i*4 -3], p[BT_OCTET16_LEN - i*4 -4]);
     }
@@ -95,7 +95,7 @@
 static void leftshift_onebit(UINT8 *input, UINT8 *output)
 {
     UINT8   i, overflow = 0 , next_overflow = 0;
-    SMP_TRACE_EVENT0 ("leftshift_onebit ");
+    SMP_TRACE_EVENT ("leftshift_onebit ");
     /* input[0] is LSB */
     for ( i = 0; i < BT_OCTET16_LEN ; i ++ )
     {
@@ -139,7 +139,7 @@
     UINT8    x[16] = {0};
     UINT8   *p_mac;
 
-    SMP_TRACE_EVENT0 ("cmac_aes_k_calculate ");
+    SMP_TRACE_EVENT ("cmac_aes_k_calculate ");
 
     while (i <= cmac_cb.round)
     {
@@ -160,10 +160,10 @@
         p_mac = output.param_buf + (BT_OCTET16_LEN - tlen);
         memcpy(p_signature, p_mac, tlen);
 
-        SMP_TRACE_DEBUG2("tlen = %d p_mac = %d", tlen, p_mac);
-        SMP_TRACE_DEBUG4("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
+        SMP_TRACE_DEBUG("tlen = %d p_mac = %d", tlen, p_mac);
+        SMP_TRACE_DEBUG("p_mac[0] = 0x%02x p_mac[1] = 0x%02x p_mac[2] = 0x%02x p_mac[3] = 0x%02x",
                          *p_mac, *(p_mac + 1), *(p_mac + 2), *(p_mac + 3));
-        SMP_TRACE_DEBUG4("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
+        SMP_TRACE_DEBUG("p_mac[4] = 0x%02x p_mac[5] = 0x%02x p_mac[6] = 0x%02x p_mac[7] = 0x%02x",
                          *(p_mac + 4), *(p_mac + 5), *(p_mac + 6), *(p_mac + 7));
 
         return TRUE;
@@ -187,11 +187,11 @@
 //    UINT8       x[16] = {0};
     BOOLEAN      flag;
 
-    SMP_TRACE_EVENT0 ("cmac_prepare_last_block ");
+    SMP_TRACE_EVENT ("cmac_prepare_last_block ");
     /* last block is a complete block set flag to 1 */
     flag = ((cmac_cb.len % BT_OCTET16_LEN) == 0 && cmac_cb.len != 0)  ? TRUE : FALSE;
 
-    SMP_TRACE_WARNING2("flag = %d round = %d", flag, cmac_cb.round);
+    SMP_TRACE_WARNING("flag = %d round = %d", flag, cmac_cb.round);
 
     if ( flag )
     { /* last block is complete block */
@@ -217,7 +217,7 @@
 {
     UINT8 k1[BT_OCTET16_LEN], k2[BT_OCTET16_LEN];
     UINT8 *pp = p->param_buf;
-    SMP_TRACE_EVENT0 ("cmac_subkey_cont ");
+    SMP_TRACE_EVENT ("cmac_subkey_cont ");
     print128(pp, (const UINT8 *)"K1 before shift");
 
     /* If MSB(L) = 0, then K1 = L << 1 */
@@ -265,7 +265,7 @@
     BT_OCTET16 z = {0};
     BOOLEAN     ret = TRUE;
     tSMP_ENC output;
-    SMP_TRACE_EVENT0 (" cmac_generate_subkey");
+    SMP_TRACE_EVENT (" cmac_generate_subkey");
 
     if (SMP_Encrypt(key, BT_OCTET16_LEN, z, BT_OCTET16_LEN, &output))
     {
@@ -298,12 +298,12 @@
     UINT16  n = (length + BT_OCTET16_LEN - 1) / BT_OCTET16_LEN;       /* n is number of rounds */
     BOOLEAN ret = FALSE;
 
-    SMP_TRACE_EVENT0 ("AES_CMAC  ");
+    SMP_TRACE_EVENT ("AES_CMAC  ");
 
     if (n == 0)  n = 1;
     len = n * BT_OCTET16_LEN;
 
-    SMP_TRACE_WARNING1("AES128_CMAC started, allocate buffer size = %d", len);
+    SMP_TRACE_WARNING("AES128_CMAC started, allocate buffer size = %d", len);
     /* allocate a memory space of multiple of 16 bytes to hold text  */
     if ((cmac_cb.text = (UINT8 *)GKI_getbuf(len)) != NULL)
     {
@@ -332,7 +332,7 @@
     else
     {
         ret = FALSE;
-        SMP_TRACE_ERROR0("No resources");
+        SMP_TRACE_ERROR("No resources");
     }
 
     return ret;
@@ -341,13 +341,13 @@
     #if 0 /* testing code, sample data from spec */
 void test_cmac_cback(UINT8 *p_mac, UINT16 tlen)
 {
-    SMP_TRACE_EVENT0 ("test_cmac_cback ");
-    SMP_TRACE_ERROR0("test_cmac_cback");
+    SMP_TRACE_EVENT ("test_cmac_cback ");
+    SMP_TRACE_ERROR("test_cmac_cback");
 }
 
 void test_cmac(void)
 {
-    SMP_TRACE_EVENT0 ("test_cmac ");
+    SMP_TRACE_EVENT ("test_cmac ");
     UINT8 M[64] = {
         0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
         0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
@@ -378,7 +378,7 @@
 
     memset(&cmac_cb, 0, sizeof(tCMAC_CB));
 
-    SMP_TRACE_WARNING1("\n Example 1: len = %d\n", len);
+    SMP_TRACE_WARNING("\n Example 1: len = %d\n", len);
 
     AES_CMAC(key, M, len, 128, test_cmac_cback, 0);
 
diff --git a/stack/smp/smp_int.h b/stack/smp/smp_int.h
index 51cdbb3..70c09a5 100644
--- a/stack/smp/smp_int.h
+++ b/stack/smp/smp_int.h
@@ -202,6 +202,8 @@
     BD_ADDR         local_bda;
     BOOLEAN         is_pair_cancel;
     BOOLEAN         discard_sec_req;
+    UINT8           rcvd_cmd_code;
+    UINT8           rcvd_cmd_len;
 #if SMP_CONFORMANCE_TESTING == TRUE
     BOOLEAN         enable_test_confirm_val;
     BT_OCTET16      test_confirm;
@@ -288,6 +290,8 @@
 extern void smp_proc_srk_info(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
 extern void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
 extern void smp_delay_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
+extern void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
+
 /* smp_l2c */
 extern void smp_l2cap_if_init (void);
 
@@ -314,6 +318,7 @@
 /* smp main util */
 extern void smp_set_state(tSMP_STATE state);
 extern tSMP_STATE smp_get_state(void);
+extern void smp_reject_unexp_pair_req(BD_ADDR bd_addr);
 
 #endif /* SMP_INT_H */
 
diff --git a/stack/smp/smp_keys.c b/stack/smp/smp_keys.c
index 49612a5..891d7f8 100644
--- a/stack/smp/smp_keys.c
+++ b/stack/smp/smp_keys.c
@@ -81,7 +81,7 @@
     {
         x += sprintf ((char *)&p_buf[x], "%02x ", p[i]);
     }
-    SMP_TRACE_WARNING2("%s(LSB ~ MSB) = %s", key_name, p_buf);
+    SMP_TRACE_WARNING("%s(LSB ~ MSB) = %s", key_name, p_buf);
 }
     #else
         #define smp_debug_print_nbyte_little_endian(p, key_name, len)
@@ -107,16 +107,16 @@
     UINT8           *p_rev_key = NULL;     /* input key in big endilan format */
     UINT8           *p_rev_output = NULL;  /* encrypted output in big endilan format */
 
-    SMP_TRACE_DEBUG0 ("smp_encrypt_data");
+    SMP_TRACE_DEBUG ("smp_encrypt_data");
     if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) )
     {
-        BTM_TRACE_ERROR0 ("smp_encrypt_data Failed");
+        BTM_TRACE_ERROR ("smp_encrypt_data Failed");
         return(FALSE);
     }
 
     if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE*4))) == NULL)
     {
-        BTM_TRACE_ERROR0 ("smp_encrypt_data Failed unable to allocate buffer");
+        BTM_TRACE_ERROR ("smp_encrypt_data Failed unable to allocate buffer");
         return(FALSE);
     }
 
@@ -164,7 +164,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_passkey");
+    SMP_TRACE_DEBUG ("smp_generate_passkey");
     p_cb->rand_enc_proc = SMP_GEN_TK;
 
     /* generate MRand or SRand */
@@ -187,14 +187,14 @@
     UINT32  passkey; /* 19655 test number; */
     UINT8 *pp = p->param_buf;
 
-    SMP_TRACE_DEBUG0 ("smp_proc_passkey ");
+    SMP_TRACE_DEBUG ("smp_proc_passkey ");
     STREAM_TO_UINT32(passkey, pp);
     passkey &= ~SMP_PASSKEY_MASK;
 
     /* truncate by maximum value */
     while (passkey > BTM_MAX_PASSKEY_VAL)
         passkey >>= 1;
-    SMP_TRACE_ERROR1("Passkey generated = %d", passkey);
+    SMP_TRACE_ERROR("Passkey generated = %d", passkey);
 
     /* save the TK */
     memset(p_cb->tk, 0, BT_OCTET16_LEN);
@@ -231,7 +231,7 @@
     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_stk ");
+    SMP_TRACE_DEBUG ("smp_generate_stk ");
 
     memset(p, 0, BT_OCTET16_LEN);
     if (p_cb->role == HCI_ROLE_MASTER)
@@ -248,7 +248,7 @@
     /* generate STK = Etk(rand|rrand)*/
     if (!SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, &output))
     {
-        SMP_TRACE_ERROR0("smp_generate_stk failed");
+        SMP_TRACE_ERROR("smp_generate_stk failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -272,7 +272,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_confirm");
+    SMP_TRACE_DEBUG ("smp_generate_confirm");
     p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND;
     /* generate MRand or SRand */
     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
@@ -292,7 +292,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_genenrate_rand_cont ");
+    SMP_TRACE_DEBUG ("smp_genenrate_rand_cont ");
     p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND_CONT;
     /* generate 64 MSB of MRand or SRand */
 
@@ -315,7 +315,7 @@
     BOOLEAN     div_status;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_ltk ");
+    SMP_TRACE_DEBUG ("smp_generate_ltk ");
 
     div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
 
@@ -325,7 +325,7 @@
     }
     else
     {
-        SMP_TRACE_DEBUG0 ("Generate DIV for LTK");
+        SMP_TRACE_DEBUG ("Generate DIV for LTK");
         p_cb->rand_enc_proc = SMP_GEN_DIV_LTK;
         /* generate MRand or SRand */
         if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
@@ -354,7 +354,7 @@
     tSMP_STATUS   status = SMP_PAIR_FAIL_UNKNOWN;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG1 ("smp_compute_csrk div=%x", p_cb->div);
+    SMP_TRACE_DEBUG ("smp_compute_csrk div=%x", p_cb->div);
     BTM_GetDeviceEncRoot(er);
     /* CSRK = d1(ER, DIV, 1) */
     UINT16_TO_STREAM(p, p_cb->div);
@@ -362,7 +362,7 @@
 
     if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output))
     {
-        SMP_TRACE_ERROR0("smp_generate_csrk failed");
+        SMP_TRACE_ERROR("smp_generate_csrk failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -388,7 +388,7 @@
     BOOLEAN     div_status;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_csrk");
+    SMP_TRACE_DEBUG ("smp_generate_csrk");
 
     div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
     if (div_status)
@@ -397,7 +397,7 @@
     }
     else
     {
-        SMP_TRACE_DEBUG0 ("Generate DIV for CSRK");
+        SMP_TRACE_DEBUG ("Generate DIV for CSRK");
         p_cb->rand_enc_proc = SMP_GEN_DIV_CSRK;
         if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
             smp_rand_back(NULL);
@@ -413,7 +413,7 @@
 {
     UINT8   *p = *p_data;
 
-    SMP_TRACE_DEBUG0 ("smp_concatenate_local ");
+    SMP_TRACE_DEBUG ("smp_concatenate_local ");
     UINT8_TO_STREAM(p, op_code);
     UINT8_TO_STREAM(p, p_cb->loc_io_caps);
     UINT8_TO_STREAM(p, p_cb->loc_oob_flag);
@@ -432,7 +432,7 @@
 {
     UINT8   *p = *p_data;
 
-    SMP_TRACE_DEBUG0 ("smp_concatenate_peer ");
+    SMP_TRACE_DEBUG ("smp_concatenate_peer ");
     UINT8_TO_STREAM(p, op_code);
     UINT8_TO_STREAM(p, p_cb->peer_io_caps);
     UINT8_TO_STREAM(p, p_cb->peer_oob_flag);
@@ -459,11 +459,11 @@
     tBLE_ADDR_TYPE    addr_type = 0;
     BD_ADDR           remote_bda;
 
-    SMP_TRACE_DEBUG0 ("smp_gen_p1_4_confirm");
+    SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm");
 
     if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
     {
-        SMP_TRACE_ERROR0("can not generate confirm for unknown device");
+        SMP_TRACE_ERROR("can not generate confirm for unknown device");
         return;
     }
 
@@ -492,7 +492,7 @@
         smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
     }
 #if SMP_DEBUG == TRUE
-    SMP_TRACE_DEBUG0("p1 = pres || preq || rat' || iat'");
+    SMP_TRACE_DEBUG("p1 = pres || preq || rat' || iat'");
     smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16);
 #endif
 }
@@ -514,11 +514,11 @@
 
     if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
     {
-        SMP_TRACE_ERROR0("can not generate confirm p2 for unknown device");
+        SMP_TRACE_ERROR("can not generate confirm p2 for unknown device");
         return;
     }
 
-    SMP_TRACE_DEBUG0 ("smp_gen_p2_4_confirm");
+    SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm");
 
     memset(p, 0, sizeof(BT_OCTET16));
 
@@ -537,7 +537,7 @@
         BDADDR_TO_STREAM(p, remote_bda);
     }
 #if SMP_DEBUG == TRUE
-    SMP_TRACE_DEBUG0("p2 = padding || ia || ra");
+    SMP_TRACE_DEBUG("p2 = padding || ia || ra");
     smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16);
 #endif
 }
@@ -557,7 +557,7 @@
     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
     UNUSED(bda);
 
-    SMP_TRACE_DEBUG0 ("smp_calculate_comfirm ");
+    SMP_TRACE_DEBUG ("smp_calculate_comfirm ");
     /* generate p1 = pres || preq || rat' || iat' */
     smp_gen_p1_4_confirm(p_cb, p1);
 
@@ -569,7 +569,7 @@
     /* calculate e(k, r XOR p1), where k = TK */
     if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output))
     {
-        SMP_TRACE_ERROR0("smp_generate_csrk failed");
+        SMP_TRACE_ERROR("smp_generate_csrk failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -593,9 +593,9 @@
     tSMP_ENC      output;
     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
 
-    SMP_TRACE_DEBUG0 ("smp_calculate_comfirm_cont ");
+    SMP_TRACE_DEBUG ("smp_calculate_comfirm_cont ");
 #if SMP_DEBUG == TRUE
-    SMP_TRACE_DEBUG0("Confirm step 1 p1' = e(k, r XOR p1)  Generated");
+    SMP_TRACE_DEBUG("Confirm step 1 p1' = e(k, r XOR p1)  Generated");
     smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16);
 #endif
 
@@ -608,7 +608,7 @@
     /* calculate: Confirm = E(k, p1' XOR p2) */
     if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output))
     {
-        SMP_TRACE_ERROR0("smp_calculate_comfirm_cont failed");
+        SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -639,7 +639,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_genenrate_confirm ");
+    SMP_TRACE_DEBUG ("smp_genenrate_confirm ");
     p_cb->rand_enc_proc = SMP_GEN_CONFIRM;
 
     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand,  (const UINT8 *)"local rand", 16);
@@ -661,7 +661,7 @@
 {
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_compare ");
+    SMP_TRACE_DEBUG ("smp_generate_compare ");
     p_cb->rand_enc_proc = SMP_GEN_COMPARE;
 
     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand,  (const UINT8 *)"peer rand", 16);
@@ -682,11 +682,11 @@
 {
     tSMP_KEY    key;
 
-    SMP_TRACE_DEBUG0 ("smp_process_confirm ");
+    SMP_TRACE_DEBUG ("smp_process_confirm ");
 #if SMP_CONFORMANCE_TESTING == TRUE
     if (p_cb->enable_test_confirm_val)
     {
-        BTM_TRACE_DEBUG0 ("Use confirm value from script");
+        BTM_TRACE_DEBUG ("Use confirm value from script");
         memcpy(p_cb->confirm, p_cb->test_confirm, BT_OCTET16_LEN);
     }
     else
@@ -697,7 +697,7 @@
 
 
 #if (SMP_DEBUG == TRUE)
-    SMP_TRACE_DEBUG0("Confirm  Generated");
+    SMP_TRACE_DEBUG("Confirm  Generated");
     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm,  (const UINT8 *)"Confirm", 16);
 #endif
 
@@ -720,9 +720,9 @@
 {
     tSMP_KEY    key;
 
-    SMP_TRACE_DEBUG0 ("smp_process_compare ");
+    SMP_TRACE_DEBUG ("smp_process_compare ");
 #if (SMP_DEBUG == TRUE)
-    SMP_TRACE_DEBUG0("Compare Generated");
+    SMP_TRACE_DEBUG("Compare Generated");
     smp_debug_print_nbyte_little_endian (p->param_buf,  (const UINT8 *)"Compare", 16);
 #endif
     key.key_type = SMP_KEY_TYPE_CMP;
@@ -745,9 +745,9 @@
 {
     tSMP_KEY    key;
 
-    SMP_TRACE_DEBUG0 ("smp_process_stk ");
+    SMP_TRACE_DEBUG ("smp_process_stk ");
 #if (SMP_DEBUG == TRUE)
-    SMP_TRACE_ERROR0("STK Generated");
+    SMP_TRACE_ERROR("STK Generated");
 #endif
     smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf);
 
@@ -773,14 +773,14 @@
     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
     UNUSED(p_data);
 
-    SMP_TRACE_DEBUG0 ("smp_genenrate_ltk_cont ");
+    SMP_TRACE_DEBUG ("smp_genenrate_ltk_cont ");
     BTM_GetDeviceEncRoot(er);
 
     /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/
     if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div,
                      sizeof(UINT16), &output))
     {
-        SMP_TRACE_ERROR0("smp_genenrate_ltk_cont failed");
+        SMP_TRACE_ERROR("smp_genenrate_ltk_cont failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -809,13 +809,13 @@
     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
     UNUSED(p);
 
-    SMP_TRACE_DEBUG0 ("smp_generate_y ");
+    SMP_TRACE_DEBUG ("smp_generate_y ");
     BTM_GetDeviceDHK(dhk);
 
     if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand,
                      BT_OCTET8_LEN, &output))
     {
-        SMP_TRACE_ERROR0("smp_generate_y failed");
+        SMP_TRACE_ERROR("smp_generate_y failed");
         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
     }
     else
@@ -839,7 +839,7 @@
 
     /* generate EDIV and rand now */
     /* generate random vector */
-    SMP_TRACE_DEBUG0 ("smp_generate_rand_vector ");
+    SMP_TRACE_DEBUG ("smp_generate_rand_vector ");
     p_cb->rand_enc_proc = SMP_GEN_RAND_V;
     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
         smp_rand_back(NULL);
@@ -860,13 +860,13 @@
     UINT8 *pp= p->param_buf;
     UINT16  y;
 
-    SMP_TRACE_DEBUG0 ("smp_process_ediv ");
+    SMP_TRACE_DEBUG ("smp_process_ediv ");
     STREAM_TO_UINT16(y, pp);
 
     /* EDIV = Y xor DIV */
     p_cb->ediv = p_cb->div ^ y;
     /* send LTK ready */
-    SMP_TRACE_ERROR0("LTK ready");
+    SMP_TRACE_ERROR("LTK ready");
     key.key_type = SMP_KEY_TYPE_LTK;
     key.p_data   = p->param_buf;
 
@@ -890,7 +890,7 @@
     UINT8   failure = SMP_PAIR_FAIL_UNKNOWN;
     UINT8   state = p_cb->rand_enc_proc & ~0x80;
 
-    SMP_TRACE_DEBUG1 ("smp_rand_back state=0x%x", state);
+    SMP_TRACE_DEBUG ("smp_rand_back state=0x%x", state);
     if (p && p->status == HCI_SUCCESS)
     {
         switch (state)
@@ -930,7 +930,7 @@
         return;
     }
 
-    SMP_TRACE_ERROR1("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc);
+    SMP_TRACE_ERROR("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc);
 
     smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
 
diff --git a/stack/smp/smp_l2c.c b/stack/smp/smp_l2c.c
index 54b78b4..63c851c 100644
--- a/stack/smp/smp_l2c.c
+++ b/stack/smp/smp_l2c.c
@@ -34,7 +34,7 @@
 
 
 
-static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason);
+static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason, tBT_TRANSPORT transport);
 static void smp_data_ind (BD_ADDR bd_addr, BT_HDR *p_buf);
 
 /*******************************************************************************
@@ -48,7 +48,7 @@
 void smp_l2cap_if_init (void)
 {
     tL2CAP_FIXED_CHNL_REG  fixed_reg;
-    SMP_TRACE_EVENT0 ("SMDBG l2c smp_l2cap_if_init");
+    SMP_TRACE_EVENT ("SMDBG l2c smp_l2cap_if_init");
     fixed_reg.fixed_chnl_opts.mode         = L2CAP_FCR_BASIC_MODE;
     fixed_reg.fixed_chnl_opts.max_transmit = 0;
     fixed_reg.fixed_chnl_opts.rtrans_tout  = 0;
@@ -58,6 +58,7 @@
 
     fixed_reg.pL2CA_FixedConn_Cb = smp_connect_cback;
     fixed_reg.pL2CA_FixedData_Cb = smp_data_ind;
+    fixed_reg.pL2CA_FixedCong_Cb = NULL;    /* do not handle congestion on this channel */
     fixed_reg.default_idle_tout  = 60;      /* set 60 seconds timeout, 0xffff default idle timeout */
 
     /* Now, register with L2CAP */
@@ -73,16 +74,23 @@
 **                      connected (conn = TRUE)/disconnected (conn = FALSE).
 **
 *******************************************************************************/
-static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason)
+static void smp_connect_cback (BD_ADDR bd_addr, BOOLEAN connected, UINT16 reason,
+                                    tBT_TRANSPORT transport)
 {
     tSMP_CB   *p_cb = &smp_cb;
     tSMP_INT_DATA   int_data;
 
-    SMP_TRACE_EVENT0 ("SMDBG l2c smp_connect_cback ");
+    SMP_TRACE_EVENT ("SMDBG l2c smp_connect_cback ");
+
+    if (transport == BT_TRANSPORT_BR_EDR)
+    {
+        SMP_TRACE_ERROR ("smp_connect_cback : Wrong transport");
+        return;
+    }
 
     if (memcmp(bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) == 0)
     {
-        SMP_TRACE_EVENT3 ("smp_connect_cback()  for pairing BDA: %08x%04x  Event: %s",
+        SMP_TRACE_EVENT ("smp_connect_cback()  for pairing BDA: %08x%04x  Event: %s",
                         (bd_addr[0]<<24)+(bd_addr[1]<<16)+(bd_addr[2]<<8) + bd_addr[3],
                         (bd_addr[4]<<8)+bd_addr[5], (connected) ? "connected" : "disconnected");
 
@@ -126,12 +134,19 @@
     tSMP_CB *p_cb = &smp_cb;
     UINT8   *p = (UINT8 *)(p_buf + 1) + p_buf->offset;
     UINT8   cmd ;
-    SMP_TRACE_EVENT0 ("SMDBG l2c smp_data_ind");
+    SMP_TRACE_EVENT ("SMDBG l2c smp_data_ind");
 
-    SMP_TRACE_EVENT0 ("Got smp_data_ind");
+    SMP_TRACE_EVENT ("Got smp_data_ind");
 
     STREAM_TO_UINT8(cmd, p);
 
+    /* sanity check */
+    if ((SMP_OPCODE_MAX <= cmd) || (cmd == 0))
+    {
+        SMP_TRACE_WARNING( "Ignore received command with RESERVED code 0x%02x", cmd);
+        GKI_freebuf (p_buf);
+        return;
+    }
 
     /* reject the pairing request if there is an on-going SMP pairing */
     if (SMP_OPCODE_PAIRING_REQ == cmd || SMP_OPCODE_SEC_REQ == cmd)
@@ -143,14 +158,23 @@
         }
         else if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN))
         {
-            p_cb->failure = SMP_PAIR_NOT_SUPPORT;
-            smp_send_cmd(SMP_OPCODE_PAIRING_FAILED, p_cb);
+            GKI_freebuf (p_buf);
+            smp_reject_unexp_pair_req(bd_addr);
+            return;
         }
+        /* else, out of state pairing request/security request received, passed into SM */
     }
 
     if (memcmp(&bd_addr[0], p_cb->pairing_bda, BD_ADDR_LEN) == 0)
     {
-        btu_stop_timer (&p_cb->rsp_timer_ent);
+        if (p_cb->state != SMP_ST_RELEASE_DELAY)
+        {
+            btu_stop_timer (&p_cb->rsp_timer_ent);
+            btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
+                             SMP_WAIT_FOR_RSP_TOUT);
+        }
+        p_cb->rcvd_cmd_code = cmd;
+        p_cb->rcvd_cmd_len = (UINT8) p_buf->len;
         smp_sm_event(p_cb, cmd, p);
     }
 
diff --git a/stack/smp/smp_main.c b/stack/smp/smp_main.c
index f8e450c..aee15da 100644
--- a/stack/smp/smp_main.c
+++ b/stack/smp/smp_main.c
@@ -114,6 +114,8 @@
     SMP_PROC_REL_DELAY,
     SMP_PROC_REL_DELAY_TOUT,
     SMP_DELAY_TERMINATE,
+    SMP_IDLE_TERMINATE,
+    SMP_FAST_CONN_PARAM,
     SMP_SM_NO_ACTION
 };
 
@@ -156,6 +158,8 @@
     smp_proc_release_delay,
     smp_proc_release_delay_tout,
     smp_delay_terminate,
+    smp_idle_terminate,
+    smp_fast_conn_param
 };
 /************ SMP Master FSM State/Event Indirection Table **************/
 static const UINT8 smp_ma_entry_map[][SMP_ST_MAX] =
@@ -176,7 +180,7 @@
 /* KEY_READY          */{ 0,    3,     0,      3,     1,   0,    2,   1,    6,     0   },
 /* ENC_CMPL           */{ 0,    0,     0,      0,     0,   0,    0,   2,    0,     0   },
 /* L2C_CONN           */{ 1,    0,     0,      0,     0,   0,    0,   0,    0,     0   },
-/* L2C_DISC           */{ 0x83,	0x83,  0,      0x83,  0x83,0x83, 0x83,0x83, 0x83,  3   },
+/* L2C_DISC           */{ 3,	0x83,  0,      0x83,  0x83,0x83, 0x83,0x83, 0x83,  3   },
 /* IO_RSP             */{ 0,    2,     0,      0,     0,   0,    0,   0,    0,     0   },
 /* SEC_GRANT          */{ 0,    1,     0,      0,     0,   0,    0,   0,    0,     0   },
 /* TK_REQ             */{ 0,    0,     0,      2,     0,   0,    0,   0,    0,     0   },
@@ -198,15 +202,16 @@
 static const UINT8 smp_ma_idle_table[][SMP_SM_NUM_COLS] = {
 /* Event       Action                   Next State */
 /* L2C_CONN */      {SMP_SEND_APP_CBACK,     SMP_SM_NO_ACTION,   SMP_ST_WAIT_APP_RSP},
-/* SEC_REQ  */      {SMP_PROC_SEC_REQ,       SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP}
+/* SEC_REQ  */      {SMP_PROC_SEC_REQ,       SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP},
+/* L2C_DISC  */     {SMP_IDLE_TERMINATE,     SMP_SM_NO_ACTION,      SMP_ST_IDLE}
 };
 
 static const UINT8 smp_ma_wait_app_rsp_table[][SMP_SM_NUM_COLS] = {
 /* Event       			                                 Action          Next State */
 /* SEC_GRANT            */ { SMP_PROC_SEC_GRANT,   SMP_SEND_APP_CBACK, SMP_ST_WAIT_APP_RSP},
-/* IO_RSP               */ { SMP_SEND_PAIR_REQ,    SMP_SM_NO_ACTION,   SMP_ST_PAIR_REQ_RSP},
+/* IO_RSP               */ { SMP_SEND_PAIR_REQ,    SMP_FAST_CONN_PARAM,   SMP_ST_PAIR_REQ_RSP},
 /* KEY_READY            */ { SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION,   SMP_ST_WAIT_CONFIRM},/* TK ready */
-/* ENC_REQ              */ { SMP_START_ENC,        SMP_SM_NO_ACTION,   SMP_ST_ENC_PENDING},/* start enc mode setup */
+/* ENC_REQ              */ { SMP_START_ENC,        SMP_FAST_CONN_PARAM,   SMP_ST_ENC_PENDING},/* start enc mode setup */
 /* DISCARD_SEC_REQ      */ { SMP_PROC_DISCARD,     SMP_SM_NO_ACTION,   SMP_ST_IDLE}
 };
 
@@ -390,14 +395,14 @@
 {
     if (state < SMP_ST_MAX)
     {
-        SMP_TRACE_DEBUG4( "State change: %s(%d) ==> %s(%d)",
+        SMP_TRACE_DEBUG( "State change: %s(%d) ==> %s(%d)",
                           smp_get_state_name(smp_cb.state), smp_cb.state,
                           smp_get_state_name(state), state );
         smp_cb.state = state;
     }
     else
     {
-        SMP_TRACE_DEBUG1("smp_set_state invalid state =%d", state );
+        SMP_TRACE_DEBUG("smp_set_state invalid state =%d", state );
     }
 }
 
@@ -433,14 +438,14 @@
     UINT8           action, entry, i;
     tSMP_ENTRY_TBL  entry_table =  smp_entry_table[p_cb->role];
 
-    SMP_TRACE_EVENT0("main smp_sm_event");
+    SMP_TRACE_EVENT("main smp_sm_event");
     if (curr_state >= SMP_ST_MAX)
     {
-        SMP_TRACE_DEBUG1( "Invalid state: %d", curr_state) ;
+        SMP_TRACE_DEBUG( "Invalid state: %d", curr_state) ;
         return;
     }
 
-    SMP_TRACE_DEBUG5( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",\
+    SMP_TRACE_DEBUG( "SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",\
                       (p_cb->role == 0x01) ?"Slave" : "Master", smp_get_state_name( p_cb->state),
                       p_cb->state, smp_get_event_name(event), event) ;
 
@@ -460,7 +465,7 @@
     }
     else
     {
-        SMP_TRACE_DEBUG4( "Ignore event [%s (%d)] in state [%s (%d)]",
+        SMP_TRACE_DEBUG( "Ignore event [%s (%d)] in state [%s (%d)]",
                           smp_get_event_name(event), event, smp_get_state_name(curr_state), curr_state);
         return;
     }
@@ -485,7 +490,7 @@
             break;
         }
     }
-    SMP_TRACE_DEBUG1( "result state = %s", smp_get_state_name( p_cb->state ) ) ;
+    SMP_TRACE_DEBUG( "result state = %s", smp_get_state_name( p_cb->state ) ) ;
 }
 
 
diff --git a/stack/smp/smp_utils.c b/stack/smp/smp_utils.c
index dac0cc0..21d93f8 100644
--- a/stack/smp/smp_utils.c
+++ b/stack/smp/smp_utils.c
@@ -87,11 +87,11 @@
 {
     UINT16              l2cap_ret;
 
-    SMP_TRACE_EVENT0("smp_send_msg_to_L2CAP");
+    SMP_TRACE_EVENT("smp_send_msg_to_L2CAP");
 
     if ((l2cap_ret = L2CA_SendFixedChnlData (L2CAP_SMP_CID, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED)
     {
-        SMP_TRACE_ERROR1("SMP   failed to pass msg:0x%0x to L2CAP",
+        SMP_TRACE_ERROR("SMP   failed to pass msg:0x%0x to L2CAP",
                          *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
         GKI_freebuf(p_toL2CAP);
         return FALSE;
@@ -113,7 +113,7 @@
     BT_HDR *p_buf;
     BOOLEAN sent = FALSE;
     UINT8 failure = SMP_PAIR_INTERNAL_ERR;
-    SMP_TRACE_EVENT1("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
+    SMP_TRACE_EVENT("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
     if ( cmd_code < SMP_OPCODE_MAX &&
          smp_cmd_build_act[cmd_code] != NULL)
     {
@@ -154,7 +154,7 @@
     UINT8 failure = SMP_RSP_TIMEOUT;
     UNUSED(p_tle);
 
-    SMP_TRACE_EVENT1("smp_rsp_timeout state:%d", p_cb->state);
+    SMP_TRACE_EVENT("smp_rsp_timeout state:%d", p_cb->state);
 
     if (smp_get_state() == SMP_ST_RELEASE_DELAY)
     {
@@ -177,7 +177,7 @@
 {
     BT_HDR      *p_buf = NULL ;
     UINT8       *p;
-    SMP_TRACE_EVENT0("smp_build_pairing_cmd");
+    SMP_TRACE_EVENT("smp_build_pairing_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -211,7 +211,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_confirm_cmd");
+    SMP_TRACE_EVENT("smp_build_confirm_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -238,7 +238,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_rand_cmd");
+    SMP_TRACE_EVENT("smp_build_rand_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_INIT_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -265,7 +265,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_encrypt_info_cmd");
+    SMP_TRACE_EVENT("smp_build_encrypt_info_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -292,7 +292,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_master_id_cmd ");
+    SMP_TRACE_EVENT("smp_build_master_id_cmd ");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -322,7 +322,7 @@
     UNUSED(cmd_code);
     UNUSED(p_cb);
 
-    SMP_TRACE_EVENT0("smp_build_identity_info_cmd");
+    SMP_TRACE_EVENT("smp_build_identity_info_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -353,7 +353,7 @@
     UNUSED(cmd_code);
     UNUSED(p_cb);
 
-    SMP_TRACE_EVENT0("smp_build_id_addr_cmd");
+    SMP_TRACE_EVENT("smp_build_id_addr_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -383,7 +383,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_signing_info_cmd");
+    SMP_TRACE_EVENT("smp_build_signing_info_cmd");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -410,7 +410,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_pairing_fail");
+    SMP_TRACE_EVENT("smp_build_pairing_fail");
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
     {
         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
@@ -437,7 +437,7 @@
     UINT8       *p;
     UNUSED(cmd_code);
 
-    SMP_TRACE_EVENT0("smp_build_security_request");
+    SMP_TRACE_EVENT("smp_build_security_request");
 
     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL)
     {
@@ -449,7 +449,7 @@
         p_buf->offset = L2CAP_MIN_OFFSET;
         p_buf->len = 2;
 
-        SMP_TRACE_EVENT2("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ,  p_cb->loc_auth_req );
+        SMP_TRACE_EVENT("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ,  p_cb->loc_auth_req );
     }
 
     return p_buf;
@@ -471,7 +471,7 @@
 {
     UINT8   *p = tk;
     tSMP_KEY    key;
-    SMP_TRACE_EVENT0("smp_convert_string_to_tk");
+    SMP_TRACE_EVENT("smp_convert_string_to_tk");
     UINT32_TO_STREAM(p, passkey);
 
     key.key_type    = SMP_KEY_TYPE_TK;
@@ -493,7 +493,7 @@
 *******************************************************************************/
 void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data)
 {
-    SMP_TRACE_EVENT0("smp_mask_enc_key");
+    SMP_TRACE_EVENT("smp_mask_enc_key");
     if (loc_enc_size < BT_OCTET16_LEN)
     {
         for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++)
@@ -515,7 +515,7 @@
 {
     UINT8 i, *aa = a, *bb = b;
 
-    SMP_TRACE_EVENT0("smp_xor_128");
+    SMP_TRACE_EVENT("smp_xor_128");
     for (i = 0; i < BT_OCTET16_LEN; i++)
     {
         aa[i] = aa[i] ^ bb[i];
@@ -537,7 +537,7 @@
     tSMP_CALLBACK   *p_callback = p_cb->p_callback;
     UINT8           trace_level = p_cb->trace_level;
 
-    SMP_TRACE_EVENT0("smp_cb_cleanup");
+    SMP_TRACE_EVENT("smp_cb_cleanup");
     memset(p_cb, 0, sizeof(tSMP_CB));
     p_cb->p_callback = p_callback;
     p_cb->trace_level = trace_level;
@@ -555,18 +555,18 @@
 *******************************************************************************/
 void smp_reset_control_value(tSMP_CB *p_cb)
 {
-    SMP_TRACE_EVENT0("smp_reset_control_value");
+    SMP_TRACE_EVENT("smp_reset_control_value");
     btu_stop_timer (&p_cb->rsp_timer_ent);
 #if SMP_CONFORMANCE_TESTING == TRUE
 
-    SMP_TRACE_EVENT1("smp_cb.remove_fixed_channel_disable=%d", smp_cb.remove_fixed_channel_disable);
+    SMP_TRACE_EVENT("smp_cb.remove_fixed_channel_disable=%d", smp_cb.remove_fixed_channel_disable);
     if (!smp_cb.remove_fixed_channel_disable)
     {
         L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda);
     }
     else
     {
-        SMP_TRACE_EVENT0("disable the removal of the fixed channel");
+        SMP_TRACE_EVENT("disable the removal of the fixed channel");
     }
 
 
@@ -592,7 +592,7 @@
 {
     tSMP_EVT_DATA   evt_data = {0};
 
-    SMP_TRACE_DEBUG0 ("smp_proc_pairing_cmpl ");
+    SMP_TRACE_DEBUG ("smp_proc_pairing_cmpl ");
 
     evt_data.cmplt.reason = p_cb->status;
 
@@ -605,7 +605,7 @@
         evt_data.cmplt.is_pair_cancel = TRUE;
 
 
-    SMP_TRACE_DEBUG2 ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
+    SMP_TRACE_DEBUG ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
                       evt_data.cmplt.reason,
                       evt_data.cmplt.sec_level );
     if (p_cb->p_callback)
@@ -621,6 +621,35 @@
     smp_reset_control_value(p_cb);
 }
 
+/*******************************************************************************
+**
+** Function         smp_reject_unexp_pair_req
+**
+** Description      send pairing failure to an unexpected pairing request during
+**                  an active pairing process.
+**
+** Returns          void
+**
+*******************************************************************************/
+void smp_reject_unexp_pair_req(BD_ADDR bd_addr)
+{
+    BT_HDR *p_buf;
+    UINT8   *p;
+
+    if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
+    {
+        p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
+
+        UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
+        UINT8_TO_STREAM (p, SMP_PAIR_NOT_SUPPORT);
+
+        p_buf->offset = L2CAP_MIN_OFFSET;
+        p_buf->len = SMP_PAIR_FAIL_SIZE;
+
+        smp_send_msg_to_L2CAP(bd_addr, p_buf);
+    }
+}
+
 #if SMP_CONFORMANCE_TESTING == TRUE
 /*******************************************************************************
 **
@@ -633,7 +662,7 @@
 *******************************************************************************/
 void smp_set_test_confirm_value(BOOLEAN enable, UINT8 *p_c_val)
 {
-    SMP_TRACE_DEBUG1("smp_set_test_confirm_value enable=%d", enable);
+    SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
     smp_cb.enable_test_confirm_val = enable;
     memcpy(smp_cb.test_confirm, p_c_val, BT_OCTET16_LEN);
 }
@@ -650,7 +679,7 @@
 *******************************************************************************/
 void smp_set_test_rand_value(BOOLEAN enable, UINT8 *p_c_val)
 {
-    SMP_TRACE_DEBUG1("smp_set_test_rand_value enable=%d", enable);
+    SMP_TRACE_DEBUG("smp_set_test_rand_value enable=%d", enable);
     smp_cb.enable_test_rand_val = enable;
     memcpy(smp_cb.test_rand, p_c_val, BT_OCTET16_LEN);
 }
@@ -667,7 +696,7 @@
 *******************************************************************************/
 void smp_set_test_pair_fail_status (BOOLEAN enable, UINT8 status)
 {
-    SMP_TRACE_DEBUG1("smp_set_test_confirm_value enable=%d", enable);
+    SMP_TRACE_DEBUG("smp_set_test_confirm_value enable=%d", enable);
     smp_cb.enable_test_pair_fail = enable;
     smp_cb.pair_fail_status = status;
 }
@@ -683,7 +712,7 @@
 *******************************************************************************/
 void smp_remove_fixed_channel_disable (BOOLEAN disable)
 {
-    SMP_TRACE_DEBUG1("smp_remove_fixed_channel_disable disable =%d", disable);
+    SMP_TRACE_DEBUG("smp_remove_fixed_channel_disable disable =%d", disable);
     smp_cb.remove_fixed_channel_disable = disable;
 }
 /*******************************************************************************
@@ -697,7 +726,7 @@
 *******************************************************************************/
 void smp_skip_compare_check(BOOLEAN enable)
 {
-    SMP_TRACE_DEBUG1("smp_skip_compare_check enable=%d", enable);
+    SMP_TRACE_DEBUG("smp_skip_compare_check enable=%d", enable);
     smp_cb.skip_test_compare_check = enable;
 }
 
diff --git a/stack/srvc/srvc_battery.c b/stack/srvc/srvc_battery.c
index 0606fd2..90632df 100644
--- a/stack/srvc/srvc_battery.c
+++ b/stack/srvc/srvc_battery.c
@@ -205,7 +205,7 @@
 
     if (battery_cb.inst_id == BA_MAX_INT_NUM)
     {
-        GATT_TRACE_ERROR0("MAX battery service has been reached");
+        GATT_TRACE_ERROR("MAX battery service has been reached");
         return 0;
     }
 
@@ -219,7 +219,7 @@
 
     if (srvc_hdl == 0)
     {
-        GATT_TRACE_ERROR0("Can not create service, Battery_Instantiate() failed!");
+        GATT_TRACE_ERROR("Can not create service, Battery_Instantiate() failed!");
         return 0;
     }
 
@@ -240,7 +240,7 @@
                                                 BATTER_LEVEL_PERM,
                                                 prop)) == 0)
     {
-        GATT_TRACE_ERROR0("Can not add Battery Level, Battery_Instantiate() failed!");
+        GATT_TRACE_ERROR("Can not add Battery Level, Battery_Instantiate() failed!");
         status = GATT_ERROR;
     }
     else
@@ -253,7 +253,7 @@
                                                            &uuid);
             if (p_inst->clt_cfg_hdl == 0)
             {
-                GATT_TRACE_ERROR0("Add battery level client notification FAILED!");
+                GATT_TRACE_ERROR("Add battery level client notification FAILED!");
             }
         }
         /* need presentation format descriptor? */
@@ -265,7 +265,7 @@
                                                                  &uuid))
                                        == 0)
             {
-                GATT_TRACE_ERROR0("Add battery level presentation format descriptor FAILED!");
+                GATT_TRACE_ERROR("Add battery level presentation format descriptor FAILED!");
             }
 
         }
@@ -278,7 +278,7 @@
                                                                 &uuid))
                                        == 0)
             {
-                GATT_TRACE_ERROR0("Add battery level report reference descriptor FAILED!");
+                GATT_TRACE_ERROR("Add battery level report reference descriptor FAILED!");
             }
 
         }
diff --git a/stack/srvc/srvc_dis.c b/stack/srvc/srvc_dis.c
index 90b4acd..e292212 100644
--- a/stack/srvc/srvc_dis.c
+++ b/stack/srvc/srvc_dis.c
@@ -25,8 +25,6 @@
 
 #if BLE_INCLUDED == TRUE
 
-#define DIS_UUID_TO_ATTR_MASK(x)   (UINT16)(1 << ((x) - GATT_UUID_SYSTEM_ID))
-
 #define DIS_MAX_NUM_INC_SVR       0
 #define DIS_MAX_CHAR_NUM          9
 #define DIS_MAX_ATTR_NUM          (DIS_MAX_CHAR_NUM * 2 + DIS_MAX_NUM_INC_SVR + 1)
@@ -57,6 +55,34 @@
 };
 
 tDIS_CB dis_cb;
+
+static tDIS_ATTR_MASK dis_uuid_to_attr(UINT16 uuid)
+{
+    switch (uuid)
+    {
+        case GATT_UUID_SYSTEM_ID:
+            return DIS_ATTR_SYS_ID_BIT;
+        case GATT_UUID_MODEL_NUMBER_STR:
+            return DIS_ATTR_MODEL_NUM_BIT;
+        case GATT_UUID_SERIAL_NUMBER_STR:
+            return DIS_ATTR_SERIAL_NUM_BIT;
+        case GATT_UUID_FW_VERSION_STR:
+            return DIS_ATTR_FW_NUM_BIT;
+        case GATT_UUID_HW_VERSION_STR:
+            return DIS_ATTR_HW_NUM_BIT;
+        case GATT_UUID_SW_VERSION_STR:
+            return DIS_ATTR_SW_NUM_BIT;
+        case GATT_UUID_MANU_NAME:
+            return DIS_ATTR_MANU_NAME_BIT;
+        case GATT_UUID_IEEE_DATA:
+            return DIS_ATTR_IEEE_DATA_BIT;
+        case GATT_UUID_PNP_ID:
+            return DIS_ATTR_PNP_ID_BIT;
+        default:
+            return 0;
+    };
+}
+
 /*******************************************************************************
 **   dis_valid_handle_range
 **
@@ -136,7 +162,7 @@
                         p_value->len -= offset;
                         pp += offset;
                         ARRAY_TO_STREAM(p, pp, p_value->len);
-                        GATT_TRACE_EVENT1("GATT_UUID_MANU_NAME len=0x%04x", p_value->len);
+                        GATT_TRACE_EVENT("GATT_UUID_MANU_NAME len=0x%04x", p_value->len);
                     }
                     break;
 
@@ -181,8 +207,8 @@
 
     if (dis_cb.p_read_dis_cback && p_clcb)
     {
-        GATT_TRACE_ERROR1("dis_gatt_c_read_dis_value_cmpl: attr_mask = 0x%04x", p_clcb->dis_value.attr_mask);
-        GATT_TRACE_EVENT0("calling p_read_dis_cbackd");
+        GATT_TRACE_ERROR("dis_gatt_c_read_dis_value_cmpl: attr_mask = 0x%04x", p_clcb->dis_value.attr_mask);
+        GATT_TRACE_EVENT("calling p_read_dis_cbackd");
 
         (*dis_cb.p_read_dis_cback)(p_clcb->bda, &p_clcb->dis_value);
         dis_cb.p_read_dis_cback=NULL;
@@ -212,17 +238,18 @@
 
     while (dis_cb.dis_read_uuid_idx < DIS_MAX_CHAR_NUM)
     {
-        param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx];
+        if (dis_uuid_to_attr(dis_attr_uuid[dis_cb.dis_read_uuid_idx]) &
+                dis_cb.request_mask)
+        {
+             param.service.uuid.uu.uuid16 = dis_attr_uuid[dis_cb.dis_read_uuid_idx];
 
-        if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, &param) == GATT_SUCCESS)
-        {
-            return(TRUE);
+             if (GATTC_Read(conn_id, GATT_READ_BY_TYPE, &param) == GATT_SUCCESS)
+                 return TRUE;
+
+            GATT_TRACE_ERROR ("Read DISInfo: 0x%04x GATT_Read Failed", param.service.uuid.uu.uuid16);
         }
-        else
-        {
-            GATT_TRACE_ERROR1 ("Read DISInfo: 0x%04x GATT_Read Failed", param.service.uuid.uu.uuid16);
-            dis_cb.dis_read_uuid_idx ++;
-        }
+
+        dis_cb.dis_read_uuid_idx++;
     }
 
     dis_gatt_c_read_dis_value_cmpl(conn_id);
@@ -246,7 +273,7 @@
     UINT8       *pp = NULL, *p_str;
     UINT16      conn_id = p_clcb->conn_id;
 
-    GATT_TRACE_EVENT3 ("dis_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x  \
+    GATT_TRACE_EVENT ("dis_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x  \
                         read_type: 0x%04x", op, status, read_type);
 
     if (op != GATTC_OPTYPE_READ)
@@ -259,7 +286,7 @@
         switch (read_type)
         {
             case GATT_UUID_SYSTEM_ID:
-                GATT_TRACE_EVENT0 ("DIS_ATTR_SYS_ID_BIT");
+                GATT_TRACE_EVENT ("DIS_ATTR_SYS_ID_BIT");
                 if (p_data->att_value.len == DIS_SYSTEM_ID_SIZE)
                 {
                     p_clcb->dis_value.attr_mask |= DIS_ATTR_SYS_ID_BIT;
@@ -291,9 +318,10 @@
                     GKI_freebuf(p_str);
                 if ((p_str = (UINT8 *)GKI_getbuf((UINT16)(p_data->att_value.len + 1))) != NULL)
                 {
-                    memset(p_str, 0, p_data->att_value.len + 1);
-                    p_clcb->dis_value.attr_mask |= DIS_UUID_TO_ATTR_MASK (read_type);
+                    p_clcb->dis_value.attr_mask |= dis_uuid_to_attr(read_type);
                     memcpy(p_str, p_data->att_value.value, p_data->att_value.len);
+                    p_str[p_data->att_value.len] = 0;
+                    p_clcb->dis_value.data_string[read_type - GATT_UUID_MODEL_NUMBER_STR] = p_str;
                 }
                 break;
 
@@ -314,7 +342,7 @@
 **
 ** Function         DIS_SrInit
 **
-** Description      Initializa the Device Information Service Server.
+** Description      Initialize the Device Information Service Server.
 **
 *******************************************************************************/
 tDIS_STATUS DIS_SrInit (tDIS_ATTR_MASK dis_attr_mask)
@@ -326,7 +354,7 @@
 
     if (dis_cb.enabled)
     {
-        GATT_TRACE_ERROR0("DIS already initalized");
+        GATT_TRACE_ERROR("DIS already initalized");
         return DIS_SUCCESS;
     }
 
@@ -336,7 +364,7 @@
 
     if (dis_cb.service_handle == 0)
     {
-        GATT_TRACE_ERROR0("Can not create service, DIS_Init failed!");
+        GATT_TRACE_ERROR("Can not create service, DIS_Init failed!");
         return GATT_ERROR;
     }
     dis_cb.max_handle = dis_cb.service_handle + DIS_MAX_ATTR_NUM;
@@ -347,7 +375,7 @@
         */
         uuid.uu.uuid16 = p_db_attr->uuid = dis_attr_uuid[i];
         p_db_attr->handle  = GATTS_AddCharacteristic(dis_cb.service_handle, &uuid, GATT_PERM_READ, GATT_CHAR_PROP_BIT_READ);
-        GATT_TRACE_DEBUG2 ("DIS_SrInit:  handle of new attribute 0x%04 = x%d", uuid.uu.uuid16, p_db_attr->handle  );
+        GATT_TRACE_DEBUG ("DIS_SrInit:  handle of new attribute 0x%04 = x%d", uuid.uu.uuid16, p_db_attr->handle  );
         p_db_attr ++;
         i ++;
         dis_attr_mask >>= 1;
@@ -393,15 +421,16 @@
             if (dis_attr_bit & (UINT16)(1 << i))
             {
                 if (dis_cb.dis_value.data_string[i - 1] != NULL)
-                    GKI_freebuf(dis_cb.dis_value.data_string[i]);
+                    GKI_freebuf(dis_cb.dis_value.data_string[i - 1]);
 /* coverity[OVERRUN-STATIC] False-positive : when i = 8, (1 << i) == DIS_ATTR_PNP_ID_BIT, and it will never come down here
 CID 49902: Out-of-bounds read (OVERRUN_STATIC)
 Overrunning static array "dis_cb.dis_value.data_string", with 7 elements, at position 7 with index variable "i".
 */
                 if ((dis_cb.dis_value.data_string[i - 1] = (UINT8 *)GKI_getbuf((UINT16)(p_info->data_str.len + 1))) != NULL)
                 {
-                    memset(dis_cb.dis_value.data_string[i - 1], 0, p_info->data_str.len + 1); /* make sure null terminate */
+
                     memcpy(dis_cb.dis_value.data_string[i - 1], p_info->data_str.p_data, p_info->data_str.len);
+                    dis_cb.dis_value.data_string[i - 1][p_info->data_str.len] = 0; /* make sure null terminate */
                     st = DIS_SUCCESS;
                 }
                 else
@@ -423,10 +452,13 @@
 ** Returns          void
 **
 *******************************************************************************/
-BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback)
+BOOLEAN DIS_ReadDISInfo(BD_ADDR peer_bda, tDIS_READ_CBACK *p_cback, tDIS_ATTR_MASK mask)
 {
     UINT16             conn_id;
 
+    /* Initialize the DIS client if it hasn't been initialized already. */
+    srvc_eng_init();
+
     /* For now we only handle one at a time */
     if (dis_cb.dis_read_uuid_idx != 0xff)
         return(FALSE);
@@ -438,19 +470,21 @@
     /* Mark currently active operation */
     dis_cb.dis_read_uuid_idx = 0;
 
-    GATT_TRACE_EVENT3 ("DIS_ReadDISInfo() - BDA: %08x%04x  cl_read_uuid: 0x%04x",
+    dis_cb.request_mask = mask;
+
+    GATT_TRACE_EVENT ("DIS_ReadDISInfo() - BDA: %08x%04x  cl_read_uuid: 0x%04x",
                       (peer_bda[0]<<24)+(peer_bda[1]<<16)+(peer_bda[2]<<8)+peer_bda[3],
                       (peer_bda[4]<<8)+peer_bda[5], dis_attr_uuid[dis_cb.dis_read_uuid_idx]);
 
 
-    GATT_GetConnIdIfConnected(srvc_eng_cb.gatt_if, peer_bda, &conn_id);
+    GATT_GetConnIdIfConnected(srvc_eng_cb.gatt_if, peer_bda, &conn_id, BT_TRANSPORT_LE);
 
     /* need to enhance it as multiple service is needed */
     srvc_eng_request_channel(peer_bda, SRVC_ID_DIS);
 
     if (conn_id == GATT_INVALID_CONN_ID)
     {
-        return GATT_Connect(srvc_eng_cb.gatt_if, peer_bda, TRUE);
+        return GATT_Connect(srvc_eng_cb.gatt_if, peer_bda, TRUE, BT_TRANSPORT_LE);
     }
 
     return dis_gatt_c_read_dis_req(conn_id);
diff --git a/stack/srvc/srvc_dis_int.h b/stack/srvc/srvc_dis_int.h
index f818063..f9f4dcd 100644
--- a/stack/srvc/srvc_dis_int.h
+++ b/stack/srvc/srvc_dis_int.h
@@ -50,6 +50,8 @@
     BOOLEAN                 enabled;
 
     UINT8                   dis_read_uuid_idx;
+
+    tDIS_ATTR_MASK          request_mask;
 }tDIS_CB;
 
 
diff --git a/stack/srvc/srvc_eng.c b/stack/srvc/srvc_eng.c
index 4598738..39299c5 100644
--- a/stack/srvc/srvc_eng.c
+++ b/stack/srvc/srvc_eng.c
@@ -29,8 +29,11 @@
 //#endif
 #include "srvc_battery_int.h"
 
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
 static void srvc_eng_s_request_cback (UINT16 conn_id, UINT32 trans_id, UINT8 op_code, tGATTS_DATA *p_data);
-static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected, tGATT_DISCONN_REASON reason);
+static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id, BOOLEAN connected,
+                                          tGATT_DISCONN_REASON reason, tBT_TRANSPORT transport);
 static void srvc_eng_c_cmpl_cback (UINT16 conn_id, tGATTC_OPTYPE op, tGATT_STATUS status, tGATT_CL_COMPLETE *p_data);
 
 static tGATT_CBACK srvc_gatt_cback =
@@ -40,6 +43,7 @@
     NULL,
     NULL,
     srvc_eng_s_request_cback,
+    NULL,
     NULL
 } ;
 /* type for action functions */
@@ -183,7 +187,7 @@
 **
 ** Description      The function deallocates a GATT profile  connection link control block
 **
-** Returns           NTrue the deallocation is successful
+** Returns           True the deallocation is successful
 **
 *******************************************************************************/
 BOOLEAN srvc_eng_clcb_dealloc (UINT16 conn_id)
@@ -195,6 +199,12 @@
     {
         if (p_clcb->in_use && p_clcb->connected && (p_clcb->conn_id == conn_id))
         {
+            unsigned j;
+            for (j = 0; j < ARRAY_SIZE(p_clcb->dis_value.data_string); j++) {
+                if (p_clcb->dis_value.data_string[j]) {
+                    GKI_freebuf(p_clcb->dis_value.data_string[j]);
+                }
+            }
             memset(p_clcb, 0, sizeof(tSRVC_CLCB));
             return TRUE;
         }
@@ -263,7 +273,7 @@
     UINT8       act = SRVC_ACT_IGNORE;
     UINT8   clcb_idx = srvc_eng_find_clcb_idx_by_conn_id(conn_id);
 
-    GATT_TRACE_EVENT1("srvc_eng_s_request_cback : recv type (0x%02x)", type);
+    GATT_TRACE_EVENT("srvc_eng_s_request_cback : recv type (0x%02x)", type);
 
     memset(&rsp_msg, 0, sizeof(tGATTS_RSP));
 
@@ -282,15 +292,15 @@
             break;
 
         case GATTS_REQ_TYPE_WRITE_EXEC:
-            GATT_TRACE_EVENT0("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
+            GATT_TRACE_EVENT("Ignore GATT_REQ_EXEC_WRITE/WRITE_CMD" );
             break;
 
         case GATTS_REQ_TYPE_MTU:
-            GATT_TRACE_EVENT1("Get MTU exchange new mtu size: %d", p_data->mtu);
+            GATT_TRACE_EVENT("Get MTU exchange new mtu size: %d", p_data->mtu);
             break;
 
         default:
-            GATT_TRACE_EVENT1("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
+            GATT_TRACE_EVENT("Unknown/unexpected LE GAP ATT request: 0x%02x", type);
             break;
     }
 
@@ -317,11 +327,11 @@
 {
     tSRVC_CLCB   *p_clcb = srvc_eng_find_clcb_by_conn_id(conn_id);
 
-    GATT_TRACE_EVENT2 ("srvc_eng_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x ", op, status);
+    GATT_TRACE_EVENT ("srvc_eng_c_cmpl_cback() - op_code: 0x%02x  status: 0x%02x ", op, status);
 
     if (p_clcb == NULL)
     {
-        GATT_TRACE_ERROR0("srvc_eng_c_cmpl_cback received for unknown connection");
+        GATT_TRACE_ERROR("srvc_eng_c_cmpl_cback received for unknown connection");
         return;
     }
 
@@ -341,11 +351,12 @@
 **
 *******************************************************************************/
 static void srvc_eng_connect_cback (tGATT_IF gatt_if, BD_ADDR bda, UINT16 conn_id,
-                                        BOOLEAN connected, tGATT_DISCONN_REASON reason)
+                                        BOOLEAN connected, tGATT_DISCONN_REASON reason,  tBT_TRANSPORT transport)
 {
     UNUSED(gatt_if);
+    UNUSED (transport);
 
-    GATT_TRACE_EVENT5 ("srvc_eng_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
+    GATT_TRACE_EVENT ("srvc_eng_connect_cback: from %08x%04x connected:%d conn_id=%d reason = 0x%04x",
                        (bda[0]<<24)+(bda[1]<<16)+(bda[2]<<8)+bda[3],
                        (bda[4]<<8)+bda[5], connected, conn_id, reason);
 
@@ -353,7 +364,7 @@
     {
         if (srvc_eng_clcb_alloc(conn_id, bda) == NULL)
         {
-            GATT_TRACE_ERROR0 ("srvc_eng_connect_cback: no_resource");
+            GATT_TRACE_ERROR ("srvc_eng_connect_cback: no_resource");
             return;
         }
     }
@@ -400,11 +411,16 @@
 {
     tSRVC_CLCB *p_clcb =  srvc_eng_find_clcb_by_conn_id(conn_id);
 
+    if (p_clcb == NULL)
+    {
+        GATT_TRACE_ERROR("%s: invalid connection id %d", __FUNCTION__, conn_id);
+        return;
+    }
+
     p_clcb->cur_srvc_id = SRVC_ID_NONE;
 
     /* check pending request */
-    //if (p_clcb->pend_req == NULL)
-        GATT_Disconnect(p_clcb->conn_id);
+    GATT_Disconnect(p_clcb->conn_id);
 }
 /*******************************************************************************
 **
@@ -419,7 +435,7 @@
 
     if (srvc_eng_cb.enabled)
     {
-        GATT_TRACE_ERROR0("DIS already initalized");
+        GATT_TRACE_ERROR("DIS already initalized");
     }
     else
     {
@@ -429,7 +445,7 @@
         srvc_eng_cb.gatt_if = GATT_Register(&app_uuid, &srvc_gatt_cback);
         GATT_StartIf(srvc_eng_cb.gatt_if);
 
-        GATT_TRACE_DEBUG1 ("Srvc_Init:  gatt_if=%d  ", srvc_eng_cb.gatt_if);
+        GATT_TRACE_DEBUG ("Srvc_Init:  gatt_if=%d  ", srvc_eng_cb.gatt_if);
 
         srvc_eng_cb.enabled = TRUE;
 //#if DIS_INCLUDED == TRUE
diff --git a/test/Android.mk b/test/Android.mk
index 3c3cb61..5053e7d 100644
--- a/test/Android.mk
+++ b/test/Android.mk
@@ -1,3 +1 @@
-ifneq ($(TARGET_SIMULATOR),true)
-  include $(call all-subdir-makefiles)
-endif
+include $(call all-subdir-makefiles)
diff --git a/test/bluedroidtest/Android.mk b/test/bluedroidtest/Android.mk
index 0c6693a..8196546 100644
--- a/test/bluedroidtest/Android.mk
+++ b/test/bluedroidtest/Android.mk
@@ -22,18 +22,21 @@
     bluedroidtest.c
 
 LOCAL_C_INCLUDES :=
+LOCAL_CFLAGS := -Wno-unused-parameter
+
+LOCAL_CFLAGS += -std=c99
+
+LOCAL_CFLAGS += -std=c99
 
 LOCAL_MODULE_TAGS := eng
 
 LOCAL_MODULE:= bdt
 
-LOCAL_LDLIBS += -lpthread -ldl -llog -lreadline
-LIBS_c += -lreadline
-
 LOCAL_SHARED_LIBRARIES += libcutils   \
                           libutils    \
                           libhardware \
                           libhardware_legacy
 
-include $(BUILD_EXECUTABLE)
+LOCAL_MULTILIB := 32
 
+include $(BUILD_EXECUTABLE)
diff --git a/test/bluedroidtest/bluedroidtest.c b/test/bluedroidtest/bluedroidtest.c
index 2b517df..ac727d8 100644
--- a/test/bluedroidtest/bluedroidtest.c
+++ b/test/bluedroidtest/bluedroidtest.c
@@ -58,6 +58,8 @@
 
 #define CASE_RETURN_STR(const) case const: return #const;
 
+#define UNUSED __attribute__((unused))
+
 /************************************************************************************
 **  Local type definitions
 ************************************************************************************/
@@ -199,7 +201,7 @@
         if (n%16 == 1) {
             /* store address for this line */
             snprintf(addrstr, sizeof(addrstr), "%.4x",
-               ((unsigned int)p-(unsigned int)data) );
+               (unsigned int)((uintptr_t)p-(uintptr_t)data) );
         }
 
         c = *p;
@@ -469,7 +471,7 @@
     }
 }
 
-static void dut_mode_recv(uint16_t opcode, uint8_t *buf, uint8_t len)
+static void dut_mode_recv(uint16_t UNUSED opcode, uint8_t UNUSED *buf, uint8_t UNUSED len)
 {
     bdt_log("DUT MODE RECV : NOT IMPLEMENTED");
 }
@@ -482,28 +484,72 @@
 static bt_callbacks_t bt_callbacks = {
     sizeof(bt_callbacks_t),
     adapter_state_changed,
-    NULL, /*adapter_properties_cb */
+    NULL, /* adapter_properties_cb */
     NULL, /* remote_device_properties_cb */
     NULL, /* device_found_cb */
     NULL, /* discovery_state_changed_cb */
     NULL, /* pin_request_cb  */
     NULL, /* ssp_request_cb  */
-    NULL, /*bond_state_changed_cb */
+    NULL, /* bond_state_changed_cb */
     NULL, /* acl_state_changed_cb */
     NULL, /* thread_evt_cb */
-    dut_mode_recv, /*dut_mode_recv_cb */
-//    NULL, /*authorize_request_cb */
+    dut_mode_recv, /* dut_mode_recv_cb */
 #if BLE_INCLUDED == TRUE
-    le_test_mode /* le_test_mode_cb */
+    le_test_mode, /* le_test_mode_cb */
 #else
-    NULL
+    NULL, /* le_test_mode_cb */
 #endif
+    NULL /* energy_info_cb */
+};
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data) {
+  static timer_t timer;
+  static bool timer_created;
+
+  if (!timer_created) {
+    struct sigevent sigevent;
+    memset(&sigevent, 0, sizeof(sigevent));
+    sigevent.sigev_notify = SIGEV_THREAD;
+    sigevent.sigev_notify_function = (void (*)(union sigval))cb;
+    sigevent.sigev_value.sival_ptr = data;
+    timer_create(CLOCK_MONOTONIC, &sigevent, &timer);
+    timer_created = true;
+  }
+
+  struct itimerspec new_value;
+  new_value.it_value.tv_sec = delay_millis / 1000;
+  new_value.it_value.tv_nsec = (delay_millis % 1000) * 1000 * 1000;
+  new_value.it_interval.tv_sec = 0;
+  new_value.it_interval.tv_nsec = 0;
+  timer_settime(timer, 0, &new_value, NULL);
+
+  return true;
+}
+
+static int acquire_wake_lock(const char *lock_name) {
+  return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *lock_name) {
+  return BT_STATUS_SUCCESS;
+}
+
+static bt_os_callouts_t callouts = {
+    sizeof(bt_os_callouts_t),
+    set_wake_alarm,
+    acquire_wake_lock,
+    release_wake_lock,
 };
 
 void bdt_init(void)
 {
     bdt_log("INIT BT ");
     status = sBtInterface->init(&bt_callbacks);
+
+    if (status == BT_STATUS_SUCCESS) {
+        status = sBtInterface->set_os_callouts(&callouts);
+    }
+
     check_return_status(status);
 }
 
@@ -611,7 +657,7 @@
  ** Console commands
  *******************************************************************************/
 
-void do_help(char *p)
+void do_help(char UNUSED *p)
 {
     int i = 0;
     int max = 0;
@@ -626,7 +672,7 @@
     }
 }
 
-void do_quit(char *p)
+void do_quit(char UNUSED *p)
 {
     bdt_shutdown();
 }
@@ -639,17 +685,17 @@
  *
 */
 
-void do_init(char *p)
+void do_init(char UNUSED *p)
 {
     bdt_init();
 }
 
-void do_enable(char *p)
+void do_enable(char UNUSED *p)
 {
     bdt_enable();
 }
 
-void do_disable(char *p)
+void do_disable(char UNUSED *p)
 {
     bdt_disable();
 }
@@ -663,7 +709,7 @@
     bdt_le_test_mode(p);
 }
 
-void do_cleanup(char *p)
+void do_cleanup(char UNUSED *p)
 {
     bdt_cleanup();
 }
@@ -731,7 +777,7 @@
     do_help(NULL);
 }
 
-int main (int argc, char * argv[])
+int main (int UNUSED argc, char UNUSED *argv[])
 {
     int opt;
     char cmd[128];
diff --git a/test/suite/Android.mk b/test/suite/Android.mk
new file mode 100644
index 0000000..2f45180
--- /dev/null
+++ b/test/suite/Android.mk
@@ -0,0 +1,43 @@
+#
+#  Copyright (C) 2014 Google, Inc.
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at:
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := bdtest
+
+LOCAL_SRC_FILES := \
+	cases/adapter.c \
+	cases/cases.c \
+	cases/pan.c \
+	support/adapter.c \
+	support/callbacks.c \
+	support/hal.c \
+	support/pan.c \
+	support/property.c \
+	main.c
+
+LOCAL_SHARED_LIBRARIES += \
+	libhardware \
+	libhardware_legacy
+
+LOCAL_CFLAGS += -std=c99 -Wall -Wno-unused-parameter -Wno-missing-field-initializers -Werror
+
+LOCAL_MULTILIB := 32
+
+include $(BUILD_EXECUTABLE)
diff --git a/test/suite/base.h b/test/suite/base.h
new file mode 100644
index 0000000..2d51af8
--- /dev/null
+++ b/test/suite/base.h
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_pan.h>
+#include <hardware/hardware.h>
+
+#ifndef ARRAY_SIZE
+#  define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#endif
+
+#define TASSERT(c, ...) if (!(c)) { fprintf(stderr, "%s:%d: ", __func__, __LINE__); fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); return false; }
+
+extern const bt_interface_t *bt_interface;
+extern bt_bdaddr_t bt_remote_bdaddr;
diff --git a/test/suite/cases/adapter.c b/test/suite/cases/adapter.c
new file mode 100644
index 0000000..492d8f4
--- /dev/null
+++ b/test/suite/cases/adapter.c
@@ -0,0 +1,96 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/adapter.h"
+#include "support/callbacks.h"
+#include "support/property.h"
+
+bool adapter_enable_disable() {
+  int error;
+
+  CALL_AND_WAIT(error = bt_interface->enable(), adapter_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error enabling Bluetooth: %d", error);
+  TASSERT(adapter_get_state() == BT_STATE_ON, "Adapter did not turn on.");
+
+  CALL_AND_WAIT(error = bt_interface->disable(), adapter_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error disabling Bluetooth: %d", error);
+  TASSERT(adapter_get_state() == BT_STATE_OFF, "Adapter did not turn off.");
+
+  return true;
+}
+
+bool adapter_repeated_enable_disable() {
+  for (int i = 0; i < 10; ++i) {
+    if (!adapter_enable_disable()) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool adapter_set_name() {
+  int error;
+  bt_property_t *name = property_new_name("set_name");
+
+  CALL_AND_WAIT(error = bt_interface->set_adapter_property(name), adapter_properties);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error setting device name.");
+  TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
+  TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
+  TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
+
+  property_free(name);
+
+  return true;
+}
+
+bool adapter_get_name() {
+  int error;
+  bt_property_t *name = property_new_name("get_name");
+
+  CALL_AND_WAIT(bt_interface->set_adapter_property(name), adapter_properties);
+  CALL_AND_WAIT(error = bt_interface->get_adapter_property(BT_PROPERTY_BDNAME), adapter_properties);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error getting device name.");
+  TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
+  TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
+  TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
+
+  property_free(name);
+  return true;
+}
+
+bool adapter_start_discovery() {
+  int error;
+
+  CALL_AND_WAIT(error = bt_interface->start_discovery(), discovery_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error calling start_discovery: %d", error);
+  TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STARTED, "Unable to start discovery.");
+
+  return true;
+}
+
+bool adapter_cancel_discovery() {
+  int error;
+
+  CALL_AND_WAIT(bt_interface->start_discovery(), discovery_state_changed);
+  CALL_AND_WAIT(error = bt_interface->cancel_discovery(), discovery_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error calling cancel_discovery: %d", error);
+  TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STOPPED, "Unable to stop discovery.");
+
+  return true;
+}
diff --git a/test/suite/cases/cases.c b/test/suite/cases/cases.c
new file mode 100644
index 0000000..20d941f
--- /dev/null
+++ b/test/suite/cases/cases.c
@@ -0,0 +1,53 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "cases/cases.h"
+
+TEST_CASE_DECL(adapter_enable_disable);
+TEST_CASE_DECL(adapter_repeated_enable_disable);
+TEST_CASE_DECL(adapter_set_name);
+TEST_CASE_DECL(adapter_get_name);
+TEST_CASE_DECL(adapter_start_discovery);
+TEST_CASE_DECL(adapter_cancel_discovery);
+
+TEST_CASE_DECL(pan_enable);
+TEST_CASE_DECL(pan_connect);
+TEST_CASE_DECL(pan_disconnect);
+TEST_CASE_DECL(pan_quick_reconnect);
+
+// These are run with the Bluetooth adapter disabled.
+const test_case_t sanity_suite[] = {
+  TEST_CASE(adapter_enable_disable),
+  TEST_CASE(adapter_repeated_enable_disable),
+};
+
+// The normal test suite is run with the adapter enabled.
+const test_case_t test_suite[] = {
+  TEST_CASE(adapter_set_name),
+  TEST_CASE(adapter_get_name),
+  TEST_CASE(adapter_start_discovery),
+  TEST_CASE(adapter_cancel_discovery),
+
+  TEST_CASE(pan_enable),
+  TEST_CASE(pan_connect),
+  TEST_CASE(pan_disconnect),
+};
+
+const size_t sanity_suite_size = ARRAY_SIZE(sanity_suite);
+const size_t test_suite_size = ARRAY_SIZE(test_suite);
diff --git a/main/bte_version.c b/test/suite/cases/cases.h
similarity index 65%
copy from main/bte_version.c
copy to test/suite/cases/cases.h
index 826f31b..b20950b 100644
--- a/main/bte_version.c
+++ b/test/suite/cases/cases.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2001-2012 Broadcom Corporation
+ *  Copyright (C) 2014 Google, Inc.
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -16,8 +16,19 @@
  *
  ******************************************************************************/
 
-#include "bt_types.h"
+#pragma once
 
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
 
+#define TEST_CASE_DECL(x) bool x()
+#define TEST_CASE(x) { x, #x }
+
+typedef struct {
+  bool (*function)();
+  const char *function_name;
+} test_case_t;
+
+extern const test_case_t test_suite[];
+extern const test_case_t sanity_suite[];
+extern const size_t test_suite_size;
+extern const size_t sanity_suite_size;
diff --git a/test/suite/cases/pan.c b/test/suite/cases/pan.c
new file mode 100644
index 0000000..b903b90
--- /dev/null
+++ b/test/suite/cases/pan.c
@@ -0,0 +1,84 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+#include "support/pan.h"
+
+static const int local_role = BTPAN_ROLE_PANU;
+static const int remote_role = BTPAN_ROLE_PANNAP;
+
+bool pan_enable() {
+  int error;
+
+  // PAN is enabled by default, wait for the first control state change
+  // with default parameters set. We don't want to verify the result since
+  // the implementation could have set any parameters.
+  WAIT(pan_control_state_changed);
+
+  // Call enable explicitly and verify that the parameters match what we just set.
+  CALL_AND_WAIT(error = pan_interface->enable(local_role), pan_control_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error enabling PAN: %d", error);
+  TASSERT(pan_get_control_state() == BTPAN_STATE_ENABLED, "Control state is disabled.");
+  TASSERT(pan_get_local_role() == local_role, "Unexpected local role: %d", pan_get_local_role());
+  TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error in control callback: %d", pan_get_error());
+
+  return true;
+}
+
+bool pan_connect() {
+  int error;
+
+  if (!pan_enable()) {
+    return false;
+  }
+
+  CALL_AND_WAIT(error = pan_interface->connect(&bt_remote_bdaddr, local_role, remote_role), pan_connection_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error connecting to remote host: %d", error);
+  TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error());
+  TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTING, "Invalid PAN state after connect: %d", pan_get_connection_state());
+  TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role());
+  TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role());
+
+  WAIT(pan_connection_state_changed);
+  TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error connecting to BT device: %d", pan_get_error());
+  TASSERT(pan_get_connection_state() == BTPAN_STATE_CONNECTED, "Invalid PAN state after connect: %d", pan_get_connection_state());
+  TASSERT(pan_get_local_role() == local_role, "Incorrect local role: %d", pan_get_local_role());
+  TASSERT(pan_get_remote_role() == remote_role, "Incorrect remote role: %d", pan_get_remote_role());
+
+  return true;
+}
+
+bool pan_disconnect() {
+  int error;
+
+  if (!pan_connect()) {
+    return false;
+  }
+
+  CALL_AND_WAIT(error = pan_interface->disconnect(&bt_remote_bdaddr), pan_connection_state_changed);
+  TASSERT(error == BT_STATUS_SUCCESS, "Error disconnecting from remote host: %d", error);
+  TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error());
+  TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTING, "Invalid PAN state after disconnect: %d", pan_get_connection_state());
+
+  WAIT(pan_connection_state_changed);
+  TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error());
+  TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTED, "Invalid PAN state after disconnect: %d", pan_get_connection_state());
+
+  return true;
+}
diff --git a/test/suite/main.c b/test/suite/main.c
new file mode 100644
index 0000000..7a3af5b
--- /dev/null
+++ b/test/suite/main.c
@@ -0,0 +1,114 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "cases/cases.h"
+#include "support/callbacks.h"
+#include "support/hal.h"
+#include "support/pan.h"
+
+#define GRAY  "\x1b[0;37m"
+#define GREEN "\x1b[0;32m"
+#define RED   "\x1b[0;31m"
+
+const bt_interface_t *bt_interface;
+bt_bdaddr_t bt_remote_bdaddr;
+
+static bool parse_bdaddr(const char *str, bt_bdaddr_t *addr) {
+  if (!addr) {
+    return false;
+  }
+
+  int v[6];
+  if (sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &v[0], &v[1], &v[2], &v[3], &v[4], &v[5]) != 6) {
+    return false;
+  }
+
+  for (int i = 0; i < 6; ++i) {
+    addr->address[i] = (uint8_t)v[i];
+  }
+
+  return true;
+}
+
+int main(int argc, char **argv) {
+  if (argc < 2 || !parse_bdaddr(argv[1], &bt_remote_bdaddr)) {
+    printf("Usage: %s <bdaddr>\n", argv[0]);
+    return -1;
+  }
+
+  if (!hal_open(callbacks_get_adapter_struct())) {
+    printf("Unable to open Bluetooth HAL.\n");
+    return 1;
+  }
+
+  if (!pan_init()) {
+    printf("Unable to initialize PAN.\n");
+    return 2;
+  }
+
+  int pass = 0;
+  int fail = 0;
+  int case_num = 0;
+
+  // Run through the sanity suite.
+  for (size_t i = 0; i < sanity_suite_size; ++i) {
+    callbacks_init();
+    if (sanity_suite[i].function()) {
+      printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, sanity_suite[i].function_name, GREEN, GRAY);
+      ++pass;
+    } else {
+      printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, sanity_suite[i].function_name, RED, GRAY);
+      ++fail;
+    }
+    callbacks_cleanup();
+  }
+
+  // If there was a failure in the sanity suite, don't bother running the rest of the tests.
+  if (fail) {
+    printf("\n%sSanity suite failed with %d errors.%s\n", RED, fail, GRAY);
+    hal_close();
+    return 0;
+  }
+
+  // Run the full test suite.
+  for (size_t i = 0; i < test_suite_size; ++i) {
+    callbacks_init();
+    CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+    if (test_suite[i].function()) {
+      printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, test_suite[i].function_name, GREEN, GRAY);
+      ++pass;
+    } else {
+      printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, test_suite[i].function_name, RED, GRAY);
+      ++fail;
+    }
+    CALL_AND_WAIT(bt_interface->disable(), adapter_state_changed);
+    callbacks_cleanup();
+  }
+
+  printf("\n");
+
+  if (fail) {
+    printf("%d/%d tests failed. See above for failed test cases.\n", fail, test_suite_size);
+  } else {
+    printf("All tests passed!\n");
+  }
+
+  hal_close();
+  return 0;
+}
diff --git a/test/suite/support/adapter.c b/test/suite/support/adapter.c
new file mode 100644
index 0000000..0a78253
--- /dev/null
+++ b/test/suite/support/adapter.c
@@ -0,0 +1,72 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/adapter.h"
+#include "support/callbacks.h"
+#include "support/property.h"
+
+static bt_state_t state;
+static int property_count = 0;
+static bt_property_t *properties = NULL;
+static bt_discovery_state_t discovery_state;
+
+bt_state_t adapter_get_state() {
+  return state;
+}
+
+int adapter_get_property_count() {
+  return property_count;
+}
+
+bt_property_t *adapter_get_property(bt_property_type_t type) {
+  for (int i = 0; i < property_count; ++i) {
+    if (properties[i].type == type) {
+      return &properties[i];
+    }
+  }
+
+  return NULL;
+}
+
+bt_discovery_state_t adapter_get_discovery_state() {
+  return discovery_state;
+}
+
+// callback
+void adapter_state_changed(bt_state_t new_state) {
+  state = new_state;
+  CALLBACK_RET();
+}
+
+// callback
+void adapter_properties(bt_status_t status,
+                        int num_properties,
+                        bt_property_t *new_properties) {
+  property_free_array(properties, property_count);
+  properties = property_copy_array(new_properties, num_properties);
+  property_count = num_properties;
+
+  CALLBACK_RET();
+}
+
+// callback
+void discovery_state_changed(bt_discovery_state_t state) {
+  discovery_state = state;
+  CALLBACK_RET();
+}
diff --git a/main/bte_version.c b/test/suite/support/adapter.h
similarity index 74%
copy from main/bte_version.c
copy to test/suite/support/adapter.h
index 826f31b..0f5883f 100644
--- a/main/bte_version.c
+++ b/test/suite/support/adapter.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2001-2012 Broadcom Corporation
+ *  Copyright (C) 2014 Google, Inc.
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -16,8 +16,11 @@
  *
  ******************************************************************************/
 
-#include "bt_types.h"
+#pragma once
 
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
 
+bt_state_t adapter_get_state();
+int adapter_get_property_count();
+bt_property_t *adapter_get_property(bt_property_type_t type);
+bt_discovery_state_t adapter_get_discovery_state();
diff --git a/test/suite/support/callbacks.c b/test/suite/support/callbacks.c
new file mode 100644
index 0000000..08a69a5
--- /dev/null
+++ b/test/suite/support/callbacks.c
@@ -0,0 +1,115 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+
+void adapter_state_changed(bt_state_t state);
+void adapter_properties(bt_status_t status,
+                        int num_properties,
+                        bt_property_t *properties);
+void discovery_state_changed(bt_discovery_state_t state);
+
+void pan_control_state_changed(btpan_control_state_t state, int local_role, bt_status_t error, const char *ifname);
+void pan_connection_state_changed(btpan_connection_state_t state, bt_status_t error, const bt_bdaddr_t *bd_addr, int local_role, int remote_role);
+
+static void remote_device_properties(bt_status_t status,
+                                     bt_bdaddr_t *bd_addr,
+                                     int num_properties,
+                                     bt_property_t *properties) {
+  CALLBACK_RET();
+}
+
+static void thread_evt(bt_cb_thread_evt evt) {
+  CALLBACK_RET();
+}
+
+static struct {
+  const char *name;
+  sem_t semaphore;
+} callback_data[] = {
+  // Adapter callbacks
+  { "adapter_state_changed" },
+  { "adapter_properties" },
+  { "remote_device_properties" },
+  {},
+  { "discovery_state_changed" },
+  {},
+  {},
+  {},
+  {},
+  { "thread_evt" },
+  {},
+  {},
+
+  // PAN callbacks
+  { "pan_control_state_changed" },
+  { "pan_connection_state_changed" },
+};
+
+static bt_callbacks_t bt_callbacks = {
+  sizeof(bt_callbacks_t),
+  adapter_state_changed,     // adapter_state_changed_callback
+  adapter_properties,        // adapter_properties_callback
+  remote_device_properties,  // remote_device_properties_callback
+  NULL,                      // device_found_callback
+  discovery_state_changed,   // discovery_state_changed_callback
+  NULL,                      // pin_request_callback
+  NULL,                      // ssp_request_callback
+  NULL,                      // bond_state_changed_callback
+  NULL,                      // acl_state_changed_callback
+  thread_evt,                // callback_thread_event
+  NULL,                      // dut_mode_recv_callback
+  NULL,                      // le_test_mode_callback
+  NULL,
+};
+
+static btpan_callbacks_t pan_callbacks = {
+  sizeof(btpan_callbacks_t),
+  pan_control_state_changed,     // btpan_control_state_callback
+  pan_connection_state_changed,  // btpan_connection_state_callback
+};
+
+void callbacks_init() {
+  for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+    sem_init(&callback_data[i].semaphore, 0, 0);
+  }
+}
+
+void callbacks_cleanup() {
+  for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+    sem_destroy(&callback_data[i].semaphore);
+  }
+}
+
+bt_callbacks_t *callbacks_get_adapter_struct() {
+  return &bt_callbacks;
+}
+
+btpan_callbacks_t *callbacks_get_pan_struct() {
+  return &pan_callbacks;
+}
+
+sem_t *callbacks_get_semaphore(const char *name) {
+  for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) {
+    if (callback_data[i].name && !strcmp(name, callback_data[i].name)) {
+      return &callback_data[i].semaphore;
+    }
+  }
+  return NULL;
+}
diff --git a/test/suite/support/callbacks.h b/test/suite/support/callbacks.h
new file mode 100644
index 0000000..102e13f
--- /dev/null
+++ b/test/suite/support/callbacks.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 "base.h"
+
+#include <semaphore.h>
+
+#define WAIT(callback) \
+  do { \
+    sem_t *semaphore = callbacks_get_semaphore(#callback); \
+    sem_wait(semaphore); \
+  } while (0)
+
+#define CALL_AND_WAIT(expression, callback) \
+  do { \
+    sem_t *semaphore = callbacks_get_semaphore(#callback); \
+    while (!sem_trywait(semaphore)); \
+    expression; \
+    sem_wait(semaphore); \
+  } while(0)
+
+// To be called from every exit point of the callback. This macro
+// takes 0 or 1 arguments, the return value of the callback.
+#define CALLBACK_RET(...) do { \
+    sem_t *semaphore = callbacks_get_semaphore(__func__); \
+    sem_post(semaphore); \
+    return __VA_ARGS__; \
+  } while (0)
+
+void callbacks_init();
+void callbacks_cleanup();
+
+bt_callbacks_t *callbacks_get_adapter_struct();
+btpan_callbacks_t *callbacks_get_pan_struct();
+sem_t *callbacks_get_semaphore(const char *name);
diff --git a/test/suite/support/hal.c b/test/suite/support/hal.c
new file mode 100644
index 0000000..ff4952c
--- /dev/null
+++ b/test/suite/support/hal.c
@@ -0,0 +1,104 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include <signal.h>
+#include <time.h>
+
+#include "base.h"
+#include "support/hal.h"
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data);
+static int acquire_wake_lock(const char *lock_name);
+static int release_wake_lock(const char *lock_name);
+
+static const bluetooth_device_t *bt_device;
+
+static bt_os_callouts_t callouts = {
+  sizeof(bt_os_callouts_t),
+  set_wake_alarm,
+  acquire_wake_lock,
+  release_wake_lock,
+};
+
+bool hal_open(bt_callbacks_t *callbacks) {
+  hw_module_t *module;
+  if (hw_get_module(BT_STACK_MODULE_ID, (hw_module_t const **)&module)) {
+    return false;
+  }
+
+  hw_device_t *device;
+  if (module->methods->open(module, BT_STACK_MODULE_ID, &device)) {
+    return false;
+  }
+
+  bt_device = (bluetooth_device_t *)device;
+  bt_interface = bt_device->get_bluetooth_interface();
+  if (!bt_interface) {
+    bt_device->common.close((hw_device_t *)&bt_device->common);
+    bt_device = NULL;
+    return false;
+  }
+
+  bool success = (bt_interface->init(callbacks) == BT_STATUS_SUCCESS);
+  success = success && (bt_interface->set_os_callouts(&callouts) == BT_STATUS_SUCCESS);
+  return success;
+}
+
+void hal_close() {
+  if (bt_interface) {
+    bt_interface->cleanup();
+    bt_interface = NULL;
+  }
+
+  if (bt_device) {
+    bt_device->common.close((hw_device_t *)&bt_device->common);
+    bt_device = NULL;
+  }
+}
+
+static bool set_wake_alarm(uint64_t delay_millis, bool should_wake, alarm_cb cb, void *data) {
+  static timer_t timer;
+  static bool timer_created;
+
+  if (!timer_created) {
+    struct sigevent sigevent;
+    memset(&sigevent, 0, sizeof(sigevent));
+    sigevent.sigev_notify = SIGEV_THREAD;
+    sigevent.sigev_notify_function = (void (*)(union sigval))cb;
+    sigevent.sigev_value.sival_ptr = data;
+    timer_create(CLOCK_MONOTONIC, &sigevent, &timer);
+    timer_created = true;
+  }
+
+  struct itimerspec new_value;
+  new_value.it_value.tv_sec = delay_millis / 1000;
+  new_value.it_value.tv_nsec = (delay_millis % 1000) * 1000 * 1000;
+  new_value.it_interval.tv_sec = 0;
+  new_value.it_interval.tv_nsec = 0;
+  timer_settime(timer, 0, &new_value, NULL);
+
+  return true;
+}
+
+static int acquire_wake_lock(const char *lock_name) {
+  return BT_STATUS_SUCCESS;
+}
+
+static int release_wake_lock(const char *lock_name) {
+  return BT_STATUS_SUCCESS;
+}
diff --git a/main/bte_version.c b/test/suite/support/hal.h
similarity index 78%
rename from main/bte_version.c
rename to test/suite/support/hal.h
index 826f31b..11fa9f9 100644
--- a/main/bte_version.c
+++ b/test/suite/support/hal.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2001-2012 Broadcom Corporation
+ *  Copyright (C) 2014 Google, Inc.
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -16,8 +16,9 @@
  *
  ******************************************************************************/
 
-#include "bt_types.h"
+#pragma once
 
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
 
+bool hal_open(bt_callbacks_t *callbacks);
+void hal_close();
diff --git a/test/suite/support/pan.c b/test/suite/support/pan.c
new file mode 100644
index 0000000..df4c516
--- /dev/null
+++ b/test/suite/support/pan.c
@@ -0,0 +1,76 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/callbacks.h"
+#include "support/pan.h"
+
+const btpan_interface_t *pan_interface;
+
+static btpan_control_state_t pan_control_state;
+static btpan_connection_state_t pan_connection_state;
+static int pan_local_role;
+static int pan_remote_role;
+static bt_status_t pan_error;
+static char *pan_ifname;
+
+bool pan_init() {
+  pan_interface = bt_interface->get_profile_interface(BT_PROFILE_PAN_ID);
+  return pan_interface->init(callbacks_get_pan_struct()) == BT_STATUS_SUCCESS;
+}
+
+btpan_control_state_t pan_get_control_state() {
+  return pan_control_state;
+}
+
+btpan_connection_state_t pan_get_connection_state() {
+  return pan_connection_state;
+}
+
+int pan_get_local_role() {
+  return pan_local_role;
+}
+
+int pan_get_remote_role() {
+  return pan_remote_role;
+}
+
+bt_status_t pan_get_error() {
+  return pan_error;
+}
+
+// callback
+void pan_control_state_changed(btpan_control_state_t state, bt_status_t error, int local_role, const char *ifname) {
+  free(pan_ifname);
+
+  pan_control_state = state;
+  pan_local_role = local_role;
+  pan_error = error;
+  pan_ifname = strdup(ifname);
+
+  CALLBACK_RET();
+}
+
+// callback
+void pan_connection_state_changed(btpan_connection_state_t state, bt_status_t error, const bt_bdaddr_t *bd_addr, int local_role, int remote_role) {
+  pan_connection_state = state;
+  pan_error = error;
+  pan_local_role = local_role;
+  pan_remote_role = remote_role;
+  CALLBACK_RET();
+}
diff --git a/main/bte_version.c b/test/suite/support/pan.h
similarity index 69%
copy from main/bte_version.c
copy to test/suite/support/pan.h
index 826f31b..f43eb24 100644
--- a/main/bte_version.c
+++ b/test/suite/support/pan.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- *  Copyright (C) 2001-2012 Broadcom Corporation
+ *  Copyright (C) 2014 Google, Inc.
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -16,8 +16,16 @@
  *
  ******************************************************************************/
 
-#include "bt_types.h"
+#pragma once
 
-const UINT8 bte_version_string[] = "BCM1200_PI_10.3.20.52";
-const UINT8 btif_version_string[] = "BDROID-PLUS-420-10_00.10";
+#include "base.h"
 
+extern const btpan_interface_t *pan_interface;
+
+bool pan_init();
+
+btpan_control_state_t pan_get_control_state();
+btpan_connection_state_t pan_get_connection_state();
+int pan_get_local_role();
+int pan_get_remote_role();
+bt_status_t pan_get_error();
diff --git a/test/suite/support/property.c b/test/suite/support/property.c
new file mode 100644
index 0000000..ea2c5c4
--- /dev/null
+++ b/test/suite/support/property.c
@@ -0,0 +1,113 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "base.h"
+#include "support/property.h"
+
+bt_property_t *property_copy_array(const bt_property_t *properties, size_t count) {
+  bt_property_t *clone = calloc(sizeof(bt_property_t), count);
+  if (!clone) {
+    return NULL;
+  }
+
+  memcpy(&clone[0], &properties[0], sizeof(bt_property_t) * count);
+  for (size_t i = 0; i < count; ++i) {
+    clone[i].val = calloc(clone[i].len, 1);
+    memcpy(clone[i].val, properties[i].val, clone[i].len);
+  }
+
+  return clone;
+}
+
+bt_property_t *property_new_name(const char *name) {
+  bt_bdname_t *bdname = calloc(sizeof(bt_bdname_t), 1);
+  bt_property_t *property = calloc(sizeof(bt_property_t), 1);
+
+  property->type = BT_PROPERTY_BDNAME;
+  property->val = bdname;
+  property->len = sizeof(bt_bdname_t);
+
+  strlcpy((char *)bdname->name, name, sizeof(bdname->name));
+
+  return property;
+}
+
+bt_property_t *property_new_discovery_timeout(uint32_t timeout) {
+  uint32_t *val = malloc(sizeof(uint32_t));
+  bt_property_t *property = malloc(sizeof(bt_property_t));
+
+  property->type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT;
+  property->val = val;
+  property->len = sizeof(uint32_t);
+
+  *val = timeout;
+
+  return property;
+}
+
+// Warning: not thread safe.
+const char *property_extract_name(const bt_property_t *property) {
+  static char name[250] = { 0 };
+  if (!property || property->type != BT_PROPERTY_BDNAME || !property->val) {
+    return NULL;
+  }
+
+  strncpy(name, (const char *)((bt_bdname_t *)property->val)->name, property->len);
+  name[sizeof(name) - 1] = '\0';
+
+  return name;
+}
+
+bool property_equals(const bt_property_t *p1, const bt_property_t *p2) {
+  // Two null properties are not the same. May need to revisit that
+  // decision when we have a test case that exercises that condition.
+  if (!p1 || !p2 || p1->type != p2->type) {
+    return false;
+  }
+
+  // Although the Bluetooth name is a 249-byte array, the implementation
+  // treats it like a variable-length array with its size specified in the
+  // property's `len` field. We special-case the equivalence of BDNAME
+  // types here by truncating the larger, zero-padded name to its string
+  // length and comparing against the shorter name.
+  //
+  // Note: it may be the case that both strings are zero-padded but that
+  // hasn't come up yet so this implementation doesn't handle it.
+  if (p1->type == BT_PROPERTY_BDNAME && p1->len != p2->len) {
+    const bt_property_t *shorter = p1, *longer = p2;
+    if (p1->len > p2->len) {
+      shorter = p2;
+      longer = p1;
+    }
+    return strlen((const char *)longer->val) == (size_t)shorter->len && !memcmp(longer->val, shorter->val, shorter->len);
+  }
+
+  return p1->len == p2->len && !memcmp(p1->val, p2->val, p1->len);
+}
+
+void property_free(bt_property_t *property) {
+  property_free_array(property, 1);
+}
+
+void property_free_array(bt_property_t *properties, size_t count) {
+  for (size_t i = 0; i < count; ++i) {
+    free(properties[i].val);
+  }
+
+  free(properties);
+}
diff --git a/test/suite/support/property.h b/test/suite/support/property.h
new file mode 100644
index 0000000..a8b77c7
--- /dev/null
+++ b/test/suite/support/property.h
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2014 Google, Inc.
+ *
+ *  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 "base.h"
+
+bt_property_t *property_copy_array(const bt_property_t *properties, size_t count);
+bt_property_t *property_new_name(const char *name);
+bt_property_t *property_new_discovery_timeout(uint32_t timeout);
+
+const char *property_extract_name(const bt_property_t *property);
+
+bool property_equals(const bt_property_t *p1, const bt_property_t *p2);
+
+void property_free(bt_property_t *property);
+void property_free_array(bt_property_t *properties, size_t count);
diff --git a/udrv/ulinux/uipc.c b/udrv/ulinux/uipc.c
index 795f615..b9caa1b 100644
--- a/udrv/ulinux/uipc.c
+++ b/udrv/ulinux/uipc.c
@@ -64,8 +64,8 @@
 
 #define UIPC_DISCONNECTED (-1)
 
-#define UIPC_LOCK() /*BTIF_TRACE_EVENT1(" %s lock", __FUNCTION__);*/ pthread_mutex_lock(&uipc_main.mutex);
-#define UIPC_UNLOCK() /*BTIF_TRACE_EVENT1("%s unlock", __FUNCTION__);*/ pthread_mutex_unlock(&uipc_main.mutex);
+#define UIPC_LOCK() /*BTIF_TRACE_EVENT(" %s lock", __FUNCTION__);*/ pthread_mutex_lock(&uipc_main.mutex);
+#define UIPC_UNLOCK() /*BTIF_TRACE_EVENT("%s unlock", __FUNCTION__);*/ pthread_mutex_unlock(&uipc_main.mutex);
 
 #define SAFE_FD_ISSET(fd, set) (((fd) == -1) ? FALSE : FD_ISSET((fd), (set)))
 
@@ -140,49 +140,6 @@
 }
 
 /*****************************************************************************
-**
-** Function
-**
-** Description
-**
-** Returns
-**
-*******************************************************************************/
-
-static void uipc_wait(tUIPC_CH_ID ch_id, tUIPC_EVENT wait_event_flags)
-{
-    int ret;
-    tUIPC_CHAN *p = &uipc_main.ch[ch_id];
-
-    //BTIF_TRACE_EVENT2("WAIT UIPC CH %d EVT %x BEGIN", ch_id, wait_event_flags);
-    pthread_mutex_lock(&p->cond_mutex);
-    p->cond_flags |= wait_event_flags;
-    ret = pthread_cond_wait(&p->cond, &p->cond_mutex);
-    pthread_mutex_unlock(&p->cond_mutex);
-    //BTIF_TRACE_EVENT2("WAIT UIPC CH %d EVT %x DONE", ch_id, wait_event_flags);
-}
-
-static void uipc_signal(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
-{
-    int ret;
-    tUIPC_CHAN *p = &uipc_main.ch[ch_id];
-
-    //BTIF_TRACE_EVENT2("SIGNAL UIPC CH %d EVT %x BEGIN", ch_id, dump_uipc_event(event));
-    pthread_mutex_lock(&p->cond_mutex);
-
-    if (event & p->cond_flags)
-    {
-        //BTIF_TRACE_EVENT0("UNBLOCK");
-        ret = pthread_cond_signal(&p->cond);
-        p->cond_flags = 0;
-    }
-
-    pthread_mutex_unlock(&p->cond_mutex);
-}
-
-
-
-/*****************************************************************************
 **   socket helper functions
 *****************************************************************************/
 
@@ -190,23 +147,23 @@
 {
     int s = socket(AF_LOCAL, SOCK_STREAM, 0);
 
-    BTIF_TRACE_EVENT1("create_server_socket %s", name);
+    BTIF_TRACE_EVENT("create_server_socket %s", name);
 
     if(socket_local_server_bind(s, name, ANDROID_SOCKET_NAMESPACE_ABSTRACT) < 0)
     {
-        BTIF_TRACE_EVENT1("socket failed to create (%s)", strerror(errno));
+        BTIF_TRACE_EVENT("socket failed to create (%s)", strerror(errno));
         close(s);
         return -1;
     }
 
     if(listen(s, 5) < 0)
     {
-        BTIF_TRACE_EVENT1("listen failed", strerror(errno));
+        BTIF_TRACE_EVENT("listen failed", strerror(errno));
         close(s);
         return -1;
     }
 
-    BTIF_TRACE_EVENT1("created socket fd %d", s);
+    BTIF_TRACE_EVENT("created socket fd %d", s);
     return s;
 }
 
@@ -215,9 +172,9 @@
     struct sockaddr_un remote;
     struct pollfd pfd;
     int fd;
-    int len = sizeof(struct sockaddr_un);
+    socklen_t len = sizeof(struct sockaddr_un);
 
-    BTIF_TRACE_EVENT1("accept fd %d", sfd);
+    BTIF_TRACE_EVENT("accept fd %d", sfd);
 
     /* make sure there is data to process */
     pfd.fd = sfd;
@@ -225,19 +182,19 @@
 
     if (poll(&pfd, 1, 0) == 0)
     {
-        BTIF_TRACE_EVENT0("accept poll timeout");
+        BTIF_TRACE_EVENT("accept poll timeout");
         return -1;
     }
 
-    //BTIF_TRACE_EVENT1("poll revents 0x%x", pfd.revents);
+    //BTIF_TRACE_EVENT("poll revents 0x%x", pfd.revents);
 
     if ((fd = accept(sfd, (struct sockaddr *)&remote, &len)) == -1)
     {
-         BTIF_TRACE_ERROR1("sock accept failed (%s)", strerror(errno));
+         BTIF_TRACE_ERROR("sock accept failed (%s)", strerror(errno));
          return -1;
     }
 
-    //BTIF_TRACE_EVENT1("new fd %d", fd);
+    //BTIF_TRACE_EVENT("new fd %d", fd);
 
     return fd;
 }
@@ -254,7 +211,7 @@
     const pthread_mutexattr_t attr = PTHREAD_MUTEX_RECURSIVE;
     pthread_mutex_init(&uipc_main.mutex, &attr);
 
-    BTIF_TRACE_EVENT0("### uipc_main_init ###");
+    BTIF_TRACE_EVENT("### uipc_main_init ###");
 
     /* setup interrupt socket pair */
     if (socketpair(AF_UNIX, SOCK_STREAM, 0, uipc_main.signal_fds) < 0)
@@ -283,7 +240,7 @@
 {
     int i;
 
-    BTIF_TRACE_EVENT0("uipc_main_cleanup");
+    BTIF_TRACE_EVENT("uipc_main_cleanup");
 
     close(uipc_main.signal_fds[0]);
     close(uipc_main.signal_fds[1]);
@@ -302,7 +259,7 @@
 
     for (i=0; i<UIPC_CH_NUM; i++)
     {
-        //BTIF_TRACE_EVENT2("CHECK TASK FLAGS %x %x",  uipc_main.ch[i].task_evt_flags, UIPC_TASK_FLAG_DISCONNECT_CHAN);
+        //BTIF_TRACE_EVENT("CHECK TASK FLAGS %x %x",  uipc_main.ch[i].task_evt_flags, UIPC_TASK_FLAG_DISCONNECT_CHAN);
         if (uipc_main.ch[i].task_evt_flags & UIPC_TASK_FLAG_DISCONNECT_CHAN)
         {
             uipc_main.ch[i].task_evt_flags &= ~UIPC_TASK_FLAG_DISCONNECT_CHAN;
@@ -320,28 +277,28 @@
     if (ch_id >= UIPC_CH_NUM)
         return -1;
 
-    //BTIF_TRACE_EVENT2("CHECK SRVFD %d (ch %d)", uipc_main.ch[ch_id].srvfd, ch_id);
+    //BTIF_TRACE_EVENT("CHECK SRVFD %d (ch %d)", uipc_main.ch[ch_id].srvfd, ch_id);
 
     if (SAFE_FD_ISSET(uipc_main.ch[ch_id].srvfd, &uipc_main.read_set))
     {
-        BTIF_TRACE_EVENT1("INCOMING CONNECTION ON CH %d", ch_id);
+        BTIF_TRACE_EVENT("INCOMING CONNECTION ON CH %d", ch_id);
 
         uipc_main.ch[ch_id].fd = accept_server_socket(uipc_main.ch[ch_id].srvfd);
 
-        BTIF_TRACE_EVENT1("NEW FD %d", uipc_main.ch[ch_id].fd);
+        BTIF_TRACE_EVENT("NEW FD %d", uipc_main.ch[ch_id].fd);
 
         if ((uipc_main.ch[ch_id].fd > 0) && uipc_main.ch[ch_id].cback)
         {
             /*  if we have a callback we should add this fd to the active set
                 and notify user with callback event */
-            BTIF_TRACE_EVENT1("ADD FD %d TO ACTIVE SET", uipc_main.ch[ch_id].fd);
+            BTIF_TRACE_EVENT("ADD FD %d TO ACTIVE SET", uipc_main.ch[ch_id].fd);
             FD_SET(uipc_main.ch[ch_id].fd, &uipc_main.active_set);
             uipc_main.max_fd = MAX(uipc_main.max_fd, uipc_main.ch[ch_id].fd);
         }
 
         if (uipc_main.ch[ch_id].fd < 0)
         {
-            BTIF_TRACE_ERROR2("FAILED TO ACCEPT CH %d (%s)", ch_id, strerror(errno));
+            BTIF_TRACE_ERROR("FAILED TO ACCEPT CH %d (%s)", ch_id, strerror(errno));
             return -1;
         }
 
@@ -349,11 +306,11 @@
             uipc_main.ch[ch_id].cback(ch_id, UIPC_OPEN_EVT);
     }
 
-    //BTIF_TRACE_EVENT2("CHECK FD %d (ch %d)", uipc_main.ch[ch_id].fd, ch_id);
+    //BTIF_TRACE_EVENT("CHECK FD %d (ch %d)", uipc_main.ch[ch_id].fd, ch_id);
 
     if (SAFE_FD_ISSET(uipc_main.ch[ch_id].fd, &uipc_main.read_set))
     {
-        //BTIF_TRACE_EVENT1("INCOMING DATA ON CH %d", ch_id);
+        //BTIF_TRACE_EVENT("INCOMING DATA ON CH %d", ch_id);
 
         if (uipc_main.ch[ch_id].cback)
             uipc_main.ch[ch_id].cback(ch_id, UIPC_RX_DATA_READY_EVT);
@@ -366,7 +323,7 @@
     if (SAFE_FD_ISSET(uipc_main.signal_fds[0], &uipc_main.read_set))
     {
         char sig_recv = 0;
-        //BTIF_TRACE_EVENT0("UIPC INTERRUPT");
+        //BTIF_TRACE_EVENT("UIPC INTERRUPT");
         recv(uipc_main.signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
     }
 }
@@ -374,7 +331,7 @@
 static inline void uipc_wakeup_locked(void)
 {
     char sig_on = 1;
-    BTIF_TRACE_EVENT0("UIPC SEND WAKE UP");
+    BTIF_TRACE_EVENT("UIPC SEND WAKE UP");
     send(uipc_main.signal_fds[1], &sig_on, sizeof(sig_on), 0);
 }
 
@@ -382,7 +339,7 @@
 {
     int fd;
 
-    BTIF_TRACE_EVENT1("SETUP CHANNEL SERVER %d", ch_id);
+    BTIF_TRACE_EVENT("SETUP CHANNEL SERVER %d", ch_id);
 
     if (ch_id >= UIPC_CH_NUM)
         return -1;
@@ -393,12 +350,12 @@
 
     if (fd < 0)
     {
-        BTIF_TRACE_ERROR2("failed to setup %s", name, strerror(errno));
+        BTIF_TRACE_ERROR("failed to setup %s", name, strerror(errno));
         UIPC_UNLOCK();
          return -1;
     }
 
-    BTIF_TRACE_EVENT1("ADD SERVER FD TO ACTIVE SET %d", fd);
+    BTIF_TRACE_EVENT("ADD SERVER FD TO ACTIVE SET %d", fd);
     FD_SET(fd, &uipc_main.active_set);
     uipc_main.max_fd = MAX(uipc_main.max_fd, fd);
 
@@ -429,14 +386,14 @@
     while (1)
     {
         ret = poll(&pfd, 1, 1);
-        BTIF_TRACE_EVENT3("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
+        BTIF_TRACE_EVENT("uipc_flush_ch_locked polling : fd %d, rxev %x, ret %d", pfd.fd, pfd.revents, ret);
 
         if (pfd.revents & (POLLERR|POLLHUP))
             return;
 
         if (ret <= 0)
         {
-            BTIF_TRACE_EVENT1("uipc_flush_ch_locked : error (%d)", ret);
+            BTIF_TRACE_EVENT("uipc_flush_ch_locked : error (%d)", ret);
             return;
         }
         read(pfd.fd, &buf, 1);
@@ -466,14 +423,14 @@
 {
     int wakeup = 0;
 
-    BTIF_TRACE_EVENT1("CLOSE CHANNEL %d", ch_id);
+    BTIF_TRACE_EVENT("CLOSE CHANNEL %d", ch_id);
 
     if (ch_id >= UIPC_CH_NUM)
         return -1;
 
     if (uipc_main.ch[ch_id].srvfd != UIPC_DISCONNECTED)
     {
-        BTIF_TRACE_EVENT1("CLOSE SERVER (FD %d)", uipc_main.ch[ch_id].srvfd);
+        BTIF_TRACE_EVENT("CLOSE SERVER (FD %d)", uipc_main.ch[ch_id].srvfd);
         close(uipc_main.ch[ch_id].srvfd);
         FD_CLR(uipc_main.ch[ch_id].srvfd, &uipc_main.active_set);
         uipc_main.ch[ch_id].srvfd = UIPC_DISCONNECTED;
@@ -482,7 +439,7 @@
 
     if (uipc_main.ch[ch_id].fd != UIPC_DISCONNECTED)
     {
-        BTIF_TRACE_EVENT1("CLOSE CONNECTION (FD %d)", uipc_main.ch[ch_id].fd);
+        BTIF_TRACE_EVENT("CLOSE CONNECTION (FD %d)", uipc_main.ch[ch_id].fd);
         close(uipc_main.ch[ch_id].fd);
         FD_CLR(uipc_main.ch[ch_id].fd, &uipc_main.active_set);
         uipc_main.ch[ch_id].fd = UIPC_DISCONNECTED;
@@ -505,7 +462,7 @@
 {
     if (uipc_main.ch[ch_id].srvfd == UIPC_DISCONNECTED)
     {
-        BTIF_TRACE_EVENT1("CHANNEL %d ALREADY CLOSED", ch_id);
+        BTIF_TRACE_EVENT("CHANNEL %d ALREADY CLOSED", ch_id);
         return;
     }
 
@@ -523,6 +480,8 @@
 
     prctl(PR_SET_NAME, (unsigned long)"uipc-main", 0, 0, 0);
 
+    raise_priority_a2dp(TASK_UIPC_READ);
+
     while (uipc_main.running)
     {
         uipc_main.read_set = uipc_main.active_set;
@@ -531,12 +490,12 @@
 
         if (result == 0)
         {
-            BTIF_TRACE_EVENT0("select timeout");
+            BTIF_TRACE_EVENT("select timeout");
             continue;
         }
         else if (result < 0)
         {
-            BTIF_TRACE_EVENT1("select failed %s", strerror(errno));
+            BTIF_TRACE_EVENT("select failed %s", strerror(errno));
             continue;
         }
 
@@ -561,13 +520,13 @@
         UIPC_UNLOCK();
     }
 
-    BTIF_TRACE_EVENT0("UIPC READ THREAD EXITING");
+    BTIF_TRACE_EVENT("UIPC READ THREAD EXITING");
 
     uipc_main_cleanup();
 
     uipc_main.tid = 0;
 
-    BTIF_TRACE_EVENT0("UIPC READ THREAD DONE");
+    BTIF_TRACE_EVENT("UIPC READ THREAD DONE");
 }
 
 
@@ -577,7 +536,7 @@
 
     if (pthread_create(&uipc_main.tid, (const pthread_attr_t *) NULL, (void*)uipc_read_task, NULL) < 0)
     {
-        BTIF_TRACE_ERROR1("uipc_thread_create pthread_create failed:%d", errno);
+        BTIF_TRACE_ERROR("uipc_thread_create pthread_create failed:%d", errno);
         return -1;
     }
 
@@ -612,7 +571,7 @@
 {
     UNUSED(p_data);
 
-    BTIF_TRACE_DEBUG0("UIPC_Init");
+    BTIF_TRACE_DEBUG("UIPC_Init");
 
     memset(&uipc_main, 0, sizeof(tUIPC_MAIN));
 
@@ -632,7 +591,7 @@
  *******************************************************************************/
 UDRV_API BOOLEAN UIPC_Open(tUIPC_CH_ID ch_id, tUIPC_RCV_CBACK *p_cback)
 {
-    BTIF_TRACE_DEBUG2("UIPC_Open : ch_id %d, p_cback %x", ch_id, p_cback);
+    BTIF_TRACE_DEBUG("UIPC_Open : ch_id %d, p_cback %x", ch_id, p_cback);
 
     UIPC_LOCK();
 
@@ -644,7 +603,7 @@
 
     if (uipc_main.ch[ch_id].srvfd != UIPC_DISCONNECTED)
     {
-        BTIF_TRACE_EVENT1("CHANNEL %d ALREADY OPEN", ch_id);
+        BTIF_TRACE_EVENT("CHANNEL %d ALREADY OPEN", ch_id);
         UIPC_UNLOCK();
         return 0;
     }
@@ -677,7 +636,7 @@
 
 UDRV_API void UIPC_Close(tUIPC_CH_ID ch_id)
 {
-    BTIF_TRACE_DEBUG1("UIPC_Close : ch_id %d", ch_id);
+    BTIF_TRACE_DEBUG("UIPC_Close : ch_id %d", ch_id);
 
     /* special case handling uipc shutdown */
     if (ch_id != UIPC_CH_ID_ALL)
@@ -688,9 +647,9 @@
     }
     else
     {
-        BTIF_TRACE_DEBUG0("UIPC_Close : waiting for shutdown to complete");
+        BTIF_TRACE_DEBUG("UIPC_Close : waiting for shutdown to complete");
         uipc_stop_main_server_thread();
-        BTIF_TRACE_DEBUG0("UIPC_Close : shutdown complete");
+        BTIF_TRACE_DEBUG("UIPC_Close : shutdown complete");
     }
 }
 
@@ -708,7 +667,7 @@
 {
     UNUSED(p_msg);
 
-    BTIF_TRACE_DEBUG1("UIPC_SendBuf : ch_id %d NOT IMPLEMENTED", ch_id);
+    BTIF_TRACE_DEBUG("UIPC_SendBuf : ch_id %d NOT IMPLEMENTED", ch_id);
 
     UIPC_LOCK();
 
@@ -734,13 +693,13 @@
     int n;
     UNUSED(msg_evt);
 
-    BTIF_TRACE_DEBUG2("UIPC_Send : ch_id:%d %d bytes", ch_id, msglen);
+    BTIF_TRACE_DEBUG("UIPC_Send : ch_id:%d %d bytes", ch_id, msglen);
 
     UIPC_LOCK();
 
     if (write(uipc_main.ch[ch_id].fd, p_buf, msglen) < 0)
     {
-        BTIF_TRACE_ERROR1("failed to write (%s)", strerror(errno));
+        BTIF_TRACE_ERROR("failed to write (%s)", strerror(errno));
     }
 
     UIPC_UNLOCK();
@@ -761,7 +720,7 @@
 {
     UNUSED(p_msg);
 
-    BTIF_TRACE_DEBUG1("UIPC_ReadBuf : ch_id:%d NOT IMPLEMENTED", ch_id);
+    BTIF_TRACE_DEBUG("UIPC_ReadBuf : ch_id:%d NOT IMPLEMENTED", ch_id);
 
     UIPC_LOCK();
     UIPC_UNLOCK();
@@ -787,17 +746,17 @@
 
     if (ch_id >= UIPC_CH_NUM)
     {
-        BTIF_TRACE_ERROR1("UIPC_Read : invalid ch id %d", ch_id);
+        BTIF_TRACE_ERROR("UIPC_Read : invalid ch id %d", ch_id);
         return 0;
     }
 
     if (fd == UIPC_DISCONNECTED)
     {
-        BTIF_TRACE_ERROR1("UIPC_Read : channel %d closed", ch_id);
+        BTIF_TRACE_ERROR("UIPC_Read : channel %d closed", ch_id);
         return 0;
     }
 
-    //BTIF_TRACE_DEBUG4("UIPC_Read : ch_id %d, len %d, fd %d, polltmo %d", ch_id, len,
+    //BTIF_TRACE_DEBUG("UIPC_Read : ch_id %d, len %d, fd %d, polltmo %d", ch_id, len,
     //        fd, uipc_main.ch[ch_id].read_poll_tmo_ms);
 
     while (n_read < (int)len)
@@ -809,15 +768,15 @@
            a read for more than poll timeout */
         if (poll(&pfd, 1, uipc_main.ch[ch_id].read_poll_tmo_ms) == 0)
         {
-            BTIF_TRACE_EVENT1("poll timeout (%d ms)", uipc_main.ch[ch_id].read_poll_tmo_ms);
+            BTIF_TRACE_EVENT("poll timeout (%d ms)", uipc_main.ch[ch_id].read_poll_tmo_ms);
             break;
         }
 
-        //BTIF_TRACE_EVENT1("poll revents %x", pfd.revents);
+        //BTIF_TRACE_EVENT("poll revents %x", pfd.revents);
 
         if (pfd.revents & (POLLHUP|POLLNVAL) )
         {
-            BTIF_TRACE_EVENT0("poll : channel detached remotely");
+            BTIF_TRACE_EVENT("poll : channel detached remotely");
             UIPC_LOCK();
             uipc_close_locked(ch_id);
             UIPC_UNLOCK();
@@ -826,11 +785,11 @@
 
         n = recv(fd, p_buf+n_read, len-n_read, 0);
 
-        //BTIF_TRACE_EVENT1("read %d bytes", n);
+        //BTIF_TRACE_EVENT("read %d bytes", n);
 
         if (n == 0)
         {
-            BTIF_TRACE_EVENT0("UIPC_Read : channel detached remotely");
+            BTIF_TRACE_EVENT("UIPC_Read : channel detached remotely");
             UIPC_LOCK();
             uipc_close_locked(ch_id);
             UIPC_UNLOCK();
@@ -839,7 +798,7 @@
 
         if (n < 0)
         {
-            BTIF_TRACE_EVENT1("UIPC_Read : read failed (%s)", strerror(errno));
+            BTIF_TRACE_EVENT("UIPC_Read : read failed (%s)", strerror(errno));
             return 0;
         }
 
@@ -862,7 +821,7 @@
 
 UDRV_API extern BOOLEAN UIPC_Ioctl(tUIPC_CH_ID ch_id, UINT32 request, void *param)
 {
-    BTIF_TRACE_DEBUG2("#### UIPC_Ioctl : ch_id %d, request %d ####", ch_id, request);
+    BTIF_TRACE_DEBUG("#### UIPC_Ioctl : ch_id %d, request %d ####", ch_id, request);
 
     UIPC_LOCK();
 
@@ -873,7 +832,7 @@
             break;
 
         case UIPC_REG_CBACK:
-            //BTIF_TRACE_EVENT3("register callback ch %d srvfd %d, fd %d", ch_id, uipc_main.ch[ch_id].srvfd, uipc_main.ch[ch_id].fd);
+            //BTIF_TRACE_EVENT("register callback ch %d srvfd %d, fd %d", ch_id, uipc_main.ch[ch_id].srvfd, uipc_main.ch[ch_id].fd);
             uipc_main.ch[ch_id].cback = (tUIPC_RCV_CBACK*)param;
             break;
 
@@ -891,12 +850,12 @@
             break;
 
         case UIPC_SET_READ_POLL_TMO:
-            uipc_main.ch[ch_id].read_poll_tmo_ms = (int)param;
-            BTIF_TRACE_EVENT2("UIPC_SET_READ_POLL_TMO : CH %d, TMO %d ms", ch_id, uipc_main.ch[ch_id].read_poll_tmo_ms );
+            uipc_main.ch[ch_id].read_poll_tmo_ms = (intptr_t)param;
+            BTIF_TRACE_EVENT("UIPC_SET_READ_POLL_TMO : CH %d, TMO %d ms", ch_id, uipc_main.ch[ch_id].read_poll_tmo_ms );
             break;
 
         default:
-            BTIF_TRACE_EVENT1("UIPC_Ioctl : request not handled (%d)", request);
+            BTIF_TRACE_EVENT("UIPC_Ioctl : request not handled (%d)", request);
             break;
     }
 
diff --git a/utils/Android.mk b/utils/Android.mk
index c74cd2d..fb337bb 100644
--- a/utils/Android.mk
+++ b/utils/Android.mk
@@ -1,20 +1,20 @@
-LOCAL_PATH:= $(call my-dir)
+LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
 
-LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include \
-                   $(LOCAL_PATH)/../gki/ulinux \
-                   $(bdroid_C_INCLUDES)
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/include \
+	$(LOCAL_PATH)/../gki/ulinux \
+	$(bdroid_C_INCLUDES)
 
-LOCAL_CFLAGS += -Werror $(bdroid_CFLAGS)
+LOCAL_CFLAGS += $(bdroid_CFLAGS) -std=c99
 
-LOCAL_PRELINK_MODULE:=false
-LOCAL_SRC_FILES:= \
-    ./src/bt_utils.c
+LOCAL_PRELINK_MODULE :=false
+LOCAL_SRC_FILES := \
+	./src/bt_utils.c
 
 LOCAL_MODULE := libbt-utils
 LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := libcutils liblog libc
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_CLASS := STATIC_LIBRARIES
 
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/utils/include/bt_utils.h b/utils/include/bt_utils.h
index d601f2e..f2bd2ed 100644
--- a/utils/include/bt_utils.h
+++ b/utils/include/bt_utils.h
@@ -29,6 +29,8 @@
     TASK_HIGH_BTU,
     TASK_HIGH_HCI_WORKER,
     TASK_HIGH_USERIAL_READ,
+    TASK_UIPC_READ,
+    TASK_JAVA_ALARM,
     TASK_HIGH_MAX
 } tHIGH_PRIORITY_TASK;
 
@@ -39,7 +41,6 @@
 void bt_utils_init();
 void bt_utils_cleanup();
 void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task);
-
+void adjust_priority_a2dp(int start);
 #define UNUSED(x) (void)(x)
-
 #endif /* BT_UTILS_H */
diff --git a/utils/src/bt_utils.c b/utils/src/bt_utils.c
index aeb9292..ab618b0 100644
--- a/utils/src/bt_utils.c
+++ b/utils/src/bt_utils.c
@@ -50,6 +50,8 @@
 static BOOLEAN g_DoSchedulingGroup[TASK_HIGH_MAX];
 static pthread_mutex_t         gIdxLock;
 static int g_TaskIdx;
+static int g_TaskIDs[TASK_HIGH_MAX];
+#define INVALID_TASK_ID  (-1)
 
 /*****************************************************************************
 **
@@ -67,6 +69,7 @@
     for(i = 0; i < TASK_HIGH_MAX; i++) {
         g_DoSchedulingGroupOnce[i] = PTHREAD_ONCE_INIT;
         g_DoSchedulingGroup[i] = TRUE;
+        g_TaskIDs[i] = INVALID_TASK_ID;
     }
     pthread_mutexattr_init(&lock_attr);
     pthread_mutex_init(&gIdxLock, &lock_attr);
@@ -117,6 +120,7 @@
 void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) {
     int rc = 0;
     int tid = gettid();
+    int priority = ANDROID_PRIORITY_AUDIO;
 
     pthread_mutex_lock(&gIdxLock);
     g_TaskIdx = high_task;
@@ -124,16 +128,52 @@
     pthread_once(&g_DoSchedulingGroupOnce[g_TaskIdx], check_do_scheduling_group);
     if (g_DoSchedulingGroup[g_TaskIdx]) {
         // set_sched_policy does not support tid == 0
-        rc = set_sched_policy(tid, SP_FOREGROUND);
+        rc = set_sched_policy(tid, SP_AUDIO_SYS);
     }
+    g_TaskIDs[high_task] = tid;
     pthread_mutex_unlock(&gIdxLock);
 
     if (rc) {
         ALOGW("failed to change sched policy, tid %d, err: %d", tid, errno);
     }
 
-    if (setpriority(PRIO_PROCESS, tid, ANDROID_PRIORITY_AUDIO) < 0) {
-        ALOGW("failed to change priority tid: %d to %d", tid, ANDROID_PRIORITY_AUDIO);
+    // always use urgent priority for HCI worker thread until we can adjust
+    // its prio individually. All other threads can be dynamically adjusted voa
+    // adjust_priority_a2dp()
+
+    if (high_task == TASK_HIGH_HCI_WORKER)
+       priority = ANDROID_PRIORITY_URGENT_AUDIO;
+
+    if (setpriority(PRIO_PROCESS, tid, priority) < 0) {
+        ALOGW("failed to change priority tid: %d to %d", tid, priority);
     }
 }
 
+/*****************************************************************************
+**
+** Function        adjust_priority_a2dp
+**
+** Description     increase the a2dp consumer task priority temporarily when start
+**                 audio playing, to avoid overflow the audio packet queue, restore
+**                 the a2dp consumer task priority when stop audio playing.
+**
+** Returns         void
+**
+*******************************************************************************/
+void adjust_priority_a2dp(int start) {
+    int priority = start ? ANDROID_PRIORITY_URGENT_AUDIO : ANDROID_PRIORITY_AUDIO;
+    int tid;
+    int i;
+
+    for (i = 0; i < TASK_HIGH_MAX; i++)
+    {
+        tid = g_TaskIDs[i];
+        if (tid != INVALID_TASK_ID)
+        {
+            if (setpriority(PRIO_PROCESS, tid, priority) < 0)
+            {
+                ALOGW("failed to change priority tid: %d to %d", tid, priority);
+            }
+        }
+    }
+}
diff --git a/vnd/ble/vendor_ble.c b/vnd/ble/vendor_ble.c
new file mode 100644
index 0000000..61d6780
--- /dev/null
+++ b/vnd/ble/vendor_ble.c
@@ -0,0 +1,757 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+**  Name:          vendor_ble.c
+**
+**  Description:   This file contains vendor specific feature for BLE
+**
+******************************************************************************/
+#include <string.h>
+#include "bt_target.h"
+
+#if (BLE_INCLUDED == TRUE)
+#include "bt_types.h"
+#include "hcimsgs.h"
+#include "btu.h"
+#include "vendor_ble.h"
+#include "vendor_hcidefs.h"
+#include "gatt_int.h"
+
+/*** This needs to be moved to a VSC control block eventually per coding conventions ***/
+#if VENDOR_DYNAMIC_MEMORY == FALSE
+tBTM_BLE_VENDOR_CB  btm_ble_vendor_cb;
+#endif
+
+static const BD_ADDR     na_bda= {0};
+
+/*******************************************************************************
+**         Resolve Address Using IRK List functions
+*******************************************************************************/
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_enq_irk_pending
+**
+** Description      add target address into IRK pending operation queue
+**
+** Parameters       target_bda: target device address
+**                  add_entry: TRUE for add entry, FALSE for remove entry
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
+
+    memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN);
+    memcpy(p_q->irk_q_random_pseudo[p_q->q_next], psuedo_bda, BD_ADDR_LEN);
+    p_q->irk_q_action[p_q->q_next] = to_add;
+
+    p_q->q_next ++;
+    p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+#endif
+    return ;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_find_irk_pending_entry
+**
+** Description      check to see if the action is in pending list
+**
+** Parameters       TRUE: action pending;
+**                  FALSE: new action
+**
+** Returns          void
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
+    UINT8   i;
+
+    for (i = p_q->q_pending; i != p_q->q_next; )
+    {
+        if (memcmp(p_q->irk_q_random_pseudo[i], psuedo_addr, BD_ADDR_LEN) == 0 &&
+            action == p_q->irk_q_action[i])
+            return TRUE;
+
+        i ++;
+        i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+    }
+#endif
+    return FALSE;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_deq_irk_pending
+**
+** Description      add target address into IRK pending operation queue
+**
+** Parameters       target_bda: target device address
+**                  add_entry: TRUE for add entry, FALSE for remove entry
+**
+** Returns          void
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
+
+    if (p_q->q_next != p_q->q_pending)
+    {
+        memcpy(target_bda, p_q->irk_q[p_q->q_pending], BD_ADDR_LEN);
+        memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN);
+
+        p_q->q_pending ++;
+        p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
+
+        return TRUE;
+    }
+#endif
+    return FALSE;
+
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_find_irk_entry
+**
+** Description      find IRK entry in local host IRK list by static address
+**
+** Returns          IRK list entry pointer
+**
+*******************************************************************************/
+tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+    UINT8   i;
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+    {
+        if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0)
+        {
+            return p_irk_entry ;
+        }
+    }
+#endif
+    return NULL;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_find_irk_entry_by_psuedo_addr
+**
+** Description      find IRK entry in local host IRK list by psuedo address
+**
+** Returns          IRK list entry pointer
+**
+*******************************************************************************/
+tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+    UINT8   i;
+
+    if(p_irk_entry == NULL)
+        return NULL;
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+    {
+        if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0)
+        {
+            return p_irk_entry ;
+        }
+    }
+#endif
+    return NULL;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_alloc_irk_entry
+**
+** Description      allocate IRK entry in local host IRK list
+**
+** Returns          IRK list index
+**
+*******************************************************************************/
+UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
+    UINT8   i;
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
+    {
+        if (!p_irk_entry->in_use)
+        {
+            memcpy(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN);
+            memcpy(p_irk_entry->psuedo_bda, pseudo_bda, BD_ADDR_LEN);
+
+            p_irk_entry->index = i;
+            p_irk_entry->in_use = TRUE;
+
+            return i;
+        }
+    }
+#endif
+    return BTM_CS_IRK_LIST_INVALID;
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_update_irk_list
+**
+** Description      update IRK entry in local host IRK list
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_IRK_ENTRY   *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda);
+    UINT8       i;
+
+    if (add)
+    {
+        if (p_irk_entry == NULL)
+        {
+            if ((i = btm_ble_vendor_alloc_irk_entry(target_bda, pseudo_bda)) == BTM_CS_IRK_LIST_INVALID)
+            {
+                BTM_TRACE_ERROR("max IRK capacity reached");
+            }
+        }
+        else
+        {
+            BTM_TRACE_WARNING(" IRK already in queue");
+        }
+    }
+    else
+    {
+        if (p_irk_entry != NULL)
+        {
+            memset(p_irk_entry, 0, sizeof(tBTM_BLE_IRK_ENTRY));
+        }
+        else
+        {
+            BTM_TRACE_ERROR("No IRK exist in list, can not remove");
+        }
+    }
+#endif
+    return ;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_irk_vsc_op_cmpl
+**
+** Description      IRK operation VSC complete handler
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
+{
+    UINT8  status;
+    UINT8  *p = p_params->p_param_buf, op_subcode;
+    UINT16  evt_len = p_params->param_len;
+    UINT8   i;
+    tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
+    BD_ADDR         target_bda, pseudo_bda, rra;
+
+
+    STREAM_TO_UINT8(status, p);
+
+    evt_len--;
+
+    op_subcode   = *p ++;
+    BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode);
+    if (evt_len < 1)
+    {
+        BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback");
+        return;
+    }
+
+    if (BTM_BLE_META_IRK_ENABLE == op_subcode)
+    {
+        BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode);
+        return;
+    }
+    else
+    if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST)
+    {
+        if (status == HCI_SUCCESS)
+        {
+            STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+            p_cb->irk_list_size = 0;
+
+            BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size);
+
+            for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++)
+                memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY));
+        }
+    }
+    else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY)
+    {
+        if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda))
+        {
+            BTM_TRACE_ERROR("no pending IRK operation");
+            return;
+        }
+
+        if (status == HCI_SUCCESS)
+        {
+            STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+            btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, TRUE);
+        }
+        else if (status == 0x07) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED  */
+        {
+            p_cb->irk_avail_size = 0;
+            BTM_TRACE_ERROR("IRK Full ");
+        }
+        else
+        {
+            /* give the credit back if invalid parameter failed the operation */
+            p_cb->irk_list_size ++;
+        }
+    }
+    else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY)
+    {
+        if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda))
+        {
+            BTM_TRACE_ERROR("no pending IRK operation");
+            return;
+        }
+        if (status == HCI_SUCCESS)
+        {
+            STREAM_TO_UINT8(p_cb->irk_avail_size, p);
+            btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, FALSE);
+        }
+        else
+        {
+            /* give the credit back if invalid parameter failed the operation */
+            if (p_cb->irk_avail_size > 0)
+                p_cb->irk_list_size --;
+        }
+
+    }
+    else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY)
+    {
+        if (status == HCI_SUCCESS)
+        {
+            //STREAM_TO_UINT8(index, p);
+            p += (1 + 16 + 1); /* skip index, IRK value, address type */
+            STREAM_TO_BDADDR(target_bda, p);
+            STREAM_TO_BDADDR(rra, p);
+            btm_ble_refresh_rra(target_bda, rra);
+        }
+    }
+
+}
+/*******************************************************************************
+**
+** Function         btm_ble_remove_irk_entry
+**
+** Description      This function to remove an IRK entry from the list
+**
+** Parameters       ble_addr_type: address type
+**                  ble_addr: LE adddress
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8           param[20], *p;
+    tBTM_STATUS     st;
+    tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return BTM_MODE_UNSUPPORTED;
+
+    p = param;
+    memset(param, 0, 20);
+
+    UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY);
+    UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
+    BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr);
+
+    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+                                    BTM_BLE_META_REMOVE_IRK_LEN,
+                                    param,
+                                    btm_ble_vendor_irk_vsc_op_cmpl))
+        != BTM_NO_RESOURCES)
+    {
+        btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, FALSE);
+        p_cb->irk_list_size --;
+    }
+
+    return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_clear_irk_list
+**
+** Description      This function clears the IRK entry list
+**
+** Parameters       None.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8           param[20], *p;
+    tBTM_STATUS     st;
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return BTM_MODE_UNSUPPORTED;
+
+    p = param;
+    memset(param, 0, 20);
+
+    UINT8_TO_STREAM(p, BTM_BLE_META_CLEAR_IRK_LIST);
+
+    st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+                                    BTM_BLE_META_CLEAR_IRK_LEN,
+                                    param,
+                                    btm_ble_vendor_irk_vsc_op_cmpl);
+
+    return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_read_irk_entry
+**
+** Description      This function read an IRK entry by index
+**
+** Parameters       entry index.
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8           param[20], *p;
+    tBTM_STATUS     st = BTM_UNKNOWN_ADDR;
+    tBTM_BLE_IRK_ENTRY *p_entry;
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return BTM_MODE_UNSUPPORTED;
+
+    if ((p_entry = btm_ble_vendor_find_irk_entry(target_bda)) == NULL)
+        return st;
+
+    p = param;
+    memset(param, 0, 20);
+
+    UINT8_TO_STREAM(p, BTM_BLE_META_READ_IRK_ENTRY);
+    UINT8_TO_STREAM(p, p_entry->index);
+
+    st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+                                    BTM_BLE_META_READ_IRK_LEN,
+                                    param,
+                                    btm_ble_vendor_irk_vsc_op_cmpl);
+
+    return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
+}
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_enable_irk_list_known_dev
+**
+** Description      This function add all known device with random address into
+**                  IRK list.
+**
+** Parameters       enable: enable IRK list with known device, or disable it
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8               i;
+    UINT8               count = 0;
+    tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return;
+
+    /* add all known device with random address into IRK list */
+    for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
+    {
+        if (p_dev_rec->sec_flags & BTM_SEC_IN_USE)
+        {
+            if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
+                count ++;
+        }
+    }
+
+    if ((count > 0 && enable) || !enable)
+        btm_ble_vendor_enable_irk_feature(enable);
+#endif
+    return ;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_irk_list_load_dev
+**
+** Description      This function add a device which is using RPA into white list
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8           param[40], *p;
+    tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
+    BOOLEAN         rt = FALSE;
+    tBTM_BLE_IRK_ENTRY  *p_irk_entry = NULL;
+    BTM_TRACE_DEBUG ("btm_ble_vendor_irk_list_load_dev:max_irk_size=%d", p_cb->irk_avail_size);
+    memset(param, 0, 40);
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return FALSE;
+
+    if (p_dev_rec != NULL && /* RPA is being used and PID is known */
+        (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0)
+    {
+
+        if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) == NULL &&
+            btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, TRUE) == FALSE)
+        {
+
+            if (p_cb->irk_avail_size > 0)
+            {
+                p = param;
+
+                UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY);
+                ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN);
+                UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
+                BDADDR_TO_STREAM(p,p_dev_rec->ble.static_addr);
+
+                if (BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC,
+                                                BTM_BLE_META_ADD_IRK_LEN,
+                                                param,
+                                                btm_ble_vendor_irk_vsc_op_cmpl)
+                       != BTM_NO_RESOURCES)
+                {
+                    btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, TRUE);
+                    p_cb->irk_list_size ++;
+                    rt = TRUE;
+
+                    btm_ble_vendor_enable_irk_feature(TRUE);
+                }
+            }
+        }
+        else
+        {
+            BTM_TRACE_ERROR("Device already in IRK list");
+            rt = TRUE;
+        }
+    }
+    else
+    {
+        BTM_TRACE_DEBUG("Device not a RPA enabled device");
+    }
+    return rt;
+#endif
+    return FALSE;
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_irk_list_remove_dev
+**
+** Description      This function remove the device from IRK list
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    tBTM_BLE_VENDOR_CB  *p_cs_cb = &btm_ble_vendor_cb;
+    tBTM_BLE_IRK_ENTRY *p_irk_entry;
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return;
+
+    if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) != NULL &&
+        btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, FALSE) == FALSE)
+    {
+        btm_ble_remove_irk_entry(p_dev_rec);
+    }
+    else
+    {
+        BTM_TRACE_ERROR("Device not in IRK list");
+    }
+
+    if (p_cs_cb->irk_list_size == 0)
+        btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
+}
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_disable_irk_list
+**
+** Description      disable LE resolve address feature
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_vendor_disable_irk_list(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_enable_irk_feature
+**
+** Description      This function is called to enable or disable the RRA
+**                  offloading feature.
+**
+** Parameters       enable: enable or disable the RRA offloading feature
+**
+** Returns          BTM_SUCCESS if successful
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    UINT8           param[20], *p;
+    tBTM_STATUS     st = BTM_WRONG_MODE;
+    tBTM_BLE_PF_COUNT *p_bda_filter;
+
+    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+        return BTM_MODE_UNSUPPORTED;
+
+    if (btm_ble_vendor_cb.enable != enable)
+    {
+        p = param;
+        memset(param, 0, 20);
+
+        /* select feature based on control block settings */
+        UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE);
+        UINT8_TO_STREAM(p, enable ? 0x01 : 0x00);
+
+        st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN,
+                                        param, btm_ble_vendor_irk_vsc_op_cmpl);
+
+        btm_ble_vendor_cb.enable = enable;
+    }
+
+    return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
+}
+
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_init
+**
+** Description      Initialize customer specific feature information in host stack
+**
+** Parameters  Max IRK list size
+**                   Max filter supported
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_init(UINT8 max_irk_list_sz)
+{
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+
+#if BLE_PRIVACY_SPT == TRUE
+    if (max_irk_list_sz > 0)
+    {
+        btm_ble_vendor_cb.irk_list =  (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY)
+                                                                        * max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q =  (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) *
+                                                                     max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) *
+                                                                                 max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz);
+    }
+
+    btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz;
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return;
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_cleanup
+**
+** Description      Cleanup VSC specific dynamic memory
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_cleanup(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    if (btm_ble_vendor_cb.irk_list)
+        GKI_freebuf(btm_ble_vendor_cb.irk_list);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q)
+       GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_action)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action);
+#endif
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+}
+
+#endif
+
diff --git a/vnd/ble/vendor_hcidefs.h b/vnd/ble/vendor_hcidefs.h
new file mode 100644
index 0000000..b5e770b
--- /dev/null
+++ b/vnd/ble/vendor_hcidefs.h
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+**  Name        vendor_hcidefs.h
+**
+**  Function    This file contains Broadcom Specific Host Controller Interface
+**              definitions.
+**
+******************************************************************************/
+
+#ifndef VENDOR_HCIDEFS_H
+#define VENDOR_HCIDEFS_H
+
+/*****************************************************************************
+** Private address resolution VSC
+******************************************************************************/
+
+/* VSC */
+#define HCI_VENDOR_BLE_RPA_VSC                (0x0155 | HCI_GRP_VENDOR_SPECIFIC)
+
+/* Sub codes */
+#define HCI_VENDOR_BLE_RPA_ENABLE       0x01
+#define HCI_VENDOR_BLE_RPA_ADD_IRK      0x02
+#define HCI_VENDOR_BLE_RPA_REMOVE_IRK   0x03
+#define HCI_VENDOR_BLE_RPA_CLEAR_IRK    0x04
+#define HCI_VENDOR_BLE_RPA_READ_IRK     0x05
+
+
+/*****************************************************************************
+** Advertising data payload filter VSC
+******************************************************************************/
+
+/* VSC */
+#define HCI_VENDOR_BLE_PCF_VSC                (0x0157 | HCI_GRP_VENDOR_SPECIFIC)
+
+#endif
+
diff --git a/vnd/include/vendor_api.h b/vnd/include/vendor_api.h
new file mode 100644
index 0000000..12519cd
--- /dev/null
+++ b/vnd/include/vendor_api.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Name:         vendor_api.h
+**
+** Description:  Vendor specific BTE API function external definitions.
+**
+** Copyright (c) 2009-2011, BROADCOM Inc., All Rights Reserved.
+** Broadcom Bluetooth Core. Proprietary and confidential.
+**
+******************************************************************************/
+#ifndef VENDOR_API_H
+#define VENDOR_API_H
+
+#include "bt_types.h"
+#include "btm_api.h"
+
+/****************************************************************************
+**  Resolvable private address offload VSC specific definitions
+******************************************************************************/
+
+enum
+{
+    BTM_BLE_PRIVACY_ENABLE,
+    BTM_BLE_PRIVACY_DISABLE
+};
+
+
+/****************************************************************************
+**  Advertising packet filter VSC specific definitions
+******************************************************************************/
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+**              VENDOR SPECIFIC BLE FEATURE FUNCTIONS
+******************************************************************************/
+#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vnd/include/vendor_ble.h b/vnd/include/vendor_ble.h
new file mode 100644
index 0000000..6207c84
--- /dev/null
+++ b/vnd/include/vendor_ble.h
@@ -0,0 +1,132 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2003-2014 Broadcom Corporation
+ *
+ *  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.
+ *
+ ******************************************************************************/
+
+/*****************************************************************************
+**
+**  Name:          vendor_ble.h
+**
+**  Description:   This file contains vendor specific feature header
+**                 for BLE
+******************************************************************************/
+#ifndef VENDOR_BLE_H
+#define VENDOR_BLE_H
+
+#include "btm_int.h"
+#include "btm_ble_api.h"
+#include "vendor_api.h"
+
+/* RPA offload VSC specifics */
+#define BTM_BLE_META_IRK_ENABLE         0x01
+#define BTM_BLE_META_ADD_IRK_ENTRY      0x02
+#define BTM_BLE_META_REMOVE_IRK_ENTRY   0x03
+#define BTM_BLE_META_CLEAR_IRK_LIST     0x04
+#define BTM_BLE_META_READ_IRK_ENTRY     0x05
+#define BTM_BLE_META_CS_RESOLVE_ADDR    0x00000001
+#define BTM_BLE_IRK_ENABLE_LEN          2
+
+/* BLE meta vsc header: 1 bytes of sub_code, 1 byte of PCF action */
+#define BTM_BLE_META_HDR_LENGTH     3
+#define BTM_BLE_PF_FEAT_SEL_LEN     18
+#define BTM_BLE_PCF_ENABLE_LEN      2
+#define BTM_BLE_META_ADDR_LEN       7
+#define BTM_BLE_META_UUID_LEN       40
+#define BTM_BLE_META_ADD_IRK_LEN        24
+#define BTM_BLE_META_REMOVE_IRK_LEN     8
+#define BTM_BLE_META_CLEAR_IRK_LEN      1
+#define BTM_BLE_META_READ_IRK_LEN       2
+#define BTM_BLE_META_ADD_WL_ATTR_LEN    9
+
+#define BTM_BLE_PF_SELECT_NONE              0
+#define BTM_BLE_PF_ADDR_FILTER_BIT          BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_ADDR_FILTER)
+#define BTM_BLE_PF_SRVC_DATA_BIT            BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA)
+#define BTM_BLE_PF_SRVC_UUID_BIT            BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_UUID)
+#define BTM_BLE_PF_SRVC_SOL_UUID_BIT        BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_SOL_UUID)
+#define BTM_BLE_PF_LOCAL_NAME_BIT           BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_LOCAL_NAME)
+#define BTM_BLE_PF_MANU_DATA_BIT            BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_MANU_DATA)
+#define BTM_BLE_PF_SRVC_DATA_PATTERN_BIT    BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA_PATTERN)
+typedef UINT8 tBTM_BLE_PF_SEL_MASK;
+
+#define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
+
+#define BTM_CS_IRK_LIST_INVALID     0xff
+
+typedef struct
+{
+    BOOLEAN         in_use;
+    BD_ADDR         bd_addr;        /* must be the address used in controller */
+    BD_ADDR         psuedo_bda;        /* the random pseudo address */
+    UINT8           index;
+}tBTM_BLE_IRK_ENTRY;
+
+
+typedef struct
+{
+    BD_ADDR         *irk_q;
+    BD_ADDR         *irk_q_random_pseudo;
+    UINT8           *irk_q_action;
+    UINT8           q_next;
+    UINT8           q_pending;
+} tBTM_BLE_IRK_Q;
+
+/* control block for BLE customer specific feature */
+typedef struct
+{
+    BOOLEAN             enable;
+
+    UINT8               op_type;
+    tBLE_BD_ADDR        cur_filter_target;
+
+    UINT8               irk_list_size;
+    UINT8               irk_avail_size;
+    tBTM_BLE_IRK_ENTRY  *irk_list;
+    tBTM_BLE_IRK_Q      irk_pend_q;
+    UINT8                max_filter_supported;
+    tBTM_BLE_PF_CMPL_CBACK *p_scan_pf_cback;
+}tBTM_BLE_VENDOR_CB;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if VENDOR_DYNAMIC_MEMORY == FALSE
+BTM_API extern tBTM_BLE_VENDOR_CB  btm_ble_vendor_cb;
+#else
+BTM_API extern tBTM_BLE_VENDOR_CB *btm_ble_vendor_ptr;
+#define btm_ble_vendor_cb (*btm_ble_vendor_ptr)
+#endif
+
+extern void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable);
+extern tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda);
+extern void btm_ble_vendor_disable_irk_list(void);
+extern BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec);
+extern void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec);
+extern tBTM_STATUS btm_ble_enable_vendor_feature (BOOLEAN enable, UINT32 feature_bit);
+
+extern void btm_ble_vendor_init(UINT8 max_irk_list_sz);
+extern void btm_ble_vendor_cleanup(void);
+extern BOOLEAN btm_ble_vendor_write_device_wl_attribute (tBLE_ADDR_TYPE addr_type, BD_ADDR bd_addr, UINT8 attribute);
+extern tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+