diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index ae10b84..9865f4a 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -271,7 +271,7 @@
    public static boolean mUpdatePickerValue = false;
 
    private LoadedDataAndState SavedDataAndState = null;
-   private static String mBTsoc = "invalid";
+   private static String mBTsoc;
 
    /** fm stats property string */
    public static final String FM_STATS_PROP = "persist.fm.stats";
@@ -390,7 +390,6 @@
       if ((mERadioTextScroller == null) && (mERadioTextTV != null)) {
           mERadioTextScroller = new ScrollerText(mERadioTextTV);
       }
-      mBTsoc = SystemProperties.get("vendor.bluetooth.soc");
    }
 
    protected void setDisplayvalue(){
@@ -737,12 +736,29 @@
           startActivity(launchFMStatIntent);
           return true;
       case MENU_SCAN_START:
+          Log.d(LOGTAG, "mBTsoc: " + mBTsoc + " mService: " + mService);
+
+          if (mBTsoc == null) {
+              if (mService != null) {
+                  try {
+                      mBTsoc = mService.getSocName();
+                      Log.d(LOGTAG, "mBTsoc: " + mBTsoc);
+                  }catch (RemoteException e) {
+                      e.printStackTrace();
+                      return false;
+                  }
+              } else {
+                return false;
+              }
+          }
+
          if (mBTsoc.equals("rome")) {
-             clearStationList();
-             initiateSearch(0); // 0 - All stations
-         } else {
-             showDialog(DIALOG_SEARCH);
+               clearStationList();
+               initiateSearch(0); // 0 - All stations
+           } else {
+               showDialog(DIALOG_SEARCH);
          }
+
          return true;
       case MENU_SCAN_STOP:
          cancelSearch();
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 4686673..24be178 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -2066,6 +2066,12 @@
       {
           return (mService.get().getAfJmpRmssiSamplesCnt());
       }
+
+      public String getSocName()
+      {
+          return (mService.get().getSocName());
+      }
+
       public boolean setAfJmpRmssiSamplesCnt(int afJmpRmssiSmplsCnt)
       {
           return (mService.get().setAfJmpRmssiSamplesCnt(afJmpRmssiSmplsCnt));
@@ -3897,6 +3903,13 @@
           else
              return Integer.MIN_VALUE;
    }
+
+   String getSocName() {
+          if(mReceiver != null)
+             return mReceiver.getSocName();
+          else
+             return null;
+   }
    private void setAlarmSleepExpired (long duration) {
        Intent i = new Intent(SLEEP_EXPIRED_ACTION);
        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 7ea1299..40cb4ec 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -332,6 +332,9 @@
                           (this, R.array.band_sweep_methods,
                             android.R.layout.simple_spinner_item);
 
+        if(mReceiver == null)
+            mReceiver = new FmReceiver();
+
         Log.d(LOGTAG, "oncreate");
         checkTransportLayer();
         if (isCherokeeChip()) {
@@ -361,9 +364,6 @@
 
         tLayout = (TableLayout) findViewById(R.id.maintable);
 
-        if(mReceiver == null)
-            mReceiver = new FmReceiver();
-
         long curTime = System.currentTimeMillis();
         mCurrentFileName = "FMStats_".concat(
                                  Long.toString(curTime).concat(".txt")
@@ -2880,8 +2880,8 @@
         }
     }
     private void checkTransportLayer() {
-       String chip = SystemProperties.get("vendor.bluetooth.soc","default");
-       if (chip.equals("default"))
+       String chip = mReceiver.getSocName();
+       if (chip.equals("pronto"))
            mIsTransportSMD = true;
        else
            mIsTransportSMD = false;
@@ -2893,7 +2893,8 @@
     private boolean isCherokeeChip() {
         Log.d(LOGTAG, "isCherokeeChip");
 
-        String chip = SystemProperties.get("vendor.bluetooth.soc");
+        String chip = mReceiver.getSocName();
+
         if (chip.equals("cherokee"))
             return true;
         else
@@ -2901,9 +2902,8 @@
     }
 
     private boolean isRomeChip() {
-        String chip = "";
+        String chip = mReceiver.getSocName();
 
-        chip = SystemProperties.get("vendor.bluetooth.soc");
         if(chip.equals("rome"))
            return true;
         return false;
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index cb271a3..0d79755 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -69,6 +69,7 @@
     int getAfJmpRmssiTh();
     int getGoodChRmssiTh();
     int getAfJmpRmssiSamplesCnt();
+    String getSocName();
     boolean setRxRepeatCount(int count);
     long getRecordingStartTime();
     boolean isSleepTimerActive();
diff --git a/jni/Android.mk b/jni/Android.mk
index bf12d79..957947a 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -15,10 +15,13 @@
         libandroid_runtime \
         libnativehelper \
         liblog \
-        libcutils
+        libcutils \
+        libbtconfigstore
 
 LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
-                   $(TOP)/libnativehelper/include/nativehelper
+                   $(TOP)/libnativehelper/include/nativehelper \
+                   $(TOP)/vendor/qcom/opensource/commonsys-intf/bluetooth/include \
+                   $(TOP)/vendor/qcom/opensource/commonsys/bluetooth_ext/system_bt_ext/btconfigstore
 LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
 
 LOCAL_MODULE := libqcomfm_jni
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 789d52f..bb0b25e 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -43,6 +43,9 @@
 #include <dlfcn.h>
 #include "android_runtime/Log.h"
 #include "android_runtime/AndroidRuntime.h"
+#include "bt_configstore.h"
+#include <vector>
+
 
 #define RADIO "/dev/radio0"
 #define FM_JNI_SUCCESS 0L
@@ -88,6 +91,12 @@
 void *lib_handle;
 static int slimbus_flag = 0;
 
+static char soc_name[16];
+bool isSocNameAvailable = false;
+static bt_configstore_interface_t* bt_configstore_intf = NULL;
+static void *bt_configstore_lib_handle = NULL;
+
+
 typedef void (*enb_result_cb)();
 typedef void (*tune_rsp_cb)(int Freq);
 typedef void (*seek_rsp_cb)(int Freq);
@@ -156,6 +165,8 @@
 jmethodID method_enableSlimbusCallback;
 jmethodID method_enableSoftMuteCallback;
 
+int load_bt_configstore_lib();
+
 static bool checkCallbackThread() {
    JNIEnv* env = AndroidRuntime::getJNIEnv();
    if (mCallbackEnv != env || mCallbackEnv == NULL)
@@ -685,11 +696,7 @@
        return FM_JNI_FAILURE;
     }
 
-    property_get("vendor.bluetooth.soc", value, NULL);
-
-    ALOGD("BT soc is %s\n", value);
-
-    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
+    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
     {
        /*Set the mode for soc downloader*/
        property_set("vendor.hw.fm.mode", "normal");
@@ -724,13 +731,8 @@
     int i = 0;
     int cleanup_success = 0;
     char retval =0;
-    char value[PROPERTY_VALUE_MAX] = {'\0'};
 
-    property_get("vendor.bluetooth.soc", value, NULL);
-
-    ALOGD("BT soc is %s\n", value);
-
-    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
+    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
     {
        property_set("ctl.stop", "fm_dl");
     }
@@ -739,12 +741,7 @@
 }
 
 static bool is_soc_cherokee() {
-
-    char value[PROPERTY_VALUE_MAX] = {'\0'};
-    property_get("vendor.bluetooth.soc", value, NULL);
-    ALOGD("BT soc is %s\n", value);
-
-    if(strcmp(value, "cherokee") == 0)
+    if(strcmp(soc_name, "cherokee") == 0)
         return true;
     else
         return false;
@@ -1198,17 +1195,13 @@
 /* native interface */
 static jint android_hardware_fmradio_FmReceiverJNI_setNotchFilterNative(JNIEnv * env, jobject thiz,jint fd, jint id, jboolean aValue)
 {
-    char value[PROPERTY_VALUE_MAX] = {'\0'};
     int init_success = 0,i;
     char notch[PROPERTY_VALUE_MAX] = {0x00};
+    char value[PROPERTY_VALUE_MAX];
     int band;
     int err = 0;
 
-    property_get("vendor.bluetooth.soc", value, NULL);
-
-    ALOGD("BT soc is %s\n", value);
-
-    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
+    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
     {
        /*Enable/Disable the WAN avoidance*/
        property_set("vendor.hw.fm.init", "0");
@@ -1264,11 +1257,7 @@
     char value[PROPERTY_VALUE_MAX] = {'\0'};
     char firmwareVersion[80];
 
-    property_get("vendor.bluetooth.soc", value, NULL);
-
-    ALOGD("BT soc is %s\n", value);
-
-    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
+    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
     {
        /*Enable/Disable Analog Mode FM*/
        property_set("vendor.hw.fm.init", "0");
@@ -1648,6 +1637,27 @@
     return err;
 }
 
+static jstring android_hardware_fmradio_FmReceiverJNI_getSocNameNative
+ (JNIEnv* env)
+{
+    ALOGI("%s, bt_configstore_intf: %p isSocNameAvailable: %d",
+        __FUNCTION__, bt_configstore_intf, isSocNameAvailable);
+
+    if (bt_configstore_intf != NULL && isSocNameAvailable == false) {
+       std::vector<vendor_property_t> vPropList;
+
+       bt_configstore_intf->get_vendor_properties(BT_PROP_SOC_TYPE, vPropList);
+       for (auto&& vendorProp : vPropList) {
+          if (vendorProp.type == BT_PROP_SOC_TYPE) {
+            strlcpy(soc_name, vendorProp.value, sizeof(soc_name));
+            isSocNameAvailable = true;
+            ALOGI("%s:: soc_name = %s",__func__, soc_name);
+          }
+       }
+    }
+    return env->NewStringUTF(soc_name);
+}
+
 static void classInitNative(JNIEnv* env, jclass clazz) {
 
     ALOGI("ClassInit native called \n");
@@ -1702,7 +1712,6 @@
 }
 
 static void initNative(JNIEnv *env, jobject object) {
-
 if (is_soc_cherokee()) {
     int status;
     ALOGI("Init native called \n");
@@ -1799,12 +1808,64 @@
              (void*)android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative},
         { "enableSoftMute", "(II)I",
              (void*)android_hardware_fmradio_FmReceiverJNI_enableSoftMuteNative},
+        {"getSocNameNative", "()Ljava/lang/String;",
+             (void*) android_hardware_fmradio_FmReceiverJNI_getSocNameNative},
 };
 
 int register_android_hardware_fm_fmradio(JNIEnv* env)
 {
+        ALOGI("%s, bt_configstore_intf", __FUNCTION__, bt_configstore_intf);
+        if (bt_configstore_intf == NULL) {
+          load_bt_configstore_lib();
+        }
+
         return jniRegisterNativeMethods(env, "qcom/fmradio/FmReceiverJNI", gMethods, NELEM(gMethods));
 }
+
+int deregister_android_hardware_fm_fmradio(JNIEnv* env)
+{
+        if (bt_configstore_lib_handle) {
+            dlclose(bt_configstore_lib_handle);
+            bt_configstore_lib_handle = NULL;
+            bt_configstore_intf = NULL;
+        }
+        return 0;
+}
+
+int load_bt_configstore_lib() {
+    const char* sym = BT_CONFIG_STORE_INTERFACE_STRING;
+
+    bt_configstore_lib_handle = dlopen("libbtconfigstore.so", RTLD_NOW);
+    if (!bt_configstore_lib_handle) {
+        const char* err_str = dlerror();
+        ALOGE("%s:: failed to load Bt Config store library, error= %s",
+            __func__, (err_str) ? err_str : "error unknown");
+        goto error;
+    }
+
+    // Get the address of the bt_configstore_interface_t.
+    bt_configstore_intf = (bt_configstore_interface_t*)dlsym(bt_configstore_lib_handle, sym);
+    if (!bt_configstore_intf) {
+        ALOGE("%s:: failed to load symbol from bt config store library = %s",
+            __func__, sym);
+        goto error;
+    }
+
+    // Success.
+    ALOGI("%s::  loaded HAL: bt_configstore_interface_t = %p , bt_configstore_lib_handle= %p",
+        __func__, bt_configstore_intf, bt_configstore_lib_handle);
+    return 0;
+
+  error:
+    if (bt_configstore_lib_handle) {
+      dlclose(bt_configstore_lib_handle);
+      bt_configstore_lib_handle = NULL;
+      bt_configstore_intf = NULL;
+    }
+
+    return -EINVAL;
+}
+
 } // end namespace
 
 jint JNI_OnLoad(JavaVM *jvm, void *reserved)
@@ -1825,3 +1886,22 @@
     }
     return JNI_VERSION_1_6;
 }
+
+jint JNI_OnUnLoad(JavaVM *jvm, void *reserved)
+{
+    JNIEnv *e;
+    int status;
+    g_jVM = jvm;
+
+    ALOGI("FM : unLoading QCOMM FM-JNI");
+    if (jvm->GetEnv((void **)&e, JNI_VERSION_1_6)) {
+        ALOGE("JNI version mismatch error");
+        return JNI_ERR;
+    }
+
+    if ((status = android::deregister_android_hardware_fm_fmradio(e)) < 0) {
+        ALOGE("jni adapter service unregistration failure, status: %d", status);
+        return JNI_ERR;
+    }
+    return JNI_VERSION_1_6;
+}
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index b7baef2..3702aac 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -344,15 +344,15 @@
    private static final int SEARCH_SINR_INT = 1;
 
    public boolean isSmdTransportLayer() {
-       String chip = SystemProperties.get("vendor.bluetooth.soc","default");
-       if (chip.equals("default"))
+       String chip = getSocName();
+       if (chip.equals("pronto"))
            return true;
        else
            return false;
    }
 
    public static boolean isRomeChip() {
-       String chip = SystemProperties.get("vendor.bluetooth.soc");
+       String chip = FmReceiverJNI.getSocNameNative();
        if (chip.equals("rome"))
            return true;
        else
@@ -360,7 +360,7 @@
    }
 
    public static boolean isCherokeeChip() {
-       String chip = SystemProperties.get("vendor.bluetooth.soc");
+       String chip = FmReceiverJNI.getSocNameNative();
        if (chip.equals("cherokee"))
            return true;
        else
@@ -3088,4 +3088,8 @@
        Log.d(TAG, "enableSoftMute :enable =" + enable);
        mControl.enableSoftMute(sFd, enable);
    }
+
+   public String getSocName() {
+     return FmReceiverJNI.getSocNameNative();
+   }
 }
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index 3e39e9a..6d36b19 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -563,4 +563,5 @@
     static native void configurePerformanceParams(int fd);
     static native int enableSlimbus(int fd, int val);
     static native int enableSoftMute(int fd, int val);
+    static native String getSocNameNative();
 }
