NFC_NCIHALx_ARC0.4.7.0_M_OpnSrc
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);