diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index b378ba1..9c55734 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -276,7 +276,7 @@
    public static boolean mUpdatePickerValue = false;
 
    private LoadedDataAndState SavedDataAndState = null;
-   private static String mBTsoc;
+   private static String mBTsoc = "invalid";
 
    /** fm stats property string */
    public static final String FM_STATS_PROP = "persist.fm.stats";
@@ -396,6 +396,7 @@
       if ((mERadioTextScroller == null) && (mERadioTextTV != null)) {
           mERadioTextScroller = new ScrollerText(mERadioTextTV);
       }
+      mBTsoc = SystemProperties.get("vendor.bluetooth.soc");
    }
 
    protected void setDisplayvalue(){
@@ -753,29 +754,12 @@
           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 {
              displayDialog(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 f44eb42..f925fe6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -2100,12 +2100,6 @@
       {
           return (mService.get().getAfJmpRmssiSamplesCnt());
       }
-
-      public String getSocName()
-      {
-          return (mService.get().getSocName());
-      }
-
       public boolean setAfJmpRmssiSamplesCnt(int afJmpRmssiSmplsCnt)
       {
           return (mService.get().setAfJmpRmssiSamplesCnt(afJmpRmssiSmplsCnt));
@@ -3937,13 +3931,6 @@
           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 2042052..aeb57e7 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -334,9 +334,6 @@
                           (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()) {
@@ -369,6 +366,9 @@
 
         tLayout = (TableLayout) findViewById(R.id.maintable);
 
+        if(mReceiver == null)
+            mReceiver = new FmReceiver();
+
         long curTime = System.currentTimeMillis();
         mCurrentFileName = "FMStats_".concat(
                                  Long.toString(curTime).concat(".txt")
@@ -2837,8 +2837,8 @@
         }
     }
     private void checkTransportLayer() {
-       String chip = mReceiver.getSocName();
-       if (chip.equals("pronto"))
+       String chip = SystemProperties.get("vendor.bluetooth.soc","default");
+       if (chip.equals("default"))
            mIsTransportSMD = true;
        else
            mIsTransportSMD = false;
@@ -2850,8 +2850,7 @@
     private boolean isCherokeeChip() {
         Log.d(LOGTAG, "isCherokeeChip");
 
-        String chip = mReceiver.getSocName();
-
+        String chip = SystemProperties.get("vendor.bluetooth.soc");
         if (chip.equals("cherokee"))
             return true;
         else
@@ -2859,15 +2858,16 @@
     }
 
     private boolean isRomeChip() {
-        String chip = mReceiver.getSocName();
+        String chip = "";
 
+        chip = SystemProperties.get("vendor.bluetooth.soc");
         if(chip.equals("rome"))
            return true;
         return false;
     }
 
     private boolean isHastingsChip() {
-        String chip = mReceiver.getSocName();
+        String chip = SystemProperties.get("vendor.bluetooth.soc","default");
 
         if(chip.equals("hastings"))
            return true;
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index 0d79755..cb271a3 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -69,7 +69,6 @@
     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 957947a..bf12d79 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -15,13 +15,10 @@
         libandroid_runtime \
         libnativehelper \
         liblog \
-        libcutils \
-        libbtconfigstore
+        libcutils
 
 LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
-                   $(TOP)/libnativehelper/include/nativehelper \
-                   $(TOP)/vendor/qcom/opensource/commonsys-intf/bluetooth/include \
-                   $(TOP)/vendor/qcom/opensource/commonsys/bluetooth_ext/system_bt_ext/btconfigstore
+                   $(TOP)/libnativehelper/include/nativehelper
 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 451cbf0..7ee0273 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -43,9 +43,6 @@
 #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
@@ -91,12 +88,6 @@
 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);
@@ -166,8 +157,6 @@
 jmethodID method_enableSoftMuteCallback;
 jmethodID method_FmReceiverJNICtor;
 
-int load_bt_configstore_lib();
-
 static bool checkCallbackThread() {
    JNIEnv* env = AndroidRuntime::getJNIEnv();
    if (mCallbackEnv != env || mCallbackEnv == NULL)
@@ -699,7 +688,11 @@
        return FM_JNI_FAILURE;
     }
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    property_get("vendor.bluetooth.soc", value, NULL);
+
+    ALOGD("BT soc is %s\n", value);
+
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Set the mode for soc downloader*/
        property_set("vendor.hw.fm.mode", "normal");
@@ -734,8 +727,13 @@
     int i = 0;
     int cleanup_success = 0;
     char retval =0;
+    char value[PROPERTY_VALUE_MAX] = {'\0'};
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    property_get("vendor.bluetooth.soc", value, NULL);
+
+    ALOGD("BT soc is %s\n", value);
+
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        property_set("ctl.stop", "fm_dl");
     }
@@ -744,7 +742,12 @@
 }
 
 static bool is_soc_cherokee() {
-    if(strcmp(soc_name, "cherokee") == 0)
+
+    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)
         return true;
     else
         return false;
@@ -1198,13 +1201,17 @@
 /* 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;
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    property_get("vendor.bluetooth.soc", value, NULL);
+
+    ALOGD("BT soc is %s\n", value);
+
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Enable/Disable the WAN avoidance*/
        property_set("vendor.hw.fm.init", "0");
@@ -1260,7 +1267,11 @@
     char value[PROPERTY_VALUE_MAX] = {'\0'};
     char firmwareVersion[80];
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    property_get("vendor.bluetooth.soc", value, NULL);
+
+    ALOGD("BT soc is %s\n", value);
+
+    if ((strcmp(value, "rome") != 0) && (strcmp(value, "hastings") != 0))
     {
        /*Enable/Disable Analog Mode FM*/
        property_set("vendor.hw.fm.init", "0");
@@ -1640,27 +1651,6 @@
     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");
@@ -1716,6 +1706,7 @@
 }
 
 static void initNative(JNIEnv *env, jobject object) {
+
 if (is_soc_cherokee()) {
     int status;
     ALOGI("Init native called \n");
@@ -1812,64 +1803,12 @@
              (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)
@@ -1890,22 +1829,3 @@
     }
     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 3702aac..b7baef2 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 = getSocName();
-       if (chip.equals("pronto"))
+       String chip = SystemProperties.get("vendor.bluetooth.soc","default");
+       if (chip.equals("default"))
            return true;
        else
            return false;
    }
 
    public static boolean isRomeChip() {
-       String chip = FmReceiverJNI.getSocNameNative();
+       String chip = SystemProperties.get("vendor.bluetooth.soc");
        if (chip.equals("rome"))
            return true;
        else
@@ -360,7 +360,7 @@
    }
 
    public static boolean isCherokeeChip() {
-       String chip = FmReceiverJNI.getSocNameNative();
+       String chip = SystemProperties.get("vendor.bluetooth.soc");
        if (chip.equals("cherokee"))
            return true;
        else
@@ -3088,8 +3088,4 @@
        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 9d6c273..0959659 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -567,5 +567,4 @@
     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();
 }
