diff --git a/nci/jni/Android.mk b/nci/jni/Android.mk
index 2a7d34a..bfbb172 100644
--- a/nci/jni/Android.mk
+++ b/nci/jni/Android.mk
@@ -17,6 +17,7 @@
 PN547C2 := 1
 PN548C2 := 2
 PN551   := 3
+PN553   := 4
 NQ110 := $PN547C2
 NQ120 := $PN547C2
 NQ210 := $PN548C2
@@ -32,6 +33,9 @@
 ifeq ($(PN551),3)
 LOCAL_CFLAGS += -DPN551=3
 endif
+ifeq ($(PN553),4)
+LOCAL_CFLAGS += -DPN553=4
+endif
 
 #NXP PN547 Enable
 LOCAL_CFLAGS += -DNXP_EXTNS=TRUE
@@ -54,12 +58,14 @@
 ifeq ($(NFC_NXP_ESE),TRUE)
 LOCAL_CFLAGS += -DNFC_NXP_ESE=TRUE
 LOCAL_CFLAGS += -DNFC_NXP_ESE_VER=$(JCOP_VER_3_3)
+LOCAL_CFLAGS += -DJCOP_WA_ENABLE=FALSE
+LOCAL_CFLAGS += -DCONCURRENCY_PROTECTION=TRUE
 else
 LOCAL_CFLAGS += -DNFC_NXP_ESE=FALSE
 endif
 
 #### Select the CHIP ####
-NXP_CHIP_TYPE := $(PN551)
+NXP_CHIP_TYPE := $(PN553)
 
 ifeq ($(NXP_CHIP_TYPE),$(PN547C2))
 LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN547C2
@@ -67,12 +73,13 @@
 LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN548C2
 else ifeq ($(NXP_CHIP_TYPE),$(PN551))
 LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551
+else ifeq ($(NXP_CHIP_TYPE),$(PN553))
+LOCAL_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN553
 endif
 
-NFC_POWER_MANAGEMENT:= FALSE
+NFC_POWER_MANAGEMENT:= TRUE
 ifeq ($(NFC_POWER_MANAGEMENT),TRUE)
 LOCAL_CFLAGS += -DNFC_POWER_MANAGEMENT=TRUE
-LOCAL_CFLAGS += -DNFC_NXP_TRIPLE_MODE_PROTECTION=TRUE
 else
 LOCAL_CFLAGS += -DNFC_POWER_MANAGEMENT=FALSE
 endif
diff --git a/nci/jni/DwpChannel.cpp b/nci/jni/DwpChannel.cpp
index 6c66a27..5984674 100644
--- a/nci/jni/DwpChannel.cpp
+++ b/nci/jni/DwpChannel.cpp
@@ -17,6 +17,8 @@
 #include "SecureElement.h"
 #include "RoutingManager.h"
 #include <cutils/log.h>
+#include "config.h"
+#include "phNxpConfig.h"
 
 static const int EE_ERROR_OPEN_FAIL =  -1;
 
@@ -172,7 +174,9 @@
     if(eSE_connected != true)
         return true;
 
-    stat = se.sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    se.NfccStandByOperation(STANDBY_MODE_ON);
+#endif
 
     stat = se.disconnectEE (SecureElement::ESE_ID);
 
@@ -224,8 +228,9 @@
     se.SecEle_Modeset(0x01);
     ALOGD("2nd mode set called");
 
-    usleep(2000 * 1000);
+    usleep(3000 * 1000);
     rm.mResetHandlerMutex.unlock();
+#if (JCOP_WA_ENABLE == TRUE)
     if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
     {
         ALOGE ("%s: is_ee_recovery_ongoing ", fn);
@@ -236,6 +241,7 @@
     {
        ALOGE ("%s: Not in Recovery State", fn);
     }
+#endif
 }
 namespace android
 {
@@ -247,3 +253,78 @@
         ALOGD("%s: exit", fn);
     }
 }
+/*******************************************************************************
+**
+** Function:        doeSE_JcopDownLoadReset
+**
+** Description:     Performs a reset to eSE during JCOP OS update depending on
+**                  Power schemes configuered
+**
+** Returns:         void.
+**
+*******************************************************************************/
+void doeSE_JcopDownLoadReset(void)
+{
+    static const char fn [] = "DwpChannel::JcopDownLoadReset";
+    SecureElement &se = SecureElement::getInstance();
+    RoutingManager &rm = RoutingManager::getInstance();
+    unsigned long int num = 0;
+    ALOGD("%s: enter:", fn);
+
+    rm.mResetHandlerMutex.lock();
+#if ((NXP_ESE_RESET_METHOD == TRUE) && (NXP_ESE_POWER_MODE == TRUE))
+    if (GetNxpNumValue (NAME_NXP_ESE_POWER_DH_CONTROL, (void*)&num, sizeof(num)) == true)
+    {
+        if(num ==1)
+        {
+            ALOGD("1st mode set calling");
+            se.SecEle_Modeset(0x00);
+            usleep(100 * 1000);
+            ALOGD("1st mode set called");
+            ALOGD("2nd mode set calling");
+            se.SecEle_Modeset(0x01);
+            ALOGD("2nd mode set called");
+            usleep(3000 * 1000);
+        }
+        else if(num ==2)
+        {
+            ALOGD("%s: eSE ISO_RST on DWP Channel:", fn);
+            se.SecEle_Modeset(0x00);
+            usleep(100 * 1000);
+            se.eSE_ISO_Reset();
+            se.SecEle_Modeset(0x01);
+            ALOGD("ISO Reset DONE");
+            usleep(3000 * 1000);
+        }
+        else
+        {
+            ALOGD("%s: Invalid Power scheme:", fn);
+        }
+    }
+#else
+    ALOGD("1st mode set calling");
+    se.SecEle_Modeset(0x00);
+    usleep(100 * 1000);
+    ALOGD("1st mode set called");
+    ALOGD("2nd mode set calling");
+
+    se.SecEle_Modeset(0x01);
+    ALOGD("2nd mode set called");
+
+    usleep(3000 * 1000);
+#endif
+    rm.mResetHandlerMutex.unlock();
+
+#if (JCOP_WA_ENABLE == TRUE)
+    if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
+    {
+        ALOGE ("%s: is_ee_recovery_ongoing ", fn);
+        SyncEventGuard guard (se.mEEdatapacketEvent);
+        se.mEEdatapacketEvent.wait();
+    }
+    else
+    {
+       ALOGE ("%s: Not in Recovery State", fn);
+    }
+#endif
+}
diff --git a/nci/jni/DwpChannel.h b/nci/jni/DwpChannel.h
index e363719..fbeedf1 100644
--- a/nci/jni/DwpChannel.h
+++ b/nci/jni/DwpChannel.h
@@ -36,4 +36,5 @@
                      INT32 recvBufferMaxSize, INT32& recvBufferActualSize, INT32 timeoutMillisec);
 
     void doeSE_Reset();
+    void doeSE_JcopDownLoadReset();
     void doDwpChannel_ForceExit();
diff --git a/nci/jni/HciRFParams.cpp b/nci/jni/HciRFParams.cpp
index dd8cfa2..a613498 100644
--- a/nci/jni/HciRFParams.cpp
+++ b/nci/jni/HciRFParams.cpp
@@ -147,7 +147,7 @@
     bPipeStatus_CeB = *params++;
     bMode_CeB = *params++;
 
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
         aPupiRegDataSize_CeB = *params++;
 #endif
         aPupiRegDataSize_CeB = 4;
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index dbbd7c5..54df8a5 100644
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -59,6 +59,7 @@
 #include "DwpChannel.h"
 extern "C"
 {
+    #include "nfc_api.h"
     #include "nfa_api.h"
     #include "nfa_p2p_api.h"
     #include "rw_api.h"
@@ -78,6 +79,7 @@
 
 #if(NXP_EXTNS == TRUE)
 #define UICC_HANDLE   0x402
+#define UICC2_HANDLE  0x481
 #define ESE_HANDLE    0x4C0
 #define RETRY_COUNT   10
 #define default_count 3
@@ -109,6 +111,9 @@
 {
     extern bool gIsTagDeactivating;
     extern bool gIsSelectingRfInterface;
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    extern bool is_wired_mode_open;
+#endif
     extern void nativeNfcTag_doTransceiveStatus (tNFA_STATUS status, uint8_t * buf, uint32_t buflen);
     extern void nativeNfcTag_notifyRfTimeout ();
     extern void nativeNfcTag_doConnectStatus (jboolean is_connect_ok);
@@ -130,7 +135,7 @@
     extern tNFA_STATUS SetScreenState(int state);
     extern tNFA_STATUS SendAutonomousMode(int state , uint8_t num);
 #if(NXP_EXTNS == TRUE)
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
     extern tNFA_STATUS SendAGCDebugCommand();
 #endif
 #endif
@@ -193,7 +198,7 @@
     jmethodID               gCachedNfcManagerNotifySWPReaderRequestedFail;
     jmethodID               gCachedNfcManagerNotifySWPReaderActivated;
     jmethodID               gCachedNfcManagerNotifyAidRoutingTableFull;
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     jmethodID               gCachedNfcManagerNotifyETSIReaderModeStartConfig;
     jmethodID               gCachedNfcManagerNotifyETSIReaderModeStopConfig;
     jmethodID               gCachedNfcManagerNotifyETSIReaderModeSwpTimeout;
@@ -238,7 +243,7 @@
 #if(NXP_EXTNS == TRUE)
 SyncEvent                   sNfaGetRoutingEvent;  // event for Get_Routing....
 static bool                 sProvisionMode = false;
-#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
+#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
 SyncEvent                   sNfceeHciCbEnableEvent;
 SyncEvent                   sNfceeHciCbDisableEvent;
 #endif
@@ -300,7 +305,7 @@
 static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state);
 static void StoreScreenState(int state);
 int getScreenState();
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 bool isp2pActivated();
 #endif
 static void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
@@ -340,8 +345,13 @@
     UINT16   sUicc2CntxLen;
     UINT8    sUicc1TechCapblty[12];
     UINT8    sUicc2TechCapblty[12];
+    UINT8    sUicc1SessionId[8];
+    UINT8    sUicc2SessionId[8];
+    UINT8    sUicc1SessionIdLen;
+    UINT8    sUicc2SessionIdLen;
     UINT8    uiccActivStat = 0;
     UINT8    uiccConfigStat = 0;
+    unsigned long  dualUiccEnable = 0;
 }dual_uicc_info_t;
 dual_uicc_info_t dualUiccInfo;
 typedef enum
@@ -380,6 +390,7 @@
 static UINT8 sCheckNfceeFlag;
 void checkforNfceeBuffer();
 void checkforNfceeConfig();
+void performNfceeETSI12Config();
 tNFA_STATUS getUICC_RF_Param_SetSWPBitRate();
 //self test start
 static IntervalTimer nfaNxpSelfTestNtfTimer; // notification timer for swp self test
@@ -404,6 +415,7 @@
 static int nfcManager_doSelectUicc(JNIEnv* e, jobject o, jint uiccSlot);
 static int nfcManager_doGetSelectedUicc(JNIEnv* e, jobject o);
 static void getUiccContext();
+static int getUiccSession();
 static int nfcManager_staticDualUicc_Precondition(int uiccSlot);
 #endif
 #endif
@@ -416,10 +428,12 @@
 #endif
 #if(NXP_EXTNS == TRUE)
 tNFC_FW_VERSION get_fw_version();
+#if (JCOP_WA_ENABLE == TRUE)
 bool isNfcInitializationDone();
+#endif
 static UINT16 discDuration = 0x00;
 UINT16 getrfDiscoveryDuration();
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
 typedef struct enableAGC_debug
 {
     long enableAGC; // config param
@@ -435,7 +449,9 @@
 #endif
 
 void checkforTranscation(UINT8 connEvent ,void * eventData);
+#if (JCOP_WA_ENABLE == TRUE)
 void sig_handler(int signo);
+#endif
 void cleanup_timer();
 /* Transaction Events in order */
 typedef enum transcation_events
@@ -860,14 +876,6 @@
         ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
 #if(NXP_EXTNS == TRUE)
         NfcTag::getInstance().selectCompleteStatus(true);
-        if(eventData->activated.activate_ntf.intf_param.type==NFC_INTERFACE_EE_DIRECT_RF)
-        {
-            ALOGD("%s: NFA_ACTIVATED_EVT: gUICCVirtualWiredProtectMask=%d, gEseVirtualWiredProtectMask=%d", __FUNCTION__,gUICCVirtualWiredProtectMask, gEseVirtualWiredProtectMask);
-            if(gUICCVirtualWiredProtectMask != 0x00 || gEseVirtualWiredProtectMask != 0x00)
-            {
-                recovery=TRUE;
-            }
-        }
 #endif
 #if(NXP_EXTNS == TRUE)
         /***P2P-Prio Logic for Multiprotocol***/
@@ -964,6 +972,12 @@
             }
 #endif
             // For the SE, consider the field to be on while p2p is active.
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            if (is_wired_mode_open && SecureElement::getInstance().mPassiveListenEnabled == true)
+            {
+                SecureElement::getInstance().mPassiveListenTimer.kill();
+            }
+#endif
             SecureElement::getInstance().notifyRfFieldEvent (true);
         }
         else if (pn544InteropIsBusy() == false)
@@ -995,6 +1009,12 @@
             {
                 sSeRfActive = true;
                 SecureElement::getInstance().notifyListenModeState (true);
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+                if (is_wired_mode_open && SecureElement::getInstance().mPassiveListenEnabled == true)
+                {
+                    SecureElement::getInstance().mPassiveListenTimer.kill();
+                }
+#endif
             }
         }
         break;
@@ -1046,6 +1066,12 @@
                 gActivated = false; //guard this variable from multi-threaded access
                 gDeactivatedEvent.notifyOne ();
             }
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            if (is_wired_mode_open == true && SecureElement::getInstance().mPassiveListenEnabled == true)
+            {
+                SecureElement::getInstance().startThread(0x00);
+            }
+#endif
             NfcTag::getInstance ().mNumDiscNtf = 0;
             NfcTag::getInstance ().mTechListIndex =0;
             nativeNfcTag_resetPresenceCheck();
@@ -1070,6 +1096,7 @@
                 || (eventData->deactivated.type == NFA_DEACTIVATE_TYPE_DISCOVERY))
         {
 #if(NXP_EXTNS == TRUE)
+ #if (JCOP_WA_ENABLE == TRUE)
             if(RoutingManager::getInstance().is_ee_recovery_ongoing())
             {
                 recovery=FALSE;
@@ -1077,6 +1104,26 @@
                 SecureElement::getInstance().mEEdatapacketEvent.notifyOne();
             }
 #endif
+
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+        case NFA_PASSIVE_LISTEN_DISABLED_EVT:
+        {
+            ALOGD("%s: NFA_PASSIVE_LISTEN_DISABLED_EVT", __FUNCTION__);
+            SyncEventGuard g (SecureElement::getInstance().mPassiveListenEvt);
+            SecureElement::getInstance().mPassiveListenEvt.notifyOne();
+        }
+        break;
+#endif
+#if(NFC_NXP_ESE == TRUE)
+        case NFA_LISTEN_ENABLED_EVT:
+        {
+            ALOGD("%s: NFA_LISTEN_ENABLED_EVT", __FUNCTION__);
+            SyncEventGuard g (SecureElement::getInstance().mPassiveListenEvt);
+            SecureElement::getInstance().mPassiveListenEvt.notifyOne();
+        }
+        break;
+#endif
+#endif
             if (sSeRfActive) {
                 sSeRfActive = false;
                 if (!sIsDisabling && sIsNfaEnabled)
@@ -1357,7 +1404,7 @@
 
     gCachedNfcManagerNotifySWPReaderActivated = e->GetMethodID (cls.get(),
             "notifySWPReaderActivated", "()V");
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     gCachedNfcManagerNotifyETSIReaderModeStartConfig = e->GetMethodID (cls.get(),
             "notifyonETSIReaderModeStartConfig", "(I)V");
 
@@ -1492,7 +1539,9 @@
                 ALOGE ("%s: NFA_DM_NFCC_TIMEOUT_EVT; abort", __FUNCTION__);
             else if (dmEvent == NFA_DM_NFCC_TRANSPORT_ERR_EVT)
                 ALOGE ("%s: NFA_DM_NFCC_TRANSPORT_ERR_EVT; abort", __FUNCTION__);
+#if (JCOP_WA_ENABLE == TRUE)
             NFA_HciW4eSETransaction_Complete(Wait);
+#endif
             nativeNfcTag_abortWaits();
             NfcTag::getInstance().abort ();
             sAbortConnlessWait = true;
@@ -1618,12 +1667,30 @@
 *******************************************************************************/
 static jboolean nfcManager_sendRawFrame (JNIEnv* e, jobject, jbyteArray data)
 {
-    ScopedByteArrayRO bytes(e, data);
-    uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
-    size_t bufLen = bytes.size();
-    tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
-
-    return (status == NFA_STATUS_OK);
+#if(NXP_NFCC_EMPTY_DATA_PACKET == TRUE)
+    size_t bufLen;
+    uint8_t* buf = NULL;
+    if(data != NULL)
+    {
+        ScopedByteArrayRO bytes(e, data);
+        buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
+        bufLen = bytes.size();
+        tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
+        return (status == NFA_STATUS_OK);
+    }
+    else
+    {
+        /*Fix for Felica on Host for Empty NCI packet handling*/
+        bufLen = 0x00;
+    }
+    ALOGD("nfcManager_sendRawFrame");
+#else
+     ScopedByteArrayRO bytes(e, data);
+     uint8_t* buf = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(&bytes[0]));
+     size_t bufLen = bytes.size();
+#endif
+     tNFA_STATUS status = NFA_SendRawFrame (buf, bufLen, 0);
+     return (status == NFA_STATUS_OK);
 }
 
 /*******************************************************************************
@@ -1917,7 +1984,7 @@
 #endif
     ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
         __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION);
-   mwVer=  NFA_GetMwVersion();
+    mwVer=  NFA_GetMwVersion();
     ALOGD ("%s:  MW Version: NFC_NCIHALx_AR%X.%x.%x.%x",
             __FUNCTION__, mwVer.validation, mwVer.android_version,
             mwVer.major_version,mwVer.minor_version);
@@ -1933,7 +2000,7 @@
     sig.sa_flags = SA_SIGINFO;
     if(sigaction(SIG_NFC, &sig, NULL) < 0)
     {
-        ALOGE("Failed to register spi prio session signal handeler");
+        ALOGE("Failed to register spi prio session signal handler");
     }
 #endif
     if (sIsNfaEnabled)
@@ -1948,12 +2015,13 @@
         nfcManager_doPartialDeInitialize();
     }
 #endif
+#if (JCOP_WA_ENABLE == TRUE)
 if ((signal(SIGABRT, sig_handler) == SIG_ERR) &&
         (signal(SIGSEGV, sig_handler) == SIG_ERR))
     {
-        ALOGE("Failed to register signal handeler");
+        ALOGE("Failed to register signal handler");
      }
-
+#endif
     powerSwitch.initialize (PowerSwitch::FULL_POWER);
 
     {
@@ -2001,12 +2069,12 @@
                 PeerToPeer::getInstance().handleNfcOnOff (true);
 
 #if(NXP_EXTNS == TRUE)
-                ALOGD("gSeDiscoverycount = %d", gSeDiscoverycount);
+                ALOGD("%s: gSeDiscoverycount=%d gActualSeCount=%d",__FUNCTION__, gSeDiscoverycount, gActualSeCount);
                 if (NFA_STATUS_OK == GetSwpStausValue())
                 {
                     if (gSeDiscoverycount < gActualSeCount)
                     {
-                        ALOGD("Wait for ESE to discover, gdisc_timeout = %d", gdisc_timeout);
+                        ALOGD("Wait for SE to discover, gdisc_timeout = %d", gdisc_timeout);
                         SyncEventGuard g(gNfceeDiscCbEvent);
                         if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false)
                         {
@@ -2015,19 +2083,19 @@
                     }
                     else
                     {
-                        ALOGD("All ESE are discovered ");
+                        ALOGD("All SE are discovered ");
                     }
                 }
 
 #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
-                GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&uicc_active_state, sizeof(uicc_active_state));
-                if(uicc_active_state == 0x01)
+                GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&dualUiccInfo.dualUiccEnable, sizeof(dualUiccInfo.dualUiccEnable));
+                if(dualUiccInfo.dualUiccEnable == 0x01)
                 {
+                    checkforNfceeConfig();
                     dualUiccInfo.uiccActivStat = 0x00;
                     if(SecureElement::getInstance().getEeStatus(UICC_HANDLE)!=NFC_NFCEE_STATUS_REMOVED)
                     {
                         dualUiccInfo.uiccActivStat = (sSelectedUicc & 0x0F);
-                        getUiccContext();
                     }
                     switchToUiccSlot = ((sSelectedUicc & 0x0F) == 0x01) ? 0x02 : 0x01;
                     nfcManager_doSelectUicc(e,o,switchToUiccSlot);
@@ -2040,6 +2108,8 @@
                 else
 #endif
                     checkforNfceeConfig();
+                //Check for ETSI12 Configuration for SE s detected in the HCI Network
+                performNfceeETSI12Config();
 #endif
 #if((NFC_NXP_ESE_VER == JCOP_VER_3_3)&& (NXP_EXTNS == TRUE))
                 if(isNxpConfigModified())
@@ -2438,7 +2508,14 @@
                 }
                 ALOGD ("%s: FRM Disable", __FUNCTION__);
 #endif
+#if((NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE) ||(NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE))
+                if(!SecureElement::getInstance().mlistenDisabled){
+                    NFA_EnableListening();
+                }
+#else
                 NFA_EnableListening();
+#endif
+
 #if(NXP_EXTNS == TRUE)
                 discDuration = nat->discovery_duration;
 #endif
@@ -2715,6 +2792,7 @@
 #endif
         //PeerToPeer::getInstance().setP2pListenMask(p2p_listen_mask & 0x05);
         //PeerToPeer::getInstance().enableP2pListening (true);
+
         PeerToPeer::getInstance().enableP2pListening (false);
         startRfDiscovery (true);
     }
@@ -2959,10 +3037,14 @@
     ALOGD ("%s: enter", __FUNCTION__);
     sIsDisabling = true;
 #if(NXP_EXTNS == TRUE)
+#if (JCOP_WA_ENABLE == TRUE)
     rfActivation = false;
 #endif
+#endif
     doDwpChannel_ForceExit();
+#if (JCOP_WA_ENABLE == TRUE)
     NFA_HciW4eSETransaction_Complete(Wait);
+#endif
     pn544InteropAbortNow ();
 
     RoutingManager::getInstance().onNfccShutdown();
@@ -2975,10 +3057,18 @@
 
     if (sIsNfaEnabled)
     {
-        stat = SetVenConfigValue(NFC_MODE_OFF);
-        if (stat != NFA_STATUS_OK)
+        /*
+         During device Power-Off while Nfc-On, Nfc mode will be NFC_MODE_ON
+         NFC_MODE_OFF indicates Nfc is turning off and only in this case reset the venConfigValue
+         */
+        if(gGeneralPowershutDown == NFC_MODE_OFF)
         {
-            ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+            stat = SetVenConfigValue(NFC_MODE_OFF);
+
+            if (stat != NFA_STATUS_OK)
+            {
+                ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+            }
         }
         SyncEventGuard guard (sNfaDisableEvent);
         EXTNS_Close ();
@@ -4258,8 +4348,11 @@
 
     bitVal = ((0x10) | uiccSlot);
 
+    getUiccContext();
+
     if((dualUiccInfo.sUicc1CntxLen !=0)||(dualUiccInfo.sUicc2CntxLen !=0))
     {
+
         if((bitVal == 0x11)&&(dualUiccInfo.sUicc1CntxLen !=0))
         {
             ALOGD ("%s : update uicc1 context information ", __FUNCTION__);
@@ -4315,7 +4408,7 @@
     {
         SyncEventGuard guard (sNfceeHciCbDisableEvent);
         NFA_EE_HCI_Control(false);
-        sNfceeHciCbDisableEvent.wait();
+        sNfceeHciCbDisableEvent.wait(500);
     }
 
     /*Reset Nfcc*/
@@ -4324,7 +4417,7 @@
     {
         SyncEventGuard guard (sNfceeHciCbEnableEvent);
         NFA_EE_HCI_Control(true);
-        sNfceeHciCbEnableEvent.wait ();
+        sNfceeHciCbEnableEvent.wait (500);
     }
 
     {
@@ -4337,22 +4430,24 @@
     }
 
     ALOGD("%s : gSeDiscoverycount = %d", __FUNCTION__ , gSeDiscoverycount);
-    /*Get the SWP1 and SWP2 lines status*/
-    if (NFA_STATUS_OK == GetSwpStausValue())
     {
-        /*The SWP lines enabled and SE's discovered*/
-        if (gSeDiscoverycount < gActualSeCount)
+        SyncEventGuard g(gNfceeDiscCbEvent);
+        /*Get the SWP1 and SWP2 lines status*/
+        if (NFA_STATUS_OK == GetSwpStausValue())
         {
-            ALOGD("%s : Wait for ESE to discover, gdisc_timeout = %d", __FUNCTION__, gdisc_timeout);
-            SyncEventGuard g(gNfceeDiscCbEvent);
-            if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false)
+         /*The SWP lines enabled and SE's discovered*/
+            if (gSeDiscoverycount < gActualSeCount)
             {
-                ALOGE ("%s: timeout waiting for nfcee dis event", __FUNCTION__);
+                ALOGD("%s : Wait for ESE to discover, gdisc_timeout = %d", __FUNCTION__, gdisc_timeout);
+                if(gNfceeDiscCbEvent.wait(gdisc_timeout) == false)
+                {
+                    ALOGE ("%s: timeout waiting for nfcee dis event", __FUNCTION__);
+                }
             }
-        }
-        else
-        {
-            ALOGD("%s : All ESE are discovered ", __FUNCTION__);
+            else
+            {
+                ALOGD("%s : All ESE are discovered ", __FUNCTION__);
+            }
         }
     }
     /*Get the eSE and UICC parameters for RF*/
@@ -4967,6 +5062,7 @@
     DWP->close = close;
     DWP->transceive = transceive;
     DWP->doeSE_Reset = doeSE_Reset;
+    DWP->doeSE_JcopDownLoadReset = doeSE_JcopDownLoadReset;
 }
 #endif
 /*******************************************************************************
@@ -5064,12 +5160,12 @@
     gGeneralPowershutDown = nfcMode;
 }
 #endif
-
+#if (JCOP_WA_ENABLE == TRUE)
 bool isNfcInitializationDone()
 {
     return sIsNfaEnabled;
 }
-
+#endif
 /*******************************************************************************
 **
 ** Function:        StoreScreenState
@@ -5101,7 +5197,7 @@
     return screenstate;
 }
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 /*******************************************************************************
 **
 ** Function:        isp2pActivated
@@ -5253,16 +5349,17 @@
     {
         if(sIsNfaEnabled)
         {
-            nfcManager_doSetNfcMode(e , o, NFC_MODE_ON);
+            nfcManager_doSetNfcMode(e , o, NFC_MODE_ON); //POWER_OFF NFC_ON
         }
         else
         {
-            nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
+            nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF); //POWER_OFF NFC_OFF
         }
     }
     else
         ALOGE ("%s: unknown screen or power state. state=%d", __FUNCTION__, state);
 }
+
 #endif
 /*******************************************************************************
  **
@@ -5509,7 +5606,7 @@
                 && eventDM_Conn_data->rf_field.rf_field_status == 0)
         {
             ALOGD("start_timer");
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
             set_AGC_process_state(false);
 #endif
             transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_OFF;
@@ -5519,7 +5616,7 @@
                 transaction_data.current_transcation_state == NFA_TRANS_DM_RF_FIELD_EVT_OFF &&
                 eventDM_Conn_data->rf_field.rf_field_status == 1)
         {
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
             nfcManagerEnableAGCDebug(connEvent);
 #endif
             transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_ON;
@@ -5533,7 +5630,7 @@
                 eventDM_Conn_data->rf_field.rf_field_status == 0)
         {
             ALOGD("Transcation is done");
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
             set_AGC_process_state(false);
 #endif
             transaction_data.current_transcation_state = NFA_TRANS_DM_RF_TRANS_PROGRESS;
@@ -5571,7 +5668,7 @@
     ALOGD ("%s: enter", __FUNCTION__);
     char last_request = get_last_request();
     eScreenState_t last_screen_state_request = get_lastScreenStateRequest();
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
     set_AGC_process_state(false);
 #endif
     set_transcation_stat(false);
@@ -5625,7 +5722,7 @@
     screen_lock_flag = false;
     disable_discovery = false;
     memset(&transaction_data, 0x00, sizeof(Transcation_Check_t));
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
     memset(&menableAGC_debug_t, 0x00, sizeof(enableAGC_debug_t));
 #endif
 TheEnd:
@@ -5633,7 +5730,7 @@
     pthread_exit(NULL);
     return NULL;
 }
-
+#if (JCOP_WA_ENABLE == TRUE)
 /*******************************************************************************
 **
 ** Function         sig_handler
@@ -5653,6 +5750,9 @@
             break;
         case SIGABRT:
             ALOGE("received SIGABRT\n");
+#if((NXP_EXTNS == TRUE) && (NXP_NFCC_MW_RCVRY_BLK_FW_DNLD == TRUE))
+            NFA_MW_Fwdnlwd_Recovery(true);
+#endif
             NFA_HciW4eSETransaction_Complete(Wait);
             break;
         case SIGSEGV:
@@ -5663,6 +5763,7 @@
             break;
     }
 }
+#endif
 
 /*******************************************************************************
 **
@@ -5829,7 +5930,15 @@
  **********************************************************************************/
 void checkforNfceeBuffer()
 {
-int i, count = 0;
+    int i, count = 0;
+#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
+/*    unsigned long uicc_active_state = 0;
+    if(!GetNxpNumValue (NAME_NXP_DUAL_UICC_ENABLE, (void*)&uicc_active_state, sizeof(uicc_active_state)))
+    {
+        ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x00");
+        uicc_active_state = 0x00;
+    }*/
+#endif
 
     for(i=4;i<12;i++)
     {
@@ -5838,9 +5947,40 @@
     }
 
     if(count >= 8)
+    {
+#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
+        /*If session ID received all 0xff for UICC and dual UICC feature is enabled then
+         * clear the corresponding buffer (invalid session ID)
+         * */
+        if((sConfig[1] == 0xA0) && (sConfig[2] == 0xEA) &&
+                (dualUiccInfo.dualUiccEnable == 0x01))
+        {
+            if(sSelectedUicc == 0x01)
+            {
+                memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId));
+                dualUiccInfo.sUicc1SessionIdLen = 0;
+            }
+            else
+            {
+                memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId));
+                dualUiccInfo.sUicc2SessionIdLen = 0;
+            }
+        }
+#endif
         sNfceeConfigured = 1;
+    }
     else
-        sNfceeConfigured = 0;
+    {
+#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
+        if((sConfig[1] == 0xA0) && (sConfig[2] == 0xEA) &&
+                (dualUiccInfo.dualUiccEnable == 0x01))
+        {
+            sNfceeConfigured = getUiccSession();
+        }
+        else
+#endif
+            sNfceeConfigured = 0;
+    }
 
     memset (sConfig, 0, sizeof (sConfig));
 
@@ -5889,7 +6029,21 @@
         uicc_flag = 0x01;
         ALOGD("uicc_flag SET");
     }
-
+#if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
+    else if (dualUiccInfo.dualUiccEnable == 0x01)
+    {
+        if(sSelectedUicc == 0x01)
+        {
+            memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId));
+            dualUiccInfo.sUicc1SessionIdLen = 0;
+        }
+        else
+        {
+            memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId));
+            dualUiccInfo.sUicc2SessionIdLen = 0;
+        }
+    }
+#endif
     if((ese_flag == 0x01)||(uicc_flag == 0x01))
     {
 
@@ -5929,7 +6083,6 @@
             retry_cnt=0;
 #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
             sCheckNfceeFlag = 0;
-            getUiccContext();
 #endif
         }
 
@@ -5965,7 +6118,9 @@
             retry_cnt=0;
         }
     }
+#if (JCOP_WA_ENABLE == TRUE)
     RoutingManager::getInstance().handleSERemovedNtf();
+#endif
     sCheckNfceeFlag = 0;
 }
 #endif
@@ -5980,6 +6135,59 @@
     SetCbStatus(NFA_STATUS_FAILED);
 }
 
+/**********************************************************************************
+ **
+ ** Function:        performNfceeETSI12Config
+ **
+ ** Description:    checking for Nfcee ETSI 12 Compliancy and configure if compliant
+ **
+ ** Returns:         None .
+ **
+ **********************************************************************************/
+void performNfceeETSI12Config()
+{
+    UINT8 num_nfcee_present = 0;
+    UINT8 count =0;
+    bool status;
+
+    ALOGD ("%s", __FUNCTION__);
+
+    ALOGD("Sending Admin command ");
+    status = SecureElement::getInstance().getNfceeHostTypeList();
+    if(status == TRUE)
+    {
+        SyncEventGuard guard (SecureElement::getInstance().mNfceeInitCbEvent);
+        if(SecureElement::getInstance().mNfceeInitCbEvent.wait(2000) == false)
+        {
+            ALOGE ("%s: timeout waiting for Get Host Type List event", __FUNCTION__);
+        }
+    }
+
+    num_nfcee_present = SecureElement::getInstance().mHostsPresent;
+    ALOGD("num_nfcee_present = %d",num_nfcee_present);
+
+    if(num_nfcee_present > 0)
+    {
+        SecureElement::getInstance().SecEle_Modeset(0x01);
+        for(count = 0; count< num_nfcee_present ; count++)
+        {
+            status = SecureElement::getInstance().configureNfceeETSI12(SecureElement::getInstance().mHostsId[count]);
+            if(status == TRUE)
+            {
+                SyncEventGuard guard (SecureElement::getInstance().mNfceeInitCbEvent);
+                if(SecureElement::getInstance().mNfceeInitCbEvent.wait(4000) == false)
+                {
+                    ALOGE ("%s:     timeout waiting for Nfcee Init event", __FUNCTION__);
+                }
+            }
+        }
+    }
+    else
+    {
+        ALOGD("No ETS12 Compliant Host in the network!!!");
+    }
+
+}
 #if(NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE)
 /**********************************************************************************
  **
@@ -6006,30 +6214,33 @@
         android::sNfaGetConfigEvent.wait();
     }
 
-    ALOGD ("%s: save UICC context Info : Len = %d", __FUNCTION__,sCurrentConfigLen);
+    ALOGD ("%s: UICC context Info : Len = %x", __FUNCTION__,sCurrentConfigLen);
     /*If the session ID is changed or uicc changed*/
+
     if((dualUiccInfo.sUicc1CntxLen != 0)&&(sSelectedUicc == 0x01))
     {
-        for(i= 5 ; i < 13; i++)
+        for(i= 0 ; i < dualUiccInfo.sUicc1CntxLen; i++)
         {
-            if(sConfig[i] != dualUiccInfo.sUicc1Cntx[1])
+            if(sConfig[i] != dualUiccInfo.sUicc1Cntx[i])
                 break;
         }
-        if(i != 13)
+        if(i != dualUiccInfo.sUicc1CntxLen)
         {
+            ALOGD ("%s: copying UICC1 info", __FUNCTION__);
             memcpy(dualUiccInfo.sUicc1Cntx, sConfig, sCurrentConfigLen);
         }
     }
     /*If the session ID is changed or uicc changed*/
     if((dualUiccInfo.sUicc2CntxLen != 0)&&(sSelectedUicc == 0x02))
     {
-        for(i= 5 ; i < 13; i++)
+        for(i= 0 ; i < dualUiccInfo.sUicc2CntxLen; i++)
         {
-            if(sConfig[i] != dualUiccInfo.sUicc2Cntx[1])
+            if(sConfig[i] != dualUiccInfo.sUicc2Cntx[i])
                 break;
         }
-        if(i != 13)
+        if(i != dualUiccInfo.sUicc1CntxLen)
         {
+            ALOGD ("%s: copying UICC2 info", __FUNCTION__);
             memcpy(dualUiccInfo.sUicc2Cntx, sConfig, sCurrentConfigLen);
         }
     }
@@ -6093,6 +6304,84 @@
 
 /**********************************************************************************
  **
+ ** Function:        getUiccSession
+ **
+ ** Description:     Read and store UICC session values
+ **
+ ** Returns:         UICC Configured status
+ **                  1 : failed
+ **                  0 : success
+ **
+ **********************************************************************************/
+static int getUiccSession()
+{
+    ALOGD ("%s: Enter", __FUNCTION__);
+
+    int cmpStat = 0, sUiccConfigured = 1;
+    /*techInfo will be set if any DISCOVERY_REQ_NTF is received for current UICC
+     *It will be used to validate received session id belongs to current selected UICC or not
+     * */
+    bool techInfo = SecureElement::getInstance().isTeckInfoReceived (UICC_HANDLE);
+    ALOGD ("%s: techInfo 0x%02x", __FUNCTION__,techInfo);
+
+    /* sConfig will have session ID received
+     * If received different from previous UICC save it in corresponding UICC buffer
+     * If same, reset the UICC buffer
+     * */
+    if(sSelectedUicc == 0x01)
+    {
+        if(dualUiccInfo.sUicc2SessionIdLen != 0)
+        {
+            cmpStat = memcmp (sConfig + 4, dualUiccInfo.sUicc2SessionId, dualUiccInfo.sUicc2SessionIdLen);
+            if((cmpStat == 0)||(!techInfo))
+            {
+                memset(dualUiccInfo.sUicc1SessionId,0x00,sizeof(dualUiccInfo.sUicc1SessionId));
+                dualUiccInfo.sUicc1SessionIdLen = 0;
+                sUiccConfigured = 1;
+            }
+            else
+            {
+                memcpy(dualUiccInfo.sUicc1SessionId, sConfig+4, 8);
+                dualUiccInfo.sUicc1SessionIdLen = 8;
+                sUiccConfigured = 0;
+            }
+        }
+        else if(techInfo)
+        {
+            memcpy(dualUiccInfo.sUicc1SessionId, sConfig+4, 8);
+            dualUiccInfo.sUicc1SessionIdLen = 8;
+            sUiccConfigured = 0;
+        }
+    }
+    else if(sSelectedUicc == 0x02)
+    {
+        if(dualUiccInfo.sUicc1SessionIdLen != 0)
+        {
+            cmpStat = memcmp (sConfig + 4, dualUiccInfo.sUicc1SessionId, dualUiccInfo.sUicc1SessionIdLen);
+            if((cmpStat == 0)||(!techInfo))
+            {
+                memset(dualUiccInfo.sUicc2SessionId,0x00,sizeof(dualUiccInfo.sUicc2SessionId));
+                dualUiccInfo.sUicc2SessionIdLen = 0;
+                sUiccConfigured = 1;
+            }
+            else
+            {
+                memcpy(dualUiccInfo.sUicc2SessionId, sConfig+4, 8);
+                dualUiccInfo.sUicc2SessionIdLen = 8;
+                sUiccConfigured = 0;
+            }
+        }
+        else if(techInfo)
+        {
+            memcpy(dualUiccInfo.sUicc2SessionId, sConfig+4, 8);
+            dualUiccInfo.sUicc2SessionIdLen = 8;
+            sUiccConfigured = 0;
+        }
+    }
+    return sUiccConfigured;
+}
+/**********************************************************************************
+ **
  ** Function:        notifyUiccEvent
  **
  ** Description:     Notifies UICC event sto Service
@@ -6141,7 +6430,7 @@
     }
     else
     {
-        ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x01");
+        ALOGE ("NXP_DUAL_UICC_ENABLE Not found taking default value 0x00");
         uicc_active_state = 0x00;
     }
 
@@ -6244,7 +6533,7 @@
     //Technology to stream          0x00:TypeA 0x01:TypeB 0x02:TypeF
     //Bitrate                       0x00:106kbps 0x01:212kbps 0x02:424kbps 0x03:848kbps
     //prbs and hw_prbs              0x00 or 0x01 two extra parameters included in case of pn548AD
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
     UINT8 param[4];
     memset(param, 0x00, sizeof(param));
     param[0] = prbs;
@@ -6644,7 +6933,7 @@
 
     return status;
 }
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
 /*******************************************************************************
 **
 ** Function:        nfcManagerEnableAGCDebug
diff --git a/nci/jni/NativeNfcTag.cpp b/nci/jni/NativeNfcTag.cpp
index 69958b9..6dcde90 100644
--- a/nci/jni/NativeNfcTag.cpp
+++ b/nci/jni/NativeNfcTag.cpp
@@ -95,7 +95,7 @@
 
 // Pre-defined tag type values. These must match the values in
 // framework Ndef.java for Google public NFC API.
-#define NDEF_UNKNOWN_TYPE          -1
+#define NDEF_UNKNOWN_TYPE          (-1)
 #define NDEF_TYPE1_TAG             1
 #define NDEF_TYPE2_TAG             2
 #define NDEF_TYPE3_TAG             3
diff --git a/nci/jni/NativeNxpFeature.cpp b/nci/jni/NativeNxpFeature.cpp
index 405d0e9..c3a0045 100644
--- a/nci/jni/NativeNxpFeature.cpp
+++ b/nci/jni/NativeNxpFeature.cpp
@@ -182,7 +182,7 @@
     gnxpfeature_conf.NxpFeatureConfigEvt.notifyOne ();
 }
 #endif
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
 /*******************************************************************************
  **
  ** Function:        NxpResponse_EnableAGCDebug_Cb()
@@ -421,7 +421,7 @@
 {
     tNFA_STATUS status = NFA_STATUS_FAILED;
     uint8_t swp_test[] ={0x2F, 0x3E, 0x01, 0x00};   //SWP SelfTest
-#if((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551))
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
     uint8_t prbs_test[] ={0x2F, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF};    //PRBS SelfTest
     uint8_t cmd_buf[9] = {0,};
 #else
@@ -565,6 +565,14 @@
             ALOGD("SWP2 Interface is enabled");
             gActualSeCount++;
         }
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+        if (p_param[16] != 0x00)
+        {
+            ALOGD("SWP1A Interface is enabled");
+            gActualSeCount++;
+        }
+
+#endif
     }
     else
     {
@@ -588,7 +596,11 @@
 {
     tNFA_STATUS status = NFA_STATUS_FAILED;
     gActualSeCount = 1; /* default ese present */
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    uint8_t cmd_buf[] = {0x20, 0x03, 0x07, 0x03, 0xA0, 0xEC, 0xA0, 0xED, 0xA0, 0xD4};
+#else
     uint8_t cmd_buf[] = {0x20, 0x03, 0x05, 0x02, 0xA0, 0xEC, 0xA0, 0xED};
+#endif
     ALOGD("%s: enter", __FUNCTION__);
 
     SetCbStatus(NFA_STATUS_FAILED);
@@ -668,6 +680,7 @@
 }
 #endif
 
+#if (JCOP_WA_ENABLE == TRUE)
 /*******************************************************************************
  **
  ** Function:        ResetEseSession
@@ -704,6 +717,7 @@
     ALOGD("%s: exit", __FUNCTION__);
     return status;
 }
+#endif
 /*******************************************************************************
  **
  ** Function:        SetUICC_SWPBitRate()
diff --git a/nci/jni/NativeSecureElement.cpp b/nci/jni/NativeSecureElement.cpp
index f1659e5..943ef37 100644
--- a/nci/jni/NativeSecureElement.cpp
+++ b/nci/jni/NativeSecureElement.cpp
@@ -39,9 +39,13 @@
 #include "NfcTag.h"
 #include "RoutingManager.h"
 #include <ScopedPrimitiveArray.h>
+#include "phNxpConfig.h"
 
 extern bool hold_the_transceive;
 extern int dual_mode_current_state;
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+extern bool ceTransactionPending;
+#endif
 namespace android
 {
 
@@ -72,7 +76,7 @@
 static const int EE_ERROR_LISTEN_MODE = -4;
 static const int EE_ERROR_EXT_FIELD = -5;
 static const int EE_ERROR_NFC_DISABLED = -6;
-static bool is_wired_mode_open = false;
+bool is_wired_mode_open = false;
 /*******************************************************************************
 **
 ** Function:        nativeNfcSecureElement_doOpenSecureElementConnection
@@ -84,7 +88,11 @@
 ** Returns:         Handle of secure element.  values < 0 represent failure.
 **
 *******************************************************************************/
+#if (NXP_EXTNS == TRUE)
+static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobject,jint seId)
+#else
 static jint nativeNfcSecureElement_doOpenSecureElementConnection (JNIEnv*, jobject)
+#endif
 {
     ALOGD("%s: enter", __FUNCTION__);
     bool stat = false;
@@ -95,17 +103,93 @@
     p61_access_state_t p61_current_state = P61_STATE_INVALID;
 #endif
     SecureElement &se = SecureElement::getInstance();
-    if (se.isBusy())
-    {
+#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if(NXP_ESE_WIRED_MODE_PRIO != TRUE)
+    if(se.isBusy()) {
         goto TheEnd;
     }
-#if (NFC_NXP_ESE ==  TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-    if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
+#endif
+    se.mIsExclusiveWiredMode = false; // to ctlr exclusive wired mode
+    if(seId == 0xF4)
+    {
+        if(se.mIsWiredModeOpen)
+        {
+            goto TheEnd;
+        }
+#if (NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == true)
+        se.mIsExclusiveWiredMode = true;
+#endif
+        stat = se.checkForWiredModeAccess();
+        if(stat == false)
+        {
+            ALOGD("Denying SE open due to SE listen mode active");
+            secElemHandle = EE_ERROR_LISTEN_MODE;
+            goto TheEnd;
+        }
+
+        ALOGD("%s: Activating UICC Wired Mode=0x%X", __FUNCTION__, seId);
+        stat = se.activate(seId);
+        ALOGD("%s: Check UICC activation status stat=%X", __FUNCTION__, stat);
+        if (stat)
+        {
+            //establish a pipe to UICC
+            ALOGD("%s: Creatting a pipe to UICC!", __FUNCTION__);
+            stat = se.connectEE();
+            if (stat)
+            {
+                secElemHandle = se.mActiveEeHandle;
+            }
+            else
+            {
+                se.deactivate (0);
+            }
+        }
+        if ((!stat) && (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED)))
+        {
+            PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
+        }
+        se.mIsWiredModeOpen = true;
+#if(NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE)
+        if (isDiscoveryStarted())
+        {
+            // Stop RF Discovery if we were polling
+            startRfDiscovery (false);
+            status = NFA_DisableListening();
+            if(status == NFCSTATUS_OK)
+            {
+                startRfDiscovery (true);
+            }
+        }
+        else
+        {
+            status = NFA_DisableListening();
+        }
+        se.mlistenDisabled = true;
+#endif
+    goto TheEnd;
+    }
+#if(NXP_ESE_WIRED_MODE_PRIO == TRUE)
+    if((se.mIsWiredModeOpen)&&(se.mActiveEeHandle == 0x402))
+    {
+        stat = SecureElement::getInstance().disconnectEE (se.mActiveEeHandle);
+        se.mActiveEeHandle = NFA_HANDLE_INVALID;
+        se.mIsWiredModeOpen = false;
+    }
+#endif
+
+#if(NFC_NXP_CHIP_TYPE != PN547C2)
+#if (JCOP_WA_ENABLE == TRUE)
+if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
     {
         ALOGD ("ee recovery ongoing!!!");
-        goto TheEnd;
+        SyncEventGuard guard (SecureElement::getInstance().mEEdatapacketEvent);
+		SecureElement::getInstance().mEEdatapacketEvent.wait();
     }
-    stat = se.isWiredModeAllowedInRfState();
+#endif
+#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE)
+    se.mIsExclusiveWiredMode = true;
+#endif
+    stat = se.checkForWiredModeAccess();
     if(stat == false)
     {
         ALOGD("Denying SE open due to SE listen mode active");
@@ -126,7 +210,6 @@
     }
 #endif
 
-#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     ret_val = NFC_GetP61Status ((void *)&p61_current_state);
     if (ret_val < 0)
     {
@@ -134,6 +217,7 @@
         goto TheEnd;
     }
     ALOGD("P61 Status is: %x", p61_current_state);
+
 #if(NFC_NXP_ESE_VER == JCOP_VER_3_1)
     if (!(p61_current_state & P61_STATE_SPI) && !(p61_current_state & P61_STATE_SPI_PRIO))
     {
@@ -163,8 +247,25 @@
         }
         else
         {
-            is_wired_mode_open = true;
+            se.mIsWiredModeOpen = true;
             ALOGD("SE Access granted");
+#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE)
+            if (isDiscoveryStarted())
+            {
+                // Stop RF Discovery if we were polling
+                startRfDiscovery (false);
+                status = NFA_DisableListening();
+                if(status == NFCSTATUS_OK)
+                {
+                    startRfDiscovery (true);
+                }
+            }
+            else
+            {
+                status = NFA_DisableListening();
+            }
+            se.mlistenDisabled = true;
+#endif
         }
     }
 #if(NFC_NXP_ESE_VER == JCOP_VER_3_1)
@@ -221,7 +322,13 @@
             se.deactivate (0);
         }
     }
-
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    if(is_wired_mode_open)
+    {
+        se.enablePassiveListen(0x00);
+        se.meseUiccConcurrentAccess = true;
+    }
+#endif
     //if code fails to connect to the secure element, and nothing is active, then
     //tell the controller to power down
     if ((!stat) && (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED)))
@@ -258,11 +365,41 @@
     SecureElement &se = SecureElement::getInstance();
     se.NfccStandByOperation(STANDBY_TIMER_STOP);
 #endif
-    //Send the EVT_END_OF_APDU_TRANSFER event at the end of wired mode session.
-    stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
 
-    if(stat == false)
+#if(NXP_EXTNS == TRUE)
+    if(handle == 0x402)
+    {
+        stat = SecureElement::getInstance().disconnectEE (handle);
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+        se.mIsWiredModeOpen = false;
+#endif
+#if( (NXP_ESE_UICC_EXCLUSIVE_WIRED_MODE == TRUE) && (NFC_NXP_ESE == TRUE) && (NXP_EXTNS == TRUE) )
+        se.mIsExclusiveWiredMode = false;
+        if(se.mlistenDisabled)
+        {
+            if (isDiscoveryStarted())
+            {
+                // Stop RF Discovery if we were polling
+                startRfDiscovery (false);
+                status = NFA_EnableListening();
+                startRfDiscovery (true);
+            }
+            else
+            {
+                status = NFA_EnableListening();
+            }
+            se.mlistenDisabled = false;
+        }
+#endif
         goto TheEnd;
+    }
+#endif
+
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    //Send the EVT_END_OF_APDU_TRANSFER event at the end of wired mode session.
+    se.NfccStandByOperation(STANDBY_MODE_ON);
+#endif
+
 #if 0
     {
         sRfEnabled = isDiscoveryStarted();
@@ -310,7 +447,29 @@
             ALOGD("Denying SE close due to SE is not being released by Pn54x driver");
             stat = false;
         }
-        is_wired_mode_open = false;
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+        se.enablePassiveListen(0x01);
+        SecureElement::getInstance().mPassiveListenTimer.kill();
+        se.meseUiccConcurrentAccess = false;
+#endif
+        se.mIsWiredModeOpen = false;
+#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_EXCLUSIVE_WIRED_MODE)
+        if(se.mlistenDisabled)
+        {
+            if (isDiscoveryStarted())
+            {
+                // Stop RF Discovery if we were polling
+                startRfDiscovery (false);
+                status = NFA_EnableListening();
+                startRfDiscovery (true);
+            }
+            else
+            {
+                status = NFA_EnableListening();
+            }
+            se.mlistenDisabled = false;
+        }
+#endif
     }
 #endif
 TheEnd:
@@ -360,29 +519,50 @@
 {
     bool stat = false;
 #if (NFC_NXP_ESE == TRUE)
+    tNFA_STATUS mstatus;
     SecureElement &se = SecureElement::getInstance();
+    unsigned long num = 0;
     ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle);
-    if(!is_wired_mode_open)
+    if(!se.mIsWiredModeOpen)
     {
         ALOGD("wired mode is not open");
         return stat;
     }
-
-    stat = se.SecEle_Modeset(0x00);
-    if (handle == 0x4C0)
+    if (GetNxpNumValue("NXP_ESE_POWER_DH_CONTROL", &num, sizeof(num)))
     {
-        if(checkP61Status())
-            se.NfccStandByOperation(STANDBY_GPIO_LOW);
+        ALOGD("Power schemes enabled in config file is %ld", num);
     }
-    usleep(100 * 1000);
-    if (handle == 0x4C0)
-    {
-        if(checkP61Status() && (is_wired_mode_open == true))
-            se.NfccStandByOperation(STANDBY_GPIO_HIGH);
-    }
-    stat = se.SecEle_Modeset(0x01);
-    usleep(2000 * 1000);
 
+#if(NXP_ESE_RESET_METHOD == TRUE)
+    if((num == 2) && (se.isEtsi12ApduGatePresent()))
+    {
+        ALOGD("Power Scheme : Ext PMU");
+        mstatus = se.SecElem_sendEvt_Abort();
+        if(mstatus == NFA_STATUS_OK){
+            stat = true;
+        }
+        else {
+            stat = false;
+        }
+    }else
+#endif
+    {
+        ALOGD("Power Scheme : Int PMU/Legacy");
+        stat = se.SecEle_Modeset(0x00);
+        if (handle == 0x4C0)
+        {
+            if(checkP61Status())
+                se.NfccStandByOperation(STANDBY_GPIO_LOW);
+        }
+        usleep(100 * 1000);
+        if (handle == 0x4C0)
+        {
+            if(checkP61Status() && (se.mIsWiredModeOpen == true))
+                se.NfccStandByOperation(STANDBY_GPIO_HIGH);
+        }
+        stat = se.SecEle_Modeset(0x01);
+        usleep(2000 * 1000);
+    }
 #endif
     ALOGD("%s: exit", __FUNCTION__);
     return stat ? JNI_TRUE : JNI_FALSE;
@@ -450,9 +630,16 @@
     //copy results back to java
     jbyteArray result = e->NewByteArray(recvBufferActualSize);
     if (result != NULL)
-         {
+    {
         e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer);
-         }
+    }
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    if (ceTransactionPending)
+    {
+        ALOGD ("APDU Transceive CE wait");
+        SecureElement::getInstance().startThread(0x01);
+    }
+#endif
     ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize);
     return result;
 #else
@@ -468,7 +655,11 @@
 *****************************************************************************/
 static JNINativeMethod gMethods[] =
 {
-   {"doNativeOpenSecureElementConnection", "()I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection},
+#if(NXP_EXTNS == TRUE)
+   {"doNativeOpenSecureElementConnection", "(I)I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection},
+#else
+    {"doNativeOpenSecureElementConnection", "()I", (void *) nativeNfcSecureElement_doOpenSecureElementConnection},
+#endif
    {"doNativeDisconnectSecureElementConnection", "(I)Z", (void *) nativeNfcSecureElement_doDisconnectSecureElementConnection},
    {"doNativeResetSecureElement", "(I)Z", (void *) nativeNfcSecureElement_doResetSecureElement},
    {"doTransceive", "(I[B)[B", (void *) nativeNfcSecureElement_doTransceive},
diff --git a/nci/jni/NfcJniUtil.h b/nci/jni/NfcJniUtil.h
old mode 100644
new mode 100755
index ad370db..884898c
--- a/nci/jni/NfcJniUtil.h
+++ b/nci/jni/NfcJniUtil.h
@@ -68,14 +68,14 @@
 
 
 /* Error codes */
-#define ERROR_BUFFER_TOO_SMALL            -12
-#define ERROR_INSUFFICIENT_RESOURCES      -9
+#define ERROR_BUFFER_TOO_SMALL            (-12)
+#define ERROR_INSUFFICIENT_RESOURCES      (-9)
 
 
 /* Pre-defined tag type values. These must match the values in
  * Ndef.java in the framework.
  */
-#define NDEF_UNKNOWN_TYPE                -1
+#define NDEF_UNKNOWN_TYPE                (-1)
 #define NDEF_TYPE1_TAG                   1
 #define NDEF_TYPE2_TAG                   2
 #define NDEF_TYPE3_TAG                   3
@@ -97,7 +97,7 @@
 #define TARGET_TYPE_ISO14443_3A_3B        11
 #endif
 /* Name strings for target types. These *must* match the values in TagTechnology.java */
-#define TARGET_TYPE_UNKNOWN               -1
+#define TARGET_TYPE_UNKNOWN               (-1)
 #define TARGET_TYPE_ISO14443_3A           1
 #define TARGET_TYPE_ISO14443_3B           2
 #define TARGET_TYPE_ISO14443_4            3
diff --git a/nci/jni/NfcTag.cpp b/nci/jni/NfcTag.cpp
index fb874d1..4e5b192 100644
--- a/nci/jni/NfcTag.cpp
+++ b/nci/jni/NfcTag.cpp
@@ -85,8 +85,8 @@
     mLastKovioUidLen (0),
     mNdefDetectionTimedOut (false),
     mIsDynamicTagId (false),
-    mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT),
-    mIsFelicaLite(false)
+    mIsFelicaLite(false),
+    mPresenceCheckAlgorithm (NFA_RW_PRES_CHK_DEFAULT)
 {
     memset (mTechList, 0, sizeof(mTechList));
     memset (mTechHandles, 0, sizeof(mTechHandles));
diff --git a/nci/jni/NfcTag.h b/nci/jni/NfcTag.h
index baf7e66..e1d74f8 100644
--- a/nci/jni/NfcTag.h
+++ b/nci/jni/NfcTag.h
@@ -516,8 +516,9 @@
     struct timespec mLastKovioTime; // time of last Kovio tag activation
     UINT8 mLastKovioUid[NFC_KOVIO_MAX_LEN]; // uid of last Kovio tag activated
     bool mIsDynamicTagId; // whether the tag has dynamic tag ID
-    tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm;
     bool mIsFelicaLite;
+    tNFA_RW_PRES_CHK_OPTION mPresenceCheckAlgorithm;
+
 
     /*******************************************************************************
     **
diff --git a/nci/jni/PeerToPeer.cpp b/nci/jni/PeerToPeer.cpp
index cb95223..5f6a25f 100644
--- a/nci/jni/PeerToPeer.cpp
+++ b/nci/jni/PeerToPeer.cpp
@@ -132,11 +132,13 @@
 *******************************************************************************/
 void PeerToPeer::initialize ()
 {
-    ALOGD ("PeerToPeer::initialize");
+    static const char fn [] = "PeerToPeer::initialize";
     unsigned long num = 0;
 
+    ALOGD ("%s: enter", fn);
     if (GetNumValue ("P2P_LISTEN_TECH_MASK", &num, sizeof (num)))
         mP2pListenTechMask = num;
+    ALOGD ("%s: exit", fn);
 }
 
 
diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp
index 88b600c..4aeffe8 100644
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -74,7 +74,7 @@
 #if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
 static int mSetDefaulRouteParams;
 #endif
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 Rdr_req_ntf_info_t swp_rdr_req_ntf_info;
 static IntervalTimer swp_rd_req_timer;
 #endif
@@ -86,9 +86,14 @@
 {
     extern  void  checkforTranscation(UINT8 connEvent, void* eventData );
 #if (NXP_EXTNS == TRUE)
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    extern bool is_wired_mode_open;
+#endif
     extern UINT16 sRoutingBuffLen;
     extern bool  rfActivation;
+#if (JCOP_WA_ENABLE == TRUE)
     extern bool isNfcInitializationDone();
+#endif
     extern void startRfDiscovery (bool isStart);
     extern bool isDiscoveryStarted();
     extern int getScreenState();
@@ -104,37 +109,33 @@
 : mNativeData(NULL),
   mDefaultEe (NFA_HANDLE_INVALID),
   mHostListnTechMask (0),
+  mUiccListnTechMask (0),
   mFwdFuntnEnable (true),
-  mAddAid(1)
+  mAddAid(0)
 {
     static const char fn [] = "RoutingManager::RoutingManager()";
     unsigned long num = 0;
-
+    ALOGD ("%s:enter", fn);
     // Get the active SE
     if (GetNumValue("ACTIVE_SE", &num, sizeof(num)))
         mActiveSe = num;
     else
         mActiveSe = 0x00;
-
     // Get the active SE for Nfc-F
     if (GetNumValue("ACTIVE_SE_NFCF", &num, sizeof(num)))
         mActiveSeNfcF = num;
     else
         mActiveSeNfcF = 0x00;
-
     // Get the "default" route
     if (GetNumValue("DEFAULT_ISODEP_ROUTE", &num, sizeof(num)))
         mDefaultEe = num;
     else
         mDefaultEe = 0x00;
-    ALOGD("%s: default route is 0x%02X", fn, mDefaultEe);
-
     // Get the "default" route for Nfc-F
     if (GetNumValue("DEFAULT_NFCF_ROUTE", &num, sizeof(num)))
       mDefaultEeNfcF = num;
     else
       mDefaultEeNfcF = 0x00;
-
     // Get the default "off-host" route.  This is hard-coded at the Java layer
     // but we can override it here to avoid forcing Java changes.
     if (GetNumValue("DEFAULT_OFFHOST_ROUTE", &num, sizeof(num)))
@@ -145,14 +146,14 @@
         mAidMatchingMode = num;
     else
         mAidMatchingMode = AID_MATCHING_EXACT_ONLY;
-
     if (GetNxpNumValue("AID_MATCHING_PLATFORM", &num, sizeof(num)))
         mAidMatchingPlatform = num;
     else
         mAidMatchingPlatform = AID_MATCHING_L;
-    ALOGD("%s: mOffHostEe=0x%02X mAidMatchingMode=0x%2X", fn, mOffHostEe, mAidMatchingMode);
-    mSeTechMask = 0x00;
+
+    mSeTechMask = 0x00; //unused
     mNfcFOnDhHandle = NFA_HANDLE_INVALID;
+    ALOGD ("%s:exit", fn);
 }
 
 
@@ -162,10 +163,12 @@
 
 int RoutingManager::mChipId = 0;
 #if (NXP_EXTNS == TRUE)
+#if (JCOP_WA_ENABLE == TRUE)
 bool recovery;
 #endif
+#endif
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 void reader_req_event_ntf (union sigval);
 #endif
 RoutingManager::~RoutingManager ()
@@ -178,53 +181,69 @@
     static const char fn [] = "RoutingManager::initialize()";
     unsigned long num = 0, tech = 0;
     mNativeData = native;
-    UINT8 mActualNumEe = SecureElement::MAX_NUM_EE;
-    tNFA_EE_INFO mEeInfo [mActualNumEe];
+    UINT8 ActualNumEe = SecureElement::MAX_NUM_EE;
+    tNFA_EE_INFO mEeInfo [ActualNumEe];
 
+    ALOGD ("%s: enter", fn);
 #if (NXP_EXTNS == TRUE)
     if ((GetNumValue(NAME_HOST_LISTEN_TECH_MASK, &tech, sizeof(tech))))
-    {
         mHostListnTechMask = tech;
-        ALOGD ("%s:HOST_LISTEN_TECH_MASK = 0x%X;", __FUNCTION__, mHostListnTechMask);
-    }
+    else
+        mHostListnTechMask = 0x07;
+
+    if ((GetNumValue(NAME_UICC_LISTEN_TECH_MASK, &tech, sizeof(tech))))
+        mUiccListnTechMask = tech;
+    else
+        mUiccListnTechMask = 0x07;
 
     if ((GetNumValue(NAME_NXP_FWD_FUNCTIONALITY_ENABLE, &tech, sizeof(tech))))
-    {
         mFwdFuntnEnable = tech;
-        ALOGE ("%s:NXP_FWD_FUNCTIONALITY_ENABLE=%d;", __FUNCTION__, mFwdFuntnEnable);
-    }
+    else
+        mFwdFuntnEnable = 0x01;
 
     if (GetNxpNumValue (NAME_NXP_DEFAULT_SE, (void*)&num, sizeof(num)))
-    {
-        ALOGD ("%d: nfcManager_GetDefaultSE", num);
         mDefaultEe = num;
-    }
+    else
+        mDefaultEe = 0x02;
+
     if (GetNxpNumValue (NAME_NXP_ENABLE_ADD_AID, (void*)&num, sizeof(num)))
-    {
-        ALOGD ("%d: mAddAid", num);
         mAddAid = num;
-    }
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+    else
+        mAddAid = 0x01;
+
+#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     if (GetNxpNumValue (NAME_NXP_ESE_WIRED_PRT_MASK, (void*)&num, sizeof(num)))
-    {
-        ALOGD (" NAME_NXP_ESE_WIRED_PRT_MASK :%d", num);
         gEseVirtualWiredProtectMask = num;
-    }
+    else
+        gEseVirtualWiredProtectMask = 0x00;
+
     if (GetNxpNumValue (NAME_NXP_UICC_WIRED_PRT_MASK, (void*)&num, sizeof(num)))
-    {
-        ALOGD ("%d: NAME_NXP_UICC_WIRED_PRT_MASK", num);
         gUICCVirtualWiredProtectMask = num;
-    }
+    else
+        gUICCVirtualWiredProtectMask = 0x00;
+
     if (GetNxpNumValue (NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE, (void*)&num, sizeof(num)))
-    {
-        ALOGD ("%d: NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE", num);
         gWiredModeRfFieldEnable = num;
-    }
+    else
+        gWiredModeRfFieldEnable = 0x00;
+#endif
+#if(NXP_ESE_FELICA_CLT == TRUE)
+    if (GetNxpNumValue (NAME_DEFAULT_FELICA_CLT_ROUTE, (void*)&num, sizeof(num)))
+        mDefaultTechFSeID = ((num == 0x01)? 0x4C0 : ((num == 0x02)? 0x402 : 0x481));
+    else
+        mDefaultTechFSeID = 0x402;
+
+    if (GetNxpNumValue (NAME_DEFAULT_FELICA_CLT_PWR_STATE, (void*)&num, sizeof(num)))
+        mDefaultTechFPowerstate = num;
+    else
+        mDefaultTechFPowerstate = 0x1F;
+#else
+    mDefaultTechFSeID = 0x402;
+    mDefaultTechFPowerstate = 0x1F;
 #endif
 #endif
     if ((GetNxpNumValue(NAME_NXP_NFC_CHIP, &num, sizeof(num))))
     {
-        ALOGD ("%s:NXP_NFC_CHIP=0x0%lu;", __FUNCTION__, num);
         mChipId = num;
     }
 
@@ -249,7 +268,7 @@
         if (nfaStat != NFA_STATUS_OK)
             ALOGE ("Failed to register wildcard AID for DH");
         // Tell the host-routing to only listen on Nfc-A/Nfc-B
-        nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask);
+        nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask & 0xB);
         if (nfaStat != NFA_STATUS_OK)
             ALOGE ("Failed to configure CE IsoDep technologies");
         //setRouting(true);
@@ -259,18 +278,19 @@
 //    setDefaultRouting();
 #endif
 
-    if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK)
+    if ((nfaStat = NFA_AllEeGetInfo (&ActualNumEe, mEeInfo)) != NFA_STATUS_OK)
     {
         ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat);
-        mActualNumEe = 0;
+        ActualNumEe = 0;
     }
     else
     {
-        gSeDiscoverycount = mActualNumEe;
+        gSeDiscoverycount = ActualNumEe;
+        ALOGD ("%s:gSeDiscoverycount=0x%X;", __FUNCTION__, gSeDiscoverycount);
 #if 0
         if(mChipId == 0x02 || mChipId == 0x04)
         {
-            for(int xx = 0; xx <  mActualNumEe; xx++)
+            for(int xx = 0; xx <  ActualNumEe; xx++)
             {
                 ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, mEeInfo[xx].ee_handle,mEeInfo[xx].ee_status);
                 if ((mEeInfo[xx].ee_handle == 0x4C0) &&
@@ -284,8 +304,7 @@
 #endif
     }
 
-    ALOGD("gSeDiscoverycount = %d", gSeDiscoverycount);
-#if (NFC_NXP_ESE ==  TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_ESE ==  TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     swp_rdr_req_ntf_info.mMutex.lock();
     memset(&(swp_rdr_req_ntf_info.swp_rd_req_info),0x00,sizeof(rd_swp_req_t));
     memset(&(swp_rdr_req_ntf_info.swp_rd_req_current_info),0x00,sizeof(rd_swp_req_t));
@@ -297,6 +316,10 @@
 
     memset(&NfcID2_add_req,0x00,sizeof(NfcID2_add_req));
     memset(&NfcId2_rmv_req,0x00,sizeof(NfcId2_rmv_req));
+
+    printMemberData();
+
+    ALOGD ("%s: exit", fn);
     return true;
 }
 
@@ -579,865 +602,632 @@
 
 bool RoutingManager::setDefaultRoute(const UINT8 defaultRoute, const UINT8 protoRoute, const UINT8 techRoute)
 {
+    static const char fn []           = "RoutingManager::setDefaultRoute";
+    tNFA_STATUS       nfaStat         = NFA_STATUS_FAILED;
+    tNFA_HANDLE       preferredHandle = ROUTE_LOC_UICC1_ID;
 
-    tNFA_STATUS nfaStat;
-    static const char fn [] = "RoutingManager::setDefaultRoute";   /*commented to eliminate unused variable warning*/
-    unsigned long uiccListenTech = 0,check_default_proto_se_id_req = 0;
-    tNFA_HANDLE defaultHandle = NFA_HANDLE_INVALID;
-    tNFA_HANDLE ActDevHandle = NFA_HANDLE_INVALID;
-    tNFA_HANDLE preferred_defaultHandle = 0x402;
-    UINT8 isDefaultProtoSeIDPresent = 0;
+    ALOGD ("%s: enter; defaultRoute:0x%2X protoRoute:0x%2X TechRoute:0x%2X HostListenMask:0x%X", fn, defaultRoute, protoRoute, techRoute, mHostListnTechMask);
 
-    ALOGD ("%s: enter", fn);
-
-#if((NXP_EXTNS == TRUE) && (NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH == TRUE))
-    if(mSetDefaulRouteParams == 0)
-    {
-        mSetDefaulRouteParams = ((defaultRoute<<16)|(protoRoute<<8)|(techRoute));
-    }
-#endif
-
-    SyncEventGuard guard (mRoutingEvent);
-    if (mDefaultEe == SecureElement::ESE_ID) //eSE
-    {
-        preferred_defaultHandle = 0x4C0;
-    }
-    else if (mDefaultEe == SecureElement::UICC_ID) //UICC
-    {
-        preferred_defaultHandle = 0x402;
-    }
-
-       uiccListenTech = NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B;
-
-       ALOGD ("%s: enter, defaultRoute:%x protoRoute:0x%x TechRoute:0x%x HostListenMask:0x%x", fn, defaultRoute, protoRoute, techRoute, mHostListnTechMask);
-
-       defaultSeID = (((defaultRoute & 0x60) >> 5) == 0x00)  ? 0x400 :  ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultPowerstate=defaultRoute & 0x1F;
-       ALOGD ("%s: enter, defaultSeID:%x defaultPowerstate:0x%x", fn, defaultSeID,defaultPowerstate);
-
-       defaultProtoSeID = (((protoRoute & 0x60) >> 5) == 0x00)  ? 0x400 :  ((((protoRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultProtoPowerstate = protoRoute & 0x1F;
-       ALOGD ("%s: enter, defaultProtoSeID:%x defaultProtoPowerstate:0x%x", fn, defaultProtoSeID,defaultProtoPowerstate);
-
-       defaultTechSeID = (((techRoute & 0x60) >> 5) == 0x00)  ? 0x400 :  ((((techRoute & 0x60)>>5 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultTechAPowerstate = techRoute & 0x1F;
-       DefaultTechType = (techRoute & 0x80) >> 7;
-       ALOGD ("%s: enter, defaultTechSeID:%x defaultTechAPowerstate:0x%x,defaultTechType:0x%x", fn, defaultTechSeID,defaultTechAPowerstate,DefaultTechType);
-
-       cleanRouting();
-
-       if (mHostListnTechMask)
-       {
-           nfaStat = NFA_CeRegisterAidOnDH (NULL, 0, stackCallback);
-           if (nfaStat != NFA_STATUS_OK)
-               ALOGE ("Failed to register wildcard AID for DH");
-       }
-
-       if (GetNxpNumValue(NAME_CHECK_DEFAULT_PROTO_SE_ID, &check_default_proto_se_id_req, sizeof(check_default_proto_se_id_req)))
-       {
-           ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%02x ",fn,check_default_proto_se_id_req);
-       }
-       else
-       {
-           ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%02x ",fn,check_default_proto_se_id_req);
-       }
-       if(check_default_proto_se_id_req == 0x01)
-       {
-           UINT8 count,seId=0;
-           tNFA_HANDLE ee_handleList[SecureElement::MAX_NUM_EE];
-           SecureElement::getInstance().getEeHandleList(ee_handleList, &count);
-
-           for (int  i = 0; ((count != 0 ) && (i < count)); i++)
-           {
-               seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]);
-               defaultHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId);
-               ALOGD ("%s: enter, ee_handleList[%d]:%x", fn, i,ee_handleList[i]);
-               //defaultHandle = ee_handleList[i];
-               if (preferred_defaultHandle == defaultHandle)
-               {
-                   //ActSEhandle = defaultHandle;
-                   break;
-               }
-           }
-           for (int  i = 0; ((count != 0 ) && (i < count)); i++)
-           {
-               seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]);
-               ActDevHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId);
-               ALOGD ("%s: enter, ee_handleList[%d]:%x", fn, i,ee_handleList[i]);
-               if (defaultProtoSeID == ActDevHandle)
-               {
-                   isDefaultProtoSeIDPresent =1;
-                   break;
-               }
-           }
-
-           ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent);
-           if(!isDefaultProtoSeIDPresent)
-           {
-               defaultProtoSeID = 0x400;
-               defaultProtoPowerstate = 0x01;
-           }
-       }
-
-       if( defaultProtoSeID == defaultSeID)
-       {
-             unsigned int default_proto_power_mask[5] = {0,};
-             for(int pCount=0 ; pCount< 5 ;pCount++)
-             {
-                  if((defaultPowerstate >> pCount)&0x01)
-                  {
-                       default_proto_power_mask[pCount] |= NFC_PROTOCOL_MASK_ISO7816;
-                  }
-                  if((defaultProtoPowerstate >> pCount)&0x01)
-                  {
-                       default_proto_power_mask[pCount] |= NFA_PROTOCOL_MASK_ISO_DEP;
-                  }
-             }
-             if(defaultProtoSeID == 0x400 && mHostListnTechMask == 0x00)
-             {
-                 ALOGE("%s, HOST is disabled hence skipping configure proto route to host", fn);
-             }
-             else
-             {
-                 if(mCeRouteStrictDisable == 0x01)
-                 {
-
-#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
-                     if(defaultProtoSeID == 0x400)
-                     {
-                         default_proto_power_mask[0] |= NFA_PROTOCOL_MASK_T3T;
-                     }
-#endif
-                     nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID ,
-                                                            default_proto_power_mask[0],
-                                                            default_proto_power_mask[1],
-                                                            default_proto_power_mask[2],
-                                                            default_proto_power_mask[3],
-                                                            default_proto_power_mask[4]);
-                 }
-                 else
-                 {
-                     nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID ,
-                                                           default_proto_power_mask[0],
-                                                           default_proto_power_mask[1],
-                                                           default_proto_power_mask[2],
-                                                           0, 0);
-                 }
-                 if (nfaStat == NFA_STATUS_OK)
-                      mRoutingEvent.wait ();
-                 else
-                 {
-                      ALOGE ("Fail to set  iso7816 routing");
-                 }
-             }
-       }
-       else
-       {
-              int t3t_protocol_mask = 0;
-              ALOGD ("%s: enter, defaultPowerstate:%x", fn, defaultPowerstate);
-              if(mHostListnTechMask == 0x00 && defaultSeID == 0x400)
-              {
-                  ALOGE("%s, HOST is disabled hence skipping configure 7816 route to host", fn);
-              }
-              else
-              {
-                  if(mCeRouteStrictDisable == 0x01)
-                  {
-#if(NFC_NXP_CHIP_TYPE != PN547C2)
-                      if(defaultSeID == 0x400)
-                      {
-                          t3t_protocol_mask = NFA_PROTOCOL_MASK_T3T;
-                      }
-#endif
-                      nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID ,
-                                                            (defaultPowerstate & 01) ? (NFC_PROTOCOL_MASK_ISO7816 | t3t_protocol_mask) :0,
-                                                            (defaultPowerstate & 02) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
-                                                            (defaultPowerstate & 04) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
-                                                            (defaultPowerstate & 0x08) ? NFC_PROTOCOL_MASK_ISO7816 :0,
-                                                            (defaultPowerstate & 0x10) ? NFC_PROTOCOL_MASK_ISO7816 :0);
-                  }else
-                  {
-                      nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID ,
-                                                            (defaultPowerstate & 01) ? NFC_PROTOCOL_MASK_ISO7816 :0,
-                                                            (defaultPowerstate & 02) ? NFC_PROTOCOL_MASK_ISO7816 :0,
-                                                            (defaultPowerstate & 04) ? NFC_PROTOCOL_MASK_ISO7816 :0,
-                                                            0, 0);
-                  }
-                  if (nfaStat == NFA_STATUS_OK)
-                  mRoutingEvent.wait ();
-                  else
-                  {
-                       ALOGE ("Fail to set  iso7816 routing");
-                  }
-
-                  t3t_protocol_mask =0;
-              }
-              if(mHostListnTechMask == 0x00 && defaultProtoSeID == 0x400)
-              {
-                  ALOGE("%s, HOST is disabled hence skipping configure ISO-DEP route to host", fn);
-              }
-              else
-              {
-                  if(mCeRouteStrictDisable == 0x01)
-                  {
-#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
-                     //Felicafrom host
-                     int t3t_protocol_mask =0;
-                      if(defaultProtoSeID == 0x400)
-                      {
-                          t3t_protocol_mask = NFA_PROTOCOL_MASK_T3T;
-                      }
-#endif
-#if(NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
-                     nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID,
-                                                           (defaultProtoPowerstate& 01) ? (NFA_PROTOCOL_MASK_ISO_DEP | t3t_protocol_mask): 0,
-                                                           (defaultProtoPowerstate & 02) ? (NFA_PROTOCOL_MASK_ISO_DEP) :0,
-                                                           (defaultProtoPowerstate & 04) ? (NFA_PROTOCOL_MASK_ISO_DEP) :0,
-                                                           (defaultProtoPowerstate & 0x08) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                           (defaultProtoPowerstate & 0x10) ? NFA_PROTOCOL_MASK_ISO_DEP :0 );
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    mDefaultIso7816SeID = ((((defaultRoute & 0xE0) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((defaultRoute & 0xE0)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((defaultRoute & 0xE0)>>5 )== 0x02 ) ? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID)));
 #else
-                      nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID,
-                                                            (defaultProtoPowerstate& 01) ? NFA_PROTOCOL_MASK_ISO_DEP: 0,
-                                                            (defaultProtoPowerstate & 02) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                            (defaultProtoPowerstate & 04) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                            (defaultProtoPowerstate & 0x08) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                            (defaultProtoPowerstate & 0x10) ? NFA_PROTOCOL_MASK_ISO_DEP :0);
+    mDefaultIso7816SeID = (((defaultRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((defaultRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID);
 #endif
-                  }else{
-                      nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID,
-                                                             (defaultProtoPowerstate& 01) ? NFA_PROTOCOL_MASK_ISO_DEP: 0,
-                                                             (defaultProtoPowerstate & 02) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                             (defaultProtoPowerstate & 04) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
-                                                             0, 0 );
-                  }
-                  if (nfaStat == NFA_STATUS_OK)
-                       mRoutingEvent.wait ();
-                  else
-                  {
-                       ALOGE ("Fail to set ISO-7816 routing");
-                  }
-                  t3t_protocol_mask =0;
-              }
-       }
+    mDefaultIso7816Powerstate = defaultRoute & 0x1F;
+    ALOGD ("%s:mDefaultIso7816SeID:0x%2X mDefaultIso7816Powerstate:0x%X", fn, mDefaultIso7816SeID, mDefaultIso7816Powerstate);
 
-#if(NFC_NXP_CHIP_TYPE != PN547C2 && NXP_EXTNS == TRUE && NXP_NFCC_HCE_F == TRUE)
-       if(0x400 != defaultProtoSeID  && 0x400 != defaultSeID && mHostListnTechMask)
-       {
-
-           if(mCeRouteStrictDisable == 0x01)
-           {
-               nfaStat = NFA_EeSetDefaultProtoRouting(0x400 ,
-                                                      NFA_PROTOCOL_MASK_T3T,
-                                                      0,
-                                                      0,
-                                                      NFA_PROTOCOL_MASK_T3T,
-                                                      0);
-
-           }else{
-                 nfaStat = NFA_EeSetDefaultProtoRouting(0x400 ,
-                                                        NFA_PROTOCOL_MASK_T3T,
-                                                        0,
-                                                        0,
-                                                        0,
-                                                        0);
-           }
-           if (nfaStat == NFA_STATUS_OK)//FelicaOnHost
-               mRoutingEvent.wait ();
-           else
-           {
-               ALOGE ("Fail to set T3T protocol routing to HOST");
-           }
-       }
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    mDefaultIsoDepSeID = ((((protoRoute & 0xE0) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((protoRoute & 0xE0)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((protoRoute & 0xE0)>>5 )== 0x02 ) ? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID)));
+#else
+    mDefaultIsoDepSeID = (((protoRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((protoRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID);
 #endif
-//ee_handle = SecureElement::getInstance().getEseHandleFromGenericId(switch_on);
-    ALOGD ("%s:defaultHandle:%x", fn, defaultHandle);
-    ALOGD ("%s:preferred_defaultHandle:%x", fn, preferred_defaultHandle);
+    mDefaultIsoDepPowerstate = protoRoute & 0x1F;
+    ALOGD ("%s:mDefaultIsoDepSeID:0x%2X mDefaultIsoDepPowerstate:0x%2X", fn, mDefaultIsoDepSeID,mDefaultIsoDepPowerstate);
 
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    mDefaultTechASeID = ((((techRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((techRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ((((techRoute & 0x60)>>5 ) == 0x02)? ROUTE_LOC_UICC1_ID : ROUTE_LOC_UICC2_ID)));
+#else
+    mDefaultTechASeID = (((techRoute & 0x60) >> 5) == 0x00) ? ROUTE_LOC_HOST_ID : ((((techRoute & 0x60)>>5 )== 0x01 ) ? ROUTE_LOC_ESE_ID : ROUTE_LOC_UICC1_ID);
+#endif
+    mDefaultTechAPowerstate = techRoute & 0x1F;
+
+    ALOGD ("%s:mDefaultTechASeID:0x%2X mDefaultTechAPowerstate:0x%2X", fn, mDefaultTechASeID,mDefaultTechAPowerstate);
+
+    if (mHostListnTechMask)
     {
-        unsigned long max_tech_mask             = 0x03;
-        unsigned int default_tech_power_mask[5] = {0,};
-        unsigned int defaultTechFPowerstate     = 0x1F;
-
-        max_tech_mask = SecureElement::getInstance().getSETechnology(defaultTechSeID);
-
-        ALOGD ("%s:defaultTechSeID:%x", fn, defaultTechSeID);
-        ALOGD ("%s:Technologies supported by defaultTechSeID :%x", fn, max_tech_mask);
-
-        if(defaultTechSeID == 0x402)
-        {
-               for(int pCount=0 ; pCount< 5 ;pCount++)
-               {
-                    if((defaultTechAPowerstate >> pCount)&0x01)
-                    {
-                         default_tech_power_mask[pCount] |= (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B);
-                    }
-                    if((defaultTechFPowerstate >> pCount)&0x01)
-                    {
-                         default_tech_power_mask[pCount] |= NFA_TECHNOLOGY_MASK_F;
-                    }
-               }
-
-               if(mCeRouteStrictDisable == 0x01)
-               {
-                   nfaStat =  NFA_EeSetDefaultTechRouting (defaultTechSeID,
-                                                      (max_tech_mask & default_tech_power_mask[0]),
-                                                      (max_tech_mask & default_tech_power_mask[1]),
-                                                      (max_tech_mask & default_tech_power_mask[2]),
-                                                      (max_tech_mask & default_tech_power_mask[3]),
-                                                      (max_tech_mask & default_tech_power_mask[4]));
-               }else{
-                   nfaStat =  NFA_EeSetDefaultTechRouting (defaultTechSeID,
-                                                      (max_tech_mask & default_tech_power_mask[0]),
-                                                      (max_tech_mask & default_tech_power_mask[1]),
-                                                      (max_tech_mask & default_tech_power_mask[2]),
-                                                      0,
-                                                      0);
-               }
-               if (nfaStat == NFA_STATUS_OK)
-                     mRoutingEvent.wait ();
-               else
-               {
-                     ALOGE ("Fail to set tech routing");
-               }
-
-            if(mHostListnTechMask > 0 && mFwdFuntnEnable == TRUE)
-            {
-                if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_A) && (max_tech_mask & NFA_TECHNOLOGY_MASK_B))
-                {
-                   if(mCeRouteStrictDisable == 0x01)
-                   {
-                       switch(mHostListnTechMask)
-                       {
-                           case 0x01:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0 );
-                           break;
-                           case 0x02:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x03:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                NFA_TECHNOLOGY_MASK_A,
-                                                                   0,
-                                                                   0,
-                                                                   NFA_TECHNOLOGY_MASK_A,
-                                                                   0 );
-                           break;
-                       }
-                   }
-                   else
-                   {
-                       switch(mHostListnTechMask)
-                       {
-                           case 0x01:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_A,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x02:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x03:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_A,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                        }
-                   }
-                   if(nfaStat == NFA_STATUS_OK)
-                   {
-                      mRoutingEvent.wait ();
-                   }
-                   else
-                   {
-                       ALOGE ("Fail to set Tech A routing to DH");
-                   }
-                }
-                else if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_B) && (max_tech_mask & NFA_TECHNOLOGY_MASK_A))
-                {
-                   if(mCeRouteStrictDisable == 0x01)
-                   {
-                       switch(mHostListnTechMask)
-                       {
-                           case 0x01:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x02:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0,
-                                                                   0,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0 );
-                           break;
-                           case 0x03:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0,
-                                                                   0,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0 );
-                           break;
-                       }
-                   }
-                   else
-                   {
-                       switch(mHostListnTechMask)
-                       {
-                           case 0x01:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x02:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                           case 0x03:
-                                  nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   NFA_TECHNOLOGY_MASK_B,
-                                                                   0,
-                                                                   0,
-                                                                   0,
-                                                                   0 );
-                           break;
-                       }
-                   }
-                   if(nfaStat == NFA_STATUS_OK)
-                   {
-                       mRoutingEvent.wait ();
-                   }
-                   else
-                   {
-                       ALOGE ("Fail to set Tech B routing to DH");
-                   }
-                }
-                else if((max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B)) ||
-                       (max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F)))// When there is NO UICC or Type AB/ABF UICC detected
-                {
-                    ALOGD ("TypeAB or Type ABF UICC detected, not setting any tech route to DH");
-                }
-                else if(max_tech_mask == 0x00) //When NO UICC
-                {
-                    ALOGD ("No UICC connected");
-                    if(mCeRouteStrictDisable == 0x01)
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                   0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                           break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    if(nfaStat == NFA_STATUS_OK)
-                    {
-                       mRoutingEvent.wait ();
-                    }
-                    else
-                    {
-                        ALOGE ("Fail to set Tech A or B routing to DH");
-                    }
-                }
-            }
-            else
-            {
-                ALOGD ("Host Listen is disabled, Not setting any tech route to DH");
-            }
-        }
-        else
-        {
-              DefaultTechType &= ~NFA_TECHNOLOGY_MASK_F;
-              DefaultTechType |= (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B);
-
-              if(mCeRouteStrictDisable == 0x01)
-              {
-                  nfaStat =  NFA_EeSetDefaultTechRouting (defaultTechSeID,
-                                                         (defaultTechAPowerstate& 01) ?  (max_tech_mask & DefaultTechType): 0,
-                                                         (defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0,
-                                                         (defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0,
-                                                         (defaultTechAPowerstate & 0x08) ? (max_tech_mask & DefaultTechType) :0,
-                                                         (defaultTechAPowerstate & 0x10) ? (max_tech_mask & DefaultTechType) :0);
-              }else{
-                   nfaStat =  NFA_EeSetDefaultTechRouting (defaultTechSeID,
-                                                          (defaultTechAPowerstate& 01) ?  (max_tech_mask & DefaultTechType): 0,
-                                                          (defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0,
-                                                          (defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0,
-                                                          0, 0 );
-              }
-              if (nfaStat == NFA_STATUS_OK)
-                  mRoutingEvent.wait ();
-              else
-              {
-                  ALOGE ("Fail to set Tech A/B/AB routing to ESE/DH");
-              }
-
-              max_tech_mask = SecureElement::getInstance().getSETechnology(0x402);
-
-              if(mCeRouteStrictDisable == 0x01)
-              {
-                  nfaStat =  NFA_EeSetDefaultTechRouting (0x402,
-                                                         (defaultTechFPowerstate& 01) ?  (max_tech_mask & NFA_TECHNOLOGY_MASK_F): 0,
-                                                         (defaultTechFPowerstate & 02) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0,
-                                                         (defaultTechFPowerstate & 04) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0,
-                                                         (defaultTechFPowerstate & 0x08) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0,
-                                                         (defaultTechFPowerstate & 0x10) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0);
-              }else{
-                  nfaStat =  NFA_EeSetDefaultTechRouting (0x402,
-                                                          (defaultTechFPowerstate& 01) ?  (max_tech_mask & NFA_TECHNOLOGY_MASK_F): 0,
-                                                          (defaultTechFPowerstate & 02) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0,
-                                                          (defaultTechFPowerstate & 04) ? (max_tech_mask & NFA_TECHNOLOGY_MASK_F) :0,
-                                                          0, 0 );
-              }
-              if (nfaStat == NFA_STATUS_OK)
-                     mRoutingEvent.wait ();
-              else
-              {
-                  ALOGE ("Fail to set Tech F routing to UICC");
-              }
-
-            if(mHostListnTechMask > 0 && mFwdFuntnEnable == TRUE)
-            {
-                if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_A) && ( max_tech_mask & NFA_TECHNOLOGY_MASK_B))
-                {
-                    if(mCeRouteStrictDisable == 0x01)
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                   0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    if(nfaStat == NFA_STATUS_OK)
-                    {
-                        mRoutingEvent.wait ();
-                    }
-                    else
-                    {
-                        ALOGE ("Fail to set Tech A routing to DH");
-                    }
-                }
-                else if(!(max_tech_mask & NFA_TECHNOLOGY_MASK_B) && (max_tech_mask & NFA_TECHNOLOGY_MASK_A))
-                {
-                    if(mCeRouteStrictDisable == 0x01)
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    if(nfaStat == NFA_STATUS_OK)
-                    {
-                        mRoutingEvent.wait ();
-                    }
-                    else
-                    {
-                        ALOGE ("Fail to set Tech B routing to DH");
-                    }
-                }
-                else if((max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B)) ||
-                       (max_tech_mask == (NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F)))// When there is NO UICC or Type AB/ABF UICC detected
-                {
-                    ALOGD ("TypeAB or Type ABF UICC detected, not setting any tech route to DH");
-                }
-                else if(max_tech_mask == 0x00) //When NO UICC
-                {
-                    ALOGD ("No UICC connected");
-                    if(mCeRouteStrictDisable == 0x01)
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-                    else
-                    {
-                        switch(mHostListnTechMask)
-                        {
-                            case 0x01:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_A,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x02:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    NFA_TECHNOLOGY_MASK_B,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                            case 0x03:
-                                   nfaStat =  NFA_EeSetDefaultTechRouting (0x400,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0,
-                                                                    0 );
-                            break;
-                        }
-                    }
-
-                    if(nfaStat == NFA_STATUS_OK)
-                    {
-                       mRoutingEvent.wait ();
-                    }
-                    else
-                    {
-                        ALOGE ("Fail to set Tech A or B routing to DH");
-                    }
-                }
-            }
-        }
+       nfaStat = NFA_CeRegisterAidOnDH (NULL, 0, stackCallback);
+       if (nfaStat != NFA_STATUS_OK)
+           ALOGE ("Failed to register wildcard AID for DH");
+       nfaStat = NFA_CeSetIsoDepListenTech(mHostListnTechMask & 0xB);
+       if (nfaStat != NFA_STATUS_OK)
+           ALOGE ("Failed to configure CE IsoDep technologies");
     }
 
-    if ((GetNumValue(NAME_UICC_LISTEN_TECH_MASK, &uiccListenTech, sizeof(uiccListenTech))))
-    {
-         ALOGD ("%s:UICC_TECH_MASK=0x0%lu;", __FUNCTION__, uiccListenTech);
-    }
-    if((defaultHandle != NFA_HANDLE_INVALID)  &&  (0 != uiccListenTech))
-    {
-         {
-               SyncEventGuard guard (SecureElement::getInstance().mUiccListenEvent);
-               nfaStat = NFA_CeConfigureUiccListenTech (defaultHandle, 0x00);
-               if (nfaStat == NFA_STATUS_OK)
-               {
-                     SecureElement::getInstance().mUiccListenEvent.wait ();
-               }
-               else
-                     ALOGE ("fail to start UICC listen");
-         }
-         {
-               SyncEventGuard guard (SecureElement::getInstance().mUiccListenEvent);
-               nfaStat = NFA_CeConfigureUiccListenTech (defaultHandle, (uiccListenTech & 0x07));
-               if(nfaStat == NFA_STATUS_OK)
-               {
-                     SecureElement::getInstance().mUiccListenEvent.wait ();
-               }
-               else
-                     ALOGE ("fail to start UICC listen");
-         }
-    }
+    checkProtoSeID();
+
+    initialiseTableEntries ();
+
+    compileProtoEntries ();
+
+    consolidateProtoEntries ();
+
+    setProtoRouting ();
+
+    compileTechEntries ();
+
+    consolidateTechEntries ();
+
+    setTechRouting ();
+
+    ALOGD ("%s: exit", fn);
+
     return true;
 }
+
 void RoutingManager::setCeRouteStrictDisable(UINT32 state)
 {
     ALOGD ("%s: mCeRouteScreenLock = 0x%X", __FUNCTION__, state);
     mCeRouteStrictDisable = state;
 }
+
+void RoutingManager::printMemberData()
+{
+    ALOGD("%s: ACTIVE_SE = 0x%0X", __FUNCTION__, mActiveSe);
+    ALOGD("%s: ACTIVE_SE_NFCF = 0x%0X", __FUNCTION__, mActiveSeNfcF);
+    ALOGD("%s: AID_MATCHING_MODE = 0x%0X", __FUNCTION__, mAidMatchingMode);
+    ALOGD("%s: DEFAULT_NFCF_ROUTE = 0x%0X", __FUNCTION__, mDefaultEeNfcF);
+    ALOGD("%s: DEFAULT_ISODEP_ROUTE = 0x%0X", __FUNCTION__, mDefaultEe);
+    ALOGD("%s: DEFAULT_OFFHOST_ROUTE = 0x%0X", __FUNCTION__, mOffHostEe);
+    ALOGD("%s: AID_MATCHING_PLATFORM = 0x%0X", __FUNCTION__, mAidMatchingPlatform);
+    ALOGD("%s: HOST_LISTEN_TECH_MASK = 0x%0X;", __FUNCTION__, mHostListnTechMask);
+    ALOGD("%s: UICC_LISTEN_TECH_MASK = 0x%0X;", __FUNCTION__, mUiccListnTechMask);
+    ALOGD("%s: DEFAULT_FELICA_CLT_ROUTE = 0x%0X;", __FUNCTION__, mDefaultTechFSeID);
+    ALOGD("%s: DEFAULT_FELICA_CLT_PWR_STATE = 0x%0X;", __FUNCTION__, mDefaultTechFPowerstate);
+
+    ALOGD("%s: NXP_NFC_CHIP = 0x%0X;", __FUNCTION__, mChipId);
+    ALOGD("%s: NXP_DEFAULT_SE = 0x%0X;", __FUNCTION__, mDefaultEe);
+    ALOGD("%s: NXP_ENABLE_ADD_AID = 0x%0X;", __FUNCTION__, mAddAid);
+    ALOGD("%s: NXP_ESE_WIRED_PRT_MASK = 0x%0X;", __FUNCTION__, gEseVirtualWiredProtectMask);
+    ALOGD("%s: NXP_UICC_WIRED_PRT_MASK = 0x%0X;", __FUNCTION__, gUICCVirtualWiredProtectMask);
+    ALOGD("%s: NXP_FWD_FUNCTIONALITY_ENABLE = 0x%0X;", __FUNCTION__, mFwdFuntnEnable);
+    ALOGD("%s: NXP_WIRED_MODE_RF_FIELD_ENABLE = 0x%0X;", __FUNCTION__, gWiredModeRfFieldEnable);
+
+}
+
+/* To check whether the route location for ISO-DEP protocol defined by user in config file is actually connected or not
+ * If not connected then set it to HOST by default*/
+void RoutingManager::checkProtoSeID(void)
+{
+    static const char fn []                     = "RoutingManager::checkProtoSeID";
+    UINT8 isDefaultIsoDepSeIDPresent            = 0;
+    tNFA_HANDLE ActDevHandle                    = NFA_HANDLE_INVALID;
+    unsigned long check_default_proto_se_id_req = 0;
+
+    ALOGD ("%s: enter", fn);
+
+    if (GetNxpNumValue(NAME_CHECK_DEFAULT_PROTO_SE_ID, &check_default_proto_se_id_req, sizeof(check_default_proto_se_id_req)))
+    {
+        ALOGD("%s : CHECK_DEFAULT_PROTO_SE_ID - 0x%2X ",fn,check_default_proto_se_id_req);
+    }
+    else
+    {
+        ALOGE("%s : CHECK_DEFAULT_PROTO_SE_ID not defined. Taking default value - 0x%2X",fn,check_default_proto_se_id_req);
+    }
+
+    if(check_default_proto_se_id_req == 0x01)
+    {
+        UINT8 count,seId=0;
+        tNFA_HANDLE ee_handleList[SecureElement::MAX_NUM_EE];
+        SecureElement::getInstance().getEeHandleList(ee_handleList, &count);
+
+        for (int  i = 0; ((count != 0 ) && (i < count)); i++)
+        {
+            seId = SecureElement::getInstance().getGenericEseId(ee_handleList[i]);
+            ActDevHandle = SecureElement::getInstance().getEseHandleFromGenericId(seId);
+            ALOGD ("%s:ee_handleList[%d]:0x%2X", fn, i,ee_handleList[i]);
+            if (mDefaultIsoDepSeID == ActDevHandle)
+            {
+                isDefaultIsoDepSeIDPresent = 1;
+                break;
+            }
+        }
+
+        ALOGD ("%s:isDefaultIsoDepSeIDPresent:0x%X", fn, isDefaultIsoDepSeIDPresent);
+        if(!isDefaultIsoDepSeIDPresent)
+        {
+            mDefaultIsoDepSeID = ROUTE_LOC_HOST_ID;
+            mDefaultIsoDepPowerstate = 0x01;
+        }
+    }
+
+    ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::initialiseTableEntries(void)
+{
+    static const char fn [] = "RoutingManager::initialiseTableEntries";
+
+    ALOGD ("%s: enter", fn);
+
+    /* Defined Protocol Masks
+    * T1T      0x01
+    * T2T      0x02
+    * T3T      0x04
+    * ISO-DEP  0x08
+    * NFC-DEP  0x10
+    * ISO-7816 0x20
+    */
+
+    mProtoTableEntries[PROTO_T3T_IDX].protocol     = NFA_PROTOCOL_MASK_T3T;
+    mProtoTableEntries[PROTO_ISODEP_IDX].protocol  = NFA_PROTOCOL_MASK_ISO_DEP;
+    mProtoTableEntries[PROTO_ISO7816_IDX].protocol = NFC_PROTOCOL_MASK_ISO7816;
+
+    mTechTableEntries[TECH_A_IDX].technology       = NFA_TECHNOLOGY_MASK_A;
+    mTechTableEntries[TECH_B_IDX].technology       = NFA_TECHNOLOGY_MASK_B;
+    mTechTableEntries[TECH_F_IDX].technology       = NFA_TECHNOLOGY_MASK_F;
+
+    for(int xx = 0; xx < MAX_PROTO_ENTRIES; xx++)
+    {
+        mProtoTableEntries[xx].routeLoc = mTechTableEntries[xx].routeLoc = 0x00;
+        mProtoTableEntries[xx].power    = mTechTableEntries[xx].power    = 0x00;
+        mProtoTableEntries[xx].enable   = mTechTableEntries[xx].enable   = FALSE;
+    }
+
+    mLmrtEntries[ROUTE_LOC_HOST_ID_IDX].nfceeID    = ROUTE_LOC_HOST_ID;
+    mLmrtEntries[ROUTE_LOC_ESE_ID_IDX].nfceeID     = ROUTE_LOC_ESE_ID;
+    mLmrtEntries[ROUTE_LOC_UICC1_ID_IDX].nfceeID   = ROUTE_LOC_UICC1_ID;
+    mLmrtEntries[ROUTE_LOC_UICC2_ID_IDX].nfceeID   = ROUTE_LOC_UICC2_ID;
+
+    for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++)
+    {
+        mLmrtEntries[xx].proto_switch_on   = mLmrtEntries[xx].tech_switch_on   = 0x00;
+        mLmrtEntries[xx].proto_switch_off  = mLmrtEntries[xx].tech_switch_off  = 0x00;
+        mLmrtEntries[xx].proto_battery_off = mLmrtEntries[xx].tech_battery_off = 0x00;
+        mLmrtEntries[xx].proto_screen_lock = mLmrtEntries[xx].tech_screen_lock = 0x00;
+        mLmrtEntries[xx].proto_screen_off  = mLmrtEntries[xx].tech_screen_off  = 0x00;
+    }
+    /*Get all the technologies supported by all the execution environments*/
+     mTechSupportedByEse   = SecureElement::getInstance().getSETechnology(ROUTE_LOC_ESE_ID);
+     mTechSupportedByUicc1 = SecureElement::getInstance().getSETechnology(ROUTE_LOC_UICC1_ID);
+     mTechSupportedByUicc2 = SecureElement::getInstance().getSETechnology(ROUTE_LOC_UICC2_ID);
+     ALOGD ("%s: exit; mTechSupportedByEse:0x%0X mTechSupportedByUicc1:0x%0X mTechSupportedByUicc2:0x%0X", fn, mTechSupportedByEse, mTechSupportedByUicc1, mTechSupportedByUicc2);
+}
+
+/* Compilation of Proto Table entries strictly based on config file parameters
+ * Each entry in proto table consistes of route location, protocol and power state
+ * */
+void RoutingManager::compileProtoEntries(void)
+{
+    static const char fn [] = "RoutingManager::compileProtoEntries";
+    tNFA_STATUS nfaStat     = NFA_STATUS_FAILED;
+
+    ALOGD ("%s: enter", fn);
+
+    /*Populate the entries on  protocol table*/
+    mProtoTableEntries[PROTO_T3T_IDX].routeLoc = ROUTE_LOC_HOST_ID;//T3T Proto always to HOST. For other EE used Tech F routing
+    mProtoTableEntries[PROTO_T3T_IDX].power    = 0x01; //Only Screen ON UNLOCK allowed
+    mProtoTableEntries[PROTO_T3T_IDX].enable   = ((mHostListnTechMask & 0x04) != 0x00) ? TRUE : FALSE;
+
+    mProtoTableEntries[PROTO_ISODEP_IDX].routeLoc = mDefaultIsoDepSeID;
+    mProtoTableEntries[PROTO_ISODEP_IDX].power    = mCeRouteStrictDisable ? mDefaultIsoDepPowerstate : (mDefaultIsoDepPowerstate & 0xE7);
+    mProtoTableEntries[PROTO_ISODEP_IDX].enable   = ((mHostListnTechMask & 0x03) != 0x00) ? TRUE : FALSE;
+
+    mProtoTableEntries[PROTO_ISO7816_IDX].routeLoc = mDefaultIso7816SeID;
+    mProtoTableEntries[PROTO_ISO7816_IDX].power    = mCeRouteStrictDisable ? mDefaultIso7816Powerstate : (mDefaultIso7816Powerstate & 0xE7);
+    mProtoTableEntries[PROTO_ISO7816_IDX].enable   = TRUE;
+
+    dumpTables(1);
+
+    ALOGD ("%s: exit", fn);
+}
+
+/* libnfc-nci takes protocols for each power-state for single route location
+ * The previous protocols set will be overwritten by new protocols set by NFA_EeSetDefaultProtoRouting
+ * So consolidate all the protocols/power state for a given NFCEE ID's
+ * For example:
+ * When PROTOCOL(ISO-DEP) and  AID default route(ISO7816) set to same EE then set (ISO-DEP | ISO-7816) to that EE.
+ */
+void RoutingManager::consolidateProtoEntries(void)
+{
+    static const char fn [] = "RoutingManager::consolidateProtoEntries";
+
+    ALOGD ("%s: enter", fn);
+
+    int index = -1;
+
+    for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++)
+    {
+        if(mProtoTableEntries[xx].enable)
+        {
+            switch(mProtoTableEntries[xx].routeLoc)
+            {
+                case ROUTE_LOC_HOST_ID:
+                        index = ROUTE_LOC_HOST_ID_IDX;
+                    break;
+                case ROUTE_LOC_ESE_ID:
+                        index = ROUTE_LOC_ESE_ID_IDX;
+                    break;
+                case ROUTE_LOC_UICC1_ID:
+                        index = ROUTE_LOC_UICC1_ID_IDX;
+                    break;
+                case ROUTE_LOC_UICC2_ID:
+                        index = ROUTE_LOC_UICC2_ID_IDX;
+                    break;
+            }
+            if(index != -1)
+            {
+                mLmrtEntries[index].proto_switch_on    = (mLmrtEntries[index].proto_switch_on)   | ((mProtoTableEntries[xx].power & 0X01)? mProtoTableEntries[xx].protocol:0);
+                mLmrtEntries[index].proto_switch_off   = (mLmrtEntries[index].proto_switch_off)  | ((mProtoTableEntries[xx].power & 0X02)? mProtoTableEntries[xx].protocol:0);
+                mLmrtEntries[index].proto_battery_off  = (mLmrtEntries[index].proto_battery_off) | ((mProtoTableEntries[xx].power & 0X04)? mProtoTableEntries[xx].protocol:0);
+                mLmrtEntries[index].proto_screen_lock  = (mLmrtEntries[index].proto_screen_lock) | ((mProtoTableEntries[xx].power & 0X08)? mProtoTableEntries[xx].protocol:0);
+                mLmrtEntries[index].proto_screen_off   = (mLmrtEntries[index].proto_screen_off)  | ((mProtoTableEntries[xx].power & 0X10)? mProtoTableEntries[xx].protocol:0);
+            }
+        }
+    }
+
+    dumpTables(2);
+
+    ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::setProtoRouting()
+{
+    static const char fn [] = "RoutingManager::setProtoRouting";
+    tNFA_STATUS nfaStat     = NFA_STATUS_FAILED;
+
+    ALOGD ("%s: enter", fn);
+    SyncEventGuard guard (mRoutingEvent);
+    for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++)
+    {
+        ALOGD ("%s: nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID);
+        if( mLmrtEntries[xx].nfceeID           &&
+           (mLmrtEntries[xx].proto_switch_on   ||
+            mLmrtEntries[xx].proto_switch_off  ||
+            mLmrtEntries[xx].proto_battery_off ||
+            mLmrtEntries[xx].proto_screen_lock ||
+            mLmrtEntries[xx].proto_screen_off) )
+        {
+            /*Clear protocols for NFCEE ID control block */
+            ALOGD ("%s: Clear Proto Routing Entries for nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID);
+            nfaStat = NFA_EeSetDefaultProtoRouting(mLmrtEntries[xx].nfceeID,0,0,0,0,0);
+            if(nfaStat == NFA_STATUS_OK)
+            {
+                mRoutingEvent.wait ();
+            }
+            else
+            {
+                ALOGE ("Fail to clear proto routing to 0x%X",mLmrtEntries[xx].nfceeID);
+            }
+            /*Set Required protocols for NFCEE ID control block in libnfc-nci*/
+            nfaStat = NFA_EeSetDefaultProtoRouting(mLmrtEntries[xx].nfceeID,
+                                                   mLmrtEntries[xx].proto_switch_on,
+                                                   mLmrtEntries[xx].proto_switch_off,
+                                                   mLmrtEntries[xx].proto_battery_off,
+                                                   mLmrtEntries[xx].proto_screen_lock,
+                                                   mLmrtEntries[xx].proto_screen_off);
+            if(nfaStat == NFA_STATUS_OK)
+            {
+                mRoutingEvent.wait ();
+            }
+            else
+            {
+                ALOGE ("Fail to set proto routing to 0x%X",mLmrtEntries[xx].nfceeID);
+            }
+        }
+    }
+    ALOGD ("%s: exit", fn);
+}
+
+/* Compilation of Tech Table entries strictly based on config file parameters
+ * Each entry in tech table consistes of route location, technology and power state
+ * */
+void RoutingManager::compileTechEntries(void)
+{
+    static const char fn []          = "RoutingManager::compileTechEntries";
+    UINT32 techSupportedBySelectedEE = 0;
+
+    ALOGD ("%s: enter", fn);
+
+    /*Check technologies supported by EE selected in conf file*/
+    if(mDefaultTechASeID == ROUTE_LOC_UICC1_ID)
+        techSupportedBySelectedEE = mTechSupportedByUicc1;
+    else if(mDefaultTechASeID == ROUTE_LOC_UICC2_ID)
+        techSupportedBySelectedEE = mTechSupportedByUicc2;
+    else if(mDefaultTechASeID == ROUTE_LOC_ESE_ID)
+        techSupportedBySelectedEE = mTechSupportedByEse;
+    else
+        techSupportedBySelectedEE = 0; /*For Host, no tech based route supported as Host always reads protocol data*/
+
+    /*Populate the entries on  tech route table*/
+    mTechTableEntries[TECH_A_IDX].routeLoc = mDefaultTechASeID;
+    mTechTableEntries[TECH_A_IDX].power    = mCeRouteStrictDisable ? mDefaultTechAPowerstate : (mDefaultTechAPowerstate & 0xE7);
+    mTechTableEntries[TECH_A_IDX].enable   = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_A)? TRUE : FALSE;
+
+    /*Reuse the same power state and route location used for A*/
+    mTechTableEntries[TECH_B_IDX].routeLoc = mDefaultTechASeID;
+    mTechTableEntries[TECH_B_IDX].power    = mCeRouteStrictDisable ? mDefaultTechAPowerstate : (mDefaultTechAPowerstate & 0xE7);
+    mTechTableEntries[TECH_B_IDX].enable   = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_B)? TRUE : FALSE;
+
+    /*Check technologies supported by EE selected in conf file - For TypeF*/
+    if(mDefaultTechFSeID == ROUTE_LOC_UICC1_ID)
+        techSupportedBySelectedEE = mTechSupportedByUicc1;
+    else if(mDefaultTechFSeID == ROUTE_LOC_UICC2_ID)
+        techSupportedBySelectedEE = mTechSupportedByUicc2;
+    else if(mDefaultTechFSeID == ROUTE_LOC_ESE_ID)
+        techSupportedBySelectedEE = mTechSupportedByEse;
+    else
+        techSupportedBySelectedEE = 0;/*For Host, no tech based route supported as Host always reads protocol data*/
+
+    mTechTableEntries[TECH_F_IDX].routeLoc = mDefaultTechFSeID;
+    mTechTableEntries[TECH_F_IDX].power    = mCeRouteStrictDisable ? mDefaultTechFPowerstate : (mDefaultTechFPowerstate & 0xE7);
+    mTechTableEntries[TECH_F_IDX].enable   = (techSupportedBySelectedEE & NFA_TECHNOLOGY_MASK_F)? TRUE : FALSE;
+
+    dumpTables(3);
+    if(((mHostListnTechMask) && (mHostListnTechMask != 0X04)) && (mFwdFuntnEnable == TRUE))
+    {
+        processTechEntriesForFwdfunctionality();
+    }
+    ALOGD ("%s: exit", fn);
+}
+
+/* Forward Functionality is to handle either technology which is supported by UICC
+ * We are handling it by setting the alternate technology(A/B) to HOST
+ * */
+void RoutingManager::processTechEntriesForFwdfunctionality(void)
+{
+    static const char fn []    = "RoutingManager::processTechEntriesForFwdfunctionality";
+    UINT32 techSupportedByUICC = mTechSupportedByUicc1;
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    techSupportedByUICC        = mTechSupportedByUicc1 | mTechSupportedByUicc2;
+#endif
+
+    ALOGD ("%s: enter", fn);
+
+    switch(mHostListnTechMask)
+    {
+        case 0x01://Host wants to listen ISO-DEP in A tech only then following cases will arises:-
+                  //i.Tech A only UICC present(Dont route Tech B to HOST),
+                  //ii.Tech B only UICC present(Route Tech A to HOST),
+                  //iii.Tech AB UICC present(Dont route any tech to HOST)
+            if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0)))//Tech A only supported UICC
+            {
+                //Tech A will goto UICC according to previous table
+                //Disable Tech B entry as host wants to listen A only
+                mTechTableEntries[TECH_B_IDX].enable   = FALSE;
+            }
+            if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0)))//Tech B only supported UICC
+            {
+                //Tech B will goto UICC according to previous table
+                //Route Tech A to HOST as Host wants to listen A only
+                mTechTableEntries[TECH_A_IDX].routeLoc = ROUTE_LOC_HOST_ID;
+                /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/
+                mTechTableEntries[TECH_A_IDX].power    = (mTechTableEntries[TECH_A_IDX].power & 0x09);
+                mTechTableEntries[TECH_A_IDX].enable   = TRUE;
+            }
+            if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC
+            {
+                //Do Nothing
+                //Tech A and Tech B will goto according to previous table
+                //HCE A only / HCE-B only functionality wont work in this case
+            }
+            break;
+        case 0x02://Host wants to listen ISO-DEP in B tech only then if Cases: Tech A only UICC present(Route Tech B to HOST), Tech B only UICC present(Dont route Tech A to HOST), Tech AB UICC present(Dont route any tech to HOST)
+            if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0)))//Tech A only supported UICC
+            {
+                //Tech A will goto UICC according to previous table
+                //Route Tech B to HOST as host wants to listen B only
+                mTechTableEntries[TECH_B_IDX].routeLoc = ROUTE_LOC_HOST_ID;
+                /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/
+                mTechTableEntries[TECH_B_IDX].power    = (mTechTableEntries[TECH_A_IDX].power & 0x09);
+                mTechTableEntries[TECH_B_IDX].enable   = TRUE;
+            }
+            if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0)))//Tech B only supported UICC
+            {
+                //Tech B will goto UICC according to previous table
+                //Disable Tech A to HOST as host wants to listen B only
+                mTechTableEntries[TECH_A_IDX].enable   = FALSE;
+            }
+            if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC
+            {
+                //Do Nothing
+                //Tech A and Tech B will goto UICC
+                //HCE A only / HCE-B only functionality wont work in this case
+            }
+            break;
+        case 0x03:
+        case 0x07://Host wants to listen ISO-DEP in AB both tech then if Cases: Tech A only UICC present(Route Tech B to HOST), Tech B only UICC present(Route Tech A to HOST), Tech AB UICC present(Dont route any tech to HOST)
+            /*If selected EE is UICC and it supports Bonly , then Set Tech A to Host */
+            /*Host doesn't support Tech Routing, To enable FWD functionality enabling tech route to Host.*/
+            if(((mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_A_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) != 0)))
+            {
+                mTechTableEntries[TECH_A_IDX].routeLoc = ROUTE_LOC_HOST_ID;
+                /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/
+                mTechTableEntries[TECH_A_IDX].power    = (mTechTableEntries[TECH_A_IDX].power & 0x09);
+                mTechTableEntries[TECH_A_IDX].enable   = TRUE;
+            }
+            /*If selected EE is UICC and it supports Aonly , then Set Tech B to Host*/
+            if(((mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC1_ID) || (mTechTableEntries[TECH_B_IDX].routeLoc == ROUTE_LOC_UICC2_ID)) &&
+                ((((techSupportedByUICC & NFA_TECHNOLOGY_MASK_B) == 0) && (techSupportedByUICC & NFA_TECHNOLOGY_MASK_A) != 0)))
+            {
+                mTechTableEntries[TECH_B_IDX].routeLoc = ROUTE_LOC_HOST_ID;
+                /*Allow only (screen On+unlock) and (screen On+lock) power state when routing to HOST*/
+                mTechTableEntries[TECH_B_IDX].power    = (mTechTableEntries[TECH_A_IDX].power & 0x09);
+                mTechTableEntries[TECH_B_IDX].enable   = TRUE;
+            }
+            if((techSupportedByUICC & 0x03) == 0x03)//AB both supported UICC
+            {
+                //Do Nothing
+                //Tech A and Tech B will goto UICC
+                //HCE A only / HCE-B only functionality wont work in this case
+            }
+            break;
+    }
+    dumpTables(3);
+    ALOGD ("%s: exit", fn);
+}
+
+/* libnfc-nci takes technologies for each power-state for single route location
+ * The previous technologies set will be overwritten by new technologies set by NFA_EeSetDefaultTechRouting
+ * So consolidate all the techs/power state for a given NFCEE ID's
+ * For example:
+ * When Tech A and Tech F set to same EE then set (TechA | Tech F) to that EE.
+ */
+void RoutingManager::consolidateTechEntries(void)
+{
+    static const char fn [] = "RoutingManager::consolidateTechEntries";
+    ALOGD ("%s: enter", fn);
+    int index=-1;
+    for(int xx=0;xx<MAX_TECH_ENTRIES;xx++)
+    {
+        if(mTechTableEntries[xx].enable)
+        {
+            switch(mTechTableEntries[xx].routeLoc)
+            {
+                case ROUTE_LOC_HOST_ID:
+                        index = ROUTE_LOC_HOST_ID_IDX;
+                    break;
+                case ROUTE_LOC_ESE_ID:
+                        index = ROUTE_LOC_ESE_ID_IDX;
+                    break;
+                case ROUTE_LOC_UICC1_ID:
+                        index = ROUTE_LOC_UICC1_ID_IDX;
+                    break;
+                case ROUTE_LOC_UICC2_ID:
+                        index = ROUTE_LOC_UICC2_ID_IDX;
+                    break;
+            }
+            if(index != -1)
+            {
+                mLmrtEntries[index].tech_switch_on    = mLmrtEntries[index].tech_switch_on |
+                                                        ((mTechTableEntries[xx].power & 0X01)? mTechTableEntries[xx].technology:0);
+                mLmrtEntries[index].tech_switch_off   = mLmrtEntries[index].tech_switch_off |
+                                                        ((mTechTableEntries[xx].power & 0X02)? mTechTableEntries[xx].technology:0);
+                mLmrtEntries[index].tech_battery_off  = mLmrtEntries[index].tech_battery_off |
+                                                        ((mTechTableEntries[index].power & 0X04)? mTechTableEntries[xx].technology:0);
+                mLmrtEntries[index].tech_screen_lock  = mLmrtEntries[index].tech_screen_lock |
+                                                        ((mTechTableEntries[xx].power & 0X08)? mTechTableEntries[xx].technology:0);
+                mLmrtEntries[index].tech_screen_off   = mLmrtEntries[index].tech_screen_off |
+                                                        ((mTechTableEntries[xx].power & 0X10)? mTechTableEntries[xx].technology:0);
+            }
+        }
+    }
+    dumpTables(4);
+    ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::setTechRouting(void)
+{
+    static const char fn [] = "RoutingManager::setTechRouting";
+    tNFA_STATUS nfaStat     = NFA_STATUS_FAILED;
+    ALOGD ("%s: enter", fn);
+    SyncEventGuard guard (mRoutingEvent);
+    for(int xx=0;xx<MAX_ROUTE_LOC_ENTRIES;xx++)
+   {
+       if( mLmrtEntries[xx].nfceeID          &&
+           (mLmrtEntries[xx].tech_switch_on   ||
+            mLmrtEntries[xx].tech_switch_off  ||
+            mLmrtEntries[xx].tech_battery_off ||
+            mLmrtEntries[xx].tech_screen_lock ||
+            mLmrtEntries[xx].tech_screen_off) )
+        {
+            /*Clear technologies for NFCEE ID control block */
+            ALOGD ("%s: Clear Routing Entries for nfceeID:0x%X", fn, mLmrtEntries[xx].nfceeID);
+            nfaStat = NFA_EeSetDefaultTechRouting(mLmrtEntries[xx].nfceeID, 0, 0, 0, 0, 0);
+            if(nfaStat == NFA_STATUS_OK)
+            {
+                mRoutingEvent.wait ();
+            }
+            else
+            {
+                ALOGE ("Fail to clear tech routing to 0x%x",mLmrtEntries[xx].nfceeID);
+            }
+
+            /*Set Required technologies for NFCEE ID control block */
+            nfaStat = NFA_EeSetDefaultTechRouting(mLmrtEntries[xx].nfceeID,
+                                                  mLmrtEntries[xx].tech_switch_on,
+                                                  mLmrtEntries[xx].tech_switch_off,
+                                                  mLmrtEntries[xx].tech_battery_off,
+                                                  mLmrtEntries[xx].tech_screen_lock,
+                                                  mLmrtEntries[xx].tech_screen_off);
+            if(nfaStat == NFA_STATUS_OK)
+            {
+                mRoutingEvent.wait ();
+            }
+            else
+            {
+                ALOGE ("Fail to set tech routing to 0x%x",mLmrtEntries[xx].nfceeID);
+            }
+        }
+    }
+    ALOGD ("%s: exit", fn);
+}
+
+void RoutingManager::dumpTables(int xx)
+{
+    switch(xx)
+    {
+    case 1://print only proto table
+        ALOGD ("------------------Proto Table Entries-----------------" );
+        for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++)
+        {
+            ALOGD ("|Index=%d|RouteLoc=0x%X|Proto=0x%X|Power=0x%x|Enable=%d|",
+                    xx,mProtoTableEntries[xx].routeLoc,
+                    mProtoTableEntries[xx].protocol,
+                    mProtoTableEntries[xx].power,
+                    mProtoTableEntries[xx].enable);
+        }
+        ALOGD ("------------------------------------------------------" );
+        break;
+    case 2://print Lmrt proto table
+        ALOGD ("-----------------------------------Lmrt Proto Entries-------------------------------" );
+        for(int xx=0;xx<MAX_PROTO_ENTRIES;xx++)
+        {
+            ALOGD ("|Index=%d|nfceeID=0x%X|SWTCH-ON=0x%X|SWTCH-OFF=0x%x|BAT-OFF=%d|SCRN-LOCK=%d|SCRN-OFF=%d|",
+                    xx,
+                    mLmrtEntries[xx].nfceeID,
+                    mLmrtEntries[xx].proto_switch_on,
+                    mLmrtEntries[xx].proto_switch_off,
+                    mLmrtEntries[xx].proto_battery_off,
+                    mLmrtEntries[xx].proto_screen_lock,
+                    mLmrtEntries[xx].proto_screen_off);
+        }
+        ALOGD ("------------------------------------------------------------------------------------" );
+        break;
+    case 3://print only tech table
+        ALOGD ("------------------Tech Table Entries-----------------" );
+        for(int xx=0;xx<MAX_TECH_ENTRIES;xx++)
+        {
+            ALOGD ("|Index=%d|RouteLoc=0x%X|Tech=0x%X|Power=0x%x|Enable=%d|",
+                    xx,
+                    mTechTableEntries[xx].routeLoc,
+                    mTechTableEntries[xx].technology,
+                    mTechTableEntries[xx].power,
+                    mTechTableEntries[xx].enable);
+        }
+        ALOGD ("-----------------------------------------------------" );
+        break;
+    case 4://print Lmrt tech table
+        ALOGD ("-----------------------------------Lmrt Tech Entries-------------------------------" );
+        for(int xx=0;xx<MAX_TECH_ENTRIES;xx++)
+        {
+            ALOGD ("|Index=%d|nfceeID=0x%X|SWTCH-ON=0x%X|SWTCH-OFF=0x%x|BAT-OFF=%d|SCRN-LOCK=%d|SCRN-OFF=%d|",
+                    xx,
+                    mLmrtEntries[xx].nfceeID,
+                    mLmrtEntries[xx].tech_switch_on,
+                    mLmrtEntries[xx].tech_switch_off,
+                    mLmrtEntries[xx].tech_battery_off,
+                    mLmrtEntries[xx].tech_screen_lock,
+                    mLmrtEntries[xx].tech_screen_off);
+        }
+        ALOGD ("------------------------------------------------------------------------------------" );
+        break;
+    }
+}
 #endif
 
 void RoutingManager::enableRoutingToHost()
@@ -1890,7 +1680,12 @@
         ALOGD ("%s: enter, mAddAid set to 0 from config file, ignoring all aids", fn);
         return false;
     }
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    current_handle = ((handle == 0x4C0)?0xF3:(handle == 0x402)?SecureElement::UICC_ID:SecureElement::UICC2_ID);
+
+#else
     current_handle = ((handle == 0x4C0)?SecureElement::ESE_ID:SecureElement::UICC_ID);
+#endif    
     if(handle == 0x400)
         current_handle = 0x00;
 
@@ -2484,21 +2279,22 @@
 
 void RoutingManager::handleData (UINT8 technology, const UINT8* data, UINT32 dataLen, tNFA_STATUS status)
 {
-    if (dataLen <= 0)
-    {
-        ALOGE("no data");
-        goto TheEnd;
-    }
 
     if (status == NFA_STATUS_CONTINUE)
     {
         ALOGE ("jni env is null");
-        mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come
+        if (dataLen > 0)
+        {
+            mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data; more to come
+        }
         return; //expect another NFA_CE_DATA_EVT to come
     }
     else if (status == NFA_STATUS_OK)
     {
-        mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data
+        if (dataLen > 0)
+        {
+            mRxDataBuffer.insert (mRxDataBuffer.end(), &data[0], &data[dataLen]); //append data
+        }
         //entire data packet has been received; no more NFA_CE_DATA_EVT
     }
     else if (status == NFA_STATUS_FAILED)
@@ -2593,6 +2389,12 @@
         {
             android::checkforTranscation(NFA_CE_DEACTIVATED_EVT, (void *)eventData);
             routingManager.notifyDeactivated(NFA_TECHNOLOGY_MASK_A);
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            if (android::is_wired_mode_open && se.mPassiveListenEnabled)
+            {
+                se.startThread(0x00);
+            }
+#endif
         }
 #if (NXP_EXTNS == TRUE)
         android::rfActivation = false;
@@ -2600,12 +2402,9 @@
         break;
     case NFA_CE_DATA_EVT:
         {
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
             se.mRecvdTransEvt = true;
             se.mAllowWiredMode = true;
-            ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__);
-            SyncEventGuard guard (se.mAllowWiredModeEvent);
-            se.mAllowWiredModeEvent.notifyOne();
 #endif
             tNFA_CE_DATA& ce_data = eventData->ce_data;
             ALOGD("%s: NFA_CE_DATA_EVT; stat=0x%X; h=0x%X; data len=%u", fn, ce_data.status, ce_data.handle, ce_data.len);
@@ -2652,6 +2451,16 @@
             se.notifyModeSet(eventData->mode_set.ee_handle, !(eventData->mode_set.status),eventData->mode_set.ee_status );
         }
         break;
+#if (NXP_EXTNS == TRUE) && (NXP_WIRED_MODE_STANDBY == TRUE)
+    case NFA_EE_PWR_LINK_CTRL_EVT:
+        {
+            ALOGD ("%s: NFA_EE_PWR_LINK_CTRL_EVT; status: 0x%04X ", fn,
+                    eventData->pwr_lnk_ctrl.status);
+            SyncEventGuard guard (se.mPwrLinkCtrlEvent);
+            se.mPwrLinkCtrlEvent.notifyOne();
+        }
+        break;
+#endif
 
     case NFA_EE_SET_TECH_CFG_EVT:
         {
@@ -2674,7 +2483,7 @@
             tNFA_EE_ACTION& action = eventData->action;
             tNFC_APP_INIT& app_init = action.param.app_init;
             android::checkforTranscation(NFA_EE_ACTION_EVT, (void *)eventData);
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
             se.mRecvdTransEvt = true;
 #endif
             if (action.trigger == NFC_EE_TRIG_SELECT)
@@ -2703,8 +2512,7 @@
                 ALOGD ("%s: NFA_EE_ACTION_EVT; h=0x%X; trigger=rf tech (0x%X)", fn, action.ee_handle, action.trigger);
             else
                 ALOGE ("%s: NFA_EE_ACTION_EVT; h=0x%X; unknown trigger (0x%X)", fn, action.ee_handle, action.trigger);
-
-#if((NXP_EXTNS == TRUE)&&(NFC_NXP_ESE == TRUE) && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if((NXP_EXTNS == TRUE)&&(NFC_NXP_ESE == TRUE))
             if((action.ee_handle == 0x4C0))
             {
                 ALOGE ("%s: NFA_EE_ACTION_EVT; h=0x%X;DWP CL activated (0x%X)", fn, action.ee_handle, action.trigger);
@@ -2712,17 +2520,17 @@
             }
 #endif
 
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
             /*if(action.ee_handle == 0x4C0 && (action.trigger != NFC_EE_TRIG_RF_TECHNOLOGY) &&
-               !(action.trigger == NFC_EE_TRIG_RF_PROTOCOL && action.param.protocol == NFA_PROTOCOL_ISO_DEP))
+            ((se.mIsDesfireMifareDisable) || !(action.trigger == NFC_EE_TRIG_RF_PROTOCOL && action.param.protocol == NFA_PROTOCOL_ISO_DEP)))
             {
                 ALOGE("%s,Allow wired mode connection", fn);
                 se.mAllowWiredMode = true;
-                SyncEventGuard guard (se.mAllowWiredModeEvent);
-                se.mAllowWiredModeEvent.notifyOne();
             }
             else
                se.mAllowWiredMode = false;*/
+               se.mIsActionNtfReceived = true;
+               se.mActiveCeHandle = action.ee_handle;
             if(action.ee_handle == 0x4C0)
             {
                 if((action.trigger == NFC_EE_TRIG_RF_TECHNOLOGY)&& (gEseVirtualWiredProtectMask & 0x04))
@@ -2772,6 +2580,7 @@
             UINT8 num_ee = eventData->ee_discover.num_ee;
             tNFA_EE_DISCOVER ee_disc_info = eventData->ee_discover;
             ALOGD ("%s: NFA_EE_DISCOVER_EVT; status=0x%X; num ee=%u", __FUNCTION__,eventData->status, eventData->ee_discover.num_ee);
+#if (JCOP_WA_ENABLE == TRUE)
             if(android::isNfcInitializationDone() == true)
             {
                 if(mChipId == 0x02 || mChipId == 0x04 || mChipId == 0x06)
@@ -2791,11 +2600,14 @@
                     }
                 }
             }
+#endif
             gSeDiscoverycount++;
             if(gSeDiscoverycount == gActualSeCount)
             {
                 SyncEventGuard g (gNfceeDiscCbEvent);
                 ALOGD("%s: Sem Post for gNfceeDiscCbEvent", __FUNCTION__);
+                usleep(1000000); // wait for 1000 millisec
+                //wait for atleast 1 sec to receive all ntf
                 gNfceeDiscCbEvent.notifyOne ();
             }
         }
@@ -2804,8 +2616,7 @@
     case NFA_EE_DISCOVER_REQ_EVT:
         ALOGD ("%s: NFA_EE_DISCOVER_REQ_EVT; status=0x%X; num ee=%u", __FUNCTION__,
                 eventData->discover_req.status, eventData->discover_req.num_ee);
-#if(NXP_EXTNS == TRUE)
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if((NXP_EXTNS == TRUE) && (NFC_NXP_ESE == TRUE))
         /* Handle Reader over SWP.
          * 1. Check if the event is for Reader over SWP.
          * 2. IF yes than send this info(READER_REQUESTED_EVENT) till FWK level.
@@ -2922,7 +2733,6 @@
         /*Set the configuration for UICC/ESE */
         se.storeUiccInfo (eventData->discover_req);
 #endif
-#endif
         break;
 
     case NFA_EE_NO_CB_ERR_EVT:
@@ -3138,7 +2948,7 @@
            :When ever the second removal request is also reached , it is handled.
 
 */
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 void reader_req_event_ntf (union sigval)
 {
     static const char fn [] = "RoutingManager::reader_req_event_ntf";
@@ -3201,10 +3011,12 @@
         SyncEventGuard guard(se.mEeSetModeEvent);
         se.mEeSetModeEvent.wait ();
     }
+#if (JCOP_WA_ENABLE == TRUE)
     NFA_HciW4eSETransaction_Complete(Release);
     SyncEventGuard guard(se.mEEdatapacketEvent);
     recovery=FALSE;
     se.mEEdatapacketEvent.notifyOne();
+#endif
     rm.mResetHandlerMutex.unlock();
 #if(NXP_EXTNS == TRUE) && (NFC_NXP_ESE == TRUE)
     if(active_ese_reset_control & TRANS_WIRED_ONGOING)
@@ -3236,7 +3048,7 @@
         ALOGE("Unable to create the thread");
     }
 }
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 /*******************************************************************************
 **
 ** Function:        getEtsiReaederState
@@ -3294,6 +3106,7 @@
 #endif
 
 #if(NXP_EXTNS == TRUE)
+#if (JCOP_WA_ENABLE == TRUE)
 bool RoutingManager::is_ee_recovery_ongoing()
 {
     ALOGD("is_ee_recovery_ongoing : recovery");
@@ -3302,6 +3115,7 @@
     else
         return false;
 }
+#endif
 
 /*******************************************************************************
 **
@@ -3363,6 +3177,7 @@
         xx++;
     }
 }
+#if (JCOP_WA_ENABLE == TRUE)
 /*******************************************************************************
 **
 ** Function:        handleSERemovedNtf()
@@ -3375,20 +3190,20 @@
 void RoutingManager::handleSERemovedNtf()
 {
     static const char fn [] = "RoutingManager::handleSERemovedNtf()";
-    UINT8 mActualNumEe = SecureElement::MAX_NUM_EE;
-    tNFA_EE_INFO mEeInfo [mActualNumEe];
+    UINT8 ActualNumEe = SecureElement::MAX_NUM_EE;
+    tNFA_EE_INFO mEeInfo [ActualNumEe];
     tNFA_STATUS nfaStat;
     ALOGE ("%s:Enter", __FUNCTION__);
-    if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK)
+    if ((nfaStat = NFA_AllEeGetInfo (&ActualNumEe, mEeInfo)) != NFA_STATUS_OK)
     {
         ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat);
-        mActualNumEe = 0;
+        ActualNumEe = 0;
     }
     else
     {
         if(mChipId == 0x02 || mChipId == 0x04 || mChipId == 0x06)
         {
-            for(int xx = 0; xx <  mActualNumEe; xx++)
+            for(int xx = 0; xx <  ActualNumEe; xx++)
             {
                ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, mEeInfo[xx].ee_handle,mEeInfo[xx].ee_status);
                 if ((mEeInfo[xx].ee_handle == 0x4C0) &&
@@ -3402,6 +3217,7 @@
         }
     }
 }
+#endif
 /*******************************************************************************
 **
 ** Function:        LmrtRspTimerCb
@@ -3417,3 +3233,4 @@
     RoutingManager::getInstance().mEeUpdateEvent.notifyOne();
 }
 #endif
+    
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index 581c6f3..b0d6487 100644
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -86,6 +86,37 @@
     Mutex mMutex;
 }NfcID2_rmv_req_info_t;
 
+typedef struct
+{
+    UINT8 protocol;
+    UINT16 routeLoc;
+    UINT8 power;
+    UINT8 enable;
+} protoEntry_t;
+
+typedef struct
+{
+    UINT8 technology;
+    UINT16 routeLoc;
+    UINT8 power;
+    UINT8 enable;
+} techEntry_t;
+
+typedef struct
+{
+    UINT16 nfceeID;//ID for the route location
+    tNFA_TECHNOLOGY_MASK    tech_switch_on;     /* default routing - technologies switch_on  */
+    tNFA_TECHNOLOGY_MASK    tech_switch_off;    /* default routing - technologies switch_off */
+    tNFA_TECHNOLOGY_MASK    tech_battery_off;   /* default routing - technologies battery_off*/
+    tNFA_TECHNOLOGY_MASK    tech_screen_lock;    /* default routing - technologies screen_lock*/
+    tNFA_TECHNOLOGY_MASK    tech_screen_off;   /* default routing - technologies screen_off*/
+    tNFA_PROTOCOL_MASK      proto_switch_on;    /* default routing - protocols switch_on     */
+    tNFA_PROTOCOL_MASK      proto_switch_off;   /* default routing - protocols switch_off    */
+    tNFA_PROTOCOL_MASK      proto_battery_off;  /* default routing - protocols battery_off   */
+    tNFA_PROTOCOL_MASK      proto_screen_lock;   /* default routing - protocols screen_lock    */
+    tNFA_PROTOCOL_MASK      proto_screen_off;  /* default routing - protocols screen_off  */
+} LmrtEntry_t;
+
 class RoutingManager
 {
 public:
@@ -112,8 +143,11 @@
     void HandleAddNfcID2_Req();
     void HandleRmvNfcID2_Req();
     void setCeRouteStrictDisable(UINT32 state);
+#if (JCOP_WA_ENABLE == TRUE)
     bool is_ee_recovery_ongoing();
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+    void handleSERemovedNtf();
+#endif
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     se_rd_req_state_t getEtsiReaederState();
     Rdr_req_ntf_info_t getSwpRrdReqInfo();
 #endif
@@ -123,9 +157,7 @@
     int addNfcid2Routing(UINT8* nfcid2, UINT8 aidLen,const UINT8* syscode,
             int syscodelen,const UINT8* optparam, int optparamlen);
     bool removeNfcid2Routing(UINT8* nfcID2);
-
     void getRouting();
-    void handleSERemovedNtf();
     void processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* sRoutingBuff);
     bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route, int power, bool isprefix);
 #else
@@ -156,20 +188,51 @@
     void notifyActivated (UINT8 technology);
     void notifyDeactivated (UINT8 technology);
     void notifyLmrtFull();
+    void printMemberData(void);
+    void initialiseTableEntries(void);
+    void compileProtoEntries(void);
+    void compileTechEntries(void);
+    void consolidateProtoEntries(void);
+    void consolidateTechEntries(void);
+    void setProtoRouting(void);
+    void setTechRouting(void);
+    void processTechEntriesForFwdfunctionality(void);
+    void checkProtoSeID(void);
+    void dumpTables(int);
 
+    static const int DBG               = true;
+    //Currently 4 protocols supported namely T3T, ISO-DEP, ISO-7816, NFC-DEP(taken care internally by the libnfc stack)
+    static const int MAX_PROTO_ENTRIES = 0x03;
+    static const int PROTO_T3T_IDX     = 0x00;
+    static const int PROTO_ISODEP_IDX  = 0x01;
+    static const int PROTO_ISO7816_IDX = 0x02;
+    //Currently 3 Technologies supported namely A,B,F
+    static const int MAX_TECH_ENTRIES  = 0x03;
+    static const int TECH_A_IDX        = 0x00;
+    static const int TECH_B_IDX        = 0x01;
+    static const int TECH_F_IDX        = 0x02;
+    //Fixed number of Lmrt entries
+    static const int MAX_ROUTE_LOC_ENTRIES  = 0x04;
+    //Fixed route location Lmrt index
+    static const int ROUTE_LOC_HOST_ID_IDX  = 0x00;
+    static const int ROUTE_LOC_ESE_ID_IDX   = 0x01;
+    static const int ROUTE_LOC_UICC1_ID_IDX = 0x02;
+    static const int ROUTE_LOC_UICC2_ID_IDX = 0x03;
+    //Fixed route location Lmrt entries
+    static const int ROUTE_LOC_HOST_ID      = 0x400;
+    static const int ROUTE_LOC_ESE_ID       = 0x4C0;
+    static const int ROUTE_LOC_UICC1_ID     = 0x402;
+    static const int ROUTE_LOC_UICC2_ID     = 0x481;
     // See AidRoutingManager.java for corresponding
     // AID_MATCHING_ constants
-
     // Every routing table entry is matched exact (BCM20793)
     static const int AID_MATCHING_EXACT_ONLY = 0x00;
     // Every routing table entry can be matched either exact or prefix
     static const int AID_MATCHING_EXACT_OR_PREFIX = 0x01;
     // Every routing table entry is matched as a prefix
     static const int AID_MATCHING_PREFIX_ONLY = 0x02;
-
     // See AidRoutingManager.java for corresponding
     // AID_MATCHING_ platform constants
-
     //Behavior as per Android-L, supporting prefix match and full
     //match for both OnHost and OffHost apps.
     static const int AID_MATCHING_L = 0x01;
@@ -199,20 +262,33 @@
     static const JNINativeMethod sMethods [];
     int mDefaultEe; //since this variable is used in both cases moved out of compiler switch
     int mHostListnTechMask;
+    int mUiccListnTechMask;
     int mFwdFuntnEnable;
     static int mChipId;
     SyncEvent mEeRegisterEvent;
     SyncEvent mRoutingEvent;
 #if(NXP_EXTNS == TRUE)
-     UINT32 mCeRouteStrictDisable;
-     int defaultSeID ;
-     bool mIsDirty;
-     int defaultPowerstate;
-     int defaultProtoSeID;
-     int defaultProtoPowerstate;
-     int defaultTechSeID;
-     int defaultTechAPowerstate;
-     int DefaultTechType;
-     int mAddAid;
+    bool mIsDirty;
+    protoEntry_t mProtoTableEntries[MAX_PROTO_ENTRIES];
+    techEntry_t mTechTableEntries[MAX_TECH_ENTRIES];
+    LmrtEntry_t mLmrtEntries[MAX_ROUTE_LOC_ENTRIES];
+    UINT32 mCeRouteStrictDisable;
+    UINT32 mDefaultIso7816SeID;
+    UINT32 mDefaultIso7816Powerstate;
+    UINT32 mDefaultIsoDepSeID;
+    UINT32 mDefaultIsoDepPowerstate;
+    UINT32 mDefaultT3TSeID;
+    UINT32 mDefaultT3TPowerstate;
+    UINT32 mDefaultTechType;
+    UINT32 mDefaultTechASeID;
+    UINT32 mDefaultTechAPowerstate;
+    UINT32 mDefaultTechBSeID;
+    UINT32 mDefaultTechBPowerstate;
+    UINT32 mDefaultTechFSeID;
+    UINT32 mDefaultTechFPowerstate;
+    UINT32 mAddAid;
+    UINT32 mTechSupportedByEse;
+    UINT32 mTechSupportedByUicc1;
+    UINT32 mTechSupportedByUicc2;
 #endif
 };
diff --git a/nci/jni/SecureElement.cpp b/nci/jni/SecureElement.cpp
index 840fa36..9654f5d 100644
--- a/nci/jni/SecureElement.cpp
+++ b/nci/jni/SecureElement.cpp
@@ -53,7 +53,11 @@
 #include <signal.h>
 #include <sys/types.h>
 #endif
+extern "C"{
+#include "nfa_api.h"
+}
 #endif
+
 /*****************************************************************************
 **
 ** public variables
@@ -67,21 +71,32 @@
 bool hold_the_transceive = false;
 int dual_mode_current_state=0;
 nfc_jni_native_data* mthreadnative;
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 extern Rdr_req_ntf_info_t swp_rdr_req_ntf_info ;
 #endif
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+pthread_t passiveListenEnable_thread;
+static void passiveListenDisablecallBack(union sigval);
+void *passiveListenEnableThread(void *arg);
+static uint8_t passiveListenState = 0x00;
+static bool isTransceiveOngoing = false;
+bool ceTransactionPending = false;
+#endif
 namespace android
 {
     extern void startRfDiscovery (bool isStart);
     extern void setUiccIdleTimeout (bool enable);
     extern bool isDiscoveryStarted();
     extern int getScreenState();
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-    extern bool isp2pActivated();
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    extern bool is_wired_mode_open;
 #endif
+    extern bool isp2pActivated();
     extern SyncEvent sNfaSetConfigEvent;
     extern tNFA_STATUS EmvCo_dosetPoll(jboolean enable);
+#if (JCOP_WA_ENABLE == TRUE)
     extern tNFA_STATUS ResetEseSession();
+#endif
     extern void config_swp_reader_mode(bool mode);
     extern void start_timer_msec(struct timeval  *start_tv);
     extern long stop_timer_getdifference_msec(struct timeval  *start_tv, struct timeval  *stop_tv);
@@ -94,6 +109,9 @@
     static UINT32          nfccStandbytimeout;        // timeout for secelem standby mode detection
     static void NFCC_StandbyModeTimerCallBack (union sigval);
     int active_ese_reset_control = 0;
+    bool hold_wired_mode = false;
+    SyncEvent mWiredModeHoldEvent;
+
 #endif
     SyncEvent mDualModeEvent;
     static void setSPIState(bool mState);
@@ -145,7 +163,7 @@
         }
 
 };
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 /*******************************************************************************
 **
 ** Function:        startStopSwpReaderProc
@@ -202,6 +220,15 @@
 :   mActiveEeHandle (NFA_HANDLE_INVALID),
     mRecvdTransEvt(false),
     mAllowWiredMode(false),
+    mPassiveListenCnt(0),
+    mPassiveListenTimeout(0),
+#if(NXP_EXTNS == TRUE)
+    mActiveCeHandle(NFA_HANDLE_INVALID),
+    mIsWiredModeOpen(false),
+    mIsActionNtfReceived(false),
+    mIsDesfireMifareDisable(false),
+    mIsAllowWiredInDesfireMifareCE(false),
+#endif
     mDestinationGate (4), //loopback gate
     mNfaHciHandle (NFA_HANDLE_INVALID),
     mNativeData (NULL),
@@ -223,8 +250,6 @@
     mGetAtrRspwait (false),
     mRfFieldIsOn(false),
     mTransceiveWaitOk(false),
-
-
     mWiredModeRfFiledEnable(0)
 {
     memset (&mEeInfo, 0, sizeof(mEeInfo));
@@ -299,6 +324,7 @@
     static const char fn [] = "SecureElement::initialize";
     tNFA_STATUS nfaStat;
     unsigned long num = 0;
+    unsigned long retValue;
 
     ALOGD ("%s: enter", fn);
 
@@ -312,7 +338,7 @@
         mActiveSeOverride = num;
     ALOGD ("%s: Active SE override: 0x%X", fn, mActiveSeOverride);
     }
-#if (NFC_NXP_ESE == TRUE &&  ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
     if (GetNxpNumValue (NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE, (void*)&num, sizeof(num)))
     {
         ALOGD ("%s: NAME_NXP_WIRED_MODE_RF_FIELD_ENABLE =%d",fn, num);
@@ -320,6 +346,14 @@
     }
 #endif
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if(CONCURRENCY_PROTECTION == TRUE)
+    if (GetNxpNumValue(NAME_NXP_NFCC_PASSIVE_LISTEN_TIMEOUT, &mPassiveListenTimeout, sizeof(mPassiveListenTimeout)) == false)
+    {
+        mPassiveListenTimeout = 2500;
+        ALOGD ("%s: NFCC Passive Listen Disable timeout =%d", fn, mPassiveListenTimeout);
+    }
+    ALOGD ("%s: NFCC Passive Listen Disable timeout =%d", fn, mPassiveListenTimeout);
+#endif
     if (GetNxpNumValue(NAME_NXP_NFCC_STANDBY_TIMEOUT, &nfccStandbytimeout, sizeof(nfccStandbytimeout)) == false)
     {
         nfccStandbytimeout = 20000;
@@ -336,6 +370,27 @@
     dual_mode_current_state = SPI_DWPCL_NOT_ACTIVE;
     hold_the_transceive = false;
     active_ese_reset_control = 0;
+    hold_wired_mode = false;
+    mlistenDisabled = false;
+    mIsExclusiveWiredMode = false;
+
+    if (GetNxpNumValue(NAME_NXP_MIFARE_DESFIRE_DISABLE, &retValue, sizeof(retValue)) == false)
+    {
+        mIsDesfireMifareDisable = false;
+    }
+    else
+    {
+        mIsDesfireMifareDisable = (retValue == 0x00)? false: true;
+    }
+    if (GetNxpNumValue(NAME_NXP_ALLOW_WIRED_IN_MIFARE_DESFIRE_CLT, &retValue, sizeof(retValue)) == false)
+    {
+        mIsAllowWiredInDesfireMifareCE = false;
+    }
+    else
+    {
+        mIsAllowWiredInDesfireMifareCE = (retValue == 0x00)? false: true;
+    }
+
 #endif
     /*
      * Since NXP doesn't support OBERTHUR RESET COMMAND, Hence commented
@@ -357,6 +412,10 @@
     mRfFieldIsOn    = false;
     mActivatedInListenMode = false;
     mCurrentRouteSelection = NoRoute;
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    mPassiveListenEnabled = true;
+    meseUiccConcurrentAccess = false;
+#endif
     memset (mEeInfo, 0, sizeof(mEeInfo));
     memset (&mUiccInfo, 0, sizeof(mUiccInfo));
     memset (&mHciCfg, 0, sizeof(mHciCfg));
@@ -453,6 +512,43 @@
     ALOGD ("%s: exit", __FUNCTION__);
     return (true);
 }
+
+/*******************************************************************************
+ **
+ ** Function:        isTeckInfoReceived
+ **
+ ** Description:     isTeckInfoReceived
+ **                  Checks if discovery_req_ntf received
+ **                  for a given EE
+ **
+ ** Returns:         True if discovery_req_ntf is received.
+ **
+ *******************************************************************************/
+bool SecureElement::isTeckInfoReceived (UINT16 eeHandle)
+{
+    ALOGD ("%s: enter", __FUNCTION__);
+    bool stat = false;
+    if (! getEeInfo())
+    {
+        ALOGE ("%s: No updated eeInfo available", __FUNCTION__);
+        stat = false;
+    }
+    else
+    {
+        for (UINT8 xx = 0; xx < mActualNumEe; xx++)
+        {
+            if ((mEeInfo[xx].ee_handle == eeHandle) &&
+                    ((mEeInfo[xx].la_protocol != 0x00) || (mEeInfo[xx].lb_protocol != 0x00) ||
+                            (mEeInfo[xx].lf_protocol != 0x00) || (mEeInfo[xx].lbp_protocol != 0x00)))
+            {
+                stat = true;
+                break;
+            }
+        }
+    }
+    ALOGD ("%s: stat : 0x%02x", __FUNCTION__,stat);
+    return stat;
+}
 #endif
 /*******************************************************************************
 **
@@ -836,7 +932,7 @@
 
     ALOGD ("%s: override ee h=0x%X", fn, overrideEeHandle );
 
-#if (NFC_NXP_ESE != TRUE || ((NFC_NXP_CHIP_TYPE != PN548C2) && (NFC_NXP_CHIP_TYPE != PN551)))
+#if (NFC_NXP_ESE != TRUE)
     if (mRfFieldIsOn) {
         ALOGE("%s: RF field indication still on, resetting", fn);
         mRfFieldIsOn = false;
@@ -848,7 +944,11 @@
     {
         tNFA_EE_INFO& eeItem = mEeInfo[index];
 
-        if ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4))
+        if ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4)
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+                         || (eeItem.ee_handle == EE_HANDLE_0xF8)
+#endif
+            )
         {
             if (overrideEeHandle && (overrideEeHandle != eeItem.ee_handle) )
                 continue;   // do not enable all SEs; only the override one
@@ -874,6 +974,11 @@
             }
         }
     } //for
+#if (NXP_EXTNS == TRUE)
+    mActiveEeHandle = getActiveEeHandle(handle);
+#else
+    mActiveEeHandle = getDefaultEeHandle();
+#endif
 
     mActiveEeHandle = getDefaultEeHandle();
     if (mActiveEeHandle == NFA_HANDLE_INVALID)
@@ -940,7 +1045,11 @@
         tNFA_EE_INFO& eeItem = mEeInfo[index];
 
         if ( eeItem.ee_handle == handle &&
-                ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4)))
+                ((eeItem.ee_handle == EE_HANDLE_0xF3) || (eeItem.ee_handle == EE_HANDLE_0xF4)
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+                 || (eeItem.ee_handle == EE_HANDLE_0xF8)
+#endif
+           ))
         {
 
             if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE)
@@ -1200,8 +1309,11 @@
         return (false);
     }
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-//Do Nothing
+#if (((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE)))
+#if (NXP_ESE_WIRED_MODE_DISABLE_DISCOVERY == TRUE)
+    // Disable RF discovery completely while the DH is connected
+    android::startRfDiscovery(false);
+#endif
 #else
     android::startRfDiscovery(false);
 #endif
@@ -1246,17 +1358,44 @@
     if (mNewPipeId != 0)
     {
 #if(NXP_EXTNS == TRUE)
-        UINT8 host = (mNewPipeId == STATIC_PIPE_0x70) ? 0xC0 : 0x03;
+        UINT8 host;
+        if(mActiveEeHandle == EE_HANDLE_0xF3)
+        {
+            host = (mNewPipeId == STATIC_PIPE_0x70) ? 0xC0 : 0x03;
+        }
+        else
+        {
+            host = (mNewPipeId == STATIC_PIPE_UICC) ? 0x02 : 0x03;
+        }
 #else
         UINT8 host = (mNewPipeId == STATIC_PIPE_0x70) ? 0x02 : 0x03;
 #endif
-        UINT8 gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
-        nfaStat = NFA_HciAddStaticPipe(mNfaHciHandle, host, gate, mNewPipeId);
-        if (nfaStat != NFA_STATUS_OK)
+        //TODO according ETSI12 APDU Gate
+#if(NXP_EXTNS == TRUE)
+        UINT8 gate;
+        if(mActiveEeHandle == EE_HANDLE_0xF3)
         {
-            ALOGE ("%s: fail create static pipe; error=0x%X", fn, nfaStat);
-            retVal = false;
-            goto TheEnd;
+            gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
+        }
+        else
+        {
+            gate = (mNewPipeId == STATIC_PIPE_UICC) ? 0x30 : 0x31;
+        }
+#else
+        UINT8 gate = (mNewPipeId == STATIC_PIPE_0x70) ? 0xF0 : 0xF1;
+#endif
+#if(NXP_EXTNS == TRUE)
+        ALOGD ("%s: Using host id : 0x%X,gate id : 0x%X,pipe id : 0x%X", __FUNCTION__,host,gate, mNewPipeId);
+#endif
+        if(!isEtsi12ApduGatePresent())
+        {
+            nfaStat = NFA_HciAddStaticPipe(mNfaHciHandle, host, gate, mNewPipeId);
+            if (nfaStat != NFA_STATUS_OK)
+            {
+                ALOGE ("%s: fail create static pipe; error=0x%X", fn, nfaStat);
+                retVal = false;
+                goto TheEnd;
+            }
         }
     }
     else
@@ -1404,6 +1543,9 @@
         dual_mode_current_state ^= SPI_ON;
 
     hold_the_transceive = false;
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    hold_wired_mode = false;
+#endif
 
     // Re-enable UICC low-power mode
     // Re-enable RF discovery
@@ -1506,6 +1648,7 @@
         {
              android::start_timer_msec(&start_timer);
              ALOGD("%s: holding the transceive for %d ms.\n", fn, (timeoutMillisec - time_elapsed));
+             SyncEventGuard guard(sSPIPrioSessionEndEvent);
              if(sSPIPrioSessionEndEvent.wait(timeoutMillisec - time_elapsed)== FALSE)
              {
                  ALOGE ("%s: wait response timeout \n", fn);
@@ -1525,6 +1668,7 @@
         if ((mNewPipeId == STATIC_PIPE_0x70) || (mNewPipeId == STATIC_PIPE_0x71))
 #if(NXP_EXTNS == TRUE)
         {
+#if (JCOP_WA_ENABLE == TRUE)
             if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
             {
                 ALOGE ("%s: is_ee_recovery_ongoing ", fn);
@@ -1535,13 +1679,17 @@
             {
                ALOGE ("%s: Not in Recovery State", fn);
             }
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-            if(!isWiredModeAllowedInRfState())
+#endif
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)||\
+    (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_TIMEOUT))
+            if(!checkForWiredModeAccess())
             {
                 ALOGD("%s, Dont allow wired mode in this RF state", fn);
                 goto TheEnd;
             }
 #endif
+#endif
 #if((NFC_NXP_TRIPLE_MODE_PROTECTION==TRUE)&&((NFC_NXP_ESE_VER == JCOP_VER_3_2)||(NFC_NXP_ESE_VER == JCOP_VER_3_3)))
             if((dual_mode_current_state == SPI_DWPCL_BOTH_ACTIVE))
             {
@@ -1562,9 +1710,17 @@
 #endif
 #endif
 #endif
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            isTransceiveOngoing = true;
+#endif
             nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
 #if(NXP_EXTNS == TRUE)
         }
+        else if (mNewPipeId == STATIC_PIPE_UICC)
+        {
+            ALOGD("%s, Starting UICC wired mode!!!!!!.....", fn);
+            nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
+        }
 #endif
         else
 #if(NXP_EXTNS == TRUE)
@@ -1581,6 +1737,9 @@
 #endif
 #endif
 #endif
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            isTransceiveOngoing = true;
+#endif
             nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, NFA_HCI_EVT_POST_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
 #if(NXP_EXTNS == TRUE)
         }
@@ -1589,8 +1748,12 @@
         {
 //          waitOk = mTransceiveEvent.wait (timeoutMillisec);
             mTransceiveEvent.wait ();
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+            isTransceiveOngoing = false;
+#endif
 
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if (JCOP_WA_ENABLE == TRUE)
             if(active_ese_reset_control & TRANS_WIRED_ONGOING)
             {
                 active_ese_reset_control ^= TRANS_WIRED_ONGOING;
@@ -1608,6 +1771,7 @@
                 }
             }
 #endif
+#endif
             if (mTransceiveWaitOk == false) //timeout occurs
             {
                 ALOGE ("%s: wait response timeout", fn);
@@ -1640,9 +1804,11 @@
         }
     }
 #endif
+#if (JCOP_WA_ENABLE == TRUE)
     if((active_ese_reset_control&TRANS_WIRED_ONGOING))
         active_ese_reset_control ^= TRANS_WIRED_ONGOING;
 #endif
+#endif
     ALOGD ("%s: exit; isSuccess: %d; recvBufferActualSize: %ld", fn, isSuccess, recvBufferActualSize);
     return (isSuccess);
 }
@@ -1664,8 +1830,10 @@
     {
        dual_mode_current_state |= CL_ACTIVE;
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if (JCOP_WA_ENABLE == TRUE)
        active_ese_reset_control |= TRANS_CL_ONGOING;
 #endif
+#endif
     }
     else
     {
@@ -1673,6 +1841,7 @@
        {
            dual_mode_current_state ^= CL_ACTIVE;
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+#if (JCOP_WA_ENABLE == TRUE)
                if((active_ese_reset_control&TRANS_CL_ONGOING))
                {
                    active_ese_reset_control ^= TRANS_CL_ONGOING;
@@ -1688,12 +1857,21 @@
                    }
                }
 #endif
+#endif
            if(inDualModeAlready)
            {
                SyncEventGuard guard (mDualModeEvent);
                mDualModeEvent.notifyOne();
            }
        }
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+        if(hold_wired_mode)
+        {
+            SyncEventGuard guard (mWiredModeHoldEvent);
+            mWiredModeHoldEvent.notifyOne();
+            hold_wired_mode = false;
+        }
+#endif
     }
     ALOGD ("%s: Exit setCLState = %d\n", __FUNCTION__, dual_mode_current_state);
 }
@@ -1754,15 +1932,14 @@
     }
 
     mActivatedInListenMode = isActivated;
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     if(!isActivated)
     {
         mRecvdTransEvt = false;
         mAllowWiredMode = false;
-        ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__);
-        SyncEventGuard guard (mAllowWiredModeEvent);
-        mAllowWiredModeEvent.notifyOne();
+        mIsActionNtfReceived = false;
         setCLState(false);
+        mActiveCeHandle = NFA_HANDLE_INVALID;
     }
     else
     {
@@ -1816,18 +1993,37 @@
         ALOGE("%s: clock_gettime failed", fn);
         // There is no good choice here...
     }
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    if (android::is_wired_mode_open)
+    {
+        if (isActive)
+        {
+            ceTransactionPending = true;
+            ALOGD ("%s: CE Transaction pending flag set", fn);
+        }
+        else
+        {
+            ceTransactionPending = false;
+            ALOGD ("%s: CE Transaction pending flag cleared", fn);
+        }
+    }
+    if (ceTransactionPending)
+    {
+        if(isTransceiveOngoing == false && mPassiveListenEnabled == false)
+        {
+            startThread(0x01);
+        }
+    }
+#endif
     if (isActive) {
         mRfFieldIsOn = true;
         e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifySeFieldActivated);
     }
     else {
         mRfFieldIsOn = false;
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
         mRecvdTransEvt = false;
         mAllowWiredMode = false;
-        ALOGD("%s: Sem Post for mAllowWiredModeEvent", __FUNCTION__);
-        SyncEventGuard guard (mAllowWiredModeEvent);
-        mAllowWiredModeEvent.notifyOne();
 #endif
         setCLState(false);
         e->CallVoidMethod (mNativeData->manager, android::gCachedNfcManagerNotifySeFieldDeactivated);
@@ -1842,7 +2038,7 @@
     ALOGD ("%s: exit", fn);
 }
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 /*Reader over SWP*/
 void SecureElement::notifyEEReaderEvent (int evt, int data)
 {
@@ -2204,6 +2400,22 @@
         {
             ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT: NFA_HCI_EVT_WTX ", fn);
         }
+#if(NXP_EXTNS == TRUE)
+        else if ((eventData->rcvd_evt.evt_code == NFA_HCI_ABORT)&&(eventData->rcvd_evt.pipe != 0x16)&&(eventData->rcvd_evt.pipe != 0x0A))
+        {
+            ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT: NFA_HCI_ABORT; status:0x%X, pipe:0x%X, len:%d", fn,\
+                eventData->rcvd_evt.status, eventData->rcvd_evt.pipe, eventData->rcvd_evt.evt_len);
+            if(eventData->rcvd_evt.evt_len > 0)
+            {
+                sSecElem.mAbortEventWaitOk = true;
+                SyncEventGuard guard(sSecElem.mAbortEvent);
+                memcpy(sSecElem.mAtrInfo, eventData->rcvd_evt.p_evt_buf, eventData->rcvd_evt.evt_len);
+                sSecElem.mAtrInfolen = eventData->rcvd_evt.evt_len;
+                sSecElem.mAtrStatus = eventData->rcvd_evt.status;
+                sSecElem.mAbortEvent.notifyOne();
+            }
+        }
+#endif
         else if ((eventData->rcvd_evt.pipe == STATIC_PIPE_0x70) || (eventData->rcvd_evt.pipe == STATIC_PIPE_0x71))
         {
             ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT; data from static pipe", fn);
@@ -2216,6 +2428,7 @@
                 sSecElem.mTransceiveWaitOk = true;
                 SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_START);
             }
+#if (JCOP_WA_ENABLE == TRUE)
             /*If there is pending reset event to process*/
             if((active_ese_reset_control&RESET_BLOCKED)&&
             (!(active_ese_reset_control &(TRANS_CL_ONGOING))))
@@ -2223,6 +2436,7 @@
                 SyncEventGuard guard (sSecElem.mResetEvent);
                 sSecElem.mResetEvent.notifyOne();
             }
+#endif
 #else
             if(eventData->rcvd_evt.evt_len > 0)
             {
@@ -2254,7 +2468,7 @@
                     //BERTLV decoding here, to support extended data length for params.
                     datalen = SecureElement::decodeBerTlvLength((UINT8 *)eventData->rcvd_evt.p_evt_buf, 2+aidlen+1, eventData->rcvd_evt.evt_len);
                 }
-                if(datalen != -1)
+                if(datalen > 0)
                 {
                     /* Over 128 bytes data of transaction can not receive on PN547, Ref. BER-TLV length fields in ISO/IEC 7816 */
                     if ( datalen < 0x80)
@@ -2274,7 +2488,10 @@
                         dataStartPosition = 2+aidlen+5;
                     }
                     data  = &eventData->rcvd_evt.p_evt_buf[dataStartPosition];
-                    sSecElem.notifyTransactionListenersOfAid (&eventData->rcvd_evt.p_evt_buf[2],aidlen,data,datalen,evtSrc);
+                    if(datalen > 0)
+                    {
+                        sSecElem.notifyTransactionListenersOfAid (&eventData->rcvd_evt.p_evt_buf[2],aidlen,data,datalen,evtSrc);
+                    }
                 }
                 else
                 {
@@ -2306,7 +2523,28 @@
             sSecElem.mRegistryEvent.notifyOne ();
             break;
         }
-
+#if(NXP_EXTNS == TRUE)
+    case NFA_HCI_RSP_SENT_ADMIN_EVT:
+        {
+            ALOGD ("%s: NFA_HCI_RSP_SENT_ADMIN_EVT; status=0x%X", fn, eventData->admin_rsp_rcvd.status);
+            SyncEventGuard guard(sSecElem.mNfceeInitCbEvent);
+            sSecElem.mHostsPresent = eventData->admin_rsp_rcvd.NoHostsPresent;
+            ALOGD ("%s: NFA_HCI_RSP_SENT_ADMIN_EVT; NoHostsPresent=0x%X", fn, eventData->admin_rsp_rcvd.NoHostsPresent);
+            if(eventData->admin_rsp_rcvd.NoHostsPresent > 0)
+            {
+                memcpy(sSecElem.mHostsId, eventData->admin_rsp_rcvd.HostIds,eventData->admin_rsp_rcvd.NoHostsPresent);
+            }
+            sSecElem.mNfceeInitCbEvent.notifyOne();
+            break;
+        }
+    case NFA_HCI_CONFIG_DONE_EVT:
+        {
+            ALOGD ("%s: NFA_HCI_CONFIG_DONE_EVT; status=0x%X", fn, eventData->admin_rsp_rcvd.status);
+            SyncEventGuard guard(sSecElem.mNfceeInitCbEvent);
+            sSecElem.mNfceeInitCbEvent.notifyOne();
+            break;
+        }
+#endif
     default:
         ALOGE ("%s: unknown event code=0x%X ????", fn, event);
         break;
@@ -2406,7 +2644,11 @@
             (mEeInfo[xx].ee_interface[0] != NCI_NFCEE_INTERFACE_HCI_ACCESS)
 #else
             &&
-            (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4)
+            (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+                || mEeInfo[xx].ee_handle == EE_HANDLE_0xF8
+#endif
+            )
 #endif
             &&
             (mEeInfo[xx].ee_status != NFC_NFCEE_STATUS_INACTIVE))
@@ -2414,8 +2656,51 @@
     }
     return NFA_HANDLE_INVALID;
 }
+#if(NXP_EXTNS == TRUE)
+/*******************************************************************************
+**
+** Function:        getActiveEeHandle
+**
+** Description:     Get the handle to the execution environment.
+**
+** Returns:         Handle to the execution environment.
+**
+*******************************************************************************/
+tNFA_HANDLE SecureElement::getActiveEeHandle (tNFA_HANDLE handle)
+{
+    static const char fn [] = "SecureElement::getActiveEeHandle";
 
+    ALOGE ("%s: - Enter", fn);
+    ALOGE ("%s: - mActualNumEe = %x mActiveSeOverride = 0x%02X", fn,mActualNumEe, mActiveSeOverride);
 
+    UINT16 overrideEeHandle = NFA_HANDLE_GROUP_EE | mActiveSeOverride;
+    ALOGE ("%s: - mActualNumEe = %x overrideEeHandle = 0x%02X", fn,mActualNumEe, overrideEeHandle);
+
+    for (UINT8 xx = 0; xx < mActualNumEe; xx++)
+    {
+        if ( (mActiveSeOverride != ACTIVE_SE_USE_ANY) && (overrideEeHandle != mEeInfo[xx].ee_handle))
+        ALOGE ("%s: - mEeInfo[xx].ee_handle = 0x%02x, mEeInfo[xx].ee_status = 0x%02x", fn,mEeInfo[xx].ee_handle, mEeInfo[xx].ee_status);
+
+        if ((mEeInfo[xx].num_interface != 0)
+#ifndef GEMALTO_SE_SUPPORT
+             &&
+            (mEeInfo[xx].ee_interface[0] != NCI_NFCEE_INTERFACE_HCI_ACCESS)
+#else
+            &&
+            (mEeInfo[xx].ee_handle == EE_HANDLE_0xF3 || mEeInfo[xx].ee_handle == EE_HANDLE_0xF4
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+                || mEeInfo[xx].ee_handle == EE_HANDLE_0xF8
+#endif
+)
+
+#endif
+            &&
+            (mEeInfo[xx].ee_status != NFC_NFCEE_STATUS_INACTIVE)&& (mEeInfo[xx].ee_handle == handle))
+            return (mEeInfo[xx].ee_handle);
+    }
+    return NFA_HANDLE_INVALID;
+}
+#endif
 /*******************************************************************************
 **
 ** Function:        findUiccByHandle
@@ -2513,8 +2798,8 @@
     ALOGD("%s: enter ;seID=0x%X", fn, seID);
     int timeoutMillisec = 30000;
 
-#if (NFC_NXP_ESE ==  TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-    if(!isWiredModeAllowedInRfState())
+#if ((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    if(!checkForWiredModeAccess())
     {
         ALOGD("Denying /atr in SE listen mode active");
         return false;
@@ -2527,6 +2812,7 @@
     }
 #endif
 #endif
+    if(!isEtsi12ApduGatePresent())
     {
         SyncEventGuard guard (mGetRegisterEvent);
         nfaStat = NFA_HciGetRegistry (mNfaHciHandle, mNewPipeId, reg_index);
@@ -2536,21 +2822,45 @@
             mGetRegisterEvent.wait();
             ALOGE("%s: Received ATR response on pipe 0x%x ", fn, mNewPipeId);
         }
+        *recvBufferSize = mAtrInfolen;
+        memcpy(recvBuffer, mAtrInfo, mAtrInfolen);
     }
-    *recvBufferSize = mAtrInfolen;
-    memcpy(recvBuffer, mAtrInfo, mAtrInfolen);
+    else
+    {
+        mAbortEventWaitOk = false;
+        uint8_t mAtrInfo1[32]={0};
+        uint8_t atr_len = 0;
+        SyncEventGuard guard (mAbortEvent);
+        nfaStat = NFA_HciSendEvent(mNfaHciHandle, mNewPipeId, EVT_ABORT, 0, NULL, atr_len, mAtrInfo1, 3000);
+        if(nfaStat == NFA_STATUS_OK)
+        {
+            mAbortEvent.wait();
+        }
+        if(mAbortEventWaitOk == false)
+        {
+            ALOGE("%s (EVT_ABORT)Wait reposne timeout");
+            nfaStat = NFA_STATUS_FAILED;
+        }
+        else
+        {
+            *recvBufferSize = mAtrInfolen;
+            memcpy(recvBuffer, mAtrInfo, mAtrInfolen);
+        }
+    }
 
-    if(mAtrStatus == NFA_HCI_ANY_E_NOK)
-        reconfigureEseHciInit();
+#if (JCOP_WA_ENABLE == TRUE)
+        if(mAtrStatus == NFA_HCI_ANY_E_NOK)
+            reconfigureEseHciInit();
+#endif
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 #if((NFC_NXP_ESE_VER == JCOP_VER_3_1) || (NFC_NXP_ESE_VER == JCOP_VER_3_2))
-    if (NFC_RelEseAccess((void *)&nfaStat) != 0)
-    {
-        ALOGE ("%s: NFC_ReqWiredAccess timeout", fn);
-    }
+        if (NFC_RelEseAccess((void *)&nfaStat) != 0)
+        {
+            ALOGE ("%s: NFC_ReqWiredAccess timeout", fn);
+        }
 #endif
 #endif
-    return (nfaStat == NFA_STATUS_OK)?true:false;
+        return (nfaStat == NFA_STATUS_OK)?true:false;
 }
 
 /*******************************************************************************
@@ -2632,7 +2942,13 @@
     {
         ret = UICC_ID;
     }
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
 
+    else if(handle ==  (EE_HANDLE_0xF8 & ~NFA_HANDLE_GROUP_EE) ) //UICC2 - 0x04
+    {
+        ret = UICC2_ID;
+    }
+#endif
     return ret;
 }
 
@@ -2650,6 +2966,12 @@
     {
         handle = EE_HANDLE_0xF4; //0x402;
     }
+#if(NXP_NFCC_DYNAMIC_DUAL_UICC == TRUE)
+    else if(eseId == UICC2_ID) //UICC
+    {
+        handle = EE_HANDLE_0xF8; //0x481;
+    }
+#endif
     else if(eseId == DH_ID) //Host
     {
         handle = NFA_EE_HANDLE_DH; //0x400;
@@ -2731,6 +3053,38 @@
 
     return retval;
 }
+#if (NXP_EXTNS == TRUE)
+bool SecureElement::getNfceeHostTypeList()
+{
+    static const char fn [] = "SecureElement::getNfceeHostTypeList";
+    ALOGD ("%s: enter", fn);
+    tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+    bool retval = true;
+
+    nfaStat = NFA_HciSendHostTypeListCommand(mNfaHciHandle);
+
+    if(nfaStat != NFA_STATUS_OK)
+        retval = false;
+
+    return retval;
+}
+
+bool SecureElement::configureNfceeETSI12(UINT8 hostId)
+{
+    static const char fn [] = "SecureElement::configureNfceeETSI12";
+    ALOGD ("%s: enter", fn);
+    tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+    bool retval = true;
+
+    nfaStat = NFA_HciConfigureNfceeETSI12(hostId);
+
+    if(nfaStat != NFA_STATUS_OK)
+        retval = false;
+
+    return retval;
+}
+#endif
+
 
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 /*******************************************************************************
@@ -2745,11 +3099,16 @@
 void SecureElement::NfccStandByOperation(nfcc_standby_operation_t value)
 {
     static IntervalTimer   mNFCCStandbyModeTimer; // timer to enable standby mode for NFCC
-
-    ALOGD("In SecureElement::NfccStandByOperation value = %d", value);
+    static nfcc_standby_operation_t state = STANDBY_MODE_ON;
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+    tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+    bool stat = false;
+#endif
+    ALOGD("In SecureElement::NfccStandByOperation value = %d, state = %d", value, state);
     switch(value)
     {
     case STANDBY_TIMER_START:
+        state = STANDBY_MODE_OFF;
         if(nfccStandbytimeout > 0)
         {
             mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack );
@@ -2761,15 +3120,73 @@
                 mNFCCStandbyModeTimer.kill();
         }
         break;
+    case STANDBY_MODE_ON:
+    {
+#if (NXP_WIRED_MODE_STANDBY_PROP == TRUE)
+        if(state == STANDBY_MODE_ON)
+            break;
+        else if(nfccStandbytimeout > 0)
+#endif
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+        if(nfccStandbytimeout > 0)
+#endif
+            mNFCCStandbyModeTimer.kill();
+
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+        stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
+        if(stat)
+        {
+            state = STANDBY_MODE_OFF;
+            ALOGD ("%s sending standby mode command EVT_END_OF_APDU_TRANSFER successful", __FUNCTION__);
+        }
+#endif
+    }
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+    break;
+#endif
     case STANDBY_TIMER_TIMEOUT:
     {
+#if (NXP_WIRED_MODE_STANDBY_PROP == TRUE)
         bool stat = false;
         //Send the EVT_END_OF_APDU_TRANSFER  after the transceive timer timed out
         stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
         if(stat)
         {
-            ALOGD ("%s sending standby mode command successful", __FUNCTION__);
+            state = STANDBY_MODE_ON;
+            ALOGD ("%s sending standby mode command EVT_END_OF_APDU_TRANSFER successful", __FUNCTION__);
         }
+#endif
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+        UINT8 num = 0;
+
+        SyncEventGuard guard (mPwrLinkCtrlEvent);
+        if (GetNxpNumValue (NAME_NXP_ESE_POWER_DH_CONTROL, (void*)&num, sizeof(num)) == true)
+        {
+            ALOGE ("%s: NXP_ESE_POWER_DH_CONTROL =%d", __FUNCTION__, num);
+            if(num == 1)
+            {
+                nfaStat = NFC_Nfcee_PwrLinkCtrl((UINT8)EE_HANDLE_0xF3, POWER_ALWAYS_ON);
+                if(nfaStat == NFA_STATUS_OK)
+                    mPwrLinkCtrlEvent.wait();
+
+                stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_SUSPEND_APDU_TRANSFER);
+                if(stat)
+                {
+                    state = STANDBY_MODE_ON;
+                    ALOGD ("%s sending standby mode command successful", __FUNCTION__);
+                }
+            }
+            else if (num == 2)
+            {
+                stat = SecureElement::getInstance().sendEvent(SecureElement::EVT_SUSPEND_APDU_TRANSFER);
+                if(stat)
+                {
+                    state = STANDBY_MODE_ON;
+                    ALOGD ("%s sending standby mode command successful", __FUNCTION__);
+                }
+            }
+        }
+#endif
     }
     break;
     case STANDBY_GPIO_HIGH:
@@ -2819,8 +3236,37 @@
 
     }
 }
+/*******************************************************************************
+**
+** Function         eSE_ISO_Reset
+**
+** Description      Performs ISO Reset on eSE
+**
+** Returns          void
+**
+*******************************************************************************/
+void SecureElement::eSE_ISO_Reset(void)
+{
+    jint ret_val = -1;
+    NFCSTATUS status = NFCSTATUS_FAILED;
+    /* Reset P73 using ISO Reset Pin. */
+    ret_val = NFC_P73ISOReset ((void *)&status);
+    if (ret_val < 0)
+    {
+        ALOGD("Reset eSE failed");
+    }
+    else
+    {
+        if (status != NFCSTATUS_SUCCESS)
+        {
+            ALOGD("SE is not being released by Pn54x driver");
+        }
+    }
+}
 #endif
 
+
+#if (JCOP_WA_ENABLE == TRUE)
 /*******************************************************************************
 **
 ** Function:        reconfigureEseHciInit
@@ -2860,47 +3306,106 @@
     android::startRfDiscovery(true);
     return status;
 }
+#endif
 
-#if (NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
-bool SecureElement::isWiredModeAllowedInRfState()
+#if (NXP_EXTNS == TRUE)
+bool SecureElement::isEtsi12ApduGatePresent()
 {
-    static const char fn[] = "isWiredModeAllowedInRfState";
-    bool status = false;
+    tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+    bool ret = false;
+
+    ALOGD ("isEtsi12ApduGatePresent : get gate, pipe list");
+    /*HCI initialised and secure element available*/
+    if((mNfaHciHandle != NFA_HANDLE_INVALID) && (mActiveEeHandle != NFA_HANDLE_INVALID))
+    {
+        SyncEventGuard guard (mPipeListEvent);
+        nfaStat = NFA_HciGetGateAndPipeList (mNfaHciHandle);
+        if (nfaStat == NFA_STATUS_OK)
+        {
+            mPipeListEvent.wait();
+            if (mHciCfg.status == NFA_STATUS_OK)
+            {
+                for (UINT8 xx = 0; xx < mHciCfg.num_pipes; xx++)
+                {
+                    ALOGD ("isEtsi12ApduGatePresent : get gate, pipe list host = 0x%x gate = 0x%x", mHciCfg.pipe[xx].dest_host,
+                            mHciCfg.pipe[xx].dest_gate);
+                    if ( (mHciCfg.pipe[xx].dest_host == 0xC0)
+                     &&  (mHciCfg.pipe[xx].dest_gate == NFA_HCI_ETSI12_APDU_GATE) )
+                    {
+                        ret = true;
+                        ALOGD ("isEtsi12ApduGatePresent: found configured gate: 0x%02x  pipe: 0x%02x", mNewSourceGate, mNewPipeId);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    return ret;
+}
+#if(NFC_NXP_ESE == TRUE)
+bool SecureElement::checkForWiredModeAccess()
+{
+    static const char fn[] = "checkForWiredModeAccess";
+    bool status = true;
     ALOGD("%s; enter", fn);
     //mRecvdTransEvt = false; //reset to false before 2.5sec wait
-    SyncEventGuard guard (mAllowWiredModeEvent);
-    if(android::isp2pActivated())
+    if(mIsExclusiveWiredMode)
     {
-        status = true;
-    }
-    else if(isActivatedInListenMode())
-    {
-        ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode);
-        if(mAllowWiredMode)
-            status = true;
-        else
-            status = mAllowWiredModeEvent.wait(2500);
-    }
-    else if(isRfFieldOn() && (mWiredModeRfFiledEnable != 0x00))
-    {
-        status = mAllowWiredModeEvent.wait(2500);
+        if(mIsWiredModeOpen)
+        {
+            return status;
+        }
+        if(android::isp2pActivated()||isActivatedInListenMode()||isRfFieldOn())
+        {
+            status = false;
+            return status;
+        }
     }
     else
-    {
-        status = true;
-    }
-
-    if(status == false)
-    {
-        ALOGD("%s; Timeout occurs: Check for RF_OFF, Link loss and mRecvdTransEvt=%d",fn, mRecvdTransEvt);
-        if(!isActivatedInListenMode() || !isRfFieldOn() || !mRecvdTransEvt)
+    {   //Wired mode resume and wired mode time out feature
+        if(android::isp2pActivated())
+        {
             status = true;
+        }
+        else if(isActivatedInListenMode())
+        {
+            ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode);
+            if (mIsActionNtfReceived)
+            {
+                if(mAllowWiredMode)
+                {
+                    status = true;
+                    if ((mIsWiredModeOpen)&&(mActiveEeHandle != mActiveCeHandle))
+                    {
+                        ALOGD("%s; hold wired mode ",fn);
+                        hold_wired_mode = true;
+                        SyncEventGuard guard (mWiredModeHoldEvent);
+                        mWiredModeHoldEvent.wait();
+                        status = true;
+                    }
+                    return status;
+                }
+                else
+                {
+                    ALOGD("%s; Desfire/Mifare CLT activated ",fn);
+                    if(!mIsAllowWiredInDesfireMifareCE)
+                    {
+                        hold_wired_mode = true;
+                        SyncEventGuard guard (mWiredModeHoldEvent);
+                        mWiredModeHoldEvent.wait();
+                    }
+                    status = true;
+                }
+            }
+        }
     }
+    ALOGD("%s; status:%d  ",fn, status);
     return status;
 }
 #endif
+#endif
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 /*******************************************************************************
 **
 ** Function:        etsiInitConfig
@@ -3217,14 +3722,147 @@
                                 received_setCPTimeout, (int)sizeof(received_setCPTimeout), recvBufferActualSize, timeout);
                         }
                     }
+                        NfccStandByOperation(STANDBY_MODE_ON);
+                        disconnectEE(ESE_ID);
                 }
             }
             sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
+            NfccStandByOperation(STANDBY_TIMER_STOP);
             disconnectEE(ESE_ID);
         }
     }
 
 }
+
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+/*******************************************************************************
+**
+** Function:        enablePassiveListen
+**
+** Description:     Enable or disable  Passive A/B listen
+**
+** Returns:         True if ok.
+**
+*******************************************************************************/
+UINT16 SecureElement::enablePassiveListen (UINT8 event)
+{
+    tNFA_STATUS status = NFA_STATUS_FAILED;
+
+    mPassiveListenMutex.lock();
+
+    if(event == 0x00 && mPassiveListenEnabled == true)
+    {
+        if(android::isDiscoveryStarted() == true)
+        {
+            android::startRfDiscovery(false);
+        }
+        status = NFA_DisablePassiveListening();
+        if(status == NFA_STATUS_OK)
+        {
+            SyncEventGuard g (mPassiveListenEvt);
+            mPassiveListenEvt.wait(100);
+        }
+        mPassiveListenEnabled = false;
+        if(android::isDiscoveryStarted() == false)
+        {
+            android::startRfDiscovery(true);
+        }
+    }
+    else if (event == 0x01 && mPassiveListenEnabled == false)
+    {
+        if(android::isDiscoveryStarted() == true)
+        {
+            android::startRfDiscovery(false);
+        }
+        status = NFA_EnableListening();
+        if(status == NFA_STATUS_OK)
+        {
+            SyncEventGuard g (mPassiveListenEvt);
+            mPassiveListenEvt.wait(100);
+        }
+        mPassiveListenTimer.set(mPassiveListenTimeout , passiveListenDisablecallBack);
+        mPassiveListenEnabled = true;
+        if(android::isDiscoveryStarted() == false)
+        {
+            android::startRfDiscovery(true);
+        }
+    }
+    mPassiveListenMutex.unlock();
+    ALOGD(" enablePassiveListen exit");
+    return 0x00;
+}
+
+/*******************************************************************************
+ **
+ ** Function:        passiveListenEnable
+ **
+ ** Description:    thread to trigger passive Listen Enable
+ **
+ ** Returns:        None .
+ **
+ *******************************************************************************/
+void *passiveListenEnableThread(void *arg)
+{
+	ALOGD(" passiveListenEnableThread  %d",*((uint8_t*)arg));
+    if (*((uint8_t*)arg))
+    {
+        SecureElement::getInstance().enablePassiveListen(0x01);
+    }
+    else
+    {
+        SecureElement::getInstance().enablePassiveListen(0x00);
+    }
+    pthread_exit(NULL);
+    return NULL;
+}
+
+UINT16 SecureElement::startThread(UINT8 thread_arg)
+{
+	passiveListenState = thread_arg;
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    mPassiveListenCnt = 0x00;
+    if (pthread_create(&passiveListenEnable_thread, &attr, passiveListenEnableThread, (void*) &passiveListenState) != 0)
+    {
+        ALOGD("Unable to create the thread");
+    }
+    pthread_attr_destroy(&attr);
+    return 0x00;
+}
+
+/*******************************************************************************
+**
+** Function:        passiveListenDisablecallBack
+**
+** Description:     Enable or disable  Passive A/B listen
+**
+** Returns:         None
+**
+*******************************************************************************/
+static void passiveListenDisablecallBack(union sigval)
+{
+	ALOGD(" passiveListenDisablecallBack enter");
+
+    if(SecureElement::getInstance().isRfFieldOn() == true)
+    {
+        if(SecureElement::getInstance().isActivatedInListenMode())
+        {
+            //do nothing ,
+            return;
+        }
+        else if((SecureElement::getInstance().isActivatedInListenMode() == false) && (SecureElement::getInstance().mPassiveListenCnt < 0x02))
+        {
+            ALOGD(" passiveListenEnableThread timer restart");
+            SecureElement::getInstance().mPassiveListenTimer.set(SecureElement::getInstance().mPassiveListenTimeout , passiveListenDisablecallBack);
+            SecureElement::getInstance().mPassiveListenCnt++;
+            return;
+        }
+    }
+    SecureElement::getInstance().enablePassiveListen (0x00);
+}
+#endif
+
 #endif
 
 #if(NXP_EXTNS == TRUE)
@@ -3276,6 +3914,7 @@
     ALOGD("%s:Enter mode = %d", __FUNCTION__, mode);
 
 #if((NFC_NXP_ESE == TRUE))
+#if (JCOP_WA_ENABLE == TRUE)
     if((mode == NFA_EE_MD_DEACTIVATE)&&(active_ese_reset_control&(TRANS_WIRED_ONGOING|TRANS_CL_ONGOING)))
     {
         active_ese_reset_control |= RESET_BLOCKED;
@@ -3283,6 +3922,7 @@
         sSecElem.mResetEvent.wait();
     }
 #endif
+#endif
     SyncEventGuard guard (sSecElem.mEeSetModeEvent);
     stat =  NFA_EeModeSet(handle, mode);
     if(stat == NFA_STATUS_OK)
@@ -3291,12 +3931,14 @@
     }
 
 #if((NFC_NXP_ESE == TRUE))
+#if (JCOP_WA_ENABLE == TRUE)
     if((active_ese_reset_control&RESET_BLOCKED))
     {
         SyncEventGuard guard (sSecElem.mResetOngoingEvent);
         sSecElem.mResetOngoingEvent.notifyOne();
     }
 #endif
+#endif
     return stat;
 }
 /**********************************************************************************
@@ -3374,4 +4016,38 @@
     return uicc_stat;
 }
 #endif
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+/*******************************************************************************
+ **
+ ** Function:       SecElem_sendEvt_Abort
+ **
+ ** Description:    Perform interface level reset by sending EVT_ABORT event
+ **
+ ** Returns:        NFA_STATUS_OK/NFA_STATUS_FAILED.
+ **
+ *******************************************************************************/
+
+tNFA_STATUS SecureElement::SecElem_sendEvt_Abort()
+{
+    static const char fn[] = "SecureElement::SecElem_sendEvt_Abort";
+    tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
+    INT32 timeoutMillisec = 3000;
+    UINT8 atr_len = 0x10;
+    UINT8 recvBuffer[MAX_RESPONSE_SIZE];
+    mAbortEventWaitOk = false;
+
+    SyncEventGuard guard (mAbortEvent);
+    nfaStat = NFA_HciSendEvent(mNfaHciHandle, mNewPipeId, EVT_ABORT, 0, NULL, atr_len, recvBuffer, timeoutMillisec);
+    if(nfaStat == NFA_STATUS_OK)
+    {
+        mAbortEvent.wait();
+    }
+    if(mAbortEventWaitOk == false)
+    {
+        ALOGE("%s (EVT_ABORT)Wait reposne timeout",fn);
+        return NFA_STATUS_FAILED;
+    }
+    return nfaStat;
+}
+#endif
 #endif
diff --git a/nci/jni/SecureElement.h b/nci/jni/SecureElement.h
index 2cd568b..8d015a7 100644
--- a/nci/jni/SecureElement.h
+++ b/nci/jni/SecureElement.h
@@ -107,7 +107,7 @@
 
 }se_rd_req_failures_t;
 
-#if (NFC_NXP_ESE ==  TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if (NFC_NXP_ESE ==  TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
 typedef struct{
     rd_swp_req_t swp_rd_req_info ;
     rd_swp_req_t swp_rd_req_current_info ;
@@ -123,7 +123,9 @@
     STANDBY_TIMER_STOP,
     STANDBY_TIMER_TIMEOUT,
     STANDBY_GPIO_HIGH,
-    STANDBY_GPIO_LOW
+    STANDBY_GPIO_LOW,
+    STANDBY_MODE_ON,
+    STANDBY_MODE_OFF
 }nfcc_standby_operation_t;
 void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused);
 #endif
@@ -147,9 +149,11 @@
         UINT8 mNfceePresent;
     };
     mNfceeData  mNfceeData_t;
+    UINT8 mHostsPresent;
+    UINT8 mHostsId[MAX_NFCEE];
 #endif
 
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     IntervalTimer sSwpReaderTimer; // timer swp reader timeout.
 #endif
 
@@ -556,6 +560,9 @@
     *******************************************************************************/
     bool getAtr(jint seID, UINT8* recvBuffer, INT32 *recvBufferSize);
 #if(NXP_EXTNS == TRUE)
+    bool getNfceeHostTypeList (void);
+    bool configureNfceeETSI12 (UINT8 host_id);
+
     /**********************************************************************************
      **
      ** Function:        getEeStatus
@@ -590,15 +597,48 @@
      **
     *******************************************************************************/
     bool updateEEStatus ();
+
+    /*******************************************************************************
+     **
+     ** Function:        isTeckInfoReceived
+     **
+     ** Description:     isTeckInfoReceived
+     **                  Checks if discovery_req_ntf received
+     **                  for a given EE
+     **
+     ** Returns:         True if ok.
+     **
+     *******************************************************************************/
+    bool isTeckInfoReceived (UINT16 eeHandle);
 #endif
 #endif
-#if(NFC_NXP_ESE == TRUE && ((NFC_NXP_CHIP_TYPE == PN548C2) || (NFC_NXP_CHIP_TYPE == PN551)))
+#if(NFC_NXP_ESE == TRUE && (NFC_NXP_CHIP_TYPE != PN547C2))
     void etsiInitConfig();
     tNFC_STATUS etsiReaderConfig(int eeHandle);
     tNFC_STATUS etsiResetReaderConfig();
 #endif
+
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    /*******************************************************************************
+    **
+    ** Function:        enablePassiveListen
+    **
+    ** Description:     Enable or disable listening to Passive A/B
+    **
+    ** Returns:         True if ok.
+    **
+    *******************************************************************************/
+    UINT16 enablePassiveListen (UINT8 event);
+
+    UINT16 startThread(UINT8 thread_arg);
+
+    bool            mPassiveListenEnabled;
+    bool            meseUiccConcurrentAccess;
+    IntervalTimer   mPassiveListenTimer;
+#endif
     jint getSETechnology(tNFA_HANDLE eeHandle);
     static const UINT8 UICC_ID = 0x02;
+    static const UINT8 UICC2_ID = 0x04;
     static const UINT8 ESE_ID = 0x01;
     static const UINT8 DH_ID = 0x00;
 
@@ -607,28 +647,54 @@
     tNFA_HANDLE getEseHandleFromGenericId(jint eseId);
 
     jint getGenericEseId(tNFA_HANDLE handle);
-
+#if (JCOP_WA_ENABLE == TRUE)
     tNFA_STATUS reconfigureEseHciInit();
+#endif
 #if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     void setCPTimeout();
     void NfccStandByOperation(nfcc_standby_operation_t value);
+    void eSE_ISO_Reset(void);
+    tNFA_STATUS SecElem_sendEvt_Abort();
 #endif
-    bool isWiredModeAllowedInRfState();
+    bool checkForWiredModeAccess();
+    bool isEtsi12ApduGatePresent();
     bool mRecvdTransEvt;
     bool mAllowWiredMode;
-
+    UINT8           mPassiveListenCnt;                 //Retry cnt for passive listen enable timer
     SyncEvent       mRoutingEvent;
     SyncEvent       mAidAddRemoveEvent;
     SyncEvent       mUiccListenEvent;
     SyncEvent       mEseListenEvent;
     SyncEvent       mAllowWiredModeEvent;
     SyncEvent       mEeSetModeEvent;
+    UINT32          mPassiveListenTimeout;                 //Retry timout value for passive listen enable timer
+#if((NFC_NXP_ESE == TRUE)&&(CONCURRENCY_PROTECTION == TRUE))
+    SyncEvent       mPassiveListenEvt;
+    Mutex           mPassiveListenMutex;
+#endif
+#if ((NXP_EXTNS == TRUE) && (NXP_WIRED_MODE_STANDBY == TRUE))
+    SyncEvent       mPwrLinkCtrlEvent;
+#endif
 
 #if(NXP_EXTNS == TRUE)
+    SyncEvent       mNfceeInitCbEvent;
     tNFA_STATUS SecElem_EeModeSet(uint16_t handle, uint8_t mode);
+#if (JCOP_WA_ENABLE == TRUE)
     SyncEvent       mEEdatapacketEvent;
+#endif
     SyncEvent       mTransceiveEvent;
     static const UINT8 EVT_END_OF_APDU_TRANSFER = 0x21;    //NXP Propritory
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+    static const UINT8 EVT_SUSPEND_APDU_TRANSFER = 0x31;
+#endif
+    tNFA_HANDLE mActiveCeHandle;
+    bool    mIsWiredModeOpen;
+    bool    mlistenDisabled;
+    bool    mIsExclusiveWiredMode;
+    bool    mIsActionNtfReceived;
+    bool    mIsDesfireMifareDisable;
+    bool    mIsAllowWiredInDesfireMifareCE;
+    static const UINT8 EVT_ABORT = 0x11;  //ETSI12
     void setCLState(bool mState);
 #endif
 
@@ -643,7 +709,14 @@
     static const UINT8 STATIC_PIPE_0x71 = 0x71; //Broadcom's proprietary static pipe
     static const UINT8 EVT_SEND_DATA = 0x10;    //see specification ETSI TS 102 622 v9.0.0 (Host Controller Interface); section 9.3.3.3
 #if(NXP_EXTNS == TRUE)
+    static const UINT8 STATIC_PIPE_UICC = 0x20; //UICC's proprietary static pipe
+#if (NXP_WIRED_MODE_STANDBY == TRUE)
+    static const UINT8 NFCC_DECIDES     = 0x00;     //NFCC decides
+    static const UINT8 POWER_ALWAYS_ON  = 0x01;     //NFCEE Power Supply always On
+    static const UINT8 COMM_LINK_ACTIVE = 0x02;     //NFCC to NFCEE Communication link always active when the NFCEE  is powered on.
+#endif
     static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4C0;//0x401; //handle to secure element in slot 0
+    static const tNFA_HANDLE EE_HANDLE_0xF8 = 0x481; //handle to secure element in slot 2
 #ifdef NXP_UICC_ENABLE
     static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x402; //handle to secure element in slot 1
 #else
@@ -681,9 +754,10 @@
     tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg;
     SyncEvent       mEeRegisterEvent;
     SyncEvent       mHciRegisterEvent;
-
+#if (JCOP_WA_ENABLE == TRUE)
     SyncEvent       mResetEvent;
     SyncEvent       mResetOngoingEvent;
+#endif
     SyncEvent       mPipeListEvent;
     SyncEvent       mCreatePipeEvent;
     SyncEvent       mPipeOpenedEvent;
@@ -709,6 +783,10 @@
     IntervalTimer   mTransceiveTimer;
     bool            mTransceiveWaitOk;
     int mWiredModeRfFiledEnable;
+#if(NXP_EXTNS == TRUE)
+    SyncEvent       mAbortEvent;
+    bool            mAbortEventWaitOk;
+#endif
     /*******************************************************************************
     **
     ** Function:        SecureElement
@@ -799,6 +877,18 @@
     tNFA_HANDLE getDefaultEeHandle ();
 
 
+#if(NXP_EXTNS == TRUE)
+    /*******************************************************************************
+    **
+    ** Function:        getActiveEeHandle
+    **
+    ** Description:     Get the handle of the active execution environment.
+    **
+    ** Returns:         Handle to the execution environment.
+    **
+    *******************************************************************************/
+    tNFA_HANDLE getActiveEeHandle (tNFA_HANDLE eeHandle);
+#endif
     /*******************************************************************************
     **
     ** Function:        adjustRoutes
diff --git a/nci/jni/extns/pn54x/inc/phNxpExtns.h b/nci/jni/extns/pn54x/inc/phNxpExtns.h
index 6fafbd1..b8a3b40 100755
--- a/nci/jni/extns/pn54x/inc/phNxpExtns.h
+++ b/nci/jni/extns/pn54x/inc/phNxpExtns.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 NXP Semiconductors
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h b/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h
index 945d0e0..a9d10c8 100755
--- a/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h
+++ b/nci/jni/extns/pn54x/inc/phNxpExtns_Custom.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 NXP Semiconductors
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/nci/jni/extns/pn54x/src/common/phNfcTypes.h b/nci/jni/extns/pn54x/src/common/phNfcTypes.h
old mode 100755
new mode 100644
index 8cfdbd4..6ba7ff3
--- a/nci/jni/extns/pn54x/src/common/phNfcTypes.h
+++ b/nci/jni/extns/pn54x/src/common/phNfcTypes.h
@@ -303,6 +303,6 @@
     P61_STATE_SPI_END = 0x4000, /*End of p61 access by SPI*/
 } p61_access_state_t;
 
-#define UNUSED(X) (void)X;
+#define UNUSED(X) (void)(X);
 
 #endif /* PHNFCTYPES_H */
diff --git a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
index bb34ee0..1eb4c70 100644
--- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
+++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
@@ -93,6 +93,9 @@
 #define NAME_NXP_UICC_WIRED_PRT_MASK         "NXP_UICC_WIRED_PRT_MASK"
 #define NAME_NXP_ESE_WIRED_PRT_MASK          "NXP_ESE_WIRED_PRT_MASK"
 #define NAME_NXP_ENABLE_ADD_AID              "NXP_ENABLE_ADD_AID"
+#if(NXP_ESE_POWER_MODE==TRUE)
+#define NAME_NXP_ESE_POWER_DH_CONTROL         "NXP_ESE_POWER_DH_CONTROL"
+#endif
 /* default configuration */
 #define default_storage_location "/data/nfc"
 
diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java b/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java
index 3d7a7f3..c8e7229 100755
--- a/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java
+++ b/nci/src/com/android/nfc/dhimpl/NativeNfcSecureElement.java
@@ -60,13 +60,13 @@
         mPrefsEditor = mPrefs.edit();
     }
 
-    private native int doNativeOpenSecureElementConnection();
+    private native int doNativeOpenSecureElementConnection(int seId);
 
-    public int doOpenSecureElementConnection() {
+    public int doOpenSecureElementConnection(int seId) {
         mPrefsEditor.putBoolean(PREF_SE_WIRED, true);
         mPrefsEditor.apply();
 
-        return doNativeOpenSecureElementConnection();
+        return doNativeOpenSecureElementConnection(seId);
     }
 
     private native boolean doNativeDisconnectSecureElementConnection(int handle);
