diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 451cbf0..1a5cbba 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -663,17 +663,37 @@
     fm_enable_softmute_cb
 };
 /* native interface */
+
+static bool is_soc_pronto() {
+    if(strcmp(soc_name, "pronto") == 0)
+        return true;
+    else
+        return false;
+}
+
+static void get_property(int ptype, char *value)
+{
+    std::vector<vendor_property_t> vPropList;
+    bt_configstore_intf->get_vendor_properties(ptype, vPropList);
+
+    for (auto&& vendorProp : vPropList) {
+        if (vendorProp.type == ptype) {
+            strlcpy(value, vendorProp.value,PROPERTY_VALUE_MAX);
+        }
+    }
+}
+
 static jint android_hardware_fmradio_FmReceiverJNI_acquireFdNative
         (JNIEnv* env, jobject thiz, jstring path)
 {
     int fd;
     int i, retval=0, err;
     char value[PROPERTY_VALUE_MAX] = {'\0'};
-    char versionStr[40] = {'\0'};
     int init_success = 0;
     jboolean isCopy;
     v4l2_capability cap;
     const char* radio_path = env->GetStringUTFChars(path, &isCopy);
+
     if(radio_path == NULL){
         return FM_JNI_FAILURE;
     }
@@ -689,39 +709,33 @@
 
     ALOGD("VIDIOC_QUERYCAP returns :%d: version: %d \n", err , cap.version );
 
-    if( err >= 0 ) {
-       ALOGD("Driver Version(Same as ChipId): %x \n",  cap.version );
-       /*Conver the integer to string */
-       snprintf(versionStr, sizeof(versionStr), "%d", cap.version);
-       property_set("vendor.hw.fm.version", versionStr);
-    } else {
-       close(fd);
-       return FM_JNI_FAILURE;
-    }
-
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    if (is_soc_pronto())
     {
        /*Set the mode for soc downloader*/
-       property_set("vendor.hw.fm.mode", "normal");
-       /* Need to clear the hw.fm.init firstly */
-       property_set("vendor.hw.fm.init", "0");
-       property_set("ctl.start", "fm_dl");
-       sched_yield();
-       for(i=0; i<45; i++) {
-         property_get("vendor.hw.fm.init", value, NULL);
-         if (strcmp(value, "1") == 0) {
-            init_success = 1;
-            break;
-         } else {
-            usleep(WAIT_TIMEOUT);
-         }
-       }
-       ALOGE("init_success:%d after %f seconds \n", init_success, 0.2*i);
-       if(!init_success) {
-         property_set("ctl.stop", "fm_dl");
-         // close the fd(power down)
-         close(fd);
-         return FM_JNI_FAILURE;
+       if (bt_configstore_intf != NULL) {
+           bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "normal");
+
+          /* Need to clear the hw.fm.init firstly */
+          bt_configstore_intf->set_vendor_property(FM_PROP_HW_INIT, "0");
+          bt_configstore_intf->set_vendor_property(FM_PROP_CTL_START, "fm_dl");
+
+          sched_yield();
+          for(i=0; i<45; i++) {
+              get_property(FM_PROP_HW_INIT, value);
+              if (strcmp(value, "1") == 0) {
+                  init_success = 1;
+                  break;
+              } else {
+                  usleep(WAIT_TIMEOUT);
+              }
+          }
+          ALOGE("init_success:%d after %f seconds \n", init_success, 0.2*i);
+          if(!init_success) {
+             bt_configstore_intf->set_vendor_property(FM_PROP_CTL_STOP,"fm_dl");
+             // close the fd(power down)
+             close(fd);
+             return FM_JNI_FAILURE;
+          }
        }
     }
     return fd;
@@ -735,9 +749,9 @@
     int cleanup_success = 0;
     char retval =0;
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    if (is_soc_pronto() && bt_configstore_intf != NULL)
     {
-       property_set("ctl.stop", "fm_dl");
+        bt_configstore_intf->set_vendor_property(FM_PROP_CTL_STOP,"fm_dl");
     }
     close(fd);
     return FM_JNI_SUCCESS;
@@ -749,6 +763,7 @@
     else
         return false;
 }
+
 /********************************************************************
  * Current JNI
  *******************************************************************/
@@ -1204,29 +1219,33 @@
     int band;
     int err = 0;
 
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
+    if (is_soc_pronto() && bt_configstore_intf != NULL)
     {
-       /*Enable/Disable the WAN avoidance*/
-       property_set("vendor.hw.fm.init", "0");
-       if (aValue)
-          property_set("vendor.hw.fm.mode", "wa_enable");
-       else
-          property_set("vendor.hw.fm.mode", "wa_disable");
+        /* Need to clear the hw.fm.init firstly */
+        bt_configstore_intf->set_vendor_property(FM_PROP_HW_INIT, "0");
 
-       property_set("ctl.start", "fm_dl");
-       sched_yield();
-       for(i=0; i<10; i++) {
-          property_get("vendor.hw.fm.init", value, NULL);
-          if (strcmp(value, "1") == 0) {
-             init_success = 1;
-             break;
-          } else {
-             usleep(WAIT_TIMEOUT);
-          }
-       }
+        /*Enable/Disable the WAN avoidance*/
+        if (aValue)
+            bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "wa_enable");
+        else
+            bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "wa_disable");
+
+        bt_configstore_intf->set_vendor_property(FM_PROP_CTL_START, "fm_dl");
+
+        sched_yield();
+        for(i=0; i<10; i++) {
+            get_property(FM_PROP_HW_INIT, value);
+
+            if (strcmp(value, "1") == 0) {
+                init_success = 1;
+                break;
+            } else {
+                usleep(WAIT_TIMEOUT);
+            }
+        }
        ALOGE("init_success:%d after %f seconds \n", init_success, 0.2*i);
 
-       property_get("vendor.notch.value", notch, NULL);
+       get_property(FM_PROP_NOTCH_VALUE, notch);
        ALOGE("Notch = %s",notch);
        if (!strncmp("HIGH",notch,strlen("HIGH")))
            band = HIGH_BAND;
@@ -1256,33 +1275,10 @@
 /* native interface */
 static jint android_hardware_fmradio_FmReceiverJNI_setAnalogModeNative(JNIEnv * env, jobject thiz, jboolean aValue)
 {
-    int i=0;
-    char value[PROPERTY_VALUE_MAX] = {'\0'};
-    char firmwareVersion[80];
-
-    if ((strcmp(soc_name, "rome") != 0) && (strcmp(soc_name, "hastings") != 0))
-    {
-       /*Enable/Disable Analog Mode FM*/
-       property_set("vendor.hw.fm.init", "0");
-       property_set("vendor.hw.fm.mode","config_dac");
-       property_set("ctl.start", "fm_dl");
-       sched_yield();
-       for(i=0; i<10; i++) {
-          property_get("vendor.hw.fm.init", value, NULL);
-          if (strcmp(value, "1") == 0) {
-             return 1;
-          } else {
-             usleep(WAIT_TIMEOUT);
-          }
-       }
-    }
-
+    /*DAC configuration is applicable only msm7627a target*/
     return 0;
 }
 
-
-
-
 /*
  * Interfaces added for Tx
 */
