diff --git a/fm_hci/fm_hci.cpp b/fm_hci/fm_hci.cpp
index 76949d2..6a9dba6 100644
--- a/fm_hci/fm_hci.cpp
+++ b/fm_hci/fm_hci.cpp
@@ -661,7 +661,14 @@
                 __func__, hci.state);
         if(hci.state == FM_RADIO_ENABLING){
             Lock lk(hci.on_mtx);
-            hci.on_cond.wait(lk);
+            std::cv_status status = std::cv_status::no_timeout;
+            auto now = std::chrono::system_clock::now();
+            status =
+               hci.on_cond.wait_until(lk, now + std::chrono::seconds(HCI_TIMEOUT));
+             if (status == std::cv_status::timeout) {
+                 ALOGE("hci_initialize failed, kill the fm process");
+                 kill(getpid(), SIGKILL);
+             }
         }
     }
 
diff --git a/fm_hci/fm_hci.h b/fm_hci/fm_hci.h
index 8470519..aa3c2b7 100644
--- a/fm_hci/fm_hci.h
+++ b/fm_hci/fm_hci.h
@@ -35,7 +35,7 @@
 #define FM_CMD_COMPLETE 0x0f
 #define FM_CMD_STATUS   0x10
 #define FM_HW_ERR_EVENT 0x1A
-
+#define HCI_TIMEOUT 3
 struct fm_hci_t {
     public:
         fm_power_state_t state;
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 0ef3a1b..6172710 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -143,7 +143,7 @@
    private boolean mServiceInUse = false;
    private static boolean mMuted = false;
    private static boolean mResumeAfterCall = false;
-   private static int mAudioDevice = 0;
+   private static int mAudioDevice = AudioDeviceInfo.TYPE_WIRED_HEADPHONES;
    MediaRecorder mRecorder = null;
    MediaRecorder mA2dp = null;
    private boolean mFMOn = false;
@@ -391,7 +391,7 @@
                " DeviceLoopbackActive = " + mIsFMDeviceLoopbackActive +
                " mStoppedOnFocusLoss = "+mStoppedOnFocusLoss);
         int mAudioDeviceType;
-  
+
         AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
         if(enable) {
             if(mIsFMDeviceLoopbackActive || mStoppedOnFocusLoss) {
@@ -399,8 +399,19 @@
                   "or Already devcie loop back is acive, not enabling audio");
                 return false;
             }
-            if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-                enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+            String status = audioManager.getParameters("fm_status");
+            Log.d(LOGTAG," FM hardwareLoopback Status = " + status);
+            if (status.contains("1")) {
+               /* This case usually happens, when FM is force killed through settings app
+                * and we don't get chance to disable Hardware LoopBack.
+                * Hardware LoopBack will be running,disable it first and enable again
+                * using routing set param to audio */
+               Log.d(LOGTAG," FM HardwareLoopBack Active, disable it first and enable again");
+               mAudioDeviceType =
+                  AudioDeviceInfo.TYPE_WIRED_HEADPHONES | AudioSystem.DEVICE_OUT_FM;
+               String keyValPairs = new String("fm_routing="+mAudioDeviceType);
+               Log.d(LOGTAG, "keyValPairs = "+keyValPairs);
+               audioManager.setParameters(keyValPairs);
             }
             mIsFMDeviceLoopbackActive = true;
             /*or with DEVICE_OUT_FM to support backward compatiblity*/
@@ -422,6 +433,16 @@
         return true;
     }
 
+    private void setCurrentFMVolume() {
+        if(isFmOn()) {
+            AudioManager maudioManager =
+                    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+            int mCurrentVolumeIndex =
+                    maudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+            setFMVolume(mCurrentVolumeIndex);
+        }
+    }
+
     /**
       * Registers an intent to listen for ACTION_MEDIA_UNMOUNTED notifications.
       * The intent will call closeExternalStorageFiles() if the external media
@@ -584,6 +605,10 @@
                             stopRecording();
                         }
                     } else if( action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
+                        if(!isFmOn()) {
+                            Log.d(LOGTAG, "FM is Turned off ,not applying the changed volume");
+                            return;
+                        }
                         int streamType =
                               intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
                         if (streamType == AudioManager.STREAM_MUSIC) {
@@ -591,8 +616,19 @@
                               intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1);
                             setFMVolume(mCurrentVolumeIndex);
                         }
-                    }
+                    } else if (action.equals(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED)) {
+                            mHandler.removeCallbacks(mFmVolumeHandler);
+                            mHandler.post(mFmVolumeHandler);
 
+                    } else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+                        int state =
+                           intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
+                        Log.d(LOGTAG, "ACTION_STATE_CHANGED state :"+ state);
+                        if (state == BluetoothAdapter.STATE_OFF) {
+                            mHandler.removeCallbacks(mFmVolumeHandler);
+                            mHandler.post(mFmVolumeHandler);
+                        }
+                    }
                 }
             };
             AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
@@ -602,6 +638,8 @@
             iFilter.addAction("HDMI_CONNECTED");
             iFilter.addAction(Intent.ACTION_SHUTDOWN);
             iFilter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
+            iFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+            iFilter.addAction(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED);
             iFilter.addCategory(Intent.CATEGORY_DEFAULT);
             registerReceiver(mHeadsetReceiver, iFilter);
         }
@@ -705,7 +743,17 @@
         }
     }
 
-
+    final Runnable    mFmVolumeHandler = new Runnable() {
+        public void run() {
+            try {
+                Thread.sleep(1000);
+            } catch (Exception ex) {
+                Log.d( LOGTAG, "RunningThread InterruptedException");
+                return;
+            }
+            setCurrentFMVolume();
+        }
+    };
 
     final Runnable    mHeadsetPluginHandler = new Runnable() {
         public void run() {
@@ -788,6 +836,9 @@
       if (isFmOn()) {
           setLowPowerMode(false);
           startFM();
+          if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+          }
       }
    }
 
@@ -970,12 +1021,26 @@
        }
 
        if (mStoppedOnFocusLoss) {
-           AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-           int granted = audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
-                   AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
-           if (granted != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-               Log.d(LOGTAG, "audio focuss couldnot be granted");
-               return;
+           for(int i = 0; i < 4; i++)
+           {
+              AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+              int granted =
+                   audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
+                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+              if (granted == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+                  Log.d(LOGTAG, "audio focuss granted");
+                  break;
+              } else {
+                  Log.d(LOGTAG, "audio focuss couldnot granted retry after some time");
+                  /*in case of call and fm concurency case focus is abandon
+                  ** after on call state callback, need to retry to get focus*/
+                  try {
+                      Thread.sleep(200);
+                  } catch (Exception ex) {
+                      Log.d( LOGTAG, "RunningThread InterruptedException");
+                      return;
+                  }
+              }
            }
        }
        mSession.setActive(true);
@@ -1541,8 +1606,13 @@
                           break;
                       }
 
-                      if(false == mPlaybackInProgress)
+                      if(false == mPlaybackInProgress) {
                           startFM();
+                          if (mReceiver.isCherokeeChip() &&
+                                (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+                              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+                          }
+                      }
                       mSession.setActive(true);
                       break;
                   default:
@@ -2312,6 +2382,9 @@
          else
          {
            if (mReceiver.isCherokeeChip()) {
+               if (mPref.getBoolean("SLIMBUS_SEQ", true)) {
+                   enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+               }
                bStatus = fmTurnOnSequenceCherokee();
            } else {
                bStatus = fmTurnOnSequence();
@@ -2332,10 +2405,6 @@
       if(audioManager != null)
       {
          Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
-         if ((mReceiver != null) && mReceiver.isCherokeeChip() &&
-                     (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-              enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
-         }
          stopFM();
          unMute();
          // If call is active, we will use audio focus to resume fm after call ends.
@@ -3931,6 +4000,9 @@
            audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
                   AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            startFM();
+           if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+           }
            mStoppedOnFocusLoss = false;
        }
    }
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 79f40a4..019db8c 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -59,9 +59,12 @@
 uint64_t flag;
 static int slimbus_flag = 0;
 struct fm_hal_t *hal = NULL;
+static pthread_mutex_t hal_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t hal_cond = PTHREAD_COND_INITIALIZER;
 
 #define LOG_TAG "radio_helium"
 #define WAIT_TIMEOUT 20000 /* 20*1000us */
+#define HAL_TIMEOUT  3
 
 static void radio_hci_req_complete(char result)
 {
@@ -1099,6 +1102,7 @@
     ALOGI("fm_hci_close_done");
     fm_hal_callbacks_t *ptr = NULL;
 
+    pthread_mutex_lock(&hal_lock);
     if(hal != NULL){
         ptr = hal->jni_cb;
         ALOGI("clearing hal ");
@@ -1114,6 +1118,8 @@
         ptr->disabled_cb();
         ptr->thread_evt_cb(1);
     }
+    pthread_cond_broadcast(&hal_cond);
+    pthread_mutex_unlock(&hal_lock);
     return 0;
 }
 
@@ -1276,27 +1282,31 @@
 {
     int ret = -FM_HC_STATUS_FAIL, i;
     fm_hci_hal_t hci_hal;
+    struct timespec ts;
 
     ALOGD("++%s", __func__);
 
     memset(&hci_hal, 0, sizeof(fm_hci_hal_t));
 
-    if (hal) {
-        ALOGE("%s:HAL is still available from the last session, please wait for sometime", __func__);
-        for(i=0; i<10; i++) {
-            if (!hal) {
-                break;
+    pthread_mutex_lock(&(hal_lock));
+    while (hal) {
+        ALOGE("%s:HAL is still available wait for last hal session to close", __func__);
+        if ((ret = clock_gettime(CLOCK_REALTIME, &ts)) == 0) {
+            ts.tv_sec += HAL_TIMEOUT;
+            ret = pthread_cond_timedwait(&hal_cond, &hal_lock,
+                    &ts);
+            if(ret == ETIMEDOUT) {
+                ALOGE("%s:FM Hci close is stuck kiiling the fm process", __func__);
+                kill(getpid(), SIGKILL);
             } else {
-                usleep(WAIT_TIMEOUT);
+                ALOGD("%s:last HAL session is closed ", LOG_TAG);
             }
+        } else {
+            ALOGE("%s: clock gettime failed. err = %d(%s)", LOG_TAG,
+                    errno, strerror(errno));
         }
     }
-
-    if (hal) {
-        ALOGE("%s:Last FM session didnot end properly, please launch again", __func__);
-        hal = NULL;
-        return ret;
-    }
+    pthread_mutex_unlock(&hal_lock);
 
     hal = malloc(sizeof(struct fm_hal_t));
     if (!hal) {
@@ -1359,9 +1369,11 @@
     struct hci_fm_def_data_wr_req def_data_wrt;
     struct hci_fm_def_data_rd_req def_data_rd;
 
+    pthread_mutex_lock(&hal_lock);
     if (!hal) {
         ALOGE("%s:ALERT: command sent before hal init", __func__);
-        return -FM_HC_STATUS_FAIL;
+        ret = -FM_HC_STATUS_FAIL;
+        goto end;
     }
     ALOGD("%s:cmd: %x, val: %d",LOG_TAG, cmd, val);
 
@@ -1946,6 +1958,7 @@
 end:
     if (ret < 0)
         ALOGE("%s:%s: 0x%x cmd failed", LOG_TAG, __func__, cmd);
+    pthread_mutex_unlock(&hal_lock);
     return ret;
 }
 
@@ -1954,31 +1967,33 @@
     int ret = 0;
     struct hci_fm_def_data_rd_req def_data_rd;
 
+    pthread_mutex_lock(&hal_lock);
     if (!hal) {
         ALOGE("%s:ALERT: command sent before hal_init", __func__);
-        return -FM_HC_STATUS_FAIL;
+        ret = -FM_HC_STATUS_FAIL;
+        goto end;
     }
 
     ALOGE("%s: cmd = 0x%x", __func__, cmd);
     switch(cmd) {
     case HCI_FM_HELIUM_FREQ:
         if (!val)
-            return -FM_HC_STATUS_NULL_POINTER;
+            ret = -FM_HC_STATUS_NULL_POINTER;
         *val = hal->radio->fm_st_rsp.station_rsp.station_freq;
         break;
     case HCI_FM_HELIUM_UPPER_BAND:
         if (!val)
-            return -FM_HC_STATUS_NULL_POINTER;
+            ret = -FM_HC_STATUS_NULL_POINTER;
         *val = hal->radio->recv_conf.band_high_limit;
         break;
     case HCI_FM_HELIUM_LOWER_BAND:
         if (!val)
-            return -FM_HC_STATUS_NULL_POINTER;
+            ret = -FM_HC_STATUS_NULL_POINTER;
         *val = hal->radio->recv_conf.band_low_limit;
         break;
     case HCI_FM_HELIUM_AUDIO_MUTE:
         if (!val)
-            return -FM_HC_STATUS_NULL_POINTER;
+            ret = -FM_HC_STATUS_NULL_POINTER;
         *val = hal->radio->mute_mode.hard_mute;
         break;
     case HCI_FM_HELIUM_SINR_SAMPLES:
@@ -2122,8 +2137,11 @@
     default:
         break;
     }
+
+end:
     if (ret < 0)
         ALOGE("%s:%s: %d cmd failed", LOG_TAG, __func__, cmd);
+    pthread_mutex_unlock(&hal_lock);
     return ret;
 }
 
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 0dca4fa..789d52f 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -689,7 +689,7 @@
 
     ALOGD("BT soc is %s\n", value);
 
-    if (strcmp(value, "rome") != 0)
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Set the mode for soc downloader*/
        property_set("vendor.hw.fm.mode", "normal");
@@ -730,7 +730,7 @@
 
     ALOGD("BT soc is %s\n", value);
 
-    if (strcmp(value, "rome") != 0)
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        property_set("ctl.stop", "fm_dl");
     }
@@ -1208,7 +1208,7 @@
 
     ALOGD("BT soc is %s\n", value);
 
-    if (strcmp(value, "rome") != 0)
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Enable/Disable the WAN avoidance*/
        property_set("vendor.hw.fm.init", "0");
@@ -1268,7 +1268,7 @@
 
     ALOGD("BT soc is %s\n", value);
 
-    if (strcmp(value, "rome") != 0)
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Enable/Disable Analog Mode FM*/
        property_set("vendor.hw.fm.init", "0");
