diff --git a/hal/Android.mk b/hal/Android.mk
index a67ce7c..c39900e 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -102,7 +102,8 @@
 	voice.c \
 	platform_info.c \
 	$(AUDIO_PLATFORM)/platform.c \
-        acdb.c
+        acdb.c \
+        ahal_config_helper.cpp
 
 LOCAL_SRC_FILES += audio_extn/audio_extn.c \
                    audio_extn/audio_feature_manager.c \
@@ -343,13 +344,15 @@
     libaudioroute \
     libdl \
     libaudioutils \
-    libexpat
+    libexpat \
+    libqti_vndfwk_detect
 
 LOCAL_C_INCLUDES += \
     external/tinyalsa/include \
     external/tinycompress/include \
     system/media/audio_utils/include \
     external/expat/lib \
+    vendor/qcom/opensource/core-utils/fwk-detect \
     $(call include-path-for, audio-route) \
     $(call include-path-for, audio-effects) \
     $(LOCAL_PATH)/$(AUDIO_PLATFORM) \
diff --git a/hal/ahal_config_helper.cpp b/hal/ahal_config_helper.cpp
new file mode 100644
index 0000000..92bb520
--- /dev/null
+++ b/hal/ahal_config_helper.cpp
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ahal_config_helper"
+
+#include "ahal_config_helper.h"
+#include <cutils/properties.h>
+#include <log/log.h>
+
+struct AHalConfigHelper {
+    static AHalConfigHelper* mConfigHelper;
+
+    AHalConfigHelper() : isRemote(false) { };
+    static AHalConfigHelper* getAHalConfInstance() {
+        if (!mConfigHelper)
+            mConfigHelper = new AHalConfigHelper();
+        return mConfigHelper;
+    }
+    void initDefaultConfig(bool isVendorEnhancedFwk);
+    AHalValues* getAHalValues();
+    inline void retrieveConfigs();
+
+    AHalValues mConfigs;
+    bool isRemote; // configs specified from remote
+};
+
+AHalConfigHelper* AHalConfigHelper::mConfigHelper;
+
+void AHalConfigHelper::initDefaultConfig(bool isVendorEnhancedFwk)
+{
+    ALOGV("%s: enter", __FUNCTION__);
+    if (isVendorEnhancedFwk) {
+        mConfigs = {
+            true,        /* SND_MONITOR */
+            false,       /* COMPRESS_CAPTURE */
+            true,        /* SOURCE_TRACK */
+            true,        /* SSREC */
+            true,        /* AUDIOSPHERE */
+            true,        /* AFE_PROXY */
+            false,       /* USE_DEEP_AS_PRIMARY_OUTPUT */
+            true,        /* HDMI_EDID */
+            true,        /* KEEP_ALIVE */
+            false,       /* HIFI_AUDIO */
+            true,        /* RECEIVER_AIDED_STEREO */
+            true,        /* KPI_OPTIMIZE */
+            true,        /* DISPLAY_PORT */
+            true,        /* FLUENCE */
+            true,        /* CUSTOM_STEREO */
+            true,        /* ANC_HEADSET */
+            false,       /* DSM_FEEDBACK */
+            true,        /* USB_OFFLOAD */
+            false,       /* USB_OFFLOAD_BURST_MODE */
+            false,       /* USB_OFFLOAD_SIDETONE_VOLM */
+            true,        /* A2DP_OFFLOAD */
+            true,        /* VBAT */
+            true,        /* COMPRESS_METADATA_NEEDED */
+            false,       /* COMPRESS_VOIP */
+            false,       /* DYNAMIC_ECNS */
+        };
+    } else {
+        mConfigs = {
+            true,        /* SND_MONITOR */
+            false,       /* COMPRESS_CAPTURE */
+            false,       /* SOURCE_TRACK */
+            false,       /* SSREC */
+            false,       /* AUDIOSPHERE */
+            false,       /* AFE_PROXY */
+            false,       /* USE_DEEP_AS_PRIMARY_OUTPUT */
+            false,       /* HDMI_EDID */
+            false,       /* KEEP_ALIVE */
+            false,       /* HIFI_AUDIO */
+            false,       /* RECEIVER_AIDED_STEREO */
+            false,       /* KPI_OPTIMIZE */
+            false,       /* DISPLAY_PORT */
+            false,       /* FLUENCE */
+            false,       /* CUSTOM_STEREO */
+            false,       /* ANC_HEADSET */
+            false,       /* DSM_FEEDBACK */
+            true,        /* USB_OFFLOAD */
+            false,       /* USB_OFFLOAD_BURST_MODE */
+            false,       /* USB_OFFLOAD_SIDETONE_VOLM */
+            true,        /* A2DP_OFFLOAD */
+            false,       /* VBAT */
+            false,       /* COMPRESS_METADATA_NEEDED */
+            false,       /* COMPRESS_VOIP */
+            false,       /* DYNAMIC_ECNS */
+        };
+    }
+}
+
+AHalValues* AHalConfigHelper::getAHalValues()
+{
+    ALOGV("%s: enter", __FUNCTION__);
+    retrieveConfigs();
+    return &mConfigs;
+}
+
+void AHalConfigHelper::retrieveConfigs()
+{
+    ALOGV("%s: enter", __FUNCTION__);
+    // ToDo: Add logic to query AHalValues from config store
+    // once support is added to it
+    return;
+}
+
+extern "C" {
+
+AHalValues* confValues = nullptr;
+
+void audio_extn_ahal_config_helper_init(bool is_vendor_enhanced_fwk)
+{
+    AHalConfigHelper* confInstance = AHalConfigHelper::getAHalConfInstance();
+    if (confInstance)
+        confInstance->initDefaultConfig(is_vendor_enhanced_fwk);
+}
+
+AHalValues* audio_extn_get_feature_values()
+{
+    AHalConfigHelper* confInstance = AHalConfigHelper::getAHalConfInstance();
+    if (confInstance)
+        confValues = confInstance->getAHalValues();
+    return confValues;
+}
+
+bool audio_extn_is_config_from_remote()
+{
+    AHalConfigHelper* confInstance = AHalConfigHelper::getAHalConfInstance();
+    if (confInstance)
+        return confInstance->isRemote;
+    return false;
+}
+
+} // extern C
diff --git a/hal/ahal_config_helper.h b/hal/ahal_config_helper.h
new file mode 100644
index 0000000..6e19bfa
--- /dev/null
+++ b/hal/ahal_config_helper.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of The Linux Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// ToDo: This struct must be used only if config store is disabled.
+// Use AHalValues struct from config store once support is added.
+struct AHalValues_t {
+    bool snd_monitor_enabled;
+    bool compress_capture_enabled;
+    bool source_track_enabled;
+    bool ssrec_enabled;
+    bool audiosphere_enabled;
+    bool afe_proxy_enabled;
+    bool use_deep_buffer_as_primary_output;
+    bool hdmi_edid_enabled;
+    bool keep_alive_enabled;
+    bool hifi_audio_enabled;
+    bool receiver_aided_stereo;
+    bool kpi_optimize_enabled;
+    bool display_port_enabled;
+    bool fluence_enabled;
+    bool custom_stereo_enabled;
+    bool anc_headset_enabled;
+    bool dsm_feedback_enabled;
+    bool usb_offload_enabled;
+    bool usb_offload_burst_mode;
+    bool usb_offload_sidetone_vol_enabled;
+    bool a2dp_offload_enabled;
+    bool vbat_enabled;
+    bool compress_metadata_needed;
+    bool compress_voip_enabled;
+    bool dynamic_ecns_enabled;
+};
+typedef struct AHalValues_t AHalValues;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void audio_extn_ahal_config_helper_init(bool isVendorEnhancedFwk);
+AHalValues* audio_extn_get_feature_values();
+bool audio_extn_is_config_from_remote();
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/hal/audio_extn/audio_feature_manager.c b/hal/audio_extn/audio_feature_manager.c
index a399800..23de0eb 100644
--- a/hal/audio_extn/audio_feature_manager.c
+++ b/hal/audio_extn/audio_feature_manager.c
@@ -27,9 +27,8 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+//#define LOG_NDEBUG 0
 #define LOG_TAG "audio_feature_manager"
-/*#define LOG_NDEBUG 0*/
-#define LOG_NDDEBUG 0
 
 #include <stdlib.h>
 #include <errno.h>
@@ -37,37 +36,83 @@
 #include <cutils/properties.h>
 #include <log/log.h>
 #include <unistd.h>
+#include <vndfwk-detect.h>
 #include "audio_feature_manager.h"
-#include <cutils/str_parms.h>
 
-static bool feature_bit_map[MAX_SUPPORTED_FEATURE] = {0};
+extern AHalValues* confValues;
 
-static void set_default_feature_flags() {
-    ALOGI(":: %s: Enter", __func__);
-    feature_bit_map[SND_MONITOR] = true;
+void audio_feature_manager_init()
+{
+    ALOGV("%s: Enter", __func__);
+    audio_extn_ahal_config_helper_init(
+                isRunningWithVendorEnhancedFramework());
+    confValues = audio_extn_get_feature_values();
 }
 
-static void set_dynamic_feature_flags() {
-    ALOGI(":: %s: Enter", __func__);
-    // TBD: Dynamically init feature bit
-}
+bool audio_feature_manager_is_feature_enabled(audio_ext_feature feature)
+{
+    ALOGV("%s: Enter", __func__);
 
-static void set_feature_flags() {
-    ALOGI(":: %s: Enter", __func__);
-    set_default_feature_flags();
-    set_dynamic_feature_flags();
-}
+#ifdef AHAL_EXT_ENABLED
+    if (!audio_extn_is_config_from_remote())
+        confValues = audio_extn_get_feature_values();
+#endif /* AHAL_EXT_ENABLED */
 
-void audio_feature_manager_init() {
-    ALOGI(":: %s: Enter", __func__);
-    set_feature_flags();
-}
+    if (!confValues)
+        return false;
 
-bool audio_feature_manager_is_feature_enabled(audio_ext_feature feature) {
-    bool ret_val = false;
-
-    if (feature >= 0 && feature < MAX_SUPPORTED_FEATURE)
-        ret_val = feature_bit_map[feature];
-
-    return ret_val;
+    switch (feature) {
+        case SND_MONITOR:
+            return confValues->snd_monitor_enabled;
+        case COMPRESS_CAPTURE:
+            return confValues->compress_capture_enabled;
+        case SOURCE_TRACK:
+            return confValues->source_track_enabled;
+        case SSREC:
+            return confValues->ssrec_enabled;
+        case AUDIOSPHERE:
+            return confValues->audiosphere_enabled;
+        case AFE_PROXY:
+            return confValues->afe_proxy_enabled;
+        case USE_DEEP_BUFFER_AS_PRIMARY_OUTPUT:
+            return confValues->use_deep_buffer_as_primary_output;
+        case HDMI_EDID:
+            return confValues->hdmi_edid_enabled;
+        case KEEP_ALIVE:
+            return confValues->keep_alive_enabled;
+        case HIFI_AUDIO:
+            return confValues->hifi_audio_enabled;
+        case RECEIVER_AIDED_STEREO:
+            return confValues->receiver_aided_stereo;
+        case KPI_OPTIMIZE:
+            return confValues->kpi_optimize_enabled;
+        case DISPLAY_PORT:
+            return confValues->display_port_enabled;
+        case FLUENCE:
+            return confValues->fluence_enabled;
+        case CUSTOM_STEREO:
+            return confValues->custom_stereo_enabled;
+        case ANC_HEADSET:
+            return confValues->anc_headset_enabled;
+        case DSM_FEEDBACK:
+            return confValues->dsm_feedback_enabled;
+        case USB_OFFLOAD:
+            return confValues->usb_offload_enabled;
+        case USB_OFFLOAD_BURST_MODE:
+            return confValues->usb_offload_burst_mode;
+        case USB_OFFLOAD_SIDETONE_VOLM:
+            return confValues->usb_offload_sidetone_vol_enabled;
+        case A2DP_OFFLOAD:
+            return confValues->a2dp_offload_enabled;
+        case VBAT:
+            return confValues->vbat_enabled;
+        case COMPRESS_METADATA_NEEDED:
+            return confValues->compress_metadata_needed;
+        case COMPRESS_VOIP:
+            return confValues->compress_voip_enabled;
+        case DYNAMIC_ECNS:
+            return confValues->dynamic_ecns_enabled;
+        default:
+            return false;
+    }
 }
diff --git a/hal/audio_extn/audio_feature_manager.h b/hal/audio_extn/audio_feature_manager.h
index 424dc4f..8433db0 100644
--- a/hal/audio_extn/audio_feature_manager.h
+++ b/hal/audio_extn/audio_feature_manager.h
@@ -30,8 +30,7 @@
 #ifndef AUDIO_FEATURE_MANAGER_H
 #define AUDIO_FEATURE_MANAGER_H
 
-#include <cutils/str_parms.h>
-
+#include <ahal_config_helper.h>
 
 enum audio_ext_feature_t {
     SND_MONITOR = 0,
@@ -40,7 +39,7 @@
     SSREC,
     AUDIOSPHERE,
     AFE_PROXY,
-    USE_DEEP_AS_PRIMARY_OUTPUT,
+    USE_DEEP_BUFFER_AS_PRIMARY_OUTPUT,
     HDMI_EDID,
     KEEP_ALIVE,
     HIFI_AUDIO,
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 37c749b..e12de67 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -6303,7 +6303,7 @@
                       (devices != AUDIO_DEVICE_OUT_USB_ACCESSORY);
     bool direct_dev = is_hdmi || is_usb_dev;
     bool use_db_as_primary =
-                audio_feature_manager_is_feature_enabled(USE_DEEP_AS_PRIMARY_OUTPUT);
+                audio_feature_manager_is_feature_enabled(USE_DEEP_BUFFER_AS_PRIMARY_OUTPUT);
 
     if (is_usb_dev && (!audio_extn_usb_connected(NULL))) {
         is_usb_dev = false;
@@ -8434,6 +8434,8 @@
     adev->bt_sco_on = false;
     /* adev->cur_hdmi_channels = 0;  by calloc() */
     adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int));
+    /* Init audio feature manager */
+    audio_feature_manager_init();
     voice_init(adev);
     list_init(&adev->usecase_list);
     adev->cur_wfd_channels = 2;
diff --git a/post_proc/Android.mk b/post_proc/Android.mk
index 86bbf98..f75ffe1 100644
--- a/post_proc/Android.mk
+++ b/post_proc/Android.mk
@@ -79,6 +79,7 @@
 
 LOCAL_C_INCLUDES := \
         external/tinyalsa/include \
+        vendor/qcom/opensource/audio-hal/primary-hal/hal \
         $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
 	$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/techpack/audio/include \
         $(call include-path-for, audio-effects) \
