NFC_NCIHALx_ARC0.7.0.4_N_OpnSrc
diff --git a/Android.mk b/Android.mk
index 84f0685..d7c0972 100644
--- a/Android.mk
+++ b/Android.mk
@@ -56,7 +56,7 @@
 endif
 
 #### Select the CHIP ####
-NXP_CHIP_TYPE := $(PN551)
+NXP_CHIP_TYPE := $(PN553)
 
 ifeq ($(NXP_CHIP_TYPE),$(PN547C2))
 D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN547C2
diff --git a/README.md b/README.md
index 579656e..8502503 100644
--- a/README.md
+++ b/README.md
@@ -26,4 +26,4 @@
 | Android Version        | NXP Release          | NXP Tag  |
 | :-------------: |:-------------:| :-----:|
 | android-7.0.0_r1                     |  7.0.3_N (PN548C2/PN551) |  NFC_NCIHALx_AR3C.7.0.3_N_OpnSrc |
-
+| android-7.0.0_r4                     |  7.0.4_N (PN553) |  NFC_NCIHALx_ARC0.7.0.4_N_OpnSrc |
diff --git a/README.md~ b/README.md~
new file mode 100644
index 0000000..ffa039d
--- /dev/null
+++ b/README.md~
@@ -0,0 +1,29 @@
+#NFC_NCIHAL_libnfc-nci
+
+####Git Repository
+
+| DESCRIPTION        | CHECKOUT COMMAND          |
+|:-------------:|:-------------:| 
+| NFC_NCIHAL_libnfc-nci     |  git clone https://github.com/NXPNFCProject/NFC_NCIHAL_libnfc-nci.git |
+
+####Supported Versions on "master" Branch
+
+| Android Version        | NXP Release          | NXP Tag  |
+| :-------------: |:-------------:| :-----:|
+| android-5.0.0_r1/android5.1.0_r1     |  3.5.0_L (PN547C2/PN548C2) |  NFC_NCIHALx_AR0F.3.5.0_L_OpnSrc |
+
+####Supported Versions on "br_android_ncihalx_m" Branch
+
+| Android Version        | NXP Release          | NXP Tag  |
+| :-------------: |:-------------:| :-----:|
+| android-6.0.0_r1                     |  4.2.0_M (PN547C2/PN548C2) |  NFC_NCIHALx_AR0F.4.2.0_M_OpnSrc |
+| android-6.0.0_r1                     |  4.3.0_M (PN547C2/PN548C2) |  NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc |
+| android-6.0.1_r17                    |  4.5.0_M (PN551/PN548C2)   |  NFC_NCIHALx_AR3C.4.5.0_M_OpnSrc |
+| android-6.0.1_r17                    |  4.7.0_M (PN553)   |  NFC_NCIHALx_ARC0.4.7.0_M_OpnSrc |
+
+####Supported Versions on "br_android_ncihalx_n" Branch
+
+| Android Version        | NXP Release          | NXP Tag  |
+| :-------------: |:-------------:| :-----:|
+| android-7.0.0_r1                     |  7.0.3_N (PN548C2/PN551) |  NFC_NCIHALx_AR3C.7.0.3_N_OpnSrc |
+| android-7.0.0_r4                     |  7.0.4_N (PN553) |  NFC_NCIHALx_AR3C.7.0.4_N_OpnSrc |
diff --git a/halimpl/pn54x/Android.mk b/halimpl/pn54x/Android.mk
index ea2e498..d24299b 100644
--- a/halimpl/pn54x/Android.mk
+++ b/halimpl/pn54x/Android.mk
@@ -51,7 +51,7 @@
 endif
 
 #### Select the CHIP ####
-NXP_CHIP_TYPE := $(PN551)
+NXP_CHIP_TYPE := $(PN553)
 
 ifeq ($(NXP_CHIP_TYPE),$(PN547C2))
 D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN547C2
diff --git a/halimpl/pn54x/common/phNfcCommon.h b/halimpl/pn54x/common/phNfcCommon.h
index 667ab49..24d2231 100644
--- a/halimpl/pn54x/common/phNfcCommon.h
+++ b/halimpl/pn54x/common/phNfcCommon.h
@@ -78,7 +78,7 @@
 #endif
 /* HAL Version number (Updated as per release) */
 #define NXP_MW_VERSION_MAJ  (0U)
-#define NXP_MW_VERSION_MIN  (3U)
+#define NXP_MW_VERSION_MIN  (4U)
 
 #define GET_EEPROM_DATA (1U)
 #define SET_EEPROM_DATA (2U)
diff --git a/halimpl/pn54x/configs/NXP_NFCC_Features.h b/halimpl/pn54x/configs/NXP_NFCC_Features.h
index 8fd1857..76a23fd 100755
--- a/halimpl/pn54x/configs/NXP_NFCC_Features.h
+++ b/halimpl/pn54x/configs/NXP_NFCC_Features.h
@@ -26,10 +26,10 @@
 //#define NXP_NFCC_FEATURE_1  TRUE
 #define NXP_NFCC_MW_RCVRY_BLK_FW_DNLD   TRUE
 #define NXP_NFCC_FORCE_NCI1_0_INIT FALSE
-#elif(NFC_NXP_CHIP_TYPE == PN551)
+#define NXP_NFCC_ROUTING_BLOCK_BIT TRUE
+#elif((NFC_NXP_CHIP_TYPE == PN551)||(NFC_NXP_CHIP_TYPE == PN548C2))
 #define NXP_NFCC_AID_MATCHING_PLATFORM_CONFIG   TRUE
-#elif(NFC_NXP_CHIP_TYPE == PN548AD)
-#define NXP_NFCC_AID_MATCHING_PLATFORM_CONFIG   TRUE
+#define NXP_NFCC_ROUTING_BLOCK_BIT_PROP TRUE
 #elif(NFC_NXP_CHIP_TYPE  == PN547C2)
 #define NXP_NFCC_AID_MATCHING_PLATFORM_CONFIG   TRUE
 #endif
diff --git a/halimpl/pn54x/hal/phNxpNciHal.c b/halimpl/pn54x/hal/phNxpNciHal.c
index 00e4d2b..1947f93 100644
--- a/halimpl/pn54x/hal/phNxpNciHal.c
+++ b/halimpl/pn54x/hal/phNxpNciHal.c
@@ -736,7 +736,7 @@
         NXPLOG_NCIHAL_E("malloc of nfc_dev_node failed ");
         goto clean_and_return;
     }
-    else if (!GetNxpStrValue (NAME_NXP_NFC_DEV_NODE, (char *)nfc_dev_node, sizeof (nfc_dev_node)))
+    else if (!GetNxpStrValue (NAME_NXP_NFC_DEV_NODE, (char *)nfc_dev_node, max_len))
     {
         NXPLOG_NCIHAL_E("Invalid nfc device node name keeping the default device node /dev/pn54x");
         strcpy ((char *)nfc_dev_node, "/dev/pn54x");
@@ -1371,6 +1371,26 @@
     mEEPROM_info.request_mode = GET_EEPROM_DATA;
     request_EEPROM(&mEEPROM_info);
 
+#if(NFC_NXP_CHIP_TYPE!=PN547C2 && (NXP_NFCC_ROUTING_BLOCK_BIT_PROP==TRUE))
+    if(isNxpConfigModified() || (fw_dwnld_flag == 0x01))
+    {
+        uint8_t value;
+        retlen = 0;
+        if(GetNxpNumValue(NAME_NXP_PROP_BLACKLIST_ROUTING, (void *)&retlen, sizeof(retlen)))
+        {
+            if(retlen == 0x00 || retlen == 0x01)
+            {
+                value = (uint8_t)retlen;
+                mEEPROM_info.buffer = &value;
+                mEEPROM_info.bufflen = sizeof(value);
+                mEEPROM_info.request_type = EEPROM_PROP_ROUTING;
+                mEEPROM_info.request_mode = SET_EEPROM_DATA;
+                status = request_EEPROM(&mEEPROM_info);
+            }
+        }
+    }
+#endif
+
 #if((NFC_NXP_CHIP_TYPE != PN547C2) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
     if(isNxpConfigModified() || (fw_dwnld_flag == 0x01))
     {
diff --git a/halimpl/pn54x/hal/phNxpNciHal.h b/halimpl/pn54x/hal/phNxpNciHal.h
index 631f72a..c048d2e 100644
--- a/halimpl/pn54x/hal/phNxpNciHal.h
+++ b/halimpl/pn54x/hal/phNxpNciHal.h
@@ -126,7 +126,8 @@
     EEPROM_WIREDMODE_RESUME_ENABLE,
     EEPROM_WIREDMODE_RESUME_TIMEOUT,
     EEPROM_ESE_SVDD_POWER,
-    EEPROM_ESE_POWER_EXT_PMU
+    EEPROM_ESE_POWER_EXT_PMU,
+    EEPROM_PROP_ROUTING
 }phNxpNci_EEPROM_request_type_t;
 
 typedef struct phNxpNci_EEPROM_info {
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.c b/halimpl/pn54x/hal/phNxpNciHal_ext.c
index 89ab80f..0d90eb4 100644
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.c
+++ b/halimpl/pn54x/hal/phNxpNciHal_ext.c
@@ -1239,8 +1239,16 @@
         addr[1]  = 0xD7;
         break;
 
+    case EEPROM_PROP_ROUTING:
+        b_position = 7;
+        memIndex = 0x00;
+        addr[0]  = 0xA0;
+        addr[1]  = 0x98;
+        break;
+
     default:
         ALOGE("No valid request information found");
+        break;
     }
 
     uint8_t get_cfg_eeprom[6] = {0x20, 0x03, //get_cfg header
diff --git a/halimpl/pn54x/libnfc-nxp-PN551_example.conf b/halimpl/pn54x/libnfc-nxp-PN551_example.conf
index 25be0df..02f86e4 100644
--- a/halimpl/pn54x/libnfc-nxp-PN551_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN551_example.conf
@@ -325,3 +325,8 @@
 # Disable           0x00
 # Enable            0x01
 NXP_CHECK_DEFAULT_PROTO_SE_ID=0x01
+###############################################################################
+# Restrict routing to first matched rule only.
+# Blacklist enable   0x01
+# Blacklist disable  0x00
+NXP_PROP_BLACKLIST_ROUTING=0x00
diff --git a/halimpl/pn54x/libnfc-nxp-PN553_example.conf b/halimpl/pn54x/libnfc-nxp-PN553_example.conf
index 79f69f9..8ac9a05 100644
--- a/halimpl/pn54x/libnfc-nxp-PN553_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN553_example.conf
@@ -421,3 +421,9 @@
 #Enable  0x01
 #Disable  0x00
 NXP_CN_TRANSIT_BLK_NUM_CHECK_ENABLE=0x01
+
+###############################################################################
+# Restrict routing to first matched rule only.
+# Blacklist enable   0x01
+# Blacklist disable  0x00
+NXP_PROP_BLACKLIST_ROUTING=0x00
diff --git a/halimpl/pn54x/libnfc-nxp-PN67T_example.conf b/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
index b73bb5f..d1b3d85 100644
--- a/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN67T_example.conf
@@ -406,3 +406,9 @@
 #Enable Passive Listen Timeout
 # Maximum retry three times, Timeout in millisec
 NXP_NFCC_PASSIVE_LISTEN_TIMEOUT=5000
+
+################################################################################
+# Restrict routing to first matched rule only.
+# Blacklist enable   0x01
+# Blacklist disable  0x00
+NXP_PROP_BLACKLIST_ROUTING=0x00
diff --git a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf b/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
index 030b56a..db0e2fe 100644
--- a/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN80T_example.conf
@@ -450,3 +450,9 @@
 # Disable           0x00
 # Enable            0x01
 NXP_ALLOW_WIRED_IN_MIFARE_DESFIRE_CLT=0x00
+
+###############################################################################
+# Restrict routing to first matched rule only.
+# Blacklist enable   0x01
+# Blacklist disable  0x00
+NXP_PROP_BLACKLIST_ROUTING=0x00
diff --git a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c b/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
index 92e26b7..1bf0fa3 100644
--- a/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
+++ b/halimpl/pn54x/self-test/phNxpNciHal_SelfTest.c
@@ -1433,7 +1433,7 @@
         NXPLOG_NCIHAL_E("malloc of nfc_dev_node failed ");
         goto clean_and_return;
     }
-    else if (!GetNxpStrValue (NAME_NXP_NFC_DEV_NODE, (char*)nfc_dev_node, sizeof (nfc_dev_node)))
+    else if (!GetNxpStrValue (NAME_NXP_NFC_DEV_NODE, (char*)nfc_dev_node, max_len))
     {
         NXPLOG_NCIHAL_E("Invalid nfc device node name keeping the default device node /dev/pn54x");
         strcpy ((char *)nfc_dev_node, "/dev/pn54x");
diff --git a/halimpl/pn54x/tml/phTmlNfc_i2c.h b/halimpl/pn54x/tml/phTmlNfc_i2c.h
index e84cc27..54b7fce 100644
--- a/halimpl/pn54x/tml/phTmlNfc_i2c.h
+++ b/halimpl/pn54x/tml/phTmlNfc_i2c.h
@@ -80,12 +80,12 @@
 #define P544_GET_ESE_ACCESS _IOW(PN544_MAGIC, 0x06, long)
 
 /*
-  NFC will call the ioctl to release the svdd protection
-*/
-#define P544_REL_SVDD_WAIT _IOW(PN544_MAGIC, 0x07, long)
-
-/*
   NFC and SPI will call the ioctl to update the power scheme
 */
 #define P544_SET_POWER_SCHEME _IOW(PN544_MAGIC, 0x07, long)
+
+/*
+  NFC will call the ioctl to release the svdd protection
+*/
+#define P544_REL_SVDD_WAIT _IOW(PN544_MAGIC, 0x08, long)
 #endif
diff --git a/halimpl/pn54x/utils/phNxpConfig.h b/halimpl/pn54x/utils/phNxpConfig.h
index 151891d..0803eda 100644
--- a/halimpl/pn54x/utils/phNxpConfig.h
+++ b/halimpl/pn54x/utils/phNxpConfig.h
@@ -104,6 +104,9 @@
 #define NAME_NXP_TYPEA_UICC_BAUD_RATE "NXP_TYPEA_UICC_BAUD_RATE"
 #define NAME_NXP_TYPEB_UICC_BAUD_RATE "NXP_TYPEB_UICC_BAUD_RATE"
 #define NAME_NXP_SET_CONFIG_ALWAYS "NXP_SET_CONFIG_ALWAYS"
+#if((NFC_NXP_CHIP_TYPE!=PN547C2) && (NXP_NFCC_ROUTING_BLOCK_BIT_PROP==TRUE))
+#define NAME_NXP_PROP_BLACKLIST_ROUTING "NXP_PROP_BLACKLIST_ROUTING"
+#endif
 #define NAME_NXP_WIREDMODE_RESUME_TIMEOUT  "NXP_WIREDMODE_RESUME_TIMEOUT"
 #define NAME_NXP_UICC_LISTEN_TECH_MASK      "UICC_LISTEN_TECH_MASK"
 #define NAME_NXP_HOST_LISTEN_TECH_MASK      "HOST_LISTEN_TECH_MASK"
diff --git a/src/include/NXP_NFCC_Features.h b/src/include/NXP_NFCC_Features.h
index e2aa360..2607b03 100755
--- a/src/include/NXP_NFCC_Features.h
+++ b/src/include/NXP_NFCC_Features.h
@@ -27,7 +27,9 @@
 #define NXP_NFCC_MW_RCVRY_BLK_FW_DNLD   TRUE
 #define NXP_NFCC_DYNAMIC_DUAL_UICC      TRUE
 #define NXP_NFCC_FW_WA                  TRUE
-#elif(NFC_NXP_CHIP_TYPE==PN551)
+#define NXP_NFCC_ROUTING_BLOCK_BIT      TRUE
+#elif((NFC_NXP_CHIP_TYPE == PN551)||(NFC_NXP_CHIP_TYPE == PN548C2))
 #define NXP_NFCC_DYNAMIC_DUAL_UICC      FALSE
+#define NXP_NFCC_ROUTING_BLOCK_BIT_PROP TRUE
 #endif
 #endif                          /* end of #ifndef NXP_NFCC_FEATURES_H */
diff --git a/src/include/config.h b/src/include/config.h
index 3c0d739..b7e0246 100644
--- a/src/include/config.h
+++ b/src/include/config.h
@@ -131,6 +131,9 @@
 #define NAME_NFA_POLL_BAIL_OUT_MODE     "NFA_POLL_BAIL_OUT_MODE"
 #define NAME_NFA_PROPRIETARY_CFG        "NFA_PROPRIETARY_CFG"
 #if(NXP_EXTNS == TRUE)
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+#define NAME_NXP_PROP_BLACKLIST_ROUTING "NXP_PROP_BLACKLIST_ROUTING"
+#endif
 #define NAME_NXP_NFCC_STANDBY_TIMEOUT   "NXP_NFCC_STANDBY_TIMEOUT"
 #define NAME_NXP_CP_TIMEOUT             "NXP_CP_TIMEOUT"
 #define NAME_NXP_CORE_SCRN_OFF_AUTONOMOUS_ENABLE   "NXP_CORE_SCRN_OFF_AUTONOMOUS_ENABLE"
diff --git a/src/nfa/ce/nfa_ce_act.c b/src/nfa/ce/nfa_ce_act.c
index 5d23213..b75c507 100755
--- a/src/nfa/ce/nfa_ce_act.c
+++ b/src/nfa/ce/nfa_ce_act.c
@@ -354,7 +354,6 @@
             UINT8_TO_STREAM (p_params, NCI_PARAM_LEN_LF_T3T_ID);                     /* length */
             UINT16_TO_BE_STREAM (p_params, p_cb->listen_info[i].t3t_system_code);    /* System Code */
             ARRAY_TO_BE_STREAM (p_params,  p_cb->listen_info[i].t3t_nfcid2, NCI_RF_F_UID_LEN);
-
             /* Set mask for this ID */
             t3t_flags2_mask &= ~((UINT16) (1<<t3t_idx));
             t3t_idx++;
@@ -381,7 +380,12 @@
     UINT16_TO_STREAM (p_params, t3t_flags2_mask);            /* Mask of IDs to disable listening */
 #endif
     tlv_size = (UINT8) (p_params-tlv);
+
+    if(appl_dta_mode_flag == 0x01){
+        nfa_dm_cb.eDtaMode = NFA_DTA_HCEF_MODE;
+    }
     nfa_dm_check_set_config (tlv_size, (UINT8 *)tlv, FALSE);
+
 }
 
 /*******************************************************************************
diff --git a/src/nfa/dm/nfa_dm_discover.c b/src/nfa/dm/nfa_dm_discover.c
index 8fb5185..1d77bd9 100755
--- a/src/nfa/dm/nfa_dm_discover.c
+++ b/src/nfa/dm/nfa_dm_discover.c
@@ -3057,7 +3057,6 @@
     {
     case NFA_DM_RF_INTF_ACTIVATED_NTF:
         nfa_dm_disc_new_state (NFA_DM_RFST_LP_ACTIVE);
-        nfa_dm_disc_notify_activation (&(p_data->nfc_discover));
         if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
         {
             NFA_TRACE_DEBUG0 ("Not matched, unexpected activation");
diff --git a/src/nfa/dm/nfa_dm_main.c b/src/nfa/dm/nfa_dm_main.c
index 22ca544..1dce30b 100755
--- a/src/nfa/dm/nfa_dm_main.c
+++ b/src/nfa/dm/nfa_dm_main.c
@@ -494,7 +494,7 @@
 #endif
        (updated_len || app_init)
 #if(NXP_EXTNS == TRUE)
-       && (appl_dta_mode_flag == 0x00 ))
+       && (appl_dta_mode_flag == 0x00 || nfa_dm_cb.eDtaMode == NFA_DTA_HCEF_MODE) )
        || ((appl_dta_mode_flag) && (app_init)))
 #endif
     {
@@ -507,6 +507,9 @@
 #endif
         if ((nfc_status = NFC_SetConfig (updated_len, p_tlv_list)) == NFC_STATUS_OK)
         {
+            if(nfa_dm_cb.eDtaMode == NFA_DTA_HCEF_MODE){
+                nfa_dm_cb.eDtaMode = NFA_DTA_DEFAULT_MODE;
+            }
             /* Keep track of whether we will need to notify NFA_DM_SET_CONFIG_EVT on NFC_SET_CONFIG_REVT */
 
             /* Get the next available bit offset for this setconfig (based on how many SetConfigs are outstanding) */
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.c
index 1422105..44aac7e 100755
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.c
@@ -1021,31 +1021,30 @@
         tNFA_EE_ECB *p_cb = nfa_ee_cb.ecb;
         for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++)
         {
-            memset(&p_cb->aid_cfg[0],0x00, sizeof(p_cb->aid_cfg));
-
 #if((NXP_EXTNS == TRUE) && (((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) && (NFC_NXP_AID_MAX_SIZE_DYN == TRUE)))
+            memset(&p_cb->aid_cfg[0],0x00, max_aid_config_length);
             memset(&p_cb->aid_len[0], 0x00, max_aid_entries);
             memset(&p_cb->aid_pwr_cfg[0], 0x00, max_aid_entries);
             memset(&p_cb->aid_rt_info[0], 0x00, max_aid_entries);
 #else
+            memset(&p_cb->aid_cfg[0],0x00, sizeof(p_cb->aid_cfg));
             memset(&p_cb->aid_len[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
             memset(&p_cb->aid_pwr_cfg[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
             memset(&p_cb->aid_rt_info[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
 #endif
-
             p_cb->aid_entries = 0;
             nfa_ee_cb.ee_cfged      |= nfa_ee_ecb_to_mask(p_cb);
         }
 
         tNFA_EE_ECB *p_ecb = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
 
-        memset(&p_ecb->aid_cfg[0],0x00, sizeof(p_ecb->aid_cfg));
-
 #if((NXP_EXTNS == TRUE) && (((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)) && (NFC_NXP_AID_MAX_SIZE_DYN == TRUE)))
+        memset(&p_ecb->aid_cfg[0],0x00, max_aid_config_length);
         memset(&p_ecb->aid_len[0], 0x00, max_aid_entries);
         memset(&p_ecb->aid_pwr_cfg[0], 0x00, max_aid_entries);
         memset(&p_ecb->aid_rt_info[0], 0x00, max_aid_entries);
 #else
+        memset(&p_ecb->aid_cfg[0],0x00, sizeof(p_ecb->aid_cfg));
         memset(&p_ecb->aid_len[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
         memset(&p_ecb->aid_pwr_cfg[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
         memset(&p_ecb->aid_rt_info[0], 0x00, NFA_EE_MAX_AID_ENTRIES);
@@ -1604,11 +1603,14 @@
         }
     }
 #if(NXP_EXTNS == TRUE)
-    if((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)&&(p_cb->ee_status != NFA_EE_STATUS_ACTIVE))
+    if(p_cb)
     {
-        NFA_TRACE_DEBUG2 ("nfa_ee_nci_disc_ntf hci_state : 0x%02x  ee_status : 0x%02x",nfa_hci_cb.hci_state,p_cb->ee_status);
-        nfa_sys_stop_timer (&nfa_hci_cb.timer);
-        nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, 150);
+        if((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE)&&(p_cb->ee_status != NFA_EE_STATUS_ACTIVE))
+       {
+           NFA_TRACE_DEBUG2 ("nfa_ee_nci_disc_ntf hci_state : 0x%02x  ee_status : 0x%02x",nfa_hci_cb.hci_state,p_cb->ee_status);
+           nfa_sys_stop_timer (&nfa_hci_cb.timer);
+           nfa_sys_start_timer (&nfa_hci_cb.timer, NFA_HCI_RSP_TIMEOUT_EVT, 150);
+       }
     }
 #endif
 }
@@ -2344,7 +2346,23 @@
     UINT8   *p_start;
     UINT8   new_size;
     tNFA_STATUS status = NFA_STATUS_OK;
-
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+    UINT8 value=0x00;
+    long retlen = 0;
+    NFA_TRACE_DEBUG1 ("NAME_NXP_PROP_BLACKLIST_ROUTING enter=0x%x",value);
+    if(GetNumValue(NAME_NXP_PROP_BLACKLIST_ROUTING, (void *)&retlen, sizeof(retlen)))
+    {
+        if(retlen == 0x01)
+        {
+            value =NFA_EE_NXP_ROUTE_BLOCK_BIT;
+            NFA_TRACE_DEBUG1 ("NAME_NXP_PROP_BLACKLIST_ROUTING change=0x%x",value);
+         }
+        else
+        {
+            NFA_TRACE_DEBUG1 ("NAME_NXP_PROP_BLACKLIST_ROUTING exit=0x%x",value);
+        }
+    }
+#endif
     nfa_ee_check_set_routing (p_cb->size_mask, p_max_len, ps, p_cur_offset);
     max_tlv = (UINT8)((*p_max_len > NFA_EE_ROUT_MAX_TLV_SIZE)?NFA_EE_ROUT_MAX_TLV_SIZE:*p_max_len);
     /* use the first byte of the buffer (ps) to keep the num_tlv */
@@ -2372,12 +2390,19 @@
                 pa ++; /* EMV tag */
                 len     = *pa++; /* aid_len */
                 if(p_cb->aid_rt_info[xx] & NFA_EE_AE_NXP_PREFIX_MATCH) {
-                 //This aid is for prefix match.
-                 *pp++   = NFC_ROUTE_TAG_AID|NFA_EE_AE_NXP_PREFIX_MATCH;
+                    //This aid is for prefix match.
+                    *pp   = NFC_ROUTE_TAG_AID|NFA_EE_AE_NXP_PREFIX_MATCH;
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+                    *pp  |= (NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00;
+#endif
                 } else {
-                  //This aid is for exact match.
-                  *pp++   = NFC_ROUTE_TAG_AID;
+                    //This aid is for exact match.
+                    *pp   = NFC_ROUTE_TAG_AID;
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+                    *pp  |= (NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00;
+#endif
                 }
+                *pp++;
                 *pp++   = len + 2;
                 *pp++   = p_cb->aid_rt_loc[xx];
                 *pp++   = p_cb->aid_pwr_cfg[xx];
@@ -2437,7 +2462,15 @@
         }
         if (power_cfg)
         {
-            *proto_pp++   = NFC_ROUTE_TAG_PROTO;
+            *proto_pp   = NFC_ROUTE_TAG_PROTO;
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+            /*Setting blocking bit for ISO-DEP and ISO7816 protocol only*/
+            if(nfa_ee_proto_list[xx]==NFC_PROTOCOL_ISO_DEP || nfa_ee_proto_list[xx] == NFC_PROTOCOL_ISO7816)
+            {
+                *proto_pp  |= (NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00;
+            }
+#endif
+            *proto_pp++;
             *proto_pp++   = 3;
             *proto_pp++   = p_cb->nfcee_id;
             *proto_pp++   = power_cfg;
@@ -2467,6 +2500,7 @@
         *proto_pp++   = NFC_PROTOCOL_NFC_DEP;
         proto_tlv_ctr++;
     }
+
 /* store  the Technology based routing entries in temporary buffer */
 for (xx = 0; xx < NFA_EE_NUM_TECH; xx++)
 {
@@ -2562,7 +2596,15 @@
 
         if (power_cfg)
         {
-            *pp++   = NFC_ROUTE_TAG_PROTO;
+            *pp  = NFC_ROUTE_TAG_PROTO;
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+            /*Setting blocking bit for ISO-DEP and ISO7816 protocol only*/
+            if(nfa_ee_proto_list[xx]==NFC_PROTOCOL_ISO_DEP || nfa_ee_proto_list[xx] == NFC_PROTOCOL_ISO7816)
+            {
+                *pp  |= (NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00;
+            }
+#endif
+            *pp++;
             *pp++   = 3;
             *pp++   = p_cb->nfcee_id;
             *pp++   = power_cfg;
@@ -2620,11 +2662,15 @@
                 len     = *pa++; /* aid_len */
 #if(NXP_EXTNS == TRUE)
                 if(p_cb->aid_rt_info[xx] & NFA_EE_AE_NXP_PREFIX_MATCH) {
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==FALSE)
                     //This aid is for prefix match.
-                    *pp++   = NFC_ROUTE_TAG_AID|NFA_EE_AE_NXP_PREFIX_MATCH;
+                    *pp++   = (NFC_ROUTE_TAG_AID|NFA_EE_AE_NXP_PREFIX_MATCH)|((NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00);
+#endif
                 } else {
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==FALSE)
                     //This aid is for exact match.
-                    *pp++   = NFC_ROUTE_TAG_AID;
+                    *pp++   = NFC_ROUTE_TAG_AID|((NFA_EE_NXP_ROUTE_BLOCK_BIT & value)?NFA_EE_NXP_ROUTE_BLOCK_BIT:0x00);
+#endif
                 }
 #else
                 *pp++   = NFC_ROUTE_TAG_AID;
diff --git a/src/nfa/hci/nfa_hci_act.c b/src/nfa/hci/nfa_hci_act.c
index 09ccec5..4ec29c9 100755
--- a/src/nfa/hci/nfa_hci_act.c
+++ b/src/nfa/hci/nfa_hci_act.c
@@ -2725,6 +2725,11 @@
     {
     case NFA_HCI_ANY_OPEN_PIPE:
             NFA_TRACE_DEBUG0 ("nfa_hci_handle_Nfcee_dynpipe_rsp - Response received open Pipe get the Gate List on Id Gate!!!");
+            if(!p_pipe)
+            {
+                NFA_TRACE_ERROR1 ("nfa_hci_handle_Nfcee_dynpipe_rsp - NULL pipe for PipeId %d",pipeId);
+                break;
+            }
             if((p_pipe-> dest_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE )&&(p_pipe-> local_gate == NFA_HCI_IDENTITY_MANAGEMENT_GATE))
             {
                 nfa_hciu_send_get_param_cmd (pipeId, NFA_HCI_GATES_LIST_INDEX);
diff --git a/src/nfa/hci/nfa_hci_main.c b/src/nfa/hci/nfa_hci_main.c
index d08dc11..02de5b9 100755
--- a/src/nfa/hci/nfa_hci_main.c
+++ b/src/nfa/hci/nfa_hci_main.c
@@ -648,9 +648,7 @@
         nfa_hciu_send_to_all_apps (NFA_HCI_INIT_EVT, &evt_data);
         nfa_sys_cback_notify_enable_complete (NFA_ID_HCI);
     }
-#if((NXP_EXTNS == TRUE)&& \
-((NFC_NXP_CHIP_TYPE==PN551)||(NFC_NXP_CHIP_TYPE==PN553))&& \
-(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
+#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
     if (status == NFA_STATUS_OK){
         nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
         NFA_TRACE_EVENT0 ("hci_state = NFA_HCI_STATE_IDLE");
@@ -868,9 +866,7 @@
         nfa_hci_cb.hci_state = NFA_HCI_STATE_DISABLED;
         /* deregister message handler on NFA SYS */
         nfa_sys_deregister (NFA_ID_HCI);
-#if((NXP_EXTNS == TRUE)&& \
-((NFC_NXP_CHIP_TYPE==PN551)||(NFC_NXP_CHIP_TYPE==PN553))&& \
-(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
+#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
         if(nfa_dm_cb.p_dm_cback)
         (*nfa_dm_cb.p_dm_cback)(NFA_DM_EE_HCI_DISABLE, NULL);
 #endif
diff --git a/src/nfa/include/nfa_api.h b/src/nfa/include/nfa_api.h
index 6caac62..fe32186 100644
--- a/src/nfa/include/nfa_api.h
+++ b/src/nfa/include/nfa_api.h
@@ -57,7 +57,7 @@
 **  Constants and data types
 *****************************************************************************/
 
-/* Max length of Appliction ID in 7816-4 */
+/* Max length of Application ID in 7816-4 */
 #define NFA_MAX_AID_LEN     NFC_MAX_AID_LEN
 #define NFA_MIN_AID_LEN     5 /* per NCI specification */
 
@@ -278,7 +278,8 @@
 {
     NFA_DTA_DEFAULT_MODE=0,
     NFA_DTA_LLCP_MODE,
-    NFA_DTA_SNEP_MODE
+    NFA_DTA_SNEP_MODE,
+    NFA_DTA_HCEF_MODE
 }tNFA_eDtaModes;
 typedef struct
 {
diff --git a/src/nfa/include/nfa_ee_api.h b/src/nfa/include/nfa_ee_api.h
index 9e27b71..6b17bce 100644
--- a/src/nfa/include/nfa_ee_api.h
+++ b/src/nfa/include/nfa_ee_api.h
@@ -57,6 +57,9 @@
 extern  UINT8 nfa_ee_ce_route_strict_disable;
 extern  UINT8 nfa_ee_ce_p61_active;
 #define NFA_EE_AE_NXP_PREFIX_MATCH      (0x10)
+#if(NXP_NFCC_ROUTING_BLOCK_BIT==TRUE)
+#define NFA_EE_NXP_ROUTE_BLOCK_BIT (0x40)
+#endif
 #endif
 
 /* NFA EE callback events */
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 62911c9..b7abd71 100755
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -83,15 +83,15 @@
 //DTA API for MW Version need to change according to release
 #define NXP_EN_PN547C2                  0
 #define NXP_EN_PN65T                    0
-#define NXP_EN_PN548C2                  1
-#define NXP_EN_PN66T                    1
-#define NXP_EN_PN551                    1
-#define NXP_EN_PN67T                    1
-#define NXP_EN_PN553                    0
-#define NXP_EN_PN80T                    0
+#define NXP_EN_PN548C2                  0
+#define NXP_EN_PN66T                    0
+#define NXP_EN_PN551                    0
+#define NXP_EN_PN67T                    0
+#define NXP_EN_PN553                    1
+#define NXP_EN_PN80T                    1
 #define NXP_ANDROID_VER                 (7U) /* NXP android version */
 #define NFC_NXP_MW_VERSION_MAJ          (0U) /* MW Major Version */
-#define NFC_NXP_MW_VERSION_MIN          (3U) /* MW Minor Version */
+#define NFC_NXP_MW_VERSION_MIN          (4U) /* MW Minor Version */
 #endif
 /* 0xE0 ~0xFF are proprietary status codes */
 #define NFC_STATUS_CMD_STARTED          0xE3/* Command started successfully                     */
diff --git a/src/nfc/llcp/llcp_link.c b/src/nfc/llcp/llcp_link.c
index 33d5929..fb56ab2 100755
--- a/src/nfc/llcp/llcp_link.c
+++ b/src/nfc/llcp/llcp_link.c
@@ -468,8 +468,13 @@
     llcp_cb.overall_tx_congested = FALSE;
     llcp_cb.overall_rx_congested = FALSE;
 
+   /*As per the LLCP test specification v1.2.00 for test case TC_LLC_TAR_BV_04
+    * the receiving LLC shall commence sending an LLC PDU to the remote
+    * LLC. So, after IUT receiving DISC PDU from LT(remote device), IUT shall send DISC PDU to LT.
+    * appl_dta_mode_flag condition is added to fulfill above requirement*/
     if (  (reason == LLCP_LINK_FRAME_ERROR)
-        ||(reason == LLCP_LINK_LOCAL_INITIATED)  )
+        ||(reason == LLCP_LINK_LOCAL_INITIATED)
+        || ((appl_dta_mode_flag) && (reason == LLCP_LINK_REMOTE_INITIATED) && (llcp_cb.lcb.is_initiator == FALSE)))
     {
         /* get rid of the data pending in NFC tx queue, so DISC PDU can be sent ASAP */
         NFC_FlushData (NFC_RF_CONN_ID);