diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
index f4b7e5400ef29e00a09121dde5232b1ea06e950c..f3554f27c400874f99a56becbfbc8229259619f5 100644
--- a/fm_hci/fm_hci.c
+++ b/fm_hci/fm_hci.c
@@ -101,7 +101,6 @@ void dequeue_fm_tx_cmd()
         lib_running = 0;
         return;
     }
-
     /*
      * Save the 'first' pointer and make it NULL.
      * This is to allow the FM-HAL to enqueue more CMDs to the TX_Q
@@ -240,13 +239,13 @@ static int read_fm_event(int fd, FM_EVT_HDR *pbuf, int len)
                     ALOGV("%s: read() returned %d bytes of FM event/data\n", __func__, ret);
                     while (ret > 0) {
                         if (pbuf->evt_code == FM_CMD_COMPLETE) {
-                            ALOGV("\n\t%s: Received %d bytes of CC event data from WCNSS FILTER!!!\n\t"
+                            ALOGI("\n\t%s: Received %d bytes of CC event data from WCNSS FILTER!!!\n\t"
                                 "Evt type\t: 0x%x \n\tEvt Code\t: 0x%x \n\tEvt len\t\t: 0x%x \n\topcode\t\t: 0x%x%x \n\tCmd Credits\t: 0x%x \n\tStatus\t\t: 0x%x\n",
                                 __func__, ret, pbuf->protocol_byte, pbuf->evt_code, pbuf->evt_len, pbuf->cmd_params[2], pbuf->cmd_params[1],
                             pbuf->cmd_params[0], pbuf->cmd_params[3]);
                             evt_type = FM_CMD_COMPLETE;
                         } else if (pbuf->evt_code == FM_CMD_STATUS) {
-                            ALOGV("\n\t%s: Received %d bytes of CS event data from WCNSS FILTER!!!\n\t"
+                            ALOGI("\n\t%s: Received %d bytes of CS event data from WCNSS FILTER!!!\n\t"
                                 "Evt type\t: 0x%x \n\tEvt Code\t: 0x%x \n\tEvt len\t\t: 0x%x \n\topcode\t\t: 0x%x%x \n\tCmd Credits\t: 0x%x \n\tStatus\t\t: 0x%x\n",
                                 __func__, ret, pbuf->protocol_byte, pbuf->evt_code, pbuf->evt_len, pbuf->cmd_params[3], pbuf->cmd_params[2],
                             pbuf->cmd_params[1], pbuf->cmd_params[0]);
@@ -320,13 +319,13 @@ static void *userial_read_thread(void *arg)
 
     FM_EVT_HDR *evt_buf = (FM_EVT_HDR *) malloc(sizeof(FM_EVT_HDR) + MAX_FM_EVT_PARAMS);
 
-    ALOGE("%s: Wait for events from the WCNSS Filter", __func__);
+    ALOGD("%s: Wait for events from the WCNSS Filter", __func__);
     length = read_fm_event(fm_fd, evt_buf, sizeof(FM_EVT_HDR) + MAX_FM_EVT_PARAMS);
-    ALOGE("length=%d\n",length);
+    ALOGD("length=%d\n",length);
     if(length <=0) {
        lib_running =0;
     }
-    ALOGE("%s: Leaving userial_read_thread()", __func__);
+    ALOGD("%s: Leaving userial_read_thread()", __func__);
     pthread_exit(NULL);
     return arg;
 }
@@ -358,15 +357,6 @@ static void* fmHCITask(void *arg)
     }
 
     ALOGE("%s: ##### Exiting fmHCITask Worker thread!!! #####", __func__);
-    ret = pthread_mutex_unlock(&fmHCIControlBlock.credit_lock);
-    ALOGE("%s: credit lock ret value =%d #####", __func__, ret);
-    pthread_mutex_destroy(&fmHCIControlBlock.credit_lock);
-    ret = pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock);
-    ALOGE("%s: tx queue lock ret value =%d #####", __func__, ret);
-    pthread_mutex_destroy(&fmHCIControlBlock.tx_q_lock);
-    ret = pthread_mutex_unlock(&fmHCIControlBlock.event_lock);
-    ALOGE("%s: event lock ret value =%d #####", __func__, ret);
-    pthread_mutex_destroy(&fmHCIControlBlock.event_lock);
     return arg;
 }
 
@@ -469,9 +459,7 @@ int open_serial_port()
         lib_running = 0;
         return FM_HC_STATUS_FAIL;
     }
-
     return 0;
-
 err:
     ALOGI("%s: Closing the TTy Serial port due to error!!!", __func__);
     ret = fm_vnd_if->op(BT_VND_OP_FM_USERIAL_CLOSE, NULL);
@@ -519,6 +507,22 @@ int transmit(FM_HDR *pbuf)
 
     if ((status = enqueue_fm_tx_cmd(pbuf)) == FM_HC_STATUS_SUCCESS)
         event_notification(HC_EVENT_TX);
+    /* Cleanup Threads if Disable command sent */
+    if ((pbuf->opcode == hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
+                    HCI_OCF_FM_DISABLE_RECV_REQ))) {
+        ALOGD("FM Disable cmd. Waiting for threads to finish");
+        if ((status = pthread_join(fmHCIControlBlock.fmHCITaskThreadId, NULL)))
+            ALOGE("Failed to join HCI task thread. err = %d", status);
+        if ((status = pthread_join(fmHCIControlBlock.fmRxTaskThreadId, NULL)))
+            ALOGE("Failed to join HCI reader thread. err = %d", status);
+        pthread_cond_destroy(&fmHCIControlBlock.cmd_credits_cond);
+        pthread_cond_destroy(&fmHCIControlBlock.event_cond);
+        pthread_mutex_destroy(&fmHCIControlBlock.event_lock);
+        pthread_mutex_destroy(&fmHCIControlBlock.credit_lock);
+        pthread_mutex_destroy(&fmHCIControlBlock.tx_q_lock);
+        ALOGD("All Threads are done. Exiting.");
+    }
+
     return status;
 }
 
@@ -536,22 +540,12 @@ void userial_close_reader(void) {
 
 void fm_userial_close(void) {
 
+    ALOGD("%s  close fm userial ", __func__);
+    lib_running = 0;
+    fm_vnd_if->op(BT_VND_OP_FM_USERIAL_CLOSE, NULL);
+    fm_fd = -1;
+    ready_events = HC_EVENT_EXIT;
     pthread_cond_signal(&fmHCIControlBlock.event_cond);
-    pthread_cond_destroy(&fmHCIControlBlock.event_cond);
     pthread_cond_signal(&fmHCIControlBlock.cmd_credits_cond);
-    pthread_cond_destroy(&fmHCIControlBlock.cmd_credits_cond);
-
-    // Join the reader thread if it's still running.
-    if (lib_running) {
-        fm_send_event(USERIAL_RX_EXIT);
-        int result = pthread_join(fmHCIControlBlock.fmRxTaskThreadId, NULL);
-        if (result)
-            ALOGE("%s failed to join reader thread: %d", __func__, result);
-    }
-    lib_running =0;
-    ALOGE("%s  close fm userial ", __func__);
-    fm_vnd_if->op(BT_VND_OP_FM_USERIAL_CLOSE, NULL);
     // Free all buffers still waiting in the RX queue.
-    //  TODO: use list data structure and clean this up.
-    fm_fd = -1;
 }