NFC: Update third party NfcService to 4.3.0_M

Merge branch 'caf/caf-3/nxpnfc-project/br_android_ncihalx_m' into nfc.lnx.1.0-dev.1.0

* caf/caf-3/nxpnfc-project/br_android_ncihalx_m:
  NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc
  NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc
  NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc

Change-Id: I392881b85f79254c135663e538d0f3e65b938353
CRs-Fixed: 970257
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ac318eb..986d40b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -53,10 +53,12 @@
     <uses-permission android:name="com.android.permission.WHITELIST_BLUETOOTH_DEVICE" />
     <uses-permission android:name="android.permission.DISPATCH_NFC_MESSAGE" />
     <uses-permission android:name="android.permission.DEVICE_POWER" />
-
-    <permission android:name="com.gsma.service.nfc.permission.TRANSACTION_EVENT"
-                android:permissionGroup = "android.permission-group.NFC"
-                android:protectionLevel="dangerous"
+    <permission-group android:name ="com.gsma.services.nfc.permission"
+                      android:label ="@string/permgrouplab_NFC"
+                      android:description="@string/permgroupdesc_NFC"
+                      android:priority="270" />
+    <permission android:name="com.gsma.services.nfc.permission.TRANSACTION_EVENT"
+                android:permissionGroup = "com.gsma.services.nfc.permission"
                 android:label= "@string/permlab_nfcReceiveEvent"
                 android:description = "@string/permdesc_nfcReceiveEvent" />
 
diff --git a/README.md b/README.md
index 031055a..5433176 100644
--- a/README.md
+++ b/README.md
@@ -17,5 +17,6 @@
 | Android Version        | NXP Release          | NXP Tag  |
 | :-------------: |:-------------:| :-----:|
 | android-6.0.0_r1                     |  4.2.0_M (PN547C2/PN548C2) |  NFC_NCIHALx_AR0F.4.2.0_M_OpnSrc |
+| android-6.0.0_r1                     |  4.3.0_M (PN547C2/PN548C2) |  NFC_NCIHALx_AR0F.4.3.0_M_OpnSrc |
 
 
diff --git a/nci/jni/DwpChannel.cpp b/nci/jni/DwpChannel.cpp
index 583037d..6c66a27 100644
--- a/nci/jni/DwpChannel.cpp
+++ b/nci/jni/DwpChannel.cpp
@@ -15,6 +15,7 @@
  */
 #include "DwpChannel.h"
 #include "SecureElement.h"
+#include "RoutingManager.h"
 #include <cutils/log.h>
 
 static const int EE_ERROR_OPEN_FAIL =  -1;
@@ -177,9 +178,10 @@
 
     //if controller is not routing AND there is no pipe connected,
     //then turn off the sec elem
+    #if((NFC_NXP_CHIP_TYPE == PN547C2)&&(NFC_NXP_ESE == TRUE))
     if (! se.isBusy())
         se.deactivate (SecureElement::ESE_ID);
-
+    #endif
      return stat;
 }
 
@@ -209,8 +211,10 @@
 {
     static const char fn [] = "DwpChannel::doeSE_Reset";
     SecureElement &se = SecureElement::getInstance();
+    RoutingManager &rm = RoutingManager::getInstance();
     ALOGD("%s: enter:", fn);
 
+    rm.mResetHandlerMutex.lock();
     ALOGD("1st mode set calling");
     se.SecEle_Modeset(0x00);
     usleep(100 * 1000);
@@ -221,6 +225,17 @@
     ALOGD("2nd mode set called");
 
     usleep(2000 * 1000);
+    rm.mResetHandlerMutex.unlock();
+    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);
+    }
 }
 namespace android
 {
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index 4a35b68..3c0b8b9 100644
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -41,7 +41,7 @@
 #include "HciRFParams.h"
 #include <pthread.h>
 #include <ScopedPrimitiveArray.h>
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 #include <signal.h>
 #include <sys/types.h>
 #endif
@@ -63,20 +63,23 @@
 #endif
 }
 
-
-
-
+#define SAK_VALUE_AT 17
 
 #if(NXP_EXTNS == TRUE)
 #define UICC_HANDLE   0x402
 #define ESE_HANDLE    0x4C0
 #define RETRY_COUNT   10
 #define default_count 3
-
+extern bool recovery;
+static INT32                gNfcInitTimeout;
+static INT32                gdisc_timeout;
+INT32                       gSeDiscoverycount = 0;
+INT32                       gActualSeCount = 0;
+SyncEvent                   gNfceeDiscCbEvent;
+extern int gUICCVirtualWiredProtectMask;
+extern int gEseVirtualWiredProtectMask;
 #endif
 
-#define SAK_VALUE_AT 17
-
 extern const UINT8 nfca_version_string [];
 extern const UINT8 nfa_version_string [];
 
@@ -87,16 +90,6 @@
 extern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg; //defined in stack
 bool                        sHCEEnabled = true; // whether HCE is enabled
 extern bool gReaderNotificationflag;
-#if(NXP_EXTNS == TRUE)
-extern bool recovery;
-static INT32                gNfcInitTimeout;
-static INT32                gdisc_timeout;
-INT32                       gSeDiscoverycount = 0;
-INT32                       gActualSeCount = 0;
-SyncEvent                   gNfceeDiscCbEvent;
-extern int gUICCVirtualWiredProtectMask;
-extern int gEseVirtualWiredProtectMask;
-#endif
 
 namespace android
 {
@@ -133,7 +126,7 @@
     static void nfaNxpSelfTestNtfTimerCb (union sigval);
     //Factory Test Code --end
     extern bool getReconnectState(void);
-    extern tNFA_STATUS SetVenConfigValue(jint venconfig);
+    extern tNFA_STATUS SetVenConfigValue(jint nfcMode);
     extern tNFA_STATUS SetHfoConfigValue(void);
     extern tNFA_STATUS SetUICC_SWPBitRate(bool);
     extern tNFA_STATUS GetSwpStausValue(void);
@@ -239,6 +232,9 @@
 static UINT8                sIsSecElemSelected = 0;  //has NFC service selected a sec elem
 static UINT8                sIsSecElemDetected = 0;  //has NFC service deselected a sec elem
 static bool                 sDiscCmdwhleNfcOff = false;
+#if (NXP_EXTNS == TRUE)
+static bool                 gsNfaPartialEnabled = false;
+#endif
 
 #define CONFIG_UPDATE_TECH_MASK     (1 << 1)
 #define TRANSACTION_TIMER_VALUE     50
@@ -258,6 +254,9 @@
 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))
+bool isp2pActivated();
+#endif
 static void nfaConnectionCallback (UINT8 event, tNFA_CONN_EVT_DATA *eventData);
 static void nfaDeviceManagementCallback (UINT8 event, tNFA_DM_CBACK_DATA *eventData);
 static bool isPeerToPeer (tNFA_ACTIVATED& activated);
@@ -272,6 +271,9 @@
 static int nfcManager_getNfcInitTimeout(JNIEnv* e, jobject o);
 static int nfcManager_doJcosDownload(JNIEnv* e, jobject o);
 static void nfcManager_doCommitRouting(JNIEnv* e, jobject o);
+#if(NXP_EXTNS == TRUE)
+static void nfcManager_doSetNfcMode (JNIEnv *e, jobject o, jint nfcMode);
+#endif
 static void nfcManager_doSetVenConfigValue (JNIEnv *e, jobject o, jint venconfig);
 static jint nfcManager_getSecureElementTechList(JNIEnv* e, jobject o);
 static void nfcManager_setSecureElementListenTechMask(JNIEnv *e, jobject o, jint tech_mask);
@@ -307,9 +309,6 @@
 
 UINT16 sRoutingBuffLen;
 static UINT8 sRoutingBuff[MAX_GET_ROUTING_BUFFER_SIZE];
-#endif
-
-#if(NXP_EXTNS == TRUE)
 static UINT8 sNfceeConfigured;
 static UINT8 sCheckNfceeFlag;
 void checkforNfceeBuffer();
@@ -329,6 +328,8 @@
 static IntervalTimer LmrtRspTimer;
 static void LmrtRspTimerCb(union sigval);
 static void nfcManager_setProvisionMode(JNIEnv* e, jobject o, jboolean provisionMode);
+static bool nfcManager_doPartialInitialize ();
+static bool nfcManager_doPartialDeInitialize();
 #endif
 
 
@@ -339,6 +340,7 @@
 #endif
 #if(NXP_EXTNS == TRUE)
 tNFC_FW_VERSION get_fw_version();
+bool isNfcInitializationDone();
 static UINT16 discDuration = 0x00;
 UINT16 getrfDiscoveryDuration();
 #if (NFC_NXP_CHIP_TYPE == PN548C2)
@@ -422,9 +424,6 @@
         jboolean restart);
 void nfcManager_disableDiscovery (JNIEnv*, jobject);
 static bool get_transcation_stat(void);
-#if(NXP_EXTNS == TRUE)
-void set_transcation_stat(bool result);
-#endif
 static char get_last_request(void);
 static void set_last_request(char status, struct nfc_jni_native_data *nat);
 static eScreenState_t get_lastScreenStateRequest(void);
@@ -443,6 +442,7 @@
 void reconfigure_poll_cb(union sigval);
 void clear_multiprotocol();
 void multiprotocol_clear_flag(union sigval);
+void set_transcation_stat(bool result);
 #endif
 
 /////////////////////////////////////////////////////////////
@@ -508,6 +508,7 @@
 #if(NXP_EXTNS == TRUE)
     else if(!sReaderModeEnabled && multiprotocol_flag)
     {
+        NfcTag::getInstance ().mNumDiscNtf = 0x00;
         multiprotocol_flag = 0;
         multiprotocol_detected = 1;
         ALOGD("Prio_Logic_multiprotocol Logic");
@@ -743,6 +744,10 @@
 #endif
                 nativeNfcTag_doConnectStatus(false);
             }
+#if(NXP_EXTNS == TRUE)
+            NfcTag::getInstance().selectCompleteStatus(false);
+            NfcTag::getInstance ().mNumDiscNtf = 0x00;
+#endif
             NfcTag::getInstance().mTechListIndex = 0;
             ALOGE("%s: NFA_SELECT_RESULT_EVT error: status = %d", __FUNCTION__, eventData->status);
             NFA_Deactivate (FALSE);
@@ -774,8 +779,10 @@
 
     case NFA_ACTIVATED_EVT: // NFC link/protocol activated
         checkforTranscation(NFA_ACTIVATED_EVT, (void *)eventData);
+
         ALOGD("%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d", __FUNCTION__, gIsSelectingRfInterface, sIsDisabling);
-        #if(NXP_EXTNS == TRUE)
+#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);
@@ -827,6 +834,7 @@
         gActivated = true;
 
         NfcTag::getInstance().setActivationState ();
+
         if (gIsSelectingRfInterface)
         {
             nativeNfcTag_doConnectStatus(true);
@@ -840,10 +848,6 @@
         nativeNfcTag_resetPresenceCheck();
         if (isPeerToPeer(eventData->activated))
         {
-#if (NFC_NXP_ESE == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
-            SyncEventGuard guard (SecureElement::getInstance().mAllowWiredModeEvent);
-            SecureElement::getInstance().mAllowWiredModeEvent.notifyOne();
-#endif
             if (sReaderModeEnabled)
             {
 #if(NXP_EXTNS == TRUE)
@@ -998,6 +1002,7 @@
                     SecureElement::getInstance().notifyListenModeState (false);
             } else if (sP2pActive) {
                 sP2pActive = false;
+                SecureElement::getInstance().notifyRfFieldEvent (false);
                 // Make sure RF field events are re-enabled
                 ALOGD("%s: NFA_DEACTIVATED_EVT; is p2p", __FUNCTION__);
                 // Disable RF field events in case of p2p
@@ -1014,7 +1019,6 @@
                         ALOGE ("%s: Failed to enable RF field events", __FUNCTION__);
                     }
                     // Consider the field to be off at this point
-                    SecureElement::getInstance().notifyRfFieldEvent (false);
                 }
 */
             }
@@ -1686,16 +1690,14 @@
 #if (NXP_EXTNS == TRUE)
     result = RoutingManager::getInstance().setDefaultRoute(defaultRouteEntry, defaultProtoRouteEntry, defaultTechRouteEntry);
     RoutingManager::getInstance().commitRouting();
-#else
-    result = RoutingManager::getInstance().setDefaultRouting();
-#endif
-
-#if(NXP_EXTNS == TRUE)
     LmrtRspTimer.set(1000, LmrtRspTimerCb);
     SyncEventGuard guard (RoutingManager::getInstance().mLmrtEvent);
     if(result == true)
         RoutingManager::getInstance().mLmrtEvent.wait();
+#else
+    result = RoutingManager::getInstance().setDefaultRouting();
 #endif
+
     startRfDiscovery(true);
     return result;
 }
@@ -1758,6 +1760,9 @@
     gSeDiscoverycount = 0;
     gActualSeCount = 0;
     UINT8 configData = 0;
+#if(NXP_EXTNS == TRUE)
+    gGeneralPowershutDown = 0;
+#endif
     ALOGD ("%s: enter; ver=%s nfa=%s NCI_VERSION=0x%02X",
         __FUNCTION__, nfca_version_string, nfa_version_string, NCI_VERSION);
    mwVer=  NFA_GetMwVersion();
@@ -1768,7 +1773,7 @@
     tNFA_STATUS stat = NFA_STATUS_OK;
     NfcTag::getInstance ().mNfcDisableinProgress = false;
     PowerSwitch & powerSwitch = PowerSwitch::getInstance ();
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     struct sigaction sig;
 
     memset(&sig, 0, sizeof(struct sigaction));
@@ -1784,7 +1789,13 @@
         ALOGD ("%s: already enabled", __FUNCTION__);
         goto TheEnd;
     }
-
+#if(NXP_EXTNS == TRUE)
+    if(gsNfaPartialEnabled)
+    {
+        ALOGD ("%s: already  partial enable calling deinitialize", __FUNCTION__);
+        nfcManager_doPartialDeInitialize();
+    }
+#endif
 if ((signal(SIGABRT, sig_handler) == SIG_ERR) &&
         (signal(SIGSEGV, sig_handler) == SIG_ERR))
     {
@@ -1800,11 +1811,12 @@
         theInstance.Initialize(); //start GKI, NCI task, NFC task
 
         {
+#if(NXP_EXTNS == TRUE)
+            NFA_SetBootMode(NFA_NORMAL_BOOT_MODE);
+#endif
             SyncEventGuard guard (sNfaEnableEvent);
             tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
-
             NFA_Init (halFuncEntries);
-
             stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
             if (stat == NFA_STATUS_OK)
             {
@@ -1856,7 +1868,6 @@
                     }
                 }
                 checkforNfceeConfig();
-                getUICC_RF_Param_SetSWPBitRate();
 #endif
 #if((NFC_NXP_ESE_VER == JCOP_VER_3_3)&& (NXP_EXTNS == TRUE))
                 if(isNxpConfigModified())
@@ -1874,13 +1885,6 @@
 #if(NXP_EXTNS == TRUE)
                     set_transcation_stat(false);
                     pendingScreenState = false;
-                    stat = SetVenConfigValue(VEN_CFG_NFC_ON_POWER_ON);
-                    if (stat != NFA_STATUS_OK)
-                    {
-                        ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
-                    }
-                    ALOGE ("%s: set the VEN_CFG to VEN_CFG_NFC_ON_POWER_ON", __FUNCTION__);
-                    gGeneralPowershutDown = 0;
 
                     if(gIsDtaEnabled == true){
                         configData = 0x01;    /**< Poll NFC-DEP : Highest Available Bit Rates */
@@ -2659,6 +2663,11 @@
     }
 
     ScopedUtfChars serviceName(e, sn);
+    if (serviceName.c_str() == NULL)
+    {
+        ALOGE ("%s: service name can not be null error", __FUNCTION__);
+        return NULL;
+    }
 
     ALOGD ("%s: enter: sap=%i; name=%s; miu=%i; rw=%i; buffLen=%i", __FUNCTION__, nSap, serviceName.c_str(), miu, rw, linearBufferLength);
 
@@ -2760,30 +2769,6 @@
 
     if (sIsNfaEnabled)
     {
-#if(NXP_EXTNS == TRUE)
-        jint venconfig;
-        if (gGeneralPowershutDown == VEN_CFG_NFC_OFF_POWER_OFF)
-        {
-            stat = SetVenConfigValue(gGeneralPowershutDown);
-            if (stat != NFA_STATUS_OK)
-            {
-               ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
-            }
-            ALOGE ("%s: set the VEN_CFG to %d", __FUNCTION__,gGeneralPowershutDown);
-            gGeneralPowershutDown = 0;
-        }
-
-#if(NFC_NXP_HFO_SETTINGS == TRUE)
-        if (gGeneralPowershutDown == VEN_CFG_NFC_ON_POWER_ON)
-        {
-            stat = SetHfoConfigValue();
-            if (stat != NFA_STATUS_OK)
-            {
-                ALOGE ("%s: fail to enable HFO; error=0x%X", __FUNCTION__, stat);
-            }
-        }
-#endif
-#endif
         SyncEventGuard guard (sNfaDisableEvent);
         EXTNS_Close();
         stat = NFA_Disable (TRUE /* graceful */);
@@ -3297,7 +3282,7 @@
      * conditional check is added to avoid multiple dicovery cmds
      * at the time of NFC OFF in progress
      */
-    if ((gGeneralPowershutDown != VEN_CFG_NFC_OFF_POWER_OFF) && bRestartDiscovery)
+    if ((gGeneralPowershutDown != NFC_MODE_OFF) && bRestartDiscovery)
         startRfDiscovery (true);
 
     //if nothing is active after this, then tell the controller to power down
@@ -3372,6 +3357,58 @@
 #if(NXP_EXTNS == TRUE)
 /*******************************************************************************
 **
+** Function:        nfcManager_getDefaultAidPowerState
+**
+** Description:     Get the default Desfire Power States.
+**                  e: JVM environment.
+**                  o: Java object.
+**
+** Returns:         Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultAidPowerState (JNIEnv* e, jobject o)
+{
+    unsigned long num = 0;
+    GetNxpNumValue(NAME_DEFAULT_AID_PWR_STATE, &num, sizeof(num));
+    return num;
+}
+
+/*******************************************************************************
+**
+** Function:        nfcManager_getDefaultDesfirePowerState
+**
+** Description:     Get the default Desfire Power States.
+**                  e: JVM environment.
+**                  o: Java object.
+**
+** Returns:         Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultDesfirePowerState (JNIEnv* e, jobject o)
+{
+    unsigned long num = 0;
+    GetNxpNumValue(NAME_DEFAULT_DESFIRE_PWR_STATE, &num, sizeof(num));
+    return num;
+}
+/*******************************************************************************
+**
+** Function:        nfcManager_getDefaultMifareCLTPowerState
+**
+** Description:     Get the default mifare CLT Power States.
+**                  e: JVM environment.
+**                  o: Java object.
+**
+** Returns:         Power State
+**
+*******************************************************************************/
+static jint nfcManager_getDefaultMifareCLTPowerState (JNIEnv* e, jobject o)
+{
+    unsigned long num = 0;
+    GetNxpNumValue(NAME_DEFAULT_MIFARE_CLT_PWR_STATE, &num, sizeof(num));
+    return num;
+}
+/*******************************************************************************
+**
 ** Function:        nfcManager_setDefaultTechRoute
 **
 ** Description:     Setting Default Technology Routing
@@ -4028,6 +4065,16 @@
 
     {"getDefaultMifareCLTRoute", "()I",
             (void*) nfcManager_getDefaultMifareCLTRoute},
+#if(NXP_EXTNS == TRUE)
+    {"getDefaultAidPowerState", "()I",
+            (void*) nfcManager_getDefaultAidPowerState},
+
+    {"getDefaultDesfirePowerState", "()I",
+            (void*) nfcManager_getDefaultDesfirePowerState},
+
+    {"getDefaultMifareCLTPowerState", "()I",
+            (void*) nfcManager_getDefaultMifareCLTPowerState},
+#endif
     {"doEnableDiscovery", "(IZZZZZ)V",
             (void*) nfcManager_enableDiscovery},
 
@@ -4109,10 +4156,10 @@
             (void *)nfcManager_doJcosDownload},
     {"doCommitRouting", "()V",
             (void *)nfcManager_doCommitRouting},
-
-    {"doSetVenConfigValue", "(I)V",
-            (void *)nfcManager_doSetVenConfigValue},
-
+#if(NXP_EXTNS == TRUE)
+    {"doSetNfcMode", "(I)V",
+            (void *)nfcManager_doSetNfcMode},
+#endif
     {"doGetSecureElementTechList", "()I",
             (void *)nfcManager_getSecureElementTechList},
 
@@ -4228,7 +4275,7 @@
     status  = isStart ? NFA_StartRfDiscovery () : NFA_StopRfDiscovery ();
     if (status == NFA_STATUS_OK)
     {
-        if(gGeneralPowershutDown == VEN_CFG_NFC_OFF_POWER_OFF)
+        if(gGeneralPowershutDown == NFC_MODE_OFF)
             sDiscCmdwhleNfcOff = true;
         sNfaEnableDisablePollingEvent.wait (); //wait for NFA_RF_DISCOVERY_xxxx_EVT
         sRfEnabled = isStart;
@@ -4238,6 +4285,7 @@
     {
         ALOGE ("%s: Failed to start/stop RF discovery; error=0x%X", __FUNCTION__, status);
     }
+    ALOGD ("%s: is exit=%d", __FUNCTION__, isStart);
 }
 
 /*******************************************************************************
@@ -4554,17 +4602,22 @@
     ALOGD ("%s: exit", __FUNCTION__);
 
 }
-
-static void nfcManager_doSetVenConfigValue(JNIEnv *e, jobject o, jint venconfig)
+#if(NXP_EXTNS == TRUE)
+static void nfcManager_doSetNfcMode(JNIEnv *e, jobject o, jint nfcMode)
 {
     /* Store the shutdown state */
-    gGeneralPowershutDown = venconfig;
+    gGeneralPowershutDown = nfcMode;
 }
-
+#endif
 bool isDiscoveryStarted()
 {
     return sRfEnabled;
 }
+
+bool isNfcInitializationDone()
+{
+    return sIsNfaEnabled;
+}
 /*******************************************************************************
 **
 ** Function:        StoreScreenState
@@ -4593,6 +4646,23 @@
 {
     return screenstate;
 }
+
+#if((NFC_NXP_ESE == TRUE) && (NFC_NXP_CHIP_TYPE == PN548C2))
+/*******************************************************************************
+**
+** Function:        isp2pActivated
+**
+** Description:     returns p2pActive state
+**
+** Returns:         bool
+**
+*******************************************************************************/
+bool isp2pActivated()
+{
+    return sP2pActive;
+}
+#endif
+
 /*******************************************************************************
 **
 ** Function:        nfcManager_doSetScreenState
@@ -4718,12 +4788,49 @@
 *******************************************************************************/
 static void nfcManager_doSetScreenOrPowerState (JNIEnv* e, jobject o, jint state)
 {
+    tNFA_STATUS stat = NFA_STATUS_OK;
     if (state <= NFA_SCREEN_STATE_UNLOCKED ) // SCREEN_STATE
         nfcManager_doSetScreenState(e, o, state);
-    else if (state == VEN_POWER_STATE_ON ) // POWER_STATE_ON
-        nfcManager_doSetVenConfigValue(e , o, VEN_CFG_NFC_ON_POWER_ON);
-    else if (state == VEN_POWER_STATE_OFF ) // POWER_STATE_OFF
-        nfcManager_doSetVenConfigValue(e , o, VEN_CFG_NFC_OFF_POWER_OFF);
+    else if (state == VEN_POWER_STATE_ON) // POWER_ON NFC_OFF
+    {
+        nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
+    }
+    else if (state == VEN_POWER_STATE_OFF) // POWER_OFF
+    {
+        if(sIsNfaEnabled)
+        {
+            if (sRfEnabled)
+            {
+                // Stop RF discovery to reconfigure
+                startRfDiscovery(false);
+            }
+            ALOGE ("%s: NfaEnabled", __FUNCTION__);
+            nfcManager_doSetNfcMode(e , o, NFC_MODE_ON);
+            SetVenConfigValue(NFC_MODE_ON);
+            if (stat != NFA_STATUS_OK)
+            {
+                ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+            }
+        }
+        else
+        {
+            ALOGE ("%s: NfaDisabled", __FUNCTION__);
+            if(nfcManager_doPartialInitialize() == true)
+            {
+                nfcManager_doSetNfcMode(e , o, NFC_MODE_OFF);
+                stat = SetVenConfigValue(NFC_MODE_OFF);
+                if (stat != NFA_STATUS_OK)
+                {
+                    ALOGE ("%s: fail enable SetVenConfigValue; error=0x%X", __FUNCTION__, stat);
+                }
+            }
+
+            if(gsNfaPartialEnabled)
+            {
+                nfcManager_doPartialDeInitialize();
+            }
+        }
+    }
     else
         ALOGE ("%s: unknown screen or power state. state=%d", __FUNCTION__, state);
 }
@@ -4912,9 +5019,6 @@
             ALOGD("ACTIVATED_EVT setting flag");
             transaction_data.current_transcation_state = NFA_TRANS_ACTIVATED_EVT;
             set_transcation_stat(true);
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-            nfcManagerEnableAGCDebug(connEvent);
-#endif
         }else{
 //            ALOGD("other event clearing flag ");
 //            memset(&transaction_data, 0x00, sizeof(Transcation_Check_t));
@@ -4924,9 +5028,6 @@
         if (transaction_data.current_transcation_state == NFA_TRANS_DEFAULT
             || transaction_data.current_transcation_state == NFA_TRANS_ACTIVATED_EVT)
         {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-            nfcManagerEnableAGCDebug(connEvent);
-#endif
             if(getScreenState() == NFA_SCREEN_STATE_OFF)
             {
                 if (!sP2pActive && eventDM_Conn_data->rf_field.status == NFA_STATUS_OK)
@@ -4949,9 +5050,6 @@
     case NFA_TRANS_CE_ACTIVATED:
         if (transaction_data.current_transcation_state == NFA_TRANS_DEFAULT || transaction_data.current_transcation_state == NFA_TRANS_ACTIVATED_EVT)
             {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-            nfcManagerEnableAGCDebug(connEvent);
-#endif
             if(getScreenState() == NFA_SCREEN_STATE_OFF)
             {
                 if (!sP2pActive && eventDM_Conn_data->rf_field.status == NFA_STATUS_OK)
@@ -4993,7 +5091,7 @@
                 eventDM_Conn_data->rf_field.rf_field_status == 1)
         {
 #if (NFC_NXP_CHIP_TYPE == PN548C2)
-            set_AGC_process_state(true);
+            nfcManagerEnableAGCDebug(connEvent);
 #endif
             transaction_data.current_transcation_state = NFA_TRANS_DM_RF_FIELD_EVT_ON;
             ALOGD("Payment is in progress hold the screen on/off request ");
@@ -5442,7 +5540,7 @@
         }
 
     }
-
+    RoutingManager::getInstance().handleSERemovedNtf();
 sCheckNfceeFlag = 0;
 
 }
@@ -5722,6 +5820,102 @@
     ALOGD ("%s: exit; status =0x%X", __FUNCTION__,status);
     return status;
 }
+
+
+/*******************************************************************************
+ **
+ ** Function:       nfcManager_doPartialInitialize
+ **
+ ** Description:    Initializes the NFC partially if it is not initialized.
+ **                 This will be required  for transceive  during NFC off.
+ **
+ **
+ ** Returns:        true/false .
+ **
+ *******************************************************************************/
+static bool nfcManager_doPartialInitialize ()
+{
+
+    ALOGD("%s enter", __FUNCTION__);
+    tNFA_STATUS stat = NFA_STATUS_OK;
+    if (sIsNfaEnabled || gsNfaPartialEnabled)
+    {
+        ALOGD ("%s: NFC already enabled", __FUNCTION__);
+        return true;
+    }
+    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+    theInstance.MinInitialize();
+
+    tHAL_NFC_ENTRY* halFuncEntries = theInstance.GetHalEntryFuncs ();
+    ALOGD("%s: calling nfa init", __FUNCTION__);
+    if(NULL == halFuncEntries)
+    {
+        theInstance.Finalize();
+        gsNfaPartialEnabled = false;
+        return false;
+    }
+
+    NFA_SetBootMode(NFA_FAST_BOOT_MODE);
+    NFA_Init (halFuncEntries);
+    ALOGD("%s: calling enable", __FUNCTION__);
+    stat = NFA_Enable (nfaDeviceManagementCallback, nfaConnectionCallback);
+    if (stat == NFA_STATUS_OK)
+    {
+        SyncEventGuard guard (sNfaEnableEvent);
+        sNfaEnableEvent.wait(); //wait for NFA command to finish
+    }
+
+    if (sIsNfaEnabled)
+    {
+        gsNfaPartialEnabled = true;
+        sIsNfaEnabled = false;
+    }
+    else
+    {
+        NFA_Disable (FALSE /* ungraceful */);
+        theInstance.Finalize();
+        gsNfaPartialEnabled = false;
+    }
+
+    ALOGD("%s exit status = 0x%x",  __FUNCTION__ ,gsNfaPartialEnabled);
+    return gsNfaPartialEnabled;
+}
+/*******************************************************************************
+ **
+ ** Function:       nfcManager_doPartialDeInitialize
+ **
+ ** Description:    DeInitializes the NFC partially if it is partially initialized.
+ **
+ ** Returns:        true/false .
+ **
+ *******************************************************************************/
+static bool nfcManager_doPartialDeInitialize()
+{
+    tNFA_STATUS stat = NFA_STATUS_OK;
+    if(!gsNfaPartialEnabled)
+    {
+        ALOGD ("%s: cannot deinitialize NFC , not partially initilaized", __FUNCTION__);
+        return true;
+    }
+    ALOGD ("%s:enter", __FUNCTION__);
+    stat = NFA_Disable (TRUE /* graceful */);
+    if (stat == NFA_STATUS_OK)
+    {
+        ALOGD ("%s: wait for completion", __FUNCTION__);
+        SyncEventGuard guard (sNfaDisableEvent);
+        sNfaDisableEvent.wait (); //wait for NFA command to finish
+    }
+    else
+    {
+        ALOGE ("%s: fail disable; error=0x%X", __FUNCTION__, stat);
+    }
+    NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+    theInstance.Finalize();
+    NFA_SetBootMode(NFA_NORMAL_BOOT_MODE);
+    gsNfaPartialEnabled = false;
+    return true;
+}
+
 /**********************************************************************************
  **
  ** Function:        nfcManager_getFwVersion
@@ -5847,28 +6041,21 @@
         ALOGD ("%s AGCDebug not enabled", __FUNCTION__);
         return;
     }
-    switch(connEvent)
+    if(connEvent == NFA_TRANS_DM_RF_FIELD_EVT &&
+       menableAGC_debug_t.AGCdebugstarted == false)
     {
-        case NFA_ACTIVATED_EVT:
-        case NFA_EE_ACTION_EVT:
-        case NFA_TRANS_CE_ACTIVATED:
-            if(menableAGC_debug_t.AGCdebugstarted == false)
-            {
-                pthread_t agcThread;
-                pthread_attr_t attr;
-                pthread_attr_init(&attr);
-                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-                retvalue = pthread_create(&agcThread, &attr, enableAGCThread, NULL);
-                pthread_attr_destroy(&attr);
-                if(retvalue == 0)
-                {
-                    menableAGC_debug_t.AGCdebugstarted = true;
-                    set_AGC_process_state(true);
-                }
-            }
-            break;
+        pthread_t agcThread;
+        pthread_attr_t attr;
+        pthread_attr_init(&attr);
+        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+        retvalue = pthread_create(&agcThread, &attr, enableAGCThread, NULL);
+        pthread_attr_destroy(&attr);
+        if(retvalue == 0)
+        {
+            menableAGC_debug_t.AGCdebugstarted = true;
+            set_AGC_process_state(true);
+        }
     }
-
 }
 
 void *enableAGCThread(void *arg)
diff --git a/nci/jni/NativeNfcTag.cpp b/nci/jni/NativeNfcTag.cpp
index cdbf4a6..4771ac9 100644
--- a/nci/jni/NativeNfcTag.cpp
+++ b/nci/jni/NativeNfcTag.cpp
@@ -873,13 +873,13 @@
         goto TheEnd;
     }
 #if(NXP_EXTNS == TRUE)
+    sCurrentConnectedHandle = targetHandle;
     if(natTag.mTechLibNfcTypes[i] == NFC_PROTOCOL_T3BT)
     {
         goto TheEnd;
     }
 #endif
     sCurrentConnectedTargetType = natTag.mTechList[i];
-    sCurrentConnectedHandle = targetHandle;
     if (natTag.mTechLibNfcTypes[i] != NFC_PROTOCOL_ISO_DEP)
     {
         ALOGD ("%s() Nfc type = %d, do nothing for non ISO_DEP", __FUNCTION__, natTag.mTechLibNfcTypes[i]);
@@ -945,7 +945,9 @@
 
     tNFA_STATUS status;
     int rVal = 1;
-
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+    unsigned char retry_cnt = 1;
+#endif
     do
     {
         //if tag has shutdown, abort this method
@@ -955,7 +957,10 @@
             rVal = STATUS_CODE_TARGET_LOST;
             break;
         }
-
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+        if(!retry_cnt && (natTag.mTechLibNfcTypes[handle] != NFA_PROTOCOL_MIFARE))
+            NfcTag::getInstance ().mCashbeeDetected = true;
+#endif
         {
             SyncEventGuard g (sReconnectEvent);
             gIsTagDeactivating = true;
@@ -1024,7 +1029,13 @@
             {
                 ALOGD ("%s: tag is not in sleep", __FUNCTION__);
                 rVal = STATUS_CODE_TARGET_LOST;
-                break;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+                if(!retry_cnt)
+#endif
+                    break;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+                else continue;
+#endif
             }
         }
         else
@@ -1065,10 +1076,19 @@
             if (sReconnectEvent.wait (1000) == false) //if timeout occured
             {
                 ALOGE ("%s: timeout waiting for select", __FUNCTION__);
-                status = NFA_Deactivate (FALSE);
-                if (status != NFA_STATUS_OK)
-                    ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, status);
+#if(NXP_EXTNS == TRUE)
+                if (!(NfcTag::getInstance ().isCashBeeActivated() == true || NfcTag::getInstance ().isEzLinkTagActivated() == true
+        #if(NFC_NXP_NON_STD_CARD == TRUE)
+                   || sNonNciCard_t.chinaTransp_Card == true
+        #endif
+                ))
+                {
+                    status = NFA_Deactivate (FALSE);
+                    if (status != NFA_STATUS_OK)
+                        ALOGE ("%s: deactivate failed; error=0x%X", __FUNCTION__, status);
+                }
                 break;
+#endif
             }
         }
 
@@ -1077,23 +1097,39 @@
         {
             ALOGD("%s: tag is not active", __FUNCTION__);
             rVal = STATUS_CODE_TARGET_LOST;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+            if(!retry_cnt)
+#endif
             break;
         }
         if(NfcTag::getInstance ().isEzLinkTagActivated() == true)
         {
             NfcTag::getInstance ().mEzLinkTypeTag = false;
         }
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+        if(NfcTag::getInstance ().isCashBeeActivated() == true)
+        {
+            NfcTag::getInstance ().mCashbeeDetected = false;
+        }
+#endif
         if (sConnectOk)
         {
             rVal = 0;   // success
             sCurrentRfInterface = rfInterface;
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+            break;
+#endif
         }
         else
         {
             rVal = 1;
         }
-    } while (0);
-
+    }
+#if(NFC_NXP_NON_STD_CARD == TRUE)
+    while (retry_cnt--);
+#else
+    while(0);
+#endif
     setReconnectState(false);
     NFA_SetReconnectState(FALSE);
     sConnectWaitingForComplete = JNI_FALSE;
@@ -1943,29 +1979,6 @@
     {
         sSwitchBackTimer.kill ();
     }
-
-    // Special case for Kovio.  The deactivation would have already occurred
-    // but was ignored so that normal tag opertions could complete.  Now we
-    // want to process as if the deactivate just happened.
-    if (NfcTag::getInstance ().mTechList [handle] == TARGET_TYPE_KOVIO_BARCODE)
-    {
-        ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__);
-        tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE};
-        {
-            SyncEventGuard g (gDeactivatedEvent);
-            gActivated = false; //guard this variable from multi-threaded access
-            gDeactivatedEvent.notifyOne ();
-        }
-
-        NfcTag::getInstance().setDeactivationState (deactivated);
-        nativeNfcTag_resetPresenceCheck();
-        NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL);
-        nativeNfcTag_abortWaits();
-        NfcTag::getInstance().abort ();
-
-        return JNI_FALSE;
-    }
-
     if (nfcManager_isNfcActive() == false)
     {
         ALOGD ("%s: NFC is no longer active.", __FUNCTION__);
@@ -1986,6 +1999,39 @@
         return JNI_FALSE;
     }
 
+    /*Presence check for Kovio - RF Deactive command with type Discovery*/
+    ALOGD ("%s: handle=%d", __FUNCTION__, handle);
+    if (NfcTag::getInstance ().mTechList [handle] == TARGET_TYPE_KOVIO_BARCODE)
+    {
+        SyncEventGuard guard (sPresenceCheckEvent);
+        status = NFA_RwPresenceCheck (NfcTag::getInstance().getPresenceCheckAlgorithm());
+        if (status == NFA_STATUS_OK)
+        {
+            sPresenceCheckEvent.wait ();
+            isPresent = sIsTagPresent ? JNI_TRUE : JNI_FALSE;
+        }
+        if (isPresent == JNI_FALSE)
+            ALOGD ("%s: tag absent", __FUNCTION__);
+        return isPresent;
+#if 0
+        ALOGD ("%s: Kovio, force deactivate handling", __FUNCTION__);
+        tNFA_DEACTIVATED deactivated = {NFA_DEACTIVATE_TYPE_IDLE};
+        {
+            SyncEventGuard g (gDeactivatedEvent);
+            gActivated = false; //guard this variable from multi-threaded access
+            gDeactivatedEvent.notifyOne ();
+        }
+
+        NfcTag::getInstance().setDeactivationState (deactivated);
+        nativeNfcTag_resetPresenceCheck();
+        NfcTag::getInstance().connectionEventHandler (NFA_DEACTIVATED_EVT, NULL);
+        nativeNfcTag_abortWaits();
+        NfcTag::getInstance().abort ();
+
+        return JNI_FALSE;
+#endif
+    }
+
     /*
      * This fix is made because NFA_RwPresenceCheck cmd is not woking for ISO-DEP in CEFH mode
      * Hence used the Properitary presence check cmd
@@ -2113,7 +2159,7 @@
 **
 ** Description:     Can tag be formatted to store NDEF message?
 **                  e: JVM environment.
-**                  o: Java object.�
+**                  o: Java object.
 **                  libNfcType: Type of tag.
 **                  uidBytes: Tag's unique ID.
 **                  pollBytes: Data from activation.
@@ -2275,7 +2321,7 @@
 
         sem_init (&sFormatSem, 0, 0);
 
-        status |= nativeNfcTag_doReconnect (e, o);
+        status = nativeNfcTag_doReconnect (e, o);
         ALOGD ("Format with Second Key");
         status |= EXTNS_MfcFormatTag(key2,sizeof(key2));
         if (status == NFA_STATUS_OK)
diff --git a/nci/jni/NativeNxpFeature.cpp b/nci/jni/NativeNxpFeature.cpp
index e7615f9..8213663 100644
--- a/nci/jni/NativeNxpFeature.cpp
+++ b/nci/jni/NativeNxpFeature.cpp
@@ -484,17 +484,17 @@
  ** Returns:         success/failure
  **
  *******************************************************************************/
-tNFA_STATUS SetVenConfigValue(jint venconfig)
+tNFA_STATUS SetVenConfigValue(jint nfcMode)
 {
     tNFA_STATUS status = NFA_STATUS_FAILED;
     uint8_t cmd_buf[] = {0x20, 0x02, 0x05, 0x01, 0xA0, 0x07, 0x01, 0x03};
     ALOGD("%s: enter", __FUNCTION__);
-    if(venconfig == VEN_CFG_NFC_OFF_POWER_OFF)
+    if(nfcMode == NFC_MODE_OFF)
     {
         ALOGD("Setting the VEN_CFG to 2, Disable ESE events");
         cmd_buf[7] = 0x02;
     }
-    else if(venconfig == VEN_CFG_NFC_ON_POWER_ON)
+    else if(nfcMode == NFC_MODE_ON)
     {
         ALOGD("Setting the VEN_CFG to 3, Make ");
         cmd_buf[7] = 0x03;
diff --git a/nci/jni/NativeSecureElement.cpp b/nci/jni/NativeSecureElement.cpp
index 7796f17..6664995 100644
--- a/nci/jni/NativeSecureElement.cpp
+++ b/nci/jni/NativeSecureElement.cpp
@@ -37,6 +37,7 @@
 #include "JavaClassConstants.h"
 #include "PowerSwitch.h"
 #include "NfcTag.h"
+#include "RoutingManager.h"
 #include <ScopedPrimitiveArray.h>
 
 extern bool hold_the_transceive;
@@ -71,7 +72,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;
 /*******************************************************************************
 **
 ** Function:        nativeNfcSecureElement_doOpenSecureElementConnection
@@ -88,7 +89,7 @@
     ALOGD("%s: enter", __FUNCTION__);
     bool stat = false;
     jint secElemHandle = EE_ERROR_INIT;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     long ret_val = -1;
     NFCSTATUS status = NFCSTATUS_FAILED;
     p61_access_state_t p61_current_state = P61_STATE_INVALID;
@@ -99,6 +100,11 @@
         goto TheEnd;
     }
 #if (NFC_NXP_ESE ==  TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+    if((RoutingManager::getInstance().is_ee_recovery_ongoing()))
+    {
+        ALOGD ("ee recovery ongoing!!!");
+        goto TheEnd;
+    }
     stat = se.isWiredModeAllowedInRfState();
     if(stat == false)
     {
@@ -120,7 +126,7 @@
     }
 #endif
 
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     ret_val = NFC_GetP61Status ((void *)&p61_current_state);
     if (ret_val < 0)
     {
@@ -157,6 +163,7 @@
         }
         else
         {
+            is_wired_mode_open = true;
             ALOGD("SE Access granted");
         }
     }
@@ -199,10 +206,6 @@
 
     if (stat)
     {
-        se.SecEle_Modeset(0x00);
-        usleep(10*1000);
-        se.SecEle_Modeset(0x01);
-        usleep(10*1000);
         //establish a pipe to sec elem
         stat = se.connectEE();
         if (stat)
@@ -244,7 +247,7 @@
 {
     ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle);
     bool stat = false;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     long ret_val = -1;
     NFCSTATUS status = NFCSTATUS_FAILED;
 #endif
@@ -278,7 +281,7 @@
 
     //if controller is not routing AND there is no pipe connected,
     //then turn off the sec elem
-#if(NFC_NXP_ESE == TRUE && NFC_NXP_CHIP_TYPE != PN547C2)
+#if(NFC_NXP_ESE == TRUE)
 //Do Nothing
 #else
     if (! SecureElement::getInstance().isBusy())
@@ -287,7 +290,7 @@
     //if nothing is active after this, then tell the controller to power down
     if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::SE_CONNECTED))
         PowerSwitch::getInstance ().setLevel (PowerSwitch::LOW_POWER);
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     ret_val = NFC_RelWiredAccess ((void *)&status);
     if (ret_val < 0)
     {
@@ -301,16 +304,40 @@
             ALOGD("Denying SE close due to SE is not being released by Pn54x driver");
             stat = false;
         }
+        is_wired_mode_open = false;
     }
 #endif
 TheEnd:
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     ALOGD("%s: exit stat = %d", __FUNCTION__, stat);
 #else
     ALOGD("%s: exit", __FUNCTION__);
 #endif
     return stat ? JNI_TRUE : JNI_FALSE;
 }
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+static int checkP61Status(void)
+{
+    jint ret_val = -1;
+    p61_access_state_t p61_current_state = P61_STATE_INVALID;
+    ret_val = NFC_GetP61Status ((void *)&p61_current_state);
+    if (ret_val < 0)
+    {
+        ALOGD("NFC_GetP61Status failed");
+        return -1;
+    }
+    if(p61_current_state & (P61_STATE_SPI)||(p61_current_state & (P61_STATE_SPI_PRIO)))
+    {
+        ALOGD("No gpio change");
+        ret_val = 0;
+    }
+    else
+    {
+        ret_val = -1;
+    }
+    return ret_val;
+}
+#endif
 /*******************************************************************************
 **
 ** Function:        nativeNfcSecureElement_doResetSecureElement
@@ -329,10 +356,24 @@
 #if (NFC_NXP_ESE == TRUE)
     SecureElement &se = SecureElement::getInstance();
     ALOGD("%s: enter; handle=0x%04x", __FUNCTION__, handle);
+    if(!is_wired_mode_open)
+    {
+        ALOGD("wired mode is not open");
+        return stat;
+    }
 
     stat = se.SecEle_Modeset(0x00);
+    if (handle == 0x4C0)
+    {
+        if(checkP61Status())
+            se.NfccStandByOperation(STANDBY_GPIO_LOW);
+    }
     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);
 
@@ -396,17 +437,22 @@
     INT32 recvBufferActualSize = 0;
 
     ScopedByteArrayRW bytes(e, data);
+#if(NXP_EXTNS == TRUE)
     ALOGD("%s: enter; handle=0x%X; buf len=%zu", __FUNCTION__, handle, bytes.size());
     SecureElement::getInstance().transceive(reinterpret_cast<UINT8*>(&bytes[0]), bytes.size(), recvBuffer, recvBufferMaxSize, recvBufferActualSize, gGeneralTransceiveTimeout);
 
-     //copy results back to java
-     jbyteArray result = e->NewByteArray(recvBufferActualSize);
-     if (result != NULL)
-     {
-         e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer);
-     }
-     ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize);
-     return result;
+    //copy results back to java
+    jbyteArray result = e->NewByteArray(recvBufferActualSize);
+    if (result != NULL)
+         {
+        e->SetByteArrayRegion(result, 0, recvBufferActualSize, (jbyte *) recvBuffer);
+         }
+    ALOGD("%s: exit: recv len=%ld", __FUNCTION__, recvBufferActualSize);
+    return result;
+#else
+    jbyteArray result = e->NewByteArray(0);
+    return result;
+#endif
 }
 
 /*****************************************************************************
diff --git a/nci/jni/NfcJniUtil.h b/nci/jni/NfcJniUtil.h
index a7421eb..ad370db 100644
--- a/nci/jni/NfcJniUtil.h
+++ b/nci/jni/NfcJniUtil.h
@@ -93,6 +93,8 @@
 #if(NXP_EXTNS == TRUE)
 #define VEN_POWER_STATE_ON                   6
 #define VEN_POWER_STATE_OFF                  7
+// ESE Suppored Technologies
+#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
@@ -110,14 +112,8 @@
 #define TARGET_TYPE_ISO14443_4B           12
 
 /* Setting VEN_CFG  */
-#define VEN_CFG_NFC_ON_POWER_ON           3
-#define VEN_CFG_NFC_OFF_POWER_OFF         2
-
-#if(NXP_EXTNS == TRUE)
-// ESE Suppored Technologies
-#define TARGET_TYPE_ISO14443_3A_3B        11
-#endif
-
+#define NFC_MODE_ON           3
+#define NFC_MODE_OFF          2
 
 //define a few NXP error codes that NFC service expects;
 //see external/libnfc-nxp/src/phLibNfcStatus.h;
diff --git a/nci/jni/NfcTag.cpp b/nci/jni/NfcTag.cpp
index 1c02acd..acfa464 100644
--- a/nci/jni/NfcTag.cpp
+++ b/nci/jni/NfcTag.cpp
@@ -41,18 +41,20 @@
 #include "config.h"
 #include <ScopedLocalRef.h>
 #include <ScopedPrimitiveArray.h>
-
+#include "IntervalTimer.h"
 extern "C"
 {
     #include "rw_int.h"
     #include "phNxpExtns.h"
 }
-
+#if(NXP_EXTNS == TRUE)
 static void deleteglobaldata(JNIEnv* e);
+static void selectCompleteCallBack(union sigval);
 static jobjectArray techActBytes1;
 int selectedId = 0;
 static jobjectArray techPollBytes2;
-
+IntervalTimer gSelectCompleteTimer;
+#endif
 /*******************************************************************************
 **
 ** Function:        NfcTag
@@ -81,6 +83,9 @@
     mIsFelicaLite(false),
     mCashbeeDetected(false),
     mEzLinkTypeTag(false)
+#if(NXP_EXTNS == TRUE)
+    ,mWaitingForSelect(false)
+#endif
 {
     memset (mTechList, 0, sizeof(mTechList));
     memset (mTechHandles, 0, sizeof(mTechHandles));
@@ -1380,6 +1385,14 @@
         tNFA_STATUS stat = NFA_Select (rfDiscoveryId, NFA_PROTOCOL_NFC_DEP, NFA_INTERFACE_NFC_DEP);
         if (stat != NFA_STATUS_OK)
             ALOGE ("%s: fail select P2P; error=0x%X", fn, stat);
+#if(NXP_EXTNS == TRUE)
+        else
+        {
+            mWaitingForSelect = true;
+            ALOGE ("%s: starting timer", fn);
+            gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+        }
+#endif
     }
     else
         ALOGE ("%s: cannot find P2P", fn);
@@ -1409,6 +1422,9 @@
     mIsDynamicTagId = false;
     mIsFelicaLite = false;
     resetAllTransceiveTimeouts ();
+#if(NXP_EXTNS == TRUE)
+    mNumDiscNtf = 0;
+#endif
 }
 
 
@@ -1457,6 +1473,14 @@
         tNFA_STATUS stat = NFA_Select (mTechHandles [foundIdx], mTechLibNfcTypes [foundIdx], rf_intf);
         if (stat != NFA_STATUS_OK)
             ALOGE ("%s: fail select; error=0x%X", fn, stat);
+#if(NXP_EXTNS == TRUE)
+        else
+        {
+            mWaitingForSelect = true;
+            gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+            ALOGE ("%s:starting timer", fn);
+        }
+#endif
     }
     else
         ALOGE ("%s: only found NFC-DEP technology.", fn);
@@ -1538,6 +1562,13 @@
         if (stat == NFA_STATUS_OK)
         {
             ALOGE ("%s: stat=%x; wait for activated ntf", fn, stat);
+#if(NXP_EXTNS == TRUE)
+            {
+                mWaitingForSelect = true;
+                ALOGE ("%s:starting timer", fn);
+                gSelectCompleteTimer.set(1000, selectCompleteCallBack);
+            }
+#endif
         }
         else
             ALOGE ("%s: fail select; error=0x%X", fn, stat);
@@ -2068,3 +2099,44 @@
     *len = 0;
     *uid = NULL;
 }
+#if(NXP_EXTNS == TRUE)
+/*******************************************************************************
+**
+** Function:        selectCompleteStatus
+**
+** Description:     Notify whether tag select is success/failure
+**
+** Returns:         None
+**
+*******************************************************************************/
+void NfcTag::selectCompleteStatus(bool status)
+{
+
+    if(mWaitingForSelect == true)
+    {
+        ALOGD ("selectCompleteStatus=%u", status);
+        gSelectCompleteTimer.kill();
+        mWaitingForSelect = false;
+    }
+}
+
+/*******************************************************************************
+**
+** Function:        selectCompleteCallBack
+**
+** Description:     CallBack called when tag select is timed out.
+**
+** Returns:         None
+**
+*******************************************************************************/
+void selectCompleteCallBack(union sigval)
+{
+
+    if(NfcTag::getInstance().mWaitingForSelect == true)
+    {
+        ALOGD ("selectCompleteCallBack");
+        NfcTag::getInstance().mWaitingForSelect = false;
+        NFA_Deactivate (FALSE);
+    }
+}
+#endif
diff --git a/nci/jni/NfcTag.h b/nci/jni/NfcTag.h
index 9a7d22d..baf7e66 100644
--- a/nci/jni/NfcTag.h
+++ b/nci/jni/NfcTag.h
@@ -66,6 +66,9 @@
     bool mCashbeeDetected;
     bool mEzLinkTypeTag;
     activationParams_t mActivationParams_t;
+#if(NXP_EXTNS == TRUE)
+    bool mWaitingForSelect;
+#endif
    /*******************************************************************************
     **
     ** Function:        NfcTag
@@ -485,7 +488,18 @@
     **
     *******************************************************************************/
     void storeActivationParams();
-
+#if(NXP_EXTNS == TRUE)
+    /*******************************************************************************
+    **
+    ** Function:        selectCompleteStatus
+    **
+    ** Description:     Notify whether tag select is success/failure
+    **
+    ** Returns:         None
+    **
+    *******************************************************************************/
+    void selectCompleteStatus(bool status);
+#endif
 private:
     std::vector<int> mTechnologyTimeoutsTable;
     std::vector<int> mTechnologyDefaultTimeoutsTable;
@@ -673,4 +687,5 @@
     **
     *******************************************************************************/
     void calculateT1tMaxMessageSize (tNFA_ACTIVATED& activate);
+
 };
diff --git a/nci/jni/PeerToPeer.cpp b/nci/jni/PeerToPeer.cpp
index fe8dd39..2b0a217 100644
--- a/nci/jni/PeerToPeer.cpp
+++ b/nci/jni/PeerToPeer.cpp
@@ -538,7 +538,7 @@
      * conditional check is added to avoid multiple dicovery cmds
      * at the time of NFC OFF in progress
      */
-    if((gGeneralPowershutDown != VEN_CFG_NFC_OFF_POWER_OFF) && isDiscStopped == true)
+    if((gGeneralPowershutDown != NFC_MODE_OFF) && isDiscStopped == true)
     {
         startRfDiscovery(true);
     }
diff --git a/nci/jni/Pn544Interop.cpp b/nci/jni/Pn544Interop.cpp
index 2699885..bb589d9 100644
--- a/nci/jni/Pn544Interop.cpp
+++ b/nci/jni/Pn544Interop.cpp
@@ -29,6 +29,8 @@
 namespace android
 {
     extern void startStopPolling (bool isStartPolling);
+    extern void releaseRfInterfaceMutexLock();
+    extern void acquireRfInterfaceMutexLock();
 }
 
 
@@ -84,6 +86,7 @@
 void pn544InteropStartPolling (union sigval)
 {
     ALOGD ("%s: enter", __FUNCTION__);
+    android::acquireRfInterfaceMutexLock();
     gMutex.lock ();
     NfcTag::ActivationState state = NfcTag::getInstance ().getActivationState ();
 
@@ -108,6 +111,7 @@
 
 TheEnd:
     gMutex.unlock ();
+    android::releaseRfInterfaceMutexLock();
     ALOGD ("%s: exit", __FUNCTION__);
 }
 
diff --git a/nci/jni/RouteDataSet.cpp b/nci/jni/RouteDataSet.cpp
index 6b73ed8..d677397 100644
--- a/nci/jni/RouteDataSet.cpp
+++ b/nci/jni/RouteDataSet.cpp
@@ -42,7 +42,7 @@
 #include <errno.h>
 #include <sys/stat.h>
 
-extern char bcm_nfc_location_jni[];
+extern char bcm_nfc_location[];
 
 
 /*******************************************************************************
@@ -273,7 +273,7 @@
     FILE* fh = NULL;
     size_t actualWritten = 0;
     bool retval = false;
-    std::string filename (bcm_nfc_location_jni);
+    std::string filename (bcm_nfc_location);
     int stat = 0;
 
     filename.append (sConfigFile);
@@ -316,7 +316,7 @@
     FILE* fh = NULL;
     size_t actual = 0;
     char buffer [1024];
-    std::string filename (bcm_nfc_location_jni);
+    std::string filename (bcm_nfc_location);
 
     filename.append (sConfigFile);
     fh = fopen (filename.c_str (), "r");
@@ -496,7 +496,7 @@
 bool RouteDataSet::deleteFile ()
 {
     static const char fn [] = "RouteDataSet::deleteFile";
-    std::string filename (bcm_nfc_location_jni);
+    std::string filename (bcm_nfc_location);
     filename.append (sConfigFile);
     int stat = remove (filename.c_str());
     ALOGD ("%s: exit %u", fn, stat==0);
diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp
index 5b648d8..5379631 100644
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -49,10 +49,7 @@
 #include "nfc_api.h"
 #include "nfa_api.h"
 }
-#endif
-extern bool sHCEEnabled;
 
-#if (NXP_EXTNS == TRUE)
 extern INT32 gSeDiscoverycount;
 extern SyncEvent gNfceeDiscCbEvent;
 extern INT32 gActualSeCount;
@@ -61,6 +58,7 @@
 int gEseVirtualWiredProtectMask = 0;
 int gWiredModeRfFieldEnable = 0;
 #endif
+extern bool sHCEEnabled;
 
 const JNINativeMethod RoutingManager::sMethods [] =
 {
@@ -85,6 +83,7 @@
     extern  void  checkforTranscation(UINT8 connEvent, void* eventData );
 #if (NXP_EXTNS == TRUE)
     extern UINT16 sRoutingBuffLen;
+    extern bool isNfcInitializationDone();
     extern void startRfDiscovery (bool isStart);
     extern bool isDiscoveryStarted();
     extern int getScreenState();
@@ -564,7 +563,7 @@
 
     tNFA_STATUS nfaStat;
     static const char fn [] = "RoutingManager::setDefaultRoute";   /*commented to eliminate unused variable warning*/
-    unsigned long uiccListenTech = 0;
+    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;
@@ -582,18 +581,18 @@
        uiccListenTech = NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B;
 
        ALOGD ("%s: enter, defaultRoute:%x protoRoute:0x%x TechRoute:0x%x ", fn, defaultRoute, protoRoute, techRoute);
-       defaultSeID = (((defaultRoute & 0x18) >> 3) == 0x00)  ? 0x400 :  ((((defaultRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultPowerstate=defaultRoute & 0x07;
+       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 & 0x18) >> 3) == 0x00)  ? 0x400 :  ((((protoRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultProtoPowerstate = protoRoute & 0x07;
+       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 & 0x18) >> 3) == 0x00)  ? 0x400 :  ((((techRoute & 0x18)>>3 )== 0x01 ) ? 0x4C0 : 0x402);
-       defaultTechAPowerstate = techRoute & 0x07;
-       DefaultTechType = (techRoute & 0x20) >> 5;
+       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);
 
@@ -604,6 +603,16 @@
            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];
@@ -611,40 +620,41 @@
 
            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;
-                }
-            }
+               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;
-                }
+               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;
+               }
            }
-       }
 
-       if(!isDefaultProtoSeIDPresent)
-       {
-            defaultProtoSeID = 0x400;
-            defaultProtoPowerstate = 0x01;
+
+           if(!isDefaultProtoSeIDPresent)
+           {
+               defaultProtoSeID = 0x400;
+               defaultProtoPowerstate = 0x01;
+           }
+           ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent);
        }
-       ALOGD ("%s: enter, isDefaultProtoSeIDPresent:%x", fn, isDefaultProtoSeIDPresent);
 
        if( defaultProtoSeID == defaultSeID)
        {
-             unsigned int default_proto_power_mask[3] = {0,};
-             for(int pCount=0 ; pCount< 3 ;pCount++)
+             unsigned int default_proto_power_mask[5] = {0,};
+             for(int pCount=0 ; pCount< 5 ;pCount++)
              {
                   if((defaultPowerstate >> pCount)&0x01)
                   {
@@ -674,8 +684,8 @@
                                                             default_proto_power_mask[0],
                                                             default_proto_power_mask[1],
                                                             default_proto_power_mask[2],
-                                                            NFC_PROTOCOL_MASK_ISO7816|NFA_PROTOCOL_MASK_ISO_DEP,
-                                                            NFC_PROTOCOL_MASK_ISO7816|NFA_PROTOCOL_MASK_ISO_DEP);
+                                                            default_proto_power_mask[3],
+                                                            default_proto_power_mask[4]);
                  }
                  else
                  {
@@ -715,8 +725,8 @@
                                                             (defaultPowerstate & 01) ? (NFC_PROTOCOL_MASK_ISO7816 | t3t_protocol_mask) :0,
                                                             (defaultPowerstate & 02) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
                                                             (defaultPowerstate & 04) ? (NFC_PROTOCOL_MASK_ISO7816) :0,
-                                                            NFC_PROTOCOL_MASK_ISO7816 ,
-                                                            NFC_PROTOCOL_MASK_ISO7816 );
+                                                            (defaultPowerstate & 0x08) ? NFC_PROTOCOL_MASK_ISO7816 :0,
+                                                            (defaultPowerstate & 0x10) ? NFC_PROTOCOL_MASK_ISO7816 :0);
                   }else
                   {
                       nfaStat = NFA_EeSetDefaultProtoRouting(defaultSeID ,
@@ -754,8 +764,8 @@
                                                             (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,
-                                                            NFA_PROTOCOL_MASK_ISO_DEP,
-                                                            NFA_PROTOCOL_MASK_ISO_DEP );
+                                                            (defaultProtoPowerstate & 0x08) ? NFA_PROTOCOL_MASK_ISO_DEP :0,
+                                                            (defaultProtoPowerstate & 0x10) ? NFA_PROTOCOL_MASK_ISO_DEP :0);
                   }else{
                       nfaStat = NFA_EeSetDefaultProtoRouting(defaultProtoSeID,
                                                              (defaultProtoPowerstate& 01) ? NFA_PROTOCOL_MASK_ISO_DEP: 0,
@@ -811,13 +821,13 @@
         unsigned long max_tech_mask = 0x03;
         max_tech_mask = SecureElement::getInstance().getSETechnology(defaultTechSeID);
         ALOGD ("%s: enter,max_tech_mask :%x", fn, max_tech_mask);
-        unsigned int default_tech_power_mask[3]={0,};
-        unsigned int defaultTechFPowerstate=0x07;
+        unsigned int default_tech_power_mask[5]={0,};
+        unsigned int defaultTechFPowerstate=0x1F;
 
         ALOGD ("%s: enter, defaultTechSeID:%x", fn, defaultTechSeID);
         if(defaultTechSeID == 0x402)
         {
-               for(int pCount=0 ; pCount< 3 ;pCount++)
+               for(int pCount=0 ; pCount< 5 ;pCount++)
                {
                     if((defaultTechAPowerstate >> pCount)&0x01)
                     {
@@ -884,8 +894,8 @@
                                                       (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 & (NFA_TECHNOLOGY_MASK_A| NFA_TECHNOLOGY_MASK_B| NFA_TECHNOLOGY_MASK_F)),
-                                                      (max_tech_mask & (NFA_TECHNOLOGY_MASK_A| NFA_TECHNOLOGY_MASK_B| NFA_TECHNOLOGY_MASK_F)));
+                                                      (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]),
@@ -911,8 +921,8 @@
                                                          (defaultTechAPowerstate& 01) ?  (max_tech_mask & DefaultTechType): 0,
                                                          (defaultTechAPowerstate & 02) ? (max_tech_mask & DefaultTechType) :0,
                                                          (defaultTechAPowerstate & 04) ? (max_tech_mask & DefaultTechType) :0,
-                                                         (max_tech_mask & DefaultTechType),
-                                                         (max_tech_mask & DefaultTechType));
+                                                         (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,
@@ -933,8 +943,8 @@
                                                          (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,
-                                                         (max_tech_mask & NFA_TECHNOLOGY_MASK_F),
-                                                         (max_tech_mask & NFA_TECHNOLOGY_MASK_F));
+                                                         (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,
@@ -1929,12 +1939,7 @@
                 && (eeInfo[xx].ee_status == NFA_EE_STATUS_ACTIVE))
             {
                 ALOGD ("%s: Handle: 0x%04x Change Status Active to Inactive", fn, eeInfo[xx].ee_handle);
-                SyncEventGuard guard (mEeSetModeEvent);
-                if ((nfaStat = NFA_EeModeSet (eeInfo[xx].ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
-                {
-                    mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
-                }
-                else
+                if ((nfaStat = SecureElement::getInstance().SecElem_EeModeSet (eeInfo[xx].ee_handle, NFA_EE_MD_DEACTIVATE)) != NFA_STATUS_OK)
                 {
                     ALOGE ("Failed to set EE inactive");
                 }
@@ -2285,20 +2290,22 @@
             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(mChipId == 0x02 || mChipId == 0x04)
+            if(android::isNfcInitializationDone() == true)
             {
-                for(int xx = 0; xx <  num_ee; xx++)
+                if(mChipId == 0x02 || mChipId == 0x04)
                 {
-                    ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, ee_disc_info.ee_info[xx].ee_handle,ee_disc_info.ee_info[xx].ee_status);
-                    if ((ee_disc_info.ee_info[xx].ee_handle == 0x4C0) &&
-                            (ee_disc_info.ee_info[xx].ee_status == 0x02))
+                    for(int xx = 0; xx <  num_ee; xx++)
                     {
+                        ALOGE("xx=%d, ee_handle=0x0%x, status=0x0%x", xx, ee_disc_info.ee_info[xx].ee_handle,ee_disc_info.ee_info[xx].ee_status);
+                        if ((ee_disc_info.ee_info[xx].ee_handle == 0x4C0) &&
+                            (ee_disc_info.ee_info[xx].ee_status == 0x02))
+                        {
 #if(NXP_EXTNS == TRUE)
-                        recovery=TRUE;
+                            recovery=TRUE;
 #endif
-                        routingManager.ee_removed_disc_ntf_handler(ee_disc_info.ee_info[xx].ee_handle, ee_disc_info.ee_info[xx].ee_status);
-                        break;
+                            routingManager.ee_removed_disc_ntf_handler(ee_disc_info.ee_info[xx].ee_handle, ee_disc_info.ee_info[xx].ee_status);
+                            break;
+                        }
                     }
                 }
             }
@@ -2561,18 +2568,38 @@
 void *ee_removed_ntf_handler_thread(void *data)
 {
     static const char fn [] = "ee_removed_ntf_handler_thread";
+    tNFA_STATUS stat = NFA_STATUS_FAILED;
     SecureElement &se = SecureElement::getInstance();
-    ALOGD ("%s:  ", fn);
-    se.SecEle_Modeset(0x00);
+    RoutingManager &rm = RoutingManager::getInstance();
+    ALOGD ("%s: Enter: ", fn);
+    rm.mResetHandlerMutex.lock();
+    ALOGD ("%s: enter sEseRemovedHandlerMutex lock", fn);
+    stat = NFA_EeModeSet(0x4c0, NFA_EE_MD_DEACTIVATE);
+
+    if(stat == NFA_STATUS_OK)
+    {
+        SyncEventGuard guard (se.mEeSetModeEvent);
+        se.mEeSetModeEvent.wait ();
+    }
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    se.NfccStandByOperation(STANDBY_GPIO_LOW);
     usleep(10*1000);
-    se.SecEle_Modeset(0x01);
-    usleep(10*1000);
+    se.NfccStandByOperation(STANDBY_GPIO_HIGH);
+#endif
+    stat = NFA_EeModeSet(0x4c0, NFA_EE_MD_ACTIVATE);
+
+    if(stat == NFA_STATUS_OK)
+    {
+        SyncEventGuard guard(se.mEeSetModeEvent);
+        se.mEeSetModeEvent.wait ();
+    }
     NFA_HciW4eSETransaction_Complete(Release);
-#if(NXP_EXTNS == TRUE)
     SyncEventGuard guard(se.mEEdatapacketEvent);
     recovery=FALSE;
     se.mEEdatapacketEvent.notifyOne();
-#endif
+    rm.mResetHandlerMutex.unlock();
+    ALOGD ("%s: exit sEseRemovedHandlerMutex lock ", fn);
+    ALOGD ("%s: exit ", fn);
     return NULL;
 }
 
@@ -2720,4 +2747,43 @@
         xx++;
     }
 }
+/*******************************************************************************
+**
+** Function:        handleSERemovedNtf()
+**
+** Description:     The Function checks whether eSE is Removed Ntf
+**
+** Returns:         None
+**
+*******************************************************************************/
+void RoutingManager::handleSERemovedNtf()
+{
+    static const char fn [] = "RoutingManager::handleSERemovedNtf()";
+    UINT8 mActualNumEe = SecureElement::MAX_NUM_EE;
+    tNFA_EE_INFO mEeInfo [mActualNumEe];
+    tNFA_STATUS nfaStat;
+    ALOGE ("%s:Enter", __FUNCTION__);
+    if ((nfaStat = NFA_AllEeGetInfo (&mActualNumEe, mEeInfo)) != NFA_STATUS_OK)
+    {
+        ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat);
+        mActualNumEe = 0;
+    }
+    else
+    {
+        if(mChipId == 0x02 || mChipId == 0x04)
+        {
+            for(int xx = 0; xx <  mActualNumEe; 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) &&
+                    (mEeInfo[xx].ee_status == 0x02))
+                {
+                    recovery = TRUE;
+                    ee_removed_disc_ntf_handler(mEeInfo[xx].ee_handle, mEeInfo[xx].ee_status);
+                    break;
+                }
+            }
+        }
+    }
+}
 #endif
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index 58bb649..2ed1726 100644
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -100,31 +100,11 @@
     static const int ROUTE_HOST = 0;
     static const int ROUTE_ESE = 1;
 
-
     static RoutingManager& getInstance ();
     bool initialize(nfc_jni_native_data* native);
     void enableRoutingToHost();
     void disableRoutingToHost();
 #if(NXP_EXTNS == TRUE)
-    void setDefaultTechRouting (int seId, int tech_switchon,int tech_switchoff);
-    void setDefaultProtoRouting (int seId, int proto_switchon,int proto_switchoff);
-    int addNfcid2Routing(UINT8* nfcid2, UINT8 aidLen,const UINT8* syscode,
-            int syscodelen,const UINT8* optparam, int optparamlen);
-    bool removeNfcid2Routing(UINT8* nfcID2);
-
-    void getRouting();
-    void processGetRoutingRsp(tNFA_DM_CBACK_DATA* eventData, UINT8* sRoutingBuff);
-#endif
-#if(NXP_EXTNS == TRUE)
-    bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route, int power, bool isprefix);
-#else
-    bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route);
-#endif
-    bool removeAidRouting(const UINT8* aid, UINT8 aidLen);
-    bool commitRouting();
-    void onNfccShutdown();
-    int registerJniFunctions (JNIEnv* e);
-#if(NXP_EXTNS == TRUE)
     bool setRoutingEntry(int type, int value, int route, int power);
     bool clearRoutingEntry(int type);
     void setRouting(bool);
@@ -137,11 +117,28 @@
     se_rd_req_state_t getEtsiReaederState();
     Rdr_req_ntf_info_t getSwpRrdReqInfo();
     void setEtsiReaederState(se_rd_req_state_t newState);
+    void setDefaultTechRouting (int seId, int tech_switchon,int tech_switchoff);
+    void setDefaultProtoRouting (int seId, int proto_switchon,int proto_switchoff);
+    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
+    bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route);
 #endif
+    bool removeAidRouting(const UINT8* aid, UINT8 aidLen);
+    bool commitRouting();
+    void onNfccShutdown();
+    int registerJniFunctions (JNIEnv* e);
     void ee_removed_disc_ntf_handler(tNFA_HANDLE handle, tNFA_EE_STATUS status);
     SyncEvent mLmrtEvent;
     SyncEvent mCeRegisterEvent;//FelicaOnHost
     SyncEvent mCeDeRegisterEvent;
+    Mutex  mResetHandlerMutex;
 private:
     RoutingManager();
     ~RoutingManager();
@@ -183,9 +180,6 @@
     std::vector<UINT8> mRxDataBuffer;
 
     // Fields below are final after initialize()
-#if(NXP_EXTNS == TRUE)
-    UINT32 mCeRouteStrictDisable;
-#endif
     //int mDefaultEe;
     int mOffHostEe;
     int mActiveSe;
@@ -202,6 +196,7 @@
     SyncEvent mEeUpdateEvent;
     SyncEvent mEeSetModeEvent;
 #if(NXP_EXTNS == TRUE)
+     UINT32 mCeRouteStrictDisable;
      int defaultSeID ;
      bool mIsDirty;
      int defaultPowerstate;
diff --git a/nci/jni/SecureElement.cpp b/nci/jni/SecureElement.cpp
index 8655f44..ed6e05a 100644
--- a/nci/jni/SecureElement.cpp
+++ b/nci/jni/SecureElement.cpp
@@ -38,7 +38,7 @@
 #include "PeerToPeer.h"
 #if(NXP_EXTNS == TRUE)
 #include "RoutingManager.h"
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 #include <signal.h>
 #include <sys/types.h>
 #endif
@@ -64,19 +64,22 @@
     extern void setUiccIdleTimeout (bool enable);
     extern bool isDiscoveryStarted();
     extern int getScreenState();
+#if((NFC_NXP_ESE == TRUE) && (NFC_NXP_CHIP_TYPE == PN548C2))
+    extern bool isp2pActivated();
+#endif
     extern SyncEvent sNfaSetConfigEvent;
     extern tNFA_STATUS EmvCo_dosetPoll(jboolean enable);
     extern tNFA_STATUS ResetEseSession();
     extern void config_swp_reader_mode(bool mode);
     extern void set_transcation_stat(bool result);
 }
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 /* hold the transceive flag should be set when the prio session is actrive/about to active*/
 /* Event used to inform the prio session end and transceive resume*/
 SyncEvent sSPIPrioSessionEndEvent;
-    static IntervalTimer   mNFCCStandbyModeTimer; // timer to enable standby mode for NFCC
     static UINT32          nfccStandbytimeout;        // timeout for secelem standby mode detection
     static void NFCC_StandbyModeTimerCallBack (union sigval);
+    int active_ese_reset_control = 0;
 #endif
     SyncEvent mDualModeEvent;
     static void setSPIState(bool mState);
@@ -85,9 +88,7 @@
 #if(NXP_EXTNS == TRUE)
 #define NFC_NUM_INTERFACE_MAP 3
 #define NFC_SWP_RD_NUM_INTERFACE_MAP 1
-#endif
 
-#if(NXP_EXTNS == TRUE)
 static const tNCI_DISCOVER_MAPS nfc_interface_mapping_default[NFC_NUM_INTERFACE_MAP] =
 {
         /* Protocols that use Frame Interface do not need to be included in the interface mapping */
@@ -173,9 +174,6 @@
 SecureElement SecureElement::sSecElem;
 const char* SecureElement::APP_NAME = "nfc_jni";
 const UINT16 ACTIVE_SE_USE_ANY = 0xFFFF;
-#if(NXP_EXTNS == TRUE)
-char bcm_nfc_location_jni[]="/etc";
-#endif
 
 /*******************************************************************************
 **
@@ -305,7 +303,7 @@
         mWiredModeRfFiledEnable = num;
     }
 #endif
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     if (GetNxpNumValue(NAME_NXP_NFCC_STANDBY_TIMEOUT, &nfccStandbytimeout, sizeof(nfccStandbytimeout)) == false)
     {
         nfccStandbytimeout = 20000;
@@ -321,6 +319,7 @@
     }
     dual_mode_current_state = SPI_DWPCL_NOT_ACTIVE;
     hold_the_transceive = false;
+    active_ese_reset_control = 0;
 #endif
     /*
      * Since NXP doesn't support OBERTHUR RESET COMMAND, Hence commented
@@ -407,7 +406,9 @@
 
 /*    if (mNfaHciHandle != NFA_HANDLE_INVALID)
         NFA_HciDeregister (const_cast<char*>(APP_NAME));*/
-
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    NfccStandByOperation(STANDBY_TIMER_STOP);
+#endif
     mNfaHciHandle = NFA_HANDLE_INVALID;
     mNativeData   = NULL;
     mIsInit       = false;
@@ -796,11 +797,9 @@
             }
 
             {
-                SyncEventGuard guard (mEeSetModeEvent);
                 ALOGD ("%s: set EE mode activate; h=0x%X", fn, eeItem.ee_handle);
-                if ((nfaStat = NFA_EeModeSet (eeItem.ee_handle, NFA_EE_MD_ACTIVATE)) == NFA_STATUS_OK)
+                if ((nfaStat = SecElem_EeModeSet (eeItem.ee_handle, NFA_EE_MD_ACTIVATE)) == NFA_STATUS_OK)
                 {
-                    mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
                     if (eeItem.ee_status == NFC_NFCEE_STATUS_ACTIVE)
                         numActivatedEe++;
                 }
@@ -885,11 +884,9 @@
             }
 
             {
-                SyncEventGuard guard (mEeSetModeEvent);
                 ALOGD ("%s: set EE mode activate; h=0x%X", fn, eeItem.ee_handle);
-                if ((nfaStat = NFA_EeModeSet (eeItem.ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
+                if ((nfaStat = SecElem_EeModeSet (eeItem.ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK)
                 {
-                    mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
                     ALOGD ("%s: eeItem.ee_status =0x%X  NFC_NFCEE_STATUS_INACTIVE = %x", fn, eeItem.ee_status, NFC_NFCEE_STATUS_INACTIVE);
                     if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE)
                     {
@@ -1426,14 +1423,14 @@
         ALOGD ("%s: Empty AID SELECT cmd detected, substituting AID from config file, new length=%d", fn, idx);
     }
 
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
-    mNFCCStandbyModeTimer.kill();
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    NfccStandByOperation(STANDBY_TIMER_STOP);
 #endif
     {
         SyncEventGuard guard (mTransceiveEvent);
         mActualResponseSize = 0;
         memset (mResponseData, 0, sizeof(mResponseData));
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
         if(hold_the_transceive == true){
             ALOGD("%s: holding the transceive\n", fn);
             sSPIPrioSessionEndEvent.wait(timeoutMillisec);
@@ -1472,17 +1469,48 @@
                 mDualModeEvent.wait();
             }
 #endif
+#if(NFC_NXP_ESE == TRUE)
+            active_ese_reset_control |= TRANS_WIRED_ONGOING;
+#endif
 #endif
             nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, EVT_SEND_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
 #if(NXP_EXTNS == TRUE)
         }
 #endif
         else
+#if(NXP_EXTNS == TRUE)
+        {
+#if(NFC_NXP_ESE == TRUE)
+            active_ese_reset_control |= TRANS_WIRED_ONGOING;
+#endif
+#endif
             nfaStat = NFA_HciSendEvent (mNfaHciHandle, mNewPipeId, NFA_HCI_EVT_POST_DATA, xmitBufferSize, xmitBuffer, sizeof(mResponseData), mResponseData, timeoutMillisec);
+#if(NXP_EXTNS == TRUE)
+        }
+#endif
         if (nfaStat == NFA_STATUS_OK)
         {
 //          waitOk = mTransceiveEvent.wait (timeoutMillisec);
             mTransceiveEvent.wait ();
+
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+            if(active_ese_reset_control & TRANS_WIRED_ONGOING)
+            {
+                active_ese_reset_control ^= TRANS_WIRED_ONGOING;
+
+                /*If only reset event is pending*/
+                if((active_ese_reset_control&RESET_BLOCKED))
+                {
+                    SyncEventGuard guard (mResetOngoingEvent);
+                    mResetOngoingEvent.wait();
+                }
+                if(!(active_ese_reset_control&TRANS_CL_ONGOING) &&
+                (active_ese_reset_control&RESET_BLOCKED))
+                {
+                    active_ese_reset_control ^= RESET_BLOCKED;
+                }
+            }
+#endif
             if (mTransceiveWaitOk == false) //timeout occurs
             {
                 ALOGE ("%s: wait response timeout", fn);
@@ -1505,6 +1533,10 @@
     isSuccess = true;
 
 TheEnd:
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+    if((active_ese_reset_control&TRANS_WIRED_ONGOING))
+        active_ese_reset_control ^= TRANS_WIRED_ONGOING;
+#endif
     ALOGD ("%s: exit; isSuccess: %d; recvBufferActualSize: %ld", fn, isSuccess, recvBufferActualSize);
     return (isSuccess);
 }
@@ -1525,12 +1557,31 @@
     if(mState)
     {
        dual_mode_current_state |= CL_ACTIVE;
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+       active_ese_reset_control |= TRANS_CL_ONGOING;
+#endif
     }
     else
     {
        if(dual_mode_current_state & CL_ACTIVE)
        {
            dual_mode_current_state ^= CL_ACTIVE;
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+               if((active_ese_reset_control&TRANS_CL_ONGOING))
+               {
+                   active_ese_reset_control ^= TRANS_CL_ONGOING;
+
+                   /*If there is no pending wired rapdu or CL session*/
+                   if(((active_ese_reset_control&RESET_BLOCKED))&&
+                   (!(active_ese_reset_control &(TRANS_WIRED_ONGOING))))
+                   {
+                       /*unblock pending reset event*/
+                       SyncEventGuard guard (sSecElem.mResetEvent);
+                       sSecElem.mResetEvent.notifyOne();
+                       active_ese_reset_control ^= RESET_BLOCKED;
+                   }
+               }
+#endif
            if(inDualModeAlready)
            {
                SyncEventGuard guard (mDualModeEvent);
@@ -1559,17 +1610,11 @@
     sSecElem.mEeSetModeEvent.notifyOne();
 }
 
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 static void NFCC_StandbyModeTimerCallBack (union sigval)
 {
     ALOGD ("%s timer timedout , sending standby mode cmd", __FUNCTION__);
-    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__);
-    }
+    SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_TIMEOUT);
 }
 #endif
 /*******************************************************************************
@@ -1735,8 +1780,7 @@
                     if (e == NULL)
                     {
                         ALOGE ("%s: jni env is null", fn);
-                        mMutex.unlock();
-                        return;
+                        break;
                     }
                     sSwpReaderTimer.kill();
                 /*
@@ -2057,17 +2101,27 @@
             ALOGD ("%s: NFA_HCI_EVENT_RCVD_EVT; data from static pipe", fn);
             SyncEventGuard guard (sSecElem.mTransceiveEvent);
             sSecElem.mActualResponseSize = (eventData->rcvd_evt.evt_len > MAX_RESPONSE_SIZE) ? MAX_RESPONSE_SIZE : eventData->rcvd_evt.evt_len;
+#if(NXP_EXTNS == TRUE)
+#if(NFC_NXP_ESE == TRUE)
             if(eventData->rcvd_evt.evt_len > 0)
             {
                 sSecElem.mTransceiveWaitOk = true;
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
-                if(nfccStandbytimeout > 0)
-                {
-                    mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack );
-                    ALOGE ("%s: starting NFCC standby mode timer", fn);
-                }
-#endif
+                SecureElement::getInstance().NfccStandByOperation(STANDBY_TIMER_START);
             }
+            /*If there is pending reset event to process*/
+            if((active_ese_reset_control&RESET_BLOCKED)&&
+            (!(active_ese_reset_control &(TRANS_CL_ONGOING))))
+            {
+                SyncEventGuard guard (sSecElem.mResetEvent);
+                sSecElem.mResetEvent.notifyOne();
+            }
+#else
+            if(eventData->rcvd_evt.evt_len > 0)
+            {
+                sSecElem.mTransceiveWaitOk = true;
+	    }
+#endif
+#endif
             sSecElem.mTransceiveEvent.notifyOne ();
         }
         else if (eventData->rcvd_evt.evt_code == NFA_HCI_EVT_POST_DATA)
@@ -2488,11 +2542,9 @@
     tNFA_STATUS nfaStat = NFA_STATUS_FAILED;
     bool retval = true;
 
-    SyncEventGuard guard (mEeSetModeEvent);
     ALOGD ("set EE mode = 0x%X", type);
-    if ((nfaStat = NFA_EeModeSet (0x4C0, type)) == NFA_STATUS_OK)
+    if ((nfaStat = SecElem_EeModeSet (0x4C0, type)) == NFA_STATUS_OK)
     {
-        mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT
 #if 0
         if (eeItem.ee_status == NFC_NFCEE_STATUS_INACTIVE)
         {
@@ -2555,6 +2607,95 @@
     return retval;
 }
 
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+/*******************************************************************************
+**
+** Function         NfccStandByTimerOperation
+**
+** Description      start/stops the standby timer
+**
+** Returns          void
+**
+*******************************************************************************/
+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);
+    switch(value)
+    {
+    case STANDBY_TIMER_START:
+        if(nfccStandbytimeout > 0)
+        {
+            mNFCCStandbyModeTimer.set(nfccStandbytimeout , NFCC_StandbyModeTimerCallBack );
+        }
+        break;
+    case STANDBY_TIMER_STOP:
+        {
+            if(nfccStandbytimeout > 0)
+                mNFCCStandbyModeTimer.kill();
+        }
+        break;
+    case STANDBY_TIMER_TIMEOUT:
+    {
+        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__);
+        }
+    }
+    break;
+    case STANDBY_GPIO_HIGH:
+    {
+        jint ret_val = -1;
+        NFCSTATUS status = NFCSTATUS_FAILED;
+
+        /* Set the ESE VDD gpio to high to make sure P61 is powered, even if NFCC
+         * is in standby
+         */
+        ret_val = NFC_EnableWired ((void *)&status);
+        if (ret_val < 0)
+        {
+            ALOGD("NFC_EnableWired failed");
+        }
+        else
+        {
+             if (status != NFCSTATUS_SUCCESS)
+             {
+                 ALOGD("SE is being used by SPI");
+             }
+        }
+    }
+    break;
+    case STANDBY_GPIO_LOW:
+    {
+        jint ret_val = -1;
+        NFCSTATUS status = NFCSTATUS_FAILED;
+        /* Set the ESE VDD gpio to low to make sure P61 is reset. */
+        ret_val = NFC_DisableWired ((void *)&status);
+        if (ret_val < 0)
+        {
+            ALOGD("NFC_DisableWired failed");
+        }
+        else
+        {
+            if (status != NFCSTATUS_SUCCESS)
+            {
+                ALOGD("SE is not being released by Pn54x driver");
+            }
+        }
+    }
+    break;
+    default:
+        ALOGE("Wrong param");
+    break;
+
+    }
+}
+#endif
+
 /*******************************************************************************
 **
 ** Function:        reconfigureEseHciInit
@@ -2603,7 +2744,11 @@
     ALOGD("%s; enter", fn);
     //mRecvdTransEvt = false; //reset to false before 2.5sec wait
     SyncEventGuard guard (mAllowWiredModeEvent);
-    if(isActivatedInListenMode())
+    if(android::isp2pActivated())
+    {
+        status = true;
+    }
+    else if(isActivatedInListenMode())
     {
         ALOGD("%s; mAllowWiredMode=%d ",fn, mAllowWiredMode);
         if(mAllowWiredMode)
@@ -2626,7 +2771,6 @@
         if(!isActivatedInListenMode() || !isRfFieldOn() || !mRecvdTransEvt)
             status = true;
     }
-
     return status;
 }
 #endif
@@ -2839,7 +2983,7 @@
 
     return decoded_length;
 }
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused)
 {
     ALOGD ("%s: Inside the Signal Handler %d\n", __FUNCTION__, SIG_NFC);
@@ -2874,7 +3018,7 @@
 }
 #endif
 
-#if(NXP_EXTNS == TRUE)
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 /*******************************************************************************
 **
 ** Function:        setCPTimeout
@@ -2904,7 +3048,6 @@
     static const char fn [] = "SecureElement::setCPTimeout";
     for ( i = 0; i < mActualNumEe; i++)
     {
-
         if (mEeInfo[i].ee_handle == 0x4C0)
         {
             nfaStat = NFA_STATUS_OK;
@@ -2928,20 +3071,38 @@
         }
         if(found)
         {
-            SecEle_Modeset(0x01);
-            activate(0xF3);
-            connectEE();
-            getAtr(0xF3,received_getatr,&recvBufferActualSize);
-            transceive(selectISD,(INT32)sizeof(selectISD),received_selectISD,(int)sizeof(received_selectISD),recvBufferActualSize,
-                                                  timeout);
-            transceive(setCPTimeoutcmdbuff,(INT32)sizeof(setCPTimeoutcmdbuff),received_setCPTimeout,(int)sizeof(received_setCPTimeout),recvBufferActualSize,
-                                                  timeout);
-            disconnectEE(0xF3);
+            bool stat = false;
+
+            stat = SecEle_Modeset(0x01);
+            if(stat == true)
+            {
+                stat = connectEE();
+                if(stat == true)
+                {
+                    stat = getAtr(ESE_ID,received_getatr,&recvBufferActualSize);
+                    if(stat == true)
+                    {
+                        /*select card manager*/
+                        stat = transceive(selectISD,(INT32)sizeof(selectISD),received_selectISD,
+                            (int)sizeof(received_selectISD), recvBufferActualSize, timeout);
+                        if(stat == true)
+                        {
+                            /*set timeout value in CP registry*/
+                            transceive(setCPTimeoutcmdbuff,(INT32)sizeof(setCPTimeoutcmdbuff),
+                                received_setCPTimeout, (int)sizeof(received_setCPTimeout), recvBufferActualSize, timeout);
+                        }
+                    }
+                }
+            }
+            sendEvent(SecureElement::EVT_END_OF_APDU_TRANSFER);
+            disconnectEE(ESE_ID);
         }
     }
 
 }
+#endif
 
+#if(NXP_EXTNS == TRUE)
 /*******************************************************************************
  **
  ** Function:       setSPIState
@@ -2974,4 +3135,43 @@
     }
     ALOGD ("%s: Exit setSPIState = %d\n", __FUNCTION__, dual_mode_current_state);
 }
+
+/*******************************************************************************
+ **
+ ** Function:       SecElem_EeModeSet
+ **
+ ** Description:    Perform SE mode set ON/OFF based on mode type
+ **
+ ** Returns:        NFA_STATUS_OK/NFA_STATUS_FAILED.
+ **
+ *******************************************************************************/
+tNFA_STATUS SecureElement::SecElem_EeModeSet(uint16_t handle, uint8_t mode)
+{
+    tNFA_STATUS stat = NFA_STATUS_FAILED;
+    ALOGD("%s:Enter mode = %d", __FUNCTION__, mode);
+
+#if((NFC_NXP_ESE == TRUE))
+    if((mode == NFA_EE_MD_DEACTIVATE)&&(active_ese_reset_control&(TRANS_WIRED_ONGOING|TRANS_CL_ONGOING)))
+    {
+        active_ese_reset_control |= RESET_BLOCKED;
+        SyncEventGuard guard (sSecElem.mResetEvent);
+        sSecElem.mResetEvent.wait();
+    }
+#endif
+    SyncEventGuard guard (sSecElem.mEeSetModeEvent);
+    stat =  NFA_EeModeSet(handle, mode);
+    if(stat == NFA_STATUS_OK)
+    {
+        sSecElem.mEeSetModeEvent.wait ();
+    }
+
+#if((NFC_NXP_ESE == TRUE))
+    if((active_ese_reset_control&RESET_BLOCKED))
+    {
+        SyncEventGuard guard (sSecElem.mResetOngoingEvent);
+        sSecElem.mResetOngoingEvent.notifyOne();
+    }
+#endif
+    return stat;
+}
 #endif
diff --git a/nci/jni/SecureElement.h b/nci/jni/SecureElement.h
index c8fea1f..932e582 100644
--- a/nci/jni/SecureElement.h
+++ b/nci/jni/SecureElement.h
@@ -49,11 +49,11 @@
     #include "nfa_hci_defs.h"
     #include "nfa_ce_api.h"
     #include "phNxpExtns.h"
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     #include "phNfcTypes.h"
 #endif
 }
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
 #define SIG_NFC 44
 #endif
 typedef enum dual_mode{
@@ -63,6 +63,12 @@
  SPI_DWPCL_BOTH_ACTIVE = 0x03,
 }dual_mode_state;
 
+typedef enum reset_management{
+ TRANS_IDLE = 0x00,
+ TRANS_WIRED_ONGOING = 0x01,
+ TRANS_CL_ONGOING = 0x02,
+ RESET_BLOCKED = 0x04,
+}ese_reset_control;
 typedef struct {
     tNFA_HANDLE src;
     tNFA_TECHNOLOGY_MASK tech_mask;
@@ -97,7 +103,14 @@
     Mutex mMutex;
 }Rdr_req_ntf_info_t;
 
-#if((NFC_POWER_MANAGEMENT == TRUE)&&(NXP_EXTNS == TRUE))
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
+typedef enum operation{
+    STANDBY_TIMER_START,
+    STANDBY_TIMER_STOP,
+    STANDBY_TIMER_TIMEOUT,
+    STANDBY_GPIO_HIGH,
+    STANDBY_GPIO_LOW
+}nfcc_standby_operation_t;
 void spi_prio_signal_handler (int signum, siginfo_t *info, void *unused);
 #endif
 
@@ -545,8 +558,9 @@
     jint getGenericEseId(tNFA_HANDLE handle);
 
     tNFA_STATUS reconfigureEseHciInit();
-#if(NXP_EXTNS == TRUE)
+#if((NFC_NXP_ESE == TRUE)&&(NXP_EXTNS == TRUE))
     void setCPTimeout();
+    void NfccStandByOperation(nfcc_standby_operation_t value);
 #endif
     bool isWiredModeAllowedInRfState();
     bool mRecvdTransEvt;
@@ -556,12 +570,12 @@
     SyncEvent       mAidAddRemoveEvent;
     SyncEvent       mUiccListenEvent;
     SyncEvent       mEseListenEvent;
-#if(NXP_EXTNS == TRUE)
-    SyncEvent       mEEdatapacketEvent;
-#endif
     SyncEvent       mAllowWiredModeEvent;
+    SyncEvent       mEeSetModeEvent;
 
 #if(NXP_EXTNS == TRUE)
+    tNFA_STATUS SecElem_EeModeSet(uint16_t handle, uint8_t mode);
+    SyncEvent       mEEdatapacketEvent;
     static const UINT8 EVT_END_OF_APDU_TRANSFER = 0x21;    //NXP Propritory
     void setCLState(bool mState);
 #endif
@@ -578,16 +592,13 @@
     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 tNFA_HANDLE EE_HANDLE_0xF3 = 0x4C0;//0x401; //handle to secure element in slot 0
-#else
-    static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
-#endif
-#if(NXP_EXTNS == TRUE)
 #ifdef NXP_UICC_ENABLE
     static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x402; //handle to secure element in slot 1
 #else
     static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x0F4;//0x4C0; //handle to secure element in slot 1
 #endif
 #else
+    static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
     static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x4F4; //handle to secure element in slot 1
 #endif
 
@@ -618,7 +629,9 @@
     tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg;
     SyncEvent       mEeRegisterEvent;
     SyncEvent       mHciRegisterEvent;
-    SyncEvent       mEeSetModeEvent;
+
+    SyncEvent       mResetEvent;
+    SyncEvent       mResetOngoingEvent;
     SyncEvent       mPipeListEvent;
     SyncEvent       mCreatePipeEvent;
     SyncEvent       mPipeOpenedEvent;
diff --git a/nci/jni/extns/pn54x/src/phNxpExtns.c b/nci/jni/extns/pn54x/src/phNxpExtns.c
index 9e90e69..63a101b 100644
--- a/nci/jni/extns/pn54x/src/phNxpExtns.c
+++ b/nci/jni/extns/pn54x/src/phNxpExtns.c
@@ -613,6 +613,8 @@
     if (sem_timedwait (&gAuthCmdBuf.semPresenceCheck, &ts))
     {
         ALOGE ("%s: failed to wait (errno=0x%08x)", __FUNCTION__, errno);
+        sem_destroy (&gAuthCmdBuf.semPresenceCheck);
+        gAuthCmdBuf.auth_sent = FALSE;
         return NFCSTATUS_FAILED;
     }
     if (sem_destroy (&gAuthCmdBuf.semPresenceCheck))
diff --git a/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp b/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
index dea3647..0127a15 100644
--- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
+++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.cpp
@@ -822,13 +822,13 @@
 ** Returns:     0 if not modified, 1 otherwise.
 **
 *******************************************************************************/
-
 int CNfcConfig::updateTimestamp()
 {
     FILE*   fd;
     struct stat st;
     unsigned long value = 0;
     int ret = 0;
+
     if(stat(config_timestamp_path, &st) != 0)
     {
         ALOGD("%s file %s not exist, creat it.\n", __func__, config_timestamp_path);
@@ -847,6 +847,7 @@
             ALOGE("%s Cannot open file %s\n", __func__, config_timestamp_path);
             return 1;
         }
+
         fread(&value, sizeof(unsigned long), 1, fd);
         ret = (value != m_timeStamp);
         if(ret)
@@ -1013,3 +1014,4 @@
     nxp::CNfcConfig& rConfig = nxp::CNfcConfig::GetInstance();
     return rConfig.updateTimestamp();
 }
+
diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
index a0759c9..7a7b609 100644
--- a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
+++ b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
@@ -292,6 +292,15 @@
     public native int   getDefaultMifareCLTRoute();
 
     @Override
+    public native int   getDefaultAidPowerState();
+
+    @Override
+    public native int   getDefaultDesfirePowerState();
+
+    @Override
+    public native int   getDefaultMifareCLTPowerState();
+
+    @Override
     public native void doSetScreenOrPowerState(int state);
 
     @Override
@@ -370,7 +379,7 @@
     public native int JCOSDownload();
 
     @Override
-    public native void doSetVenConfigValue(int venconfig);
+    public native void doSetNfcMode(int nfcMode);
 
     @Override
     public native int GetDefaultSE();
diff --git a/nci/src/com/gsma/nfc/internal/NxpNfcController.java b/nci/src/com/gsma/nfc/internal/NxpNfcController.java
index f8fc69b..7af9651 100644
--- a/nci/src/com/gsma/nfc/internal/NxpNfcController.java
+++ b/nci/src/com/gsma/nfc/internal/NxpNfcController.java
@@ -26,6 +26,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import android.content.BroadcastReceiver;
+import android.content.pm.ResolveInfo;
+import android.content.pm.PackageInfo;
 
 import android.util.Log;
 import com.nxp.nfc.gsma.internal.INxpNfcController;
@@ -34,7 +36,8 @@
 import android.nfc.cardemulation.NQApduServiceInfo;
 import android.os.Binder;
 import android.content.ComponentName;
-
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
 import com.android.nfc.NfcPermissions;
 import com.android.nfc.NfcService;
 import com.nxp.nfc.NxpConstants;
@@ -61,7 +64,7 @@
     private boolean mHasCert = false;
     private Object mWaitOMACheckCert = null;
     private boolean mHasOMACert = false;
-
+    private ComponentName unicastPkg = null;
 
     public NxpNfcController(Context context, CardEmulationManager cardEmulationManager) {
         mContext = context;
@@ -79,6 +82,10 @@
     }
 
     public ArrayList<String> getEnabledMultiEvtsPackageList() {
+        if(mEnabledMultiEvts.size() == 0x00) {
+            Log.d(TAG, " check for unicast mode service resolution");
+            getPackageListUnicastMode();
+        }
         return mEnabledMultiEvts;
     }
 
@@ -183,6 +190,92 @@
         return data;
     }
 
+    private long getApplicationInstallTime(String packageName) {
+        PackageManager pm = mContext.getPackageManager();
+        try {
+            PackageInfo pInfo = pm.getPackageInfo(packageName ,0);
+            return pInfo.firstInstallTime;
+        }catch(NameNotFoundException exception) {
+            Log.e(TAG, "Application install time not retrieved");
+            return 0;
+        }
+    }
+
+    private void getPackageListUnicastMode () {
+        unicastPkg = null;
+        ArrayList<NQApduServiceInfo> regApduServices = mServiceCache.getApduservicesList();
+        PackageManager pm = mContext.getPackageManager();
+        List<ResolveInfo> intentServices = pm.queryIntentActivities(
+                new Intent(NxpConstants.ACTION_MULTI_EVT_TRANSACTION),
+                PackageManager.GET_INTENT_FILTERS| PackageManager.GET_RESOLVED_FILTER);
+        ArrayList<String> apduResolvedServices = new ArrayList<String>();
+        String packageName = null;
+        String resolvedApduService = null;
+        int highestPriority = -1000;
+        long minInstallTime;
+        ResolveInfo resolveInfoService = null;
+
+        for(NQApduServiceInfo service : regApduServices) {
+            packageName = service.getComponent().getPackageName();
+            for(ResolveInfo resInfo : intentServices){
+                resolveInfoService = null;
+                Log.e(TAG, " Registered Service in resolved cache"+resInfo.activityInfo.packageName);
+                if(resInfo.activityInfo.packageName.equals(packageName)) {
+                    resolveInfoService = resInfo;
+                    break;
+                }
+            }
+            if(resolveInfoService == null) {
+                Log.e(TAG, " Registered Service is not found in cache");
+                continue;
+            }
+            int priority = resolveInfoService.priority;
+            if(pm.checkPermission(NxpConstants.PERMISSIONS_TRANSACTION_EVENT , packageName) ==
+                    PackageManager.PERMISSION_GRANTED)
+            {
+                if(checkCertificatesFromUICC(packageName, NxpConstants.UICC_ID) == true)
+                {
+                    if(priority == highestPriority) {
+                        apduResolvedServices.add(packageName);
+                    } else if(highestPriority < priority) {
+                        highestPriority = priority;
+                        apduResolvedServices.clear();
+                        apduResolvedServices.add(packageName);
+                    }
+                }
+            }
+        }
+        if(apduResolvedServices.size() == 0x00) {
+            Log.e(TAG, "No services to resolve, not starting the activity");
+            return;
+        }else if(apduResolvedServices.size() > 0x01) {
+            Log.e(TAG, " resolved"+apduResolvedServices.size());
+            minInstallTime = getApplicationInstallTime(apduResolvedServices.get(0));
+            for(String resolvedService : apduResolvedServices) {
+                if(getApplicationInstallTime(resolvedService) <= minInstallTime ) {
+                    minInstallTime = getApplicationInstallTime(resolvedService);
+                    resolvedApduService = resolvedService;
+                }
+                Log.e(TAG, " Install time  of application"+ minInstallTime);
+            }
+
+        } else  resolvedApduService = apduResolvedServices.get(0);
+
+        Log.e(TAG, " Final Resolved Service"+resolvedApduService);
+        if(resolvedApduService != null) {
+            for(ResolveInfo resolve : intentServices) {
+                if(resolve.activityInfo.packageName.equals(resolvedApduService)) {
+                    unicastPkg = new ComponentName(resolvedApduService ,resolve.activityInfo.name);
+                    break;
+                }
+            }
+        }
+    }
+
+    public ComponentName getUnicastPackage() {
+        return unicastPkg;
+    }
+
     final class NxpNfcControllerInterface extends INxpNfcController.Stub {
 
         @Override
@@ -200,6 +293,11 @@
             HashMap<ComponentName, NQApduServiceInfo> mapServices = mServiceCache.getApduservicesMaps();
             ComponentName preferredPaymentService = mRegisteredAidCache.getPreferredPaymentService();
             if(preferredPaymentService != null) {
+                if(preferredPaymentService.getPackageName() != null &&
+                    !preferredPaymentService.getPackageName().equals(packageName)) {
+                    Log.d(TAG, "getDefaultOffHostService unregistered package Name");
+                    return null;
+                }
                 String defaultservice = preferredPaymentService.getClassName();
 
                 //If Default is Dynamic Service
diff --git a/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java b/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
index 95a7185..949f8b9 100644
--- a/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
+++ b/nci/src/com/gsma/nfc/internal/RegisteredNxpServicesCache.java
@@ -78,6 +78,7 @@
 
     private RegisteredServicesCache mRegisteredServicesCache;
     final HashMap<ComponentName, NQApduServiceInfo> mApduServices = Maps.newHashMap();
+    final HashMap<ComponentName , String> mApduBanner = Maps.newHashMap();
     AtomicFile mDynamicApduServiceFile = null;
     File dataDir = null;
 
@@ -94,6 +95,49 @@
         mDynamicApduServiceFile = new AtomicFile(new File(dataDir, "dynamic_apduservice.xml"));
     }
 
+
+    private String writeDrawableAsBitMap(Drawable drawable , String path) {
+        File file = new File(dataDir, path);
+        Log.d(TAG, " input Path "+ path);
+        Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
+        Log.d(TAG, "drawablePath: "+ file.getPath());
+        try {
+            FileOutputStream outStream = new FileOutputStream(file);
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
+            outStream.flush();
+            outStream.close();
+            return file.getPath();
+        } catch (IOException e) {
+            Log.d(TAG, " input Path Not found"+ e.getMessage());
+            return null;
+        }
+    }
+
+    private Drawable readDrawableFromBitMap(String drawablePath) {
+        Log.d(TAG, " input Path "+ drawablePath);
+        File filePath = new File(drawablePath);
+        try {
+            FileInputStream fi = new FileInputStream(filePath);
+            Bitmap bitmap = BitmapFactory.decodeStream(fi);
+            Drawable DrawableResource  = new BitmapDrawable(mContext.getResources(),bitmap);
+            return DrawableResource;
+        } catch (IOException e) {
+            Log.d(TAG, " input Path Not found"+ e.getMessage());
+            return null;
+        }
+    }
+
+    private boolean deleteBitMapfromFile(String drawablePath) {
+        Log.d(TAG, " delete Path "+ drawablePath);
+        boolean deleted = false;
+        File file = new File(drawablePath);
+        if (file.exists()) {
+            Log.d(TAG, " delete Path found"+ drawablePath);
+            deleted = file.delete();
+        }
+        Log.d(TAG, "deleted "+deleted);
+        return deleted;
+    }
     // Register APDU Service
     public boolean registerApduService(int userId, int uid, String packageName, String serviceName, NQApduServiceInfo apduService) {
         ComponentName componentName = new ComponentName(packageName, serviceName);
@@ -146,6 +190,10 @@
                 if(uninstalledpackageName.equals(entry.getKey().getPackageName())){
                     it.remove();
                     Log.d(TAG, "Removed packageName: "+ entry.getKey().getPackageName());
+                    if(mApduBanner.containsKey(entry.getKey())) {
+                        deleteBitMapfromFile(mApduBanner.get(entry.getKey()));
+                        mApduBanner.remove(entry.getKey());
+                    }
                 }
             }
         } else {
@@ -158,6 +206,10 @@
          synchronized (mLock) {
              mApduServices.values().remove(apduService);
              writeDynamicApduService();
+             if(mApduBanner.containsKey(apduService.getComponent())) {
+                 deleteBitMapfromFile(mApduBanner.get(apduService.getComponent()));
+                 mApduBanner.remove(apduService.getComponent());
+             }
              mRegisteredServicesCache.invalidateCache(userId);
          }
          return true;
@@ -194,10 +246,21 @@
 
             for(Iterator<Map.Entry<ComponentName, NQApduServiceInfo>>it=mApduServices.entrySet().iterator(); it.hasNext();){
                 Map.Entry<ComponentName, NQApduServiceInfo> service = it.next();
-                out.startTag(null, "service");
-                out.attribute(null, "component", service.getKey().flattenToString());
-                service.getValue().writeToXml(out);
-                out.endTag(null, "service");
+                if( null != service) {
+                    out.startTag(null, "service");
+                    out.attribute(null, "component", service.getKey().flattenToString());
+                    if(service.getValue().getBannerId() <= 0x00 && null != service.getValue().mBanner) {
+                        Log.e(TAG, "writeDynamicApduService "+service.getValue().getBannerId());
+                        String path = service.getKey().getPackageName() + "_"+ service.getKey().getClassName()+".png";
+                        path = writeDrawableAsBitMap(service.getValue().mBanner ,path);
+                        if(!mApduBanner.containsKey(service.getKey())) {
+                            mApduBanner.put(service.getKey(),path);
+                        }
+                        out.attribute(null, "drawableResourcepath", path);
+                    }
+                    service.getValue().writeToXml(out);
+                    out.endTag(null, "service");
+                }
             }
             out.endTag(null, "apduservices");
             out.endDocument();
@@ -253,6 +316,7 @@
                             description = parser.getAttributeValue(null, "description");
                             bannerId  = Integer.parseInt(parser.getAttributeValue(null, "bannerId"));
                             String isModifiable = parser.getAttributeValue(null, "modifiable");
+                            drawbalePath = parser.getAttributeValue(null, "drawableResourcepath");
                             if(isModifiable.equals("true")) {
                                 modifiable = true;
                             } else {
@@ -262,6 +326,14 @@
                             String seIdString = parser.getAttributeValue(null, "seId");
                             seId = Integer.parseInt(seIdString);
                             inService = true;
+                            Log.e(TAG, "readDynamicApduService "+bannerId);
+                            if(bannerId <= 0x00) {
+                                bannerId = -1;
+                                DrawableResource = readDrawableFromBitMap(drawbalePath);
+                                if(!mApduBanner.containsKey(currentComponent)) {
+                                    mApduBanner.put(currentComponent, drawbalePath);
+                                }
+                            }
                         }
 
                         if ("aid-group".equals(tagName) && parser.getDepth() == 3 && inService) {
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 17fe502..e0e7231 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -99,6 +99,10 @@
 
     <string name="nfc_enabled_dialog">        Nfc is Currently Disabled. \nDo you want to Enable it for your NFC Service </string>
 
+    <string name="permgrouplab_NFC">NFC-Near Field communication</string>
+
+    <string name="permgroupdesc_NFC"> Access various NFC features</string>
+
     <string name="ok">OK</string>
 
     <string name="no">NO</string>
diff --git a/src/com/android/nfc/DeviceHost.java b/src/com/android/nfc/DeviceHost.java
index 9b67fe8..f7d38c8 100644
--- a/src/com/android/nfc/DeviceHost.java
+++ b/src/com/android/nfc/DeviceHost.java
@@ -306,6 +306,12 @@
 
     public int getDefaultMifareCLTRoute();
 
+    public int getDefaultAidPowerState();
+
+    public int getDefaultDesfirePowerState();
+
+    public int getDefaultMifareCLTPowerState();
+
     public boolean setRoutingEntry(int type, int value, int route, int power);
 
     public boolean clearRoutingEntry(int type);
@@ -359,7 +365,7 @@
 
     int JCOSDownload();
 
-    void doSetVenConfigValue(int VenConfig);
+    void doSetNfcMode(int nfcMode);
 
     String dump();
 
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 50f7cd2..2f88c1c 100644
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -148,6 +148,7 @@
     private static final String NFC_PERM_ERROR = "NFC permission required";
 
     public static final String PREF = "NfcServicePrefs";
+    public static final String NXP_PREF = "NfcServiceNxpPrefs";
 
     static final String PREF_NFC_ON = "nfc_on";
     static final boolean NFC_ON_DEFAULT = true;
@@ -196,8 +197,8 @@
     static final boolean SE_BROADCASTS_WITH_HCE = true;
 
     private static final String PREF_SECURE_ELEMENT_ID = "secure_element_id";
-    public static final int ROUTE_LOC_MASK=3;
-    public static final int TECH_TYPE_MASK=5;
+    public static final int ROUTE_LOC_MASK=5;
+    public static final int TECH_TYPE_MASK=7;
 
     static final int MSG_NDEF_TAG = 0;
     static final int MSG_CARD_EMULATION = 1;
@@ -307,10 +308,6 @@
     public static final int SOUND_END = 1;
     public static final int SOUND_ERROR = 2;
 
-    // for setting VEN_CFG
-    public static final int VEN_CFG_NFC_ON_POWER_ON = 3;
-    public static final int VEN_CFG_NFC_OFF_POWER_OFF = 2;
-
     //ETSI Reader Events
     public static final int ETSI_READER_REQUESTED   = 0;
     public static final int ETSI_READER_START       = 1;
@@ -432,7 +429,9 @@
     Context mContext;
     private DeviceHost mDeviceHost;
     private SharedPreferences mPrefs;
+    private SharedPreferences mNxpPrefs;
     private SharedPreferences.Editor mPrefsEditor;
+    private SharedPreferences.Editor mNxpPrefsEditor;
     private PowerManager.WakeLock mRoutingWakeLock;
     private PowerManager.WakeLock mEeWakeLock;
 
@@ -818,6 +817,8 @@
 
         mPrefs = mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE);
         mPrefsEditor = mPrefs.edit();
+        mNxpPrefs = mContext.getSharedPreferences(NXP_PREF, Context.MODE_PRIVATE);
+        mNxpPrefsEditor = mNxpPrefs.edit();
 
         mState = NfcAdapter.STATE_OFF;
         mIsNdefPushEnabled = mPrefs.getBoolean(PREF_NDEF_PUSH_ON, NDEF_PUSH_ON_DEFAULT);
@@ -1143,11 +1144,11 @@
             }
 
             mNfcSecureElementState =
-                    mPrefs.getBoolean(PREF_SECURE_ELEMENT_ON, SECURE_ELEMENT_ON_DEFAULT);
+                    mNxpPrefs.getBoolean(PREF_SECURE_ELEMENT_ON, SECURE_ELEMENT_ON_DEFAULT);
 
             if (mNfcSecureElementState) {
                 int secureElementId =
-                        mPrefs.getInt(PREF_SECURE_ELEMENT_ID, SECURE_ELEMENT_ID_DEFAULT);
+                        mNxpPrefs.getInt(PREF_SECURE_ELEMENT_ID, SECURE_ELEMENT_ID_DEFAULT);
 
                 if (Se_list != null) {
 
@@ -1530,14 +1531,13 @@
             if(!mPowerShutDown)
             {
                 Log.i(TAG, "Disabling NFC Disabling ESE/UICC");
-                mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_OFF);
                 //Since only Nfc is getting disabled so disable CE from EE.
+                mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_ON);
                 mDeviceHost.doDeselectSecureElement(UICC_ID_TYPE);
                 mDeviceHost.doDeselectSecureElement(SMART_MX_ID_TYPE);
             } else {
                 Log.i(TAG, "Power off : Disabling NFC Disabling ESE/UICC");
                 mPowerShutDown = false;
-                mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_ON);
                 mCardEmulationManager.onPreferredForegroundServiceChanged(null);
             }
 
@@ -1965,9 +1965,9 @@
             mSelectedSeId = 0;
 
             /* store preference */
-            mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, false);
-            mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, 0);
-            mPrefsEditor.apply();
+            mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, false);
+            mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, 0);
+            mNxpPrefsEditor.apply();
 
             return ErrorCodes.SUCCESS;
         }
@@ -1981,9 +1981,9 @@
             NfcPermissions.enforceAdminPermissions(mContext);
             /* store */
             Log.d(TAG, "SE Preference stored");
-            mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
-            mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, seId);
-            mPrefsEditor.apply();
+            mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
+            mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, seId);
+            mNxpPrefsEditor.apply();
         }
 
         @Override
@@ -2022,9 +2022,9 @@
                 }
             }
             /* store */
-            mPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
-            mPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, mSelectedSeId);
-            mPrefsEditor.apply();
+            mNxpPrefsEditor.putBoolean(PREF_SECURE_ELEMENT_ON, true);
+            mNxpPrefsEditor.putInt(PREF_SECURE_ELEMENT_ID, mSelectedSeId);
+            mNxpPrefsEditor.apply();
 
             mNfcSecureElementState = true;
 
@@ -2037,9 +2037,9 @@
             int protoRouteEntry = 0;
             protoRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << 3) : (((routeLoc & 0x03) == 0x02) ? (0x01 << 4) : 0x00) ;
             protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0) );
-            mPrefsEditor = mPrefs.edit();
-            mPrefsEditor.putInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", protoRouteEntry);
-            mPrefsEditor.commit();
+            mNxpPrefsEditor = mNxpPrefs.edit();
+            mNxpPrefsEditor.putInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", protoRouteEntry);
+            mNxpPrefsEditor.commit();
             Log.i(TAG,"MifareDesfireRouteSet function in");
             commitRouting();
         }
@@ -2053,9 +2053,9 @@
                 protoRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0));
                 if(GetDefaultRouteLoc() != routeLoc)
                 {
-                    mPrefsEditor = mPrefs.edit();
-                    mPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", protoRouteEntry );
-                    mPrefsEditor.commit();
+                    mNxpPrefsEditor = mNxpPrefs.edit();
+                    mNxpPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", protoRouteEntry );
+                    mNxpPrefsEditor.commit();
                     mIsRouteForced = true;
                     if (mIsHceCapable) {
                         mAidRoutingManager.onNfccRoutingTableCleared();
@@ -2079,9 +2079,9 @@
             techRouteEntry=((routeLoc & 0x03)== 0x01) ? (0x01 << 3) : (((routeLoc & 0x03) == 0x02) ? (0x01 << 4) : 0x00) ;
             techRouteEntry |= ((fullPower ? 0x01 : 0) | (lowPower ? 0x01 << 1 :0 ) | (noPower ? 0x01 << 2 :0) );
             techRouteEntry |=0x20;
-            mPrefsEditor = mPrefs.edit();
-            mPrefsEditor.putInt("PREF_MIFARE_CLT_ROUTE_ID", techRouteEntry);
-            mPrefsEditor.commit();
+            mNxpPrefsEditor = mNxpPrefs.edit();
+            mNxpPrefsEditor.putInt("PREF_MIFARE_CLT_ROUTE_ID", techRouteEntry);
+            mNxpPrefsEditor.commit();
             commitRouting();
         }
         @Override
@@ -2100,6 +2100,12 @@
         public Map<String,Integer> getServicesAidCacheSize(int userId, String category){
             return mCardEmulationManager.getServicesAidCacheSize(userId, category);
         }
+
+        @Override
+        public int updateServiceState(int userId , Map serviceState) {
+            return mCardEmulationManager.updateServiceState(userId ,serviceState);
+        }
+
         @Override
         public int getSeInterface(int type) throws RemoteException {
             return mDeviceHost.doGetSeInterface(type);
@@ -3137,7 +3143,7 @@
             } else if(cmdType.equals("enableserver")) {
                 if(serviceName.equals(null))
                     return false;
-                mP2pLinkManager.enableExtDtaSnepServer(serviceName, serviceSap, miu, rwSize);
+                mP2pLinkManager.enableExtDtaSnepServer(serviceName, serviceSap, miu, rwSize,testCaseId);
             } else if(cmdType.equals("disableserver")) {
                 mP2pLinkManager.disableExtDtaSnepServer();
             } else if(cmdType.equals("enableclient")) {
@@ -3848,9 +3854,9 @@
         if(mIsRoutingTableDirty) {
             mIsRoutingTableDirty = false;
             //TODO: Take this logic from L_OSP_EXT [PN547C2]
-            int protoRoute = mPrefs.getInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", GetDefaultMifareDesfireRouteEntry());
-            int defaultRoute=mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry());
-            int techRoute=mPrefs.getInt("PREF_MIFARE_CLT_ROUTE_ID", GetDefaultMifateCLTRouteEntry());
+            int protoRoute = mNxpPrefs.getInt("PREF_MIFARE_DESFIRE_PROTO_ROUTE_ID", GetDefaultMifareDesfireRouteEntry());
+            int defaultRoute=mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry());
+            int techRoute=mNxpPrefs.getInt("PREF_MIFARE_CLT_ROUTE_ID", GetDefaultMifateCLTRouteEntry());
             Log.d(TAG, "Set default Route Entry");
             setDefaultRoute(defaultRoute, protoRoute, techRoute);
         }
@@ -3966,11 +3972,12 @@
 
     public void notifyRoutingTableFull()
     {
+        mNxpPrefsEditor = mNxpPrefs.edit();
+        mNxpPrefsEditor.putInt("PREF_SET_AID_ROUTING_TABLE_FULL",0x01);
+        mNxpPrefsEditor.commit();
         //broadcast Aid Routing Table Full intent to the user
-        String ACTION_ROUTING_TABLE_FULL =
-                "com.nxp.action.AID_ROUTING_TABLE_FULL";
         Intent aidTableFull = new Intent();
-        aidTableFull.setAction(ACTION_ROUTING_TABLE_FULL);
+        aidTableFull.setAction(NxpConstants.ACTION_ROUTING_TABLE_FULL);
         if (DBG) {
             Log.d(TAG, "notify aid routing table full to the user");
         }
@@ -3981,11 +3988,11 @@
      */
     public void setDefaultAidRouteLoc( int defaultAidRouteEntry)
     {
-        mPrefsEditor = mPrefs.edit();
+        mNxpPrefsEditor = mNxpPrefs.edit();
         Log.d(TAG, "writing to preferences setDefaultAidRouteLoc  :" + defaultAidRouteEntry);
-        mPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", (defaultAidRouteEntry << 0x03 )| ROUTE_SWITCH_ON );
-        mPrefsEditor.commit();
-        int defaultRoute=mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID",0xFF);
+        mNxpPrefsEditor.putInt("PREF_SET_DEFAULT_ROUTE_ID", ((defaultAidRouteEntry << ROUTE_LOC_MASK)| (mDeviceHost.getDefaultAidPowerState() & 0x1F)));
+        mNxpPrefsEditor.commit();
+        int defaultRoute=mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID",0xFF);
         Log.d(TAG, "reading preferences from user  :" + defaultRoute);
     }
 
@@ -4017,7 +4024,7 @@
      */
     public int GetDefaultRouteLoc()
     {
-        int defaultRouteLoc = mPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry()) >> ROUTE_LOC_MASK;
+        int defaultRouteLoc = mNxpPrefs.getInt("PREF_SET_DEFAULT_ROUTE_ID", GetDefaultRouteEntry()) >> ROUTE_LOC_MASK;
         Log.d(TAG, "GetDefaultRouteLoc  :" + defaultRouteLoc);
         return defaultRouteLoc ;
     }
@@ -4029,7 +4036,7 @@
     {
         //return ((ROUTE_ID_UICC << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF) ;
         Log.d(TAG, "GetDefaultMifareDesfireRouteEntry :" + mDeviceHost.getDefaultDesfireRoute() );
-        return ((mDeviceHost.getDefaultDesfireRoute() << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF) ;
+        return ((mDeviceHost.getDefaultDesfirePowerState() & 0x1F) | (mDeviceHost.getDefaultDesfireRoute() << ROUTE_LOC_MASK)) ;
     }
     /**
      * set default Aid route entry in case application does not configure this route entry
@@ -4037,7 +4044,7 @@
 
     public int GetDefaultRouteEntry()
     {
-        int defaultAidRoute = ((mDeviceHost.getDefaultAidRoute()<< ROUTE_LOC_MASK) | ROUTE_SWITCH_ON);
+        int defaultAidRoute = ((mDeviceHost.getDefaultAidPowerState() & 0x1F) | (mDeviceHost.getDefaultAidRoute()<< ROUTE_LOC_MASK));
         Log.d(TAG, "GetDefaultRouteEntry :" + defaultAidRoute );
         return defaultAidRoute;
     }
@@ -4049,7 +4056,7 @@
     {
         //return ((ROUTE_ID_UICC << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF | (TECH_TYPE_A << TECH_TYPE_MASK)) ;
         Log.d(TAG, "getDefaultMifareCLTRoute :" + mDeviceHost.getDefaultMifareCLTRoute() );
-        return ((mDeviceHost.getDefaultMifareCLTRoute() << ROUTE_LOC_MASK ) | ROUTE_SWITCH_ON | ROUTE_SWITCH_OFF | (TECH_TYPE_A << TECH_TYPE_MASK)) ;
+        return ((mDeviceHost.getDefaultMifareCLTPowerState() & 0x1F) | (mDeviceHost.getDefaultMifareCLTRoute() << ROUTE_LOC_MASK) | (TECH_TYPE_A << TECH_TYPE_MASK)) ;
     }
 
     public boolean setDefaultRoute(int defaultRouteEntry, int defaultProtoRouteEntry, int defaultTechRouteEntry) {
@@ -4058,7 +4065,7 @@
     }
 
     public int getDefaultRoute() {
-        return mPrefs.getInt(PREF_DEFAULT_ROUTE_ID, DEFAULT_ROUTE_ID_DEFAULT);
+        return mNxpPrefs.getInt(PREF_DEFAULT_ROUTE_ID, DEFAULT_ROUTE_ID_DEFAULT);
     }
 
 
@@ -4070,6 +4077,11 @@
         mHandler.sendEmptyMessage(MSG_COMMITED_FELICA_ROUTING);
     }
 
+    public int getAidRoutingTableStatus() {
+        int aidTableStatus = 0x00;
+        aidTableStatus = mNxpPrefs.getInt("PREF_SET_AID_ROUTING_TABLE_FULL",0x00);
+        return aidTableStatus;
+    }
 
     public void routeNfcid2(String nfcid2, String syscode, String optparam) {
         Message msg = mHandler.obtainMessage();
@@ -4779,8 +4791,28 @@
         private void sendMultiEvtBroadcast(Intent intent) {
 
             ArrayList<String> packageList = mNxpNfcController.getEnabledMultiEvtsPackageList();
+            ComponentName unicastComponent = null;
             if(packageList.size() == 0) {
                 Log.d(TAG, "No packages to send broadcast.");
+                unicastComponent = mNxpNfcController.getUnicastPackage();
+                if(unicastComponent != null)
+                {
+                    intent.setComponent(unicastComponent);
+                    try {
+                        //start gsma
+                        Log.d(TAG, "Starting activity uincast Pkg"+unicastComponent.flattenToString());
+                        intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        if(mContext.getPackageManager().resolveActivity(intent, 0) != null)
+                        {
+                            mContext.startActivity(intent);
+                        } else {
+                            Log.d(TAG, "Intent not resolved");
+                        }
+                    } catch (Exception e) {
+                        if (DBG) Log.d(TAG, "Exception: " + e.getMessage());
+                    }
+                }
                 return;
             }
 
@@ -5041,6 +5073,7 @@
             } else if(action.equals(Intent.ACTION_SHUTDOWN)) {
                 mPowerShutDown = true;
                 Log.d(TAG,"Device is shutting down.");
+                mDeviceHost.doSetScreenOrPowerState(ScreenStateHelper.POWER_STATE_OFF);
             }
         }
     };
diff --git a/src/com/android/nfc/P2pLinkManager.java b/src/com/android/nfc/P2pLinkManager.java
index 5e18eb6..c44818f 100644
--- a/src/com/android/nfc/P2pLinkManager.java
+++ b/src/com/android/nfc/P2pLinkManager.java
@@ -338,17 +338,17 @@
      /**
      * To Enable DTA SNEP Server for NFC Forum testing
      */
-    public void enableExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize)
+    public void enableExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize,int testCaseId)
     {
         if (DBG) Log.d(TAG, "Enabling Extended DTA Server");
         mServiceName = serviceName;
         mServiceSap = serviceSap;
         mDtaMiu = miu;
         mDtaRwSize  = rwSize;
-        mTestCaseID = 0;
+        mTestCaseID = testCaseId;
         synchronized (this) {
             if(mExtDtaSnepServer == null)
-            mExtDtaSnepServer = new ExtDtaSnepServer(mServiceName, mServiceSap, mDtaMiu, mDtaRwSize, mExtDtaSnepServerCallback,mContext);
+            mExtDtaSnepServer = new ExtDtaSnepServer(mServiceName, mServiceSap, mDtaMiu, mDtaRwSize, mExtDtaSnepServerCallback,mContext, mTestCaseID);
             mExtDtaSnepServer.start();
             mExtDtaSnepServerRunning = true;
         }
diff --git a/src/com/android/nfc/cardemulation/AidRoutingManager.java b/src/com/android/nfc/cardemulation/AidRoutingManager.java
index 86c6047..eed1579 100644
--- a/src/com/android/nfc/cardemulation/AidRoutingManager.java
+++ b/src/com/android/nfc/cardemulation/AidRoutingManager.java
@@ -87,7 +87,8 @@
     // see AID_MATCHING constants
     final int mAidMatchingSupport;
     final int mAidMatchingPlatform;
-    final int mAidRoutingTableSize;
+    //Changed from final to private int to update RoutingtableSize later in configureRouting.
+    private int mAidRoutingTableSize;
     // Maximum AID routing table size
     final Object mLock = new Object();
 
@@ -118,8 +119,6 @@
         mAidMatchingSupport = doGetAidMatchingMode();
         if (DBG) Log.d(TAG, "mAidMatchingSupport=0x" + Integer.toHexString(mAidMatchingSupport));
         mAidMatchingPlatform = doGetAidMatchingPlatform();
-        if (DBG) Log.d(TAG, "mAidMatchingPlatform=0x" + Integer.toHexString(mAidMatchingPlatform));
-        mAidRoutingTableSize = NfcService.getInstance().getAidRoutingTableSize();
         if (DBG) Log.d(TAG, "mAidTableSize=0x" + Integer.toHexString(mAidRoutingTableSize));
         mVzwRoutingCache = new VzwRoutingCache();
     }
@@ -137,6 +136,8 @@
     public boolean configureRouting(HashMap<String, AidElement> aidMap) {
         mDefaultRoute = NfcService.getInstance().GetDefaultRouteLoc();
         boolean aidRouteResolved = false;
+        if (DBG) Log.d(TAG, "mAidMatchingPlatform=0x" + Integer.toHexString(mAidMatchingPlatform));
+        mAidRoutingTableSize = NfcService.getInstance().getAidRoutingTableSize();
         if (DBG) Log.d(TAG, "mDefaultRoute=0x" + Integer.toHexString(mDefaultRoute));
         Hashtable<String, AidElement> routeCache = new Hashtable<String, AidElement>(50);
         SparseArray<Set<String>> aidRoutingTable = new SparseArray<Set<String>>(aidMap.size());
diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java
index 5f0214e..481a284 100644
--- a/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -463,4 +463,11 @@
         //Add dynamic non-payment services
         return nonPaymentServiceAidCacheSize;
     }
+
+    public int updateServiceState(int userId ,
+            Map<String , Boolean> serviceState) {
+        NfcPermissions.validateUserId(userId);
+        NfcPermissions.enforceUserPermissions(mContext);
+        return mServiceCache.updateServiceState(userId ,Binder.getCallingUid() ,serviceState);
+    }
 }
diff --git a/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java b/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
index c8f2e51..e3c06c9 100644
--- a/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
+++ b/src/com/android/nfc/cardemulation/Nfcid2RoutingManager.java
@@ -41,7 +41,7 @@
 import com.android.nfc.NfcService;
 import com.android.nfc.cardemulation.Nfcid2RoutingCache;
 
-import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.cardemulation.NQApduServiceInfo;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -65,7 +65,7 @@
     // For Nexus devices, just a static route to the eSE
     // OEMs/Carriers could manually map off-host AIDs
     // to the correct eSE/UICC based on state they keep.
-//    static final int DEFAULT_OFFHOST_ROUTE = ApduServiceInfo.SECURE_ELEMENT_ROUTE_UICC;
+//    static final int DEFAULT_OFFHOST_ROUTE = NQApduServiceInfo.SECURE_ELEMENT_ROUTE_UICC;
 
     final Object mLock = new Object();
 
diff --git a/src/com/android/nfc/cardemulation/RegisteredAidCache.java b/src/com/android/nfc/cardemulation/RegisteredAidCache.java
index 8121d44..475d4e4 100644
--- a/src/com/android/nfc/cardemulation/RegisteredAidCache.java
+++ b/src/com/android/nfc/cardemulation/RegisteredAidCache.java
@@ -410,6 +410,11 @@
                 ServiceAidInfo serviceAidInfo = new ServiceAidInfo();
                 serviceAidInfo.service = service;
                 serviceAidInfo.category = service.getCategoryForAid(aid);
+                if( serviceAidInfo.category == CardEmulation.CATEGORY_OTHER &&
+                    service.getServiceState(CardEmulation.CATEGORY_OTHER) == false) {
+                    Log.e(TAG, "ignoring other category aid because service category disabled");
+                    continue;
+                }
                 //NXP specific, Adding prefix (*) to all off host aid for prefix match.
                 if (mRoutingManager.getAidMatchingPlatform() == AidRoutingManager.AID_MATCHING_K
                         && !service.isOnHost() && !aid.endsWith("*")) {
diff --git a/src/com/android/nfc/cardemulation/RegisteredServicesCache.java b/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
index fd9161b..e2c64cf 100644
--- a/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
+++ b/src/com/android/nfc/cardemulation/RegisteredServicesCache.java
@@ -63,6 +63,7 @@
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
 import com.gsma.nfc.internal.RegisteredNxpServicesCache;
+import com.android.nfc.NfcService;
 
 /**
  * This class is inspired by android.content.pm.RegisteredServicesCache
@@ -86,7 +87,7 @@
     final SparseArray<UserServices> mUserServices = new SparseArray<UserServices>();
     final Callback mCallback;
     final AtomicFile mDynamicAidsFile;
-
+    final AtomicFile mServiceStateFile;
     //public ArrayList<NQApduServiceInfo> mAllServices = new ArrayList<NQApduServiceInfo>();
     final HashMap<ComponentName, NQApduServiceInfo> mAllServices = Maps.newHashMap();
 
@@ -177,6 +178,7 @@
 
         File dataDir = mContext.getFilesDir();
         mDynamicAidsFile = new AtomicFile(new File(dataDir, "dynamic_aids.xml"));
+        mServiceStateFile = new AtomicFile(new File(dataDir, "service_state.xml"));
     }
 
     void initialize(RegisteredNxpServicesCache registeredNxpServicesCache) {
@@ -353,6 +355,8 @@
                 // Persist to filesystem
                 writeDynamicAidsLocked();
             }
+            updateServiceStateFromFile(userId);
+            writeServiceStateToFile(userId);
         }
 
         mCallback.onServicesUpdated(userId, Collections.unmodifiableList(validServices));
@@ -475,8 +479,185 @@
         }
     }
 
+    private void updateServiceStateFromFile(int currUserId)
+    {
+        FileInputStream fis = null;
+        try {
+             if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+                 Log.e(TAG, " Aid Routing Table still  availble , No need to disable services");
+                 return;
+             }
+             if(!mServiceStateFile.getBaseFile().exists()) {
+                 Log.d(TAG,"mServiceStateFile does not exist");
+                 return;
+             }
+             fis = mServiceStateFile.openRead();
+             XmlPullParser parser = Xml.newPullParser();
+             parser.setInput(fis , null);
+             int eventType = parser.getEventType();
+             int currUid = -1;
+             ComponentName currComponent = null;
+             HashMap<ComponentName ,NQApduServiceInfo> nxpOffHostServiceMap = mRegisteredNxpServicesCache.getApduservicesMaps();
+             boolean state = true;
+             while (eventType != XmlPullParser.START_TAG &&
+                     eventType != XmlPullParser.END_DOCUMENT) {
+                 eventType = parser.next();
+             }
+             String tagName = parser.getName();
+             if ("services".equals(tagName)) {
+                 while (eventType != XmlPullParser.END_DOCUMENT) {
+                     tagName = parser.getName();
+                     if (eventType == XmlPullParser.START_TAG) {
+                         if("service".equals(tagName) && parser.getDepth() == 0x02) {
+                             String compString  = parser.getAttributeValue(null ,"component");
+                             String uidString   = parser.getAttributeValue(null ,"uid");
+                             String stateString = parser.getAttributeValue(null ,"serviceState");
+                             if(compString == null || uidString == null || stateString == null) {
+                                 Log.e(TAG, "Invalid service attributes");
+                             } else {
+                                try {
+                                    currUid       = Integer.parseInt(uidString);
+                                    currComponent = ComponentName.unflattenFromString(compString);
+                                    Log.d(TAG, " curr component "+compString);
+                                    Log.d(TAG, " curr uid "+uidString);
+                                    Log.d(TAG, " curr state "+stateString);
+                                    if(stateString.equalsIgnoreCase("false")) { state = false;}
+                                } catch (NumberFormatException e) {
+                                    Log.e(TAG, "could not parse the service attributes");
+                                }
+                             }
+                         }
+                     } else  if (eventType == XmlPullParser.END_TAG) {
+                         if("service".equals(tagName)) {
+                             final int userId = UserHandle.getUserId(currUid);
+                             if(currUserId == userId) {
+                                 UserServices serviceCache = findOrCreateUserLocked(userId);
+                                 NQApduServiceInfo serviceInfo = serviceCache.services.get(currComponent);
+                                 if(serviceInfo == null) {
+                                 // CHECK for GSMA related services also.
+                                     serviceInfo = nxpOffHostServiceMap.get(currComponent);
+                                     if(serviceInfo == null) {
+                                         Log.e(TAG, "could not find the required serviceInfo");
+                                     } else serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER ,state);
+                                 } else   serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER ,state);
+                             }
+                         }
+                         currUid       = -1;
+                         currComponent = null;
+                         state         = true;
+                     }
+
+                     eventType = parser.next();
+                 }
+             }
+        } catch(Exception e) {
+            mServiceStateFile.delete();
+            Log.e(TAG, "could not parse the seriveState file , thrashing the file");
+        } finally {
+            try {
+                if(fis != null) {
+                    fis.close();
+                }
+            } catch ( Exception e) {
+            }
+        }
+    }
+
+    private boolean writeServiceStateToFile(int currUserId) {
+        FileOutputStream fos = null;
+        ArrayList<NQApduServiceInfo> nxpOffHostServiceCache = mRegisteredNxpServicesCache.getApduservicesList();
+        if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+            Log.e(TAG, " Aid Routing Table still  availble , No need to disable services");
+            return false;
+        }
+        if(currUserId != ActivityManager.getCurrentUser()) {
+            return false;
+        }
+        try {
+            fos = mServiceStateFile.startWrite();
+            XmlSerializer out = new FastXmlSerializer();
+            out.setOutput(fos, "utf-8");
+            out.startDocument(null , true);
+            out.setFeature(XML_INDENT_OUTPUT_FEATURE, true);
+            out.startTag(null ,"services");
+            for(int userId = 0; userId < mUserServices.size(); userId++) {
+                final UserServices userServices = mUserServices.valueAt(userId);
+                for (NQApduServiceInfo serviceInfo : userServices.services.values()) {
+                    if(!serviceInfo.hasCategory(CardEmulation.CATEGORY_OTHER)) {
+                        continue;
+                    }
+                    out.startTag(null ,"service");
+                    out.attribute(null, "component", serviceInfo.getComponent().flattenToString());
+                    Log.d(TAG,"component name"+ serviceInfo.getComponent().flattenToString());
+                    out.attribute(null, "uid", Integer.toString(serviceInfo.getUid()));
+                    Log.d(TAG,"uid name"+ Integer.toString(serviceInfo.getUid()));
+                    out.attribute(null, "serviceState", Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+                    Log.d(TAG,"curr name"+ Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+                    out.endTag(null, "service");
+                }
+            }
+            dump(nxpOffHostServiceCache);
+            //ADD GSMA services Cache
+            for(NQApduServiceInfo serviceInfo : nxpOffHostServiceCache) {
+                out.startTag(null ,"service");
+                out.attribute(null, "component", serviceInfo.getComponent().flattenToString());
+                Log.d(TAG,"component name"+ serviceInfo.getComponent().flattenToString());
+                out.attribute(null, "uid", Integer.toString(serviceInfo.getUid()));
+                Log.d(TAG,"uid name"+ Integer.toString(serviceInfo.getUid()));
+                out.attribute(null, "serviceState", Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+                Log.d(TAG,"curr name"+ Boolean.toString(serviceInfo.getServiceState(CardEmulation.CATEGORY_OTHER)));
+                out.endTag(null, "service");
+            }
+            out.endTag(null ,"services");
+            out.endDocument();
+            mServiceStateFile.finishWrite(fos);
+            return true;
+        } catch ( Exception e){
+            Log.e(TAG,"Failed to write serviceStateFile xml");
+            e.printStackTrace();
+            if (fos != null) {
+                mServiceStateFile.failWrite(fos);
+            }
+            return false;
+        }
+    }
+
+    public int updateServiceState(int userId , int uid,
+            Map<String , Boolean> serviceState) {
+        boolean success = false;
+        HashMap<ComponentName ,NQApduServiceInfo> nxpOffHostServiceMap = mRegisteredNxpServicesCache.getApduservicesMaps();
+        if(NfcService.getInstance().getAidRoutingTableStatus() == 0x00) {
+            Log.e(TAG, " Aid Routing Table still  availble , No need to disable services");
+            return 0xFF;
+        }
+        synchronized(mLock) {
+            Iterator<Map.Entry<String , Boolean>> it =
+                    serviceState.entrySet().iterator();
+            while(it.hasNext()) {
+                Map.Entry<String , Boolean> entry =
+                        (Map.Entry<String , Boolean>) it.next();
+                ComponentName componentName = ComponentName.unflattenFromString(entry.getKey());
+                NQApduServiceInfo serviceInfo = getService(userId, componentName);
+                Log.e(TAG, "updateServiceState " + entry.getKey());
+                Log.e(TAG, "updateServiceState  " + entry.getValue());
+                if (serviceInfo != null) {
+                    serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER, entry.getValue());
+                } else if ((serviceInfo = nxpOffHostServiceMap.get(componentName)) != null) {
+                      // CHECK for GSMA cache
+                      serviceInfo.setServiceState(CardEmulation.CATEGORY_OTHER, entry.getValue());
+                } else {
+                      Log.e(TAG, "Could not find service " + componentName);
+                      return 0xFF;
+                }
+            }
+            success = writeServiceStateToFile(userId);
+        }
+        invalidateCache(ActivityManager.getCurrentUser());
+        return (success?0x00:0xFF);
+    }
+
     public boolean registerAidGroupForService(int userId, int uid,
-            ComponentName componentName, NQAidGroup aidGroup) {
+            ComponentName componentName, NQAidGroup nqaidGroup) {
         ArrayList<NQApduServiceInfo> newServices = null;
         boolean success;
         synchronized (mLock) {
@@ -497,27 +678,27 @@
             }
             // Do another AID validation, since a caller could have thrown in a modified
             // NQAidGroup object with invalid AIDs over Binder.
-            List<String> aids = aidGroup.getAids();
+            List<String> aids = nqaidGroup.getAids();
             for (String aid : aids) {
                 if (!CardEmulation.isValidAid(aid)) {
                     Log.e(TAG, "AID " + aid + " is not a valid AID");
                     return false;
                 }
             }
-            serviceInfo.setOrReplaceDynamicNQAidGroup(aidGroup);
+            serviceInfo.setOrReplaceDynamicNQAidGroup(nqaidGroup);
             DynamicAids dynAids = services.dynamicAids.get(componentName);
             if (dynAids == null) {
                 dynAids = new DynamicAids(uid);
                 services.dynamicAids.put(componentName, dynAids);
             }
-            dynAids.aidGroups.put(aidGroup.getCategory(), aidGroup);
+            dynAids.aidGroups.put(nqaidGroup.getCategory(), nqaidGroup);
             success = writeDynamicAidsLocked();
             if (success) {
                 newServices = new ArrayList<NQApduServiceInfo>(services.services.values());
             } else {
                 Log.e(TAG, "Failed to persist AID group.");
                 // Undo registration
-                dynAids.aidGroups.remove(aidGroup.getCategory());
+                dynAids.aidGroups.remove(nqaidGroup.getCategory());
             }
         }
         if (success) {
diff --git a/src/com/android/nfc/snep/SnepMessenger.java b/src/com/android/nfc/snep/SnepMessenger.java
index 81053e2..5cd60bc 100644
--- a/src/com/android/nfc/snep/SnepMessenger.java
+++ b/src/com/android/nfc/snep/SnepMessenger.java
@@ -37,6 +37,7 @@
 import com.android.nfc.DeviceHost.LlcpSocket;
 import com.android.nfc.NfcService;
 import com.android.nfc.sneptest.DtaSnepClient;
+import com.android.nfc.sneptest.ExtDtaSnepServer;
 
 import android.nfc.FormatException;
 import android.util.Log;
@@ -129,7 +130,7 @@
             mSocket.send(tmpBuffer);
 
             if(NfcService.mIsDtaMode) {
-                if((!mIsClient)&&(DtaSnepClient.mTestCaseId == 0x01)){
+                if((!mIsClient)&&(ExtDtaSnepServer.mTestCaseId == 0x01)){
                     mSocket.receive(responseBytes);
                     try {
                         snepResponse = SnepMessage.fromByteArray(responseBytes);
diff --git a/src/com/android/nfc/sneptest/ExtDtaSnepServer.java b/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
index 46672a5..5e25631 100644
--- a/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
+++ b/src/com/android/nfc/sneptest/ExtDtaSnepServer.java
@@ -45,6 +45,7 @@
     final int mDtaMiu;
     final int mDtaRwSize;
     public static Context mContext;
+    public static int mTestCaseId;
 
     /** Protected by 'this', null when stopped, non-null when running */
     ServerThread mServerThread = null;
@@ -58,7 +59,7 @@
     }
 
     // for NFC Forum SNEP DTA
-    public ExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize, Callback callback,Context mContext)
+    public ExtDtaSnepServer(String serviceName, int serviceSap, int miu, int rwSize, Callback callback,Context mContext,int testCaseId)
     {
         mExtDtaSnepServerCallback = callback;
         mDtaServiceName = serviceName;
@@ -66,6 +67,7 @@
         mDtaFragmentLength = -1; // to get remote MIU
         mDtaMiu = miu;
         mDtaRwSize = rwSize;
+        mTestCaseId = testCaseId;
         dtaServiceConnector=new DtaServiceConnector(mContext);
         dtaServiceConnector.bindService();
     }