Reconcile with gingerbread-release gingerbread-mr4-release

Change-Id: Ibcd6e2299e3f03df1a5320041404a42a20546a57
diff --git a/Android.mk b/Android.mk
index 2ae7f39..2c2220b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,7 +6,6 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_PRELINK_MODULE := false
 LOCAL_ARM_MODE := arm
 
 #phLibNfc
@@ -105,27 +104,23 @@
 LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_i2c.c
 LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_messageQueueLib.c
 
-# Really verbose:
-#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DDEBUG -DNFC_TIMER_CONTEXT -DDAL_TRACE -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
-# Just show I2C traffic:
-#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DNFC_TIMER_CONTEXT -DINCLUDE_DALINIT_DEINIT -DLOW_LEVEL_TRACES -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
-# Quiet:
-LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DNFC_TIMER_CONTEXT -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -fpic
-ifeq ($(TARGET_ARCH),arm)
-LOCAL_CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common
-endif
+LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -fno-strict-aliasing
 
-ifeq ($(NFC_BUILD_VARIANT),debug)
-LOCAL_CFLAGS += -DDEBUG -D_DEBUG
-LOCAL_CFLAGS += -O0 -g
-$(info DEBUG)
-endif
-ifeq ($(NFC_BUILD_VARIANT),release)
-LOCAL_CFLAGS += -DNDEBUG
-LOCAL_CFLAGS += -Os
-LOCAL_CFLAGS += -Wl,-s
-$(info RELEASE)
-endif
+# Uncomment for Chipset command/responses
+# Or use "setprop debug.nfc.LOW_LEVEL_TRACES" at run-time
+# LOCAL_CFLAGS += -DLOW_LEVEL_TRACES
+
+# Uncomment for DAL traces
+# LOCAL_CFLAGS += -DDEBUG -DDAL_TRACE
+
+# Uncomment for LLC traces
+# LOCAL_CFLAGS += -DDEBUG -DLLC_TRACE
+
+# Uncomment for LLCP traces
+# LOCAL_CFLAGS += -DDEBUG -DLLCP_TRACE
+
+# Uncomment for HCI traces
+# LOCAL_CFLAGS += -DDEBUG -DHCI_TRACE
 
 #includes
 LOCAL_CFLAGS += -I$(LOCAL_PATH)/inc
@@ -144,8 +139,6 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_PRELINK_MODULE := false
-
 LOCAL_SRC_FILES += src/phFriNfc_NdefRecord.c
 
 LOCAL_CFLAGS += -I$(LOCAL_PATH)/inc
@@ -156,4 +149,3 @@
 LOCAL_SHARED_LIBRARIES := libcutils
 
 include $(BUILD_SHARED_LIBRARY)
-
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..5a4aac6
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,53 @@
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libnfc_intermediates/)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libnfc_ndef_intermediates/)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libnfc.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libnfc_ndef.so)
diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c
index ec92566..9bedaf9 100644
--- a/Linux_x86/phDal4Nfc.c
+++ b/Linux_x86/phDal4Nfc.c
@@ -33,6 +33,8 @@
 #include <stdlib.h>
 #ifdef ANDROID
 #include <linux/ipc.h>
+#include <cutils/log.h>
+#include <cutils/properties.h> // for property_get
 #else
 #include <sys/msg.h>
 #endif
@@ -98,6 +100,7 @@
 static pphDal4Nfc_SContext_t          pgDalContext;
 static phHal_sHwReference_t   *       pgDalHwContext;
 static sem_t                          nfc_read_sem;
+static int                            low_level_traces;
 #ifdef USE_MQ_MESSAGE_QUEUE
 static phDal4Nfc_DeferredCall_Msg_t   nDeferedMessage;
 static mqd_t                          nDeferedCallMessageQueueId;
@@ -117,6 +120,31 @@
                                 DAL API IMPLEMENTATION
 ------------------------------------------------------------------------------------*/
 
+static void refresh_low_level_traces() {
+#ifdef LOW_LEVEL_TRACES
+    low_level_traces = 1;
+    return;
+#else
+
+#ifdef ANDROID
+    char value[PROPERTY_VALUE_MAX];
+
+    property_get("ro.debuggable", value, "");
+    if (!value[0] || !atoi(value)) {
+        low_level_traces = 0;  // user build, do not allow debug
+        return;
+    }
+
+    property_get("debug.nfc.LOW_LEVEL_TRACES", value, "");
+    if (value[0]) {
+        low_level_traces = atoi(value) ? 1 : 0;
+        return;
+    }
+#endif
+    low_level_traces = 0;
+#endif
+}
+
 /*-----------------------------------------------------------------------------
 
 FUNCTION: phDal4Nfc_Register
@@ -216,6 +244,8 @@
 {
     NFCSTATUS        result = NFCSTATUS_SUCCESS;
 
+    refresh_low_level_traces();
+
     if ((NULL != pContext) && (NULL != pHwRef))
     {
         pContext  = pgDalContext;
@@ -530,7 +560,6 @@
          gLinkFunc.open_and_configure = phDal4Nfc_uart_open_and_configure;
          gLinkFunc.read               = phDal4Nfc_uart_read;
          gLinkFunc.write              = phDal4Nfc_uart_write;
-         gLinkFunc.download           = phDal4Nfc_uart_download;
          gLinkFunc.reset              = phDal4Nfc_uart_reset;
       }
       break;
@@ -605,7 +634,7 @@
 {
    NFCSTATUS	retstatus = NFCSTATUS_SUCCESS;
 
-   DAL_DEBUG("phDal4Nfc_Reset: VEN to %d",level);
+   DAL_DEBUG("phDal4Nfc_Reset: VEN to %ld",level);
 
    retstatus = gLinkFunc.reset(level);
 
@@ -720,17 +749,19 @@
     else
     {
         i2c_error_count = 0;
-#ifdef LOW_LEVEL_TRACES
-        phOsalNfc_PrintData("Received buffer", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
-#endif
+
+        if (low_level_traces)
+        {
+             phOsalNfc_PrintData("RECV", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
+        }
         DAL_DEBUG("RX Thread Read ok. nbToRead=%d\n", gReadWriteContext.nNbOfBytesToRead);
         DAL_DEBUG("RX Thread NbReallyRead=%d\n", gReadWriteContext.nNbOfBytesRead);
-        DAL_PRINT("RX Thread ReadBuff[]={ ");
+/*      DAL_PRINT("RX Thread ReadBuff[]={ ");
         for (i = 0; i < gReadWriteContext.nNbOfBytesRead; i++)
         {
           DAL_DEBUG("RX Thread 0x%x ", gReadWriteContext.pReadBuffer[i]);
         }
-        DAL_PRINT("RX Thread }\n");
+        DAL_PRINT("RX Thread }\n"); */
 
         /* read completed immediately */
         sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
@@ -867,9 +898,10 @@
         case PHDAL4NFC_WRITE_MESSAGE:
             DAL_PRINT(" Dal deferred write called \n");
 
-#ifdef LOW_LEVEL_TRACES
-            phOsalNfc_PrintData("Send buffer", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, gReadWriteContext.pWriteBuffer);
-#endif
+            if(low_level_traces)
+            {
+                phOsalNfc_PrintData("SEND", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, gReadWriteContext.pWriteBuffer);
+            }
 
             /* DAL_DEBUG("dalMsg->transactInfo.length : %d\n", dalMsg->transactInfo.length); */
             /* Make a Physical WRITE */
@@ -894,12 +926,12 @@
                 DAL_PRINT(" Physical Write Success \n"); 
 	        TransactionInfo.length=(uint16_t)gReadWriteContext.nNbOfBytesWritten;
 	        TransactionInfo.status=NFCSTATUS_SUCCESS;
-                DAL_PRINT("WriteBuff[]={ ");
+/*              DAL_PRINT("WriteBuff[]={ ");
                 for (i = 0; i < gReadWriteContext.nNbOfBytesWritten; i++)
                 {
                   DAL_DEBUG("0x%x ", gReadWriteContext.pWriteBuffer[i]);
                 }
-                DAL_PRINT("}\n");
+                DAL_PRINT("}\n"); */
 
 		// Free TempWriteBuffer 
 		if(gReadWriteContext.pTempWriteBuffer != NULL)
diff --git a/Linux_x86/phDal4Nfc_i2c.c b/Linux_x86/phDal4Nfc_i2c.c
index 2d0e113..72da8e7 100644
--- a/Linux_x86/phDal4Nfc_i2c.c
+++ b/Linux_x86/phDal4Nfc_i2c.c
@@ -23,7 +23,7 @@
  */
 
 #define LOG_TAG "NFC_i2c"
-#include <utils/Log.h>
+#include <cutils/log.h>
 
 #include <stdlib.h>
 #include <unistd.h>
@@ -31,6 +31,7 @@
 #include <termios.h>
 #include <sys/ioctl.h>
 #include <sys/select.h>
+#include <errno.h>
 
 #include <phDal4Nfc_debug.h>
 #include <phDal4Nfc_i2c.h>
@@ -188,20 +189,49 @@
 
 int phDal4Nfc_i2c_read(uint8_t * pBuffer, int nNbBytesToRead)
 {
-   int ret;
-   DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "read called but not opened!");
+    int ret;
+    int numRead = 0;
+    struct timeval tv;
+    fd_set rfds;
 
-   DAL_DEBUG("Reading %d bytes\n", nNbBytesToRead);
-   ret = read(gI2cPortContext.nHandle, pBuffer, nNbBytesToRead);
-   if (ret < 0)
-   {
-      DAL_DEBUG("Read failed: read() returned %d\n", ret);
-   }
-   else
-   {
-      DAL_DEBUG("Read succeed (%d bytes)\n", ret);
-   }
-   return ret;
+    DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "read called but not opened!");
+    DAL_DEBUG("_i2c_read() called to read %d bytes", nNbBytesToRead);
+
+    // Read with 2 second timeout, so that the read thread can be aborted
+    // when the pn544 does not respond and we need to switch to FW download
+    // mode. This should be done via a control socket instead.
+    while (numRead < nNbBytesToRead) {
+        FD_ZERO(&rfds);
+        FD_SET(gI2cPortContext.nHandle, &rfds);
+        tv.tv_sec = 2;
+        tv.tv_usec = 0;
+        ret = select(gI2cPortContext.nHandle + 1, &rfds, NULL, NULL, &tv);
+        if (ret < 0) {
+            DAL_DEBUG("select() errno=%d", errno);
+            if (errno == EINTR || errno == EAGAIN) {
+                continue;
+            }
+            return -1;
+        } else if (ret == 0) {
+            DAL_PRINT("timeout!");
+            return -1;
+        }
+        ret = read(gI2cPortContext.nHandle, pBuffer + numRead, nNbBytesToRead - numRead);
+        if (ret > 0) {
+            DAL_DEBUG("read %d bytes", ret);
+            numRead += ret;
+        } else if (ret == 0) {
+            DAL_PRINT("_i2c_read() EOF");
+            return -1;
+        } else {
+            DAL_DEBUG("_i2c_read() errno=%d", errno);
+            if (errno == EINTR || errno == EAGAIN) {
+                continue;
+            }
+            return -1;
+        }
+    }
+    return numRead;
 }
 
 /*-----------------------------------------------------------------------------
@@ -215,23 +245,32 @@
 
 int phDal4Nfc_i2c_write(uint8_t * pBuffer, int nNbBytesToWrite)
 {
-   int ret;
-   DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "write called but not opened!");
+    int ret;
+    int numWrote = 0;
 
-   DAL_DEBUG("Writing %d bytes\n", nNbBytesToWrite);
-   ret = write(gI2cPortContext.nHandle, pBuffer, nNbBytesToWrite);
-   if (ret < 0)
-   {
-      DAL_DEBUG("Write failed: write() returned %d \n", ret);
-   }
-   else
-   {
-      DAL_DEBUG("Write succeed (%d bytes)\n", ret);
-   }
-   return ret;
+    DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "write called but not opened!");
+    DAL_DEBUG("_i2c_write() called to write %d bytes\n", nNbBytesToWrite);
+
+    while (numWrote < nNbBytesToWrite) {
+        ret = write(gI2cPortContext.nHandle, pBuffer + numWrote, nNbBytesToWrite - numWrote);
+        if (ret > 0) {
+            DAL_DEBUG("wrote %d bytes", ret);
+            numWrote += ret;
+        } else if (ret == 0) {
+            DAL_PRINT("_i2c_write() EOF");
+            return -1;
+        } else {
+            DAL_DEBUG("_i2c_write() errno=%d", errno);
+            if (errno == EINTR || errno == EAGAIN) {
+                continue;
+            }
+            return -1;
+        }
+    }
+
+    return numWrote;
 }
 
-
 /*-----------------------------------------------------------------------------
 
 FUNCTION: phDal4Nfc_i2c_reset
@@ -241,26 +280,7 @@
 -----------------------------------------------------------------------------*/
 int phDal4Nfc_i2c_reset(long level)
 {
-   int ret = NFCSTATUS_SUCCESS;   
+    DAL_DEBUG("phDal4Nfc_i2c_reset, VEN level = %ld", level);
 
-   DAL_DEBUG("phDal4Nfc_i2c_reset, VEN level = %ld",level);
-
-   ret = ioctl(gI2cPortContext.nHandle, PN544_SET_PWR, level);
-
-   /* HACK to increase reset time
-    * TODO: move this to kernel
-    */
-   if (level == 0) {
-       LOGW("sleeping a little longer...");
-       usleep(50000);
-   } else {
-       usleep(10000);
-   }
-
-   return ret;
+    return ioctl(gI2cPortContext.nHandle, PN544_SET_PWR, level);
 }
-
-
-
-
-
diff --git a/Linux_x86/phDal4Nfc_uart.c b/Linux_x86/phDal4Nfc_uart.c
index 30cb500..bb891e3 100644
--- a/Linux_x86/phDal4Nfc_uart.c
+++ b/Linux_x86/phDal4Nfc_uart.c
@@ -26,11 +26,17 @@
  *
  */
 
+#define LOG_TAG "NFC_uart"
+#include <cutils/log.h>
+
 #include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
+#include <errno.h>
 #include <sys/ioctl.h>
 #include <sys/select.h>
+#include <stdio.h>
+#include <errno.h>
 
 #include <phDal4Nfc_debug.h>
 #include <phDal4Nfc_uart.h>
@@ -161,28 +167,28 @@
    switch(pConfig->nLinkType)
    {
      case ENUM_DAL_LINK_TYPE_COM1:
-      pComPort = "/dev/ttyS0";
+      pComPort = "/dev/ttyO0";
       break;
      case ENUM_DAL_LINK_TYPE_COM2:
-      pComPort = "/dev/ttyS1";
+      pComPort = "/dev/ttyO1";
       break;
      case ENUM_DAL_LINK_TYPE_COM3:
-      pComPort = "/dev/ttyS2";
+      pComPort = "/dev/ttyO2";
       break;
      case ENUM_DAL_LINK_TYPE_COM4:
-      pComPort = "/dev/ttyS3";
+      pComPort = "/dev/ttyO3";
       break;
      case ENUM_DAL_LINK_TYPE_COM5:
-      pComPort = "/dev/ttyS4";
+      pComPort = "/dev/ttyO4";
       break;
      case ENUM_DAL_LINK_TYPE_COM6:
-      pComPort = "/dev/ttyS5";
+      pComPort = "/dev/ttyO5";
       break;
      case ENUM_DAL_LINK_TYPE_COM7:
-      pComPort = "/dev/ttyS6";
+      pComPort = "/dev/ttyO6";
       break;
      case ENUM_DAL_LINK_TYPE_COM8:
-      pComPort = "/dev/ttyS7";
+      pComPort = "/dev/ttyO7";
       break;
      case ENUM_DAL_LINK_TYPE_USB:
       pComPort = "/dev/ttyUSB0";
@@ -263,31 +269,51 @@
           Returns the number of bytes really read or -1 in case of error.
 
 -----------------------------------------------------------------------------*/
-
 int phDal4Nfc_uart_read(uint8_t * pBuffer, int nNbBytesToRead)
 {
-   fd_set rfds;
-   struct timeval tv;
-   int ret;
+    int ret;
+    int numRead = 0;
+    struct timeval tv;
+    fd_set rfds;
 
-   DAL_ASSERT_STR(gComPortContext.nOpened == 1, "read called but not opened!");
+    DAL_ASSERT_STR(gComPortContext.nOpened == 1, "read called but not opened!");
+    DAL_DEBUG("_uart_read() called to read %d bytes", nNbBytesToRead);
 
-   FD_ZERO(&rfds);
-   FD_SET(gComPortContext.nHandle, &rfds);
-
-   /* select will block for 10 sec */
-   tv.tv_sec = 2;
-   tv.tv_usec = 0;
-
-   ret = select(gComPortContext.nHandle + 1, &rfds, NULL, NULL, &tv);
-
-   if (ret == -1)
-      return -1;
-
-   if (ret)
-      return read(gComPortContext.nHandle, pBuffer, nNbBytesToRead);
-
-   return 0;
+    // Read with 2 second timeout, so that the read thread can be aborted
+    // when the pn544 does not respond and we need to switch to FW download
+    // mode. This should be done via a control socket instead.
+    while (numRead < nNbBytesToRead) {
+       FD_ZERO(&rfds);
+       FD_SET(gComPortContext.nHandle, &rfds);
+       tv.tv_sec = 2;
+       tv.tv_usec = 0;
+       ret = select(gComPortContext.nHandle + 1, &rfds, NULL, NULL, NULL);
+       if (ret < 0) {
+           DAL_DEBUG("select() errno=%d", errno);
+           if (errno == EINTR || errno == EAGAIN) {
+               continue;
+           }
+           return -1;
+       } else if (ret == 0) {
+           DAL_PRINT("timeout!");
+           break;  // return partial response
+       }
+       ret = read(gComPortContext.nHandle, pBuffer + numRead, nNbBytesToRead - numRead);
+       if (ret > 0) {
+           DAL_DEBUG("read %d bytes", ret);
+           numRead += ret;
+       } else if (ret == 0) {
+           DAL_PRINT("_uart_read() EOF");
+           return 0;
+       } else {
+           DAL_DEBUG("_uart_read() errno=%d", errno);
+           if (errno == EINTR || errno == EAGAIN) {
+               continue;
+           }
+           return -1;
+       }
+    }
+    return numRead;
 }
 
 /*-----------------------------------------------------------------------------
@@ -301,28 +327,30 @@
 
 int phDal4Nfc_uart_write(uint8_t * pBuffer, int nNbBytesToWrite)
 {
-   fd_set wfds;
-   struct timeval tv;
-   int ret;
+    int ret;
+    int numWrote = 0;
 
-   DAL_ASSERT_STR(gComPortContext.nOpened == 1, "write called but not opened!");
+    DAL_ASSERT_STR(gComPortContext.nOpened == 1, "write called but not opened!");
+    DAL_DEBUG("_uart_write() called to write %d bytes\n", nNbBytesToWrite);
 
-   FD_ZERO(&wfds);
-   FD_SET(gComPortContext.nHandle, &wfds);
+    while (numWrote < nNbBytesToWrite) {
+        ret = write(gComPortContext.nHandle, pBuffer + numWrote, nNbBytesToWrite - numWrote);
+        if (ret > 0) {
+            DAL_DEBUG("wrote %d bytes", ret);
+            numWrote += ret;
+        } else if (ret == 0) {
+            DAL_PRINT("_uart_write() EOF");
+            return -1;
+        } else {
+            DAL_DEBUG("_uart_write() errno=%d", errno);
+            if (errno == EINTR || errno == EAGAIN) {
+                continue;
+            }
+            return -1;
+        }
+    }
 
-   /* select will block for 10 sec */
-   tv.tv_sec = 2;
-   tv.tv_usec = 0;
-
-   ret = select(gComPortContext.nHandle + 1, NULL, &wfds, NULL, &tv);
-
-   if (ret == -1)
-      return -1;
-
-   if (ret)
-      return write(gComPortContext.nHandle, pBuffer, nNbBytesToWrite);
-
-   return 0;
+    return numWrote;
 }
 
 /*-----------------------------------------------------------------------------
@@ -332,24 +360,38 @@
 PURPOSE:  Reset the PN544, using the VEN pin
 
 -----------------------------------------------------------------------------*/
-int phDal4Nfc_uart_reset()
+int phDal4Nfc_uart_reset(long level)
 {
-   DAL_PRINT("phDal4Nfc_uart_reset");
+    static const char NFC_POWER_PATH[] = "/sys/devices/platform/nfc-power/nfc_power";
+    int sz;
+    int fd = -1;
+    int ret = NFCSTATUS_FAILED;
+    char buffer[2];
 
-   return NFCSTATUS_FEATURE_NOT_SUPPORTED;
+    DAL_DEBUG("phDal4Nfc_uart_reset, VEN level = %ld", level);
+
+    if (snprintf(buffer, sizeof(buffer), "%u", (unsigned int)level) != 1) {
+        LOGE("Bad nfc power level (%u)", (unsigned int)level);
+        goto out;
+    }
+
+    fd = open(NFC_POWER_PATH, O_WRONLY);
+    if (fd < 0) {
+        LOGE("open(%s) for write failed: %s (%d)", NFC_POWER_PATH,
+                strerror(errno), errno);
+        goto out;
+    }
+    sz = write(fd, &buffer, sizeof(buffer) - 1);
+    if (sz < 0) {
+        LOGE("write(%s) failed: %s (%d)", NFC_POWER_PATH, strerror(errno),
+             errno);
+        goto out;
+    }
+    ret = NFCSTATUS_SUCCESS;
+
+out:
+    if (fd >= 0) {
+        close(fd);
+    }
+    return ret;
 }
-
-/*-----------------------------------------------------------------------------
-
-FUNCTION: phDal4Nfc_uart_write
-
-PURPOSE:  Put the PN544 in download mode, using the GPIO4 pin
-
------------------------------------------------------------------------------*/
-int phDal4Nfc_uart_download()
-{
-   DAL_PRINT("phDal4Nfc_uart_download");
-
-   return NFCSTATUS_FEATURE_NOT_SUPPORTED;
-}
-
diff --git a/Linux_x86/phOsalNfc.c b/Linux_x86/phOsalNfc.c
index 9765e2c..0544309 100644
--- a/Linux_x86/phOsalNfc.c
+++ b/Linux_x86/phOsalNfc.c
@@ -160,16 +160,15 @@
  */
 void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer)
 {
-    char print_buffer[512]; // Max length 512 for the download mode
+    char print_buffer[length * 3 + 1];
     int i;
 
-    if(NULL!=pString && length > 1 && length < 34)
-    {
-        print_buffer[0] = '\0';
-        for (i = 0; i < length; i++) {
-            snprintf(&print_buffer[i*5], 6, " 0x%02X", pBuffer[i]);
-        }
-        LOGD("> NFC I2C %s: %s", pString,print_buffer);
+    if (pString == NULL) {
+        pString = "";
     }
+    print_buffer[0] = '\0';
+    for (i = 0; i < length; i++) {
+        snprintf(&print_buffer[i*3], 4, " %02X", pBuffer[i]);
+    }
+    LOGD("> %s:%s", pString, print_buffer);
 }
-
diff --git a/inc/phNfcConfig.h b/inc/phNfcConfig.h
index b11e79d..e7386d9 100644
--- a/inc/phNfcConfig.h
+++ b/inc/phNfcConfig.h
@@ -176,7 +176,7 @@
 #endif
 
 #ifndef NXP_MIFARE_XCHG_TIMEOUT
-#define NXP_MIFARE_XCHG_TIMEOUT         0x03U
+#define NXP_MIFARE_XCHG_TIMEOUT         0x0BU
 #endif
 
 #ifndef NXP_FELICA_XCHG_TIMEOUT
@@ -223,6 +223,12 @@
 #define LINK_CONNECTION_TIMEOUT         1000U
 #endif 
 
+/**< Defines ACK time out value for LLC timer,
+    150 is in milliseconds */
+#ifndef LINK_ACK_TIMEOUT
+#define LINK_ACK_TIMEOUT                1U
+#endif
+
 
 /**< Defines Firmware Download Completion Timeout value ,
     120000 is in milliseconds */
@@ -254,7 +260,7 @@
 
 
 #ifndef NXP_NFC_HCI_TIMER
-#define NXP_NFC_HCI_TIMER       0
+#define NXP_NFC_HCI_TIMER       1
 #define NXP_NFC_HCI_TIMEOUT     6000
 #endif
 
@@ -369,15 +375,11 @@
 /**< Macro to Enable the Card Emulation Feature */
 /* #define HOST_EMULATION */
 
-#define NXP_HAL_VERIFY_EEPROM_CRC  0x01U
-
 /**< Macro to Enable the Download Mode Feature */
 #define FW_DOWNLOAD
 
 /**< Macro to Enable the Firmware Download Timer */
-/* 0x01U to use overall timeout */
-/* 0x02U to use per frame timeout */
-#define FW_DOWNLOAD_TIMER   0x02U
+#define FW_DOWNLOAD_TIMER
 
 /**< Macro to Verify the Firmware Download */
 /* #define FW_DOWNLOAD_VERIFY */
@@ -386,9 +388,6 @@
 #define NXP_FW_INTEGRITY_CHK    1
 #endif
 
-/* To specify the Maximum TX/RX Len */
-#define NXP_FW_MAX_TX_RX_LEN   0x200
-
 #define UICC_CONNECTIVITY_PATCH
 
 /* Work around to Delay the initiator activation */
diff --git a/inc/phNfcHalTypes.h b/inc/phNfcHalTypes.h
index 47e9036..a242450 100644
--- a/inc/phNfcHalTypes.h
+++ b/inc/phNfcHalTypes.h
@@ -36,8 +36,6 @@
  *
  * File: \ref phNfcHalTypes.h
  *
- * Developed By: Ravindra U.
- *
  */
 
 /*@{*/
@@ -49,26 +47,6 @@
 #include <phNfcCompId.h>
 #include <phNfcConfig.h>
 
-#ifndef NXP_HAL_MEM_INFO_SIZE
-#define NXP_HAL_MEM_INFO_SIZE           0x01U
-#endif
-
-#if (NXP_HAL_MEM_INFO_SIZE > 0x01)
-#define NXP_FW_UPLOAD_PROGRESS          0x965AU
-#define NXP_FW_UPLOAD_SUCCESS           0x0000U
-#else
-#define NXP_FW_UPLOAD_PROGRESS          0x5AU
-#define NXP_FW_UPLOAD_SUCCESS           0x00U
-#endif
-
-
-typedef struct phHal_sMemInfo
-{
-    uint16_t            fw_magic;
-    uint16_t            fw_rfu;
-    uint32_t            hal_version;
-}phHal_sMemInfo_t;
-
 
 /** \ingroup  grp_hal_common
  *
@@ -858,7 +836,6 @@
     NFC_INFO_TXLDO_OVERCUR       = 0x71U,
     NFC_INFO_MEM_VIOLATION       = 0x73U,
     NFC_INFO_TEMP_OVERHEAT       = 0x74U,
-    NFC_INFO_LLC_ERROR           = 0x75U,
 
     /* NXP EVENTS */
     NFC_EVT_MIFARE_ACCESS          = 0x35,
diff --git a/inc/phNfcLlcpTypes.h b/inc/phNfcLlcpTypes.h
index 3c555c2..2954d00 100644
--- a/inc/phNfcLlcpTypes.h
+++ b/inc/phNfcLlcpTypes.h
@@ -55,7 +55,7 @@
  *
  */
  /*@{*/
-#define PHFRINFC_LLCP_NB_SOCKET_MAX          5                                 /**< Max.number of simultaneous sockets */
+#define PHFRINFC_LLCP_NB_SOCKET_MAX          10                                /**< Max.number of simultaneous sockets */
 /*@}*/
 
 /**
diff --git a/src/phDnldNfc.c b/src/phDnldNfc.c
old mode 100644
new mode 100755
index 0c11377..796653e
--- a/src/phDnldNfc.c
+++ b/src/phDnldNfc.c
@@ -24,9 +24,9 @@
 *                                                                             *
 * Project: NFC-FRI-1.1                                                        *
 *                                                                             *
-* $Date: Thu Sep  9 14:58:05 2010 $                                           *
+* $Date: Tue Jun 28 14:25:44 2011 $                                           *
 * $Author: ing04880 $                                                         *
-* $Revision: 1.32 $                                                           *
+* $Revision: 1.33 $                                                           *
 * $Aliases:  $
 *                                                                             *
 * =========================================================================== *
@@ -39,6 +39,7 @@
 ################################################################################
 */
 #include <stdlib.h>
+#include <unistd.h>
 #include <phNfcConfig.h>
 #include <phNfcCompId.h>
 #include <phNfcIoctlCode.h>
@@ -46,8 +47,7 @@
 #include <phOsalNfc.h>
 #include <phOsalNfc_Timer.h>
 #include <phDal4Nfc.h>
-
-
+#include <utils/Log.h>
 /*
 ################################################################################
 ****************************** Macro Definitions *******************************
@@ -58,6 +58,8 @@
 #define STATIC static
 #endif
 
+#define SECTION_HDR
+
 #if defined (DNLD_SUMMARY) && !defined (DNLD_TRACE)
 #define DNLD_TRACE
 #endif
@@ -88,51 +90,19 @@
 #define DNLD_PRINT_BUFFER(msg,buf,len)
 #endif
 
-#define DO_DELAY(period)        { unsigned i=0; for(;i<period;i++); }
+#define DO_DELAY(period)        usleep(period)
 
-#define PHDNLD_DNLD_DELAY        0x1000U
+/* delay after SW reset cmd in ms, required on uart for XTAL stability */
+#define PHDNLD_DNLD_DELAY        5000
 #define PHDNLD_MAX_PACKET        0x0200U  /* Max Total Packet Size is 512 */
-#define PHDNLD_DATA_SIZE         ((PHDNLD_MAX_PACKET)- 8U) /* 0x01F8U */ 
+#define PHDNLD_DATA_SIZE         ((PHDNLD_MAX_PACKET)- 8U) /* 0x01F8U */
                                                      /* Max Data Size is 504 */
 #define PHDNLD_MIN_PACKET        0x03U    /* Minimum Packet Size is 3*/
 
-#define DNLD_DEFAULT_RESPONSE_TIMEOUT   0x4000U
-
-#define NXP_FW_MIN_TX_RX_LEN     0x0AU
-
-
-#if defined( NXP_FW_MAX_TX_RX_LEN ) && \
-     ( NXP_FW_MAX_TX_RX_LEN > NXP_FW_MIN_TX_RX_LEN )
-
-#define PHDNLD_FW_TX_RX_LEN   NXP_FW_MAX_TX_RX_LEN
-
-#elif !defined( NXP_FW_MAX_TX_RX_LEN )
-
-/* To specify the Maximum TX/RX Len */
-#define NXP_FW_MAX_TX_RX_LEN   0x200
-#define PHDNLD_FW_TX_RX_LEN   NXP_FW_MAX_TX_RX_LEN
-
-#else
-
-#define PHDNLD_FW_TX_RX_LEN   NXP_FW_MIN_TX_RX_LEN
-
-#endif
-
 #define PHDNLD_FRAME_LEN_SIZE    0x02U
 #define PHDNLD_ADDR_SIZE         0x03U
 #define PHDNLD_DATA_LEN_SIZE     0x02U
-#define PHDNLD_FRAME_DATA_OFFSET 0x03U
 
-#define DNLD_SM_UNLOCK_MASK      0x01U
-#define DNLD_TRIM_MASK           0x02U
-#define DNLD_RESET_MASK          0x04U
-#define DNLD_VERIFY_MASK         0x08U
-#define DNLD_CRITICAL_MASK       0x10U
-
-
-#define NXP_NFC_IMAG_FW_MAX      0x05U
-
-#define PHDNLD_FW_PATCH_SEC      0x5FU
 
 #define PHDNLD_PAGE_SIZE         0x80U    /* Page Size Configured for 64 Bytes */
 
@@ -148,8 +118,6 @@
 #define DNLD_PATCH_TABLE_ADDR    0x00008200U
 
 
-/* Raw Command to pass the Data in Download Mode */
-#define PHDNLD_CMD_RAW                  0x00U
 /* Command to Reset the Device in Download Mode */
 #define PHDNLD_CMD_RESET                0x01U
 /* Command to Read from the Address specified in Download Mode */
@@ -157,7 +125,6 @@
 #define PHDNLD_CMD_READ_LEN             0x0005U
 /* Command to write to the Address specified in Download Mode */
 #define PHDNLD_CMD_WRITE                0x08U
-#define PHDNLD_CMD_SEC_WRITE            0x0CU
 #define PHDNLD_CMD_WRITE_MIN_LEN        0x0005U
 #define PHDNLD_CMD_WRITE_MAX_LEN        PHDNLD_DATA_SIZE
 /* Command to verify the data written */
@@ -178,9 +145,6 @@
 /* Command to verify the Integrity of the data written */
 #define PHDNLD_CMD_CHECK_INTEGRITY      0x0BU
 
-/* Command to verify the Integrity of the data written */
-#define PHDNLD_CMD_ENCAPSULATE          0x0DU
-
 #define CHECK_INTEGRITY_RESP_CRC16_LEN  0x03U
 #define CHECK_INTEGRITY_RESP_CRC32_LEN  0x05U
 #define CHECK_INTEGRITY_RESP_COMP_LEN   0x10U
@@ -198,23 +162,8 @@
 #define PHDNLD_RESP_PROTOCOL_ERROR      0x0BU
 /* Invalid parameter Response to a Command Sent in the Download Mode */
 #define PHDNLD_RESP_INVALID_PARAMETER   0x11U
-/* Command Not Supported Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_CMD_NOT_SUPPORTED   0x13U
 /* Length parameter error Response to a Command Sent in the Download Mode */
 #define PHDNLD_RESP_INVALID_LENGTH      0x18U
-/* Checksum Error Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_CHKSUM_ERROR        0x19U
-/* Version already uptodate Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_VERSION_UPTODATE    0x1DU
-/*  Memory operation error during the processing of
-                 the Command Frame in the Download Mode */
-#define PHDNLD_RESP_MEMORY_UPDATE_ERROR 0x20U
-/*  The Chaining of the Command Frame was Successful in the Download Mode */
-#define PHDNLD_RESP_CHAINING_SUCCESS    0x21U
-/*  The Command is not allowed anymore in the Download Mode */
-#define PHDNLD_RESP_CMD_NOT_ALLOWED     0xE0U
-/*  The Error during the Chaining the Command Frame in the Download Mode */
-#define PHDNLD_RESP_CHAINING_ERROR      0xE6U
 /* Write Error Response to a Command Sent in the Download Mode */
 #define PHDNLD_RESP_WRITE_ERROR         0x74U
 
@@ -236,7 +185,6 @@
 typedef enum phDnldNfc_eSeqType{
     DNLD_SEQ_RESET                              = 0x00U,
     DNLD_SEQ_INIT,
-    DNLD_SEQ_RAW,
     DNLD_SEQ_LOCK,
     DNLD_SEQ_UNLOCK,
     DNLD_SEQ_UPDATE,
@@ -268,7 +216,6 @@
     phDnld_Verify_Integrity,
     phDnld_Verify_Section,
     phDnld_Complete_Seq,
-    phDnld_Raw_Upgrade,
     phDnld_Invalid_Seq
 }phDnldNfc_eSeq_t;
 
@@ -297,7 +244,7 @@
   uint8_t           img_data_offset;
   /* Number of fimware images available in the img_data */
   uint8_t           no_of_fw_img;
-  /* Fimware image Padding in the img_data */
+  /* Number of fimware images available in the img_data */
   uint8_t           fw_img_pad[2];
  /* HW Compatiblity table for the set of the Hardwares */
   hw_comp_tbl_t     comp_tbl;
@@ -326,12 +273,25 @@
 {
   uint8_t            section_hdr_len;
   uint8_t            section_mem_type;
-  uint8_t            section_checksum;
-  uint8_t            section_conf;
+  uint16_t           section_data_crc;
   uint32_t           section_address;
   uint32_t           section_length;
 }section_hdr_t;
 
+
+typedef struct section_type
+{
+    unsigned system_mem_unlock:1;
+    unsigned trim_val:1;
+    unsigned reset_required:1;
+    unsigned verify_mem:1;
+    unsigned critical_section:1;
+    unsigned section_crc_check:1;
+    unsigned section_type_rfu:2;
+    unsigned section_type_pad:24;
+
+}section_type_t;
+
 typedef struct section_info
 {
    section_hdr_t *p_sec_hdr;
@@ -340,10 +300,6 @@
    * to be loaded to the particular address.
    */
    uint8_t       *p_sec_data;
-  /* The Section checksum to verify the integrity of the section
-   * data.
-   */
-   uint8_t       *p_sec_chksum;
    /** \internal Index used to refer and process the
     *    Firmware Section Data */
    volatile uint32_t           section_offset;
@@ -369,24 +325,13 @@
     uint8_t data_packet[PHDNLD_DATA_SIZE];
 }phDnldNfc_sParam_t;
 
+
 typedef struct phDnldNfc_sDataHdr
 {
     uint8_t frame_type;
     uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE];
 }phDnldNfc_sData_Hdr_t;
 
-typedef struct phDnldNfc_sRawHdr
-{
-    uint8_t frame_type;
-    uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE];
-}phDnldNfc_sRawHdr_t;
-
-typedef struct phDnldNfc_sRawDataHdr
-{
-    uint8_t data_addr[PHDNLD_ADDR_SIZE];
-    uint8_t data_len[PHDNLD_DATA_LEN_SIZE];
-}phDnldNfc_sRawDataHdr_t;
-
 typedef struct phDnldNfc_sChkCrc16_Resp
 {
     uint8_t Chk_status;
@@ -417,59 +362,11 @@
     union param
     {
         phDnldNfc_sParam_t data_param;
-        uint8_t            response_data[PHDNLD_MAX_PACKET];
+        uint8_t            response_data[PHDNLD_MAX_PACKET + 0];
         uint8_t            cmd_param;
     }param_info;
 }phDnldNfc_sData_t;
 
-#ifdef NXP_NFC_MULTIPLE_FW
-
-typedef struct phDnldNfc_sFwImageInfo
-{
-    /** \internal Data Pointer to the Firmware header section of the Firmware */
-    fw_data_hdr_t               *p_fw_hdr;
-    /** \internal Buffer pointer to store the Firmware Section Data */
-    section_info_t              *p_fw_sec;
-    /** \internal Buffer pointer to store the Firmware Raw Data */
-    uint8_t                     *p_fw_raw;
-}phDnldNfc_sFwImageInfo_t;
-
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
-
-typedef struct phDnldNfc_TxInfo
-{
-    uint8_t       *transmit_frame;
-
-    uint16_t      tx_offset;
-
-    /** \internal Remaining amount of data to be sent */
-    uint16_t      tx_len;
-
-    uint16_t      tx_total;
-
-    /** \internal Chain information for the data to be sent */
-    uint8_t       tx_chain;
-
-}phDnldNfc_TxInfo_t;
-
-
-typedef struct phDnldNfc_RxInfo
-{
-    /** \internal Total length of the received buffer */
-    uint16_t      rx_total;
-    /** \internal Chain information of the received buffer */
-    uint16_t      rx_chain;
-    /** \internal Remaining Data information to be read to complete the
-      * Data Information.
-      */
-    uint16_t      rx_remain;
-
-    /** \internal Buffer to Send the Raw Data Frame */
-    uint8_t                     raw_buffer_data[PHDNLD_MAX_PACKET
-                                                    + PHDNLD_PAGE_SIZE];
-}phDnldNfc_RxInfo_t;
-
 
 typedef struct phDnldNfc_sContext
 {
@@ -488,29 +385,18 @@
 
     /** \internal Timer ID for the Download Abort */
     uint32_t                    timer_id;
-    /** \internal Internal Download for the Download Abort */
-    uint32_t                    dnld_timeout;
     /** \internal Data Pointer to the Image header section of the Firmware */
     img_data_hdr_t              *p_img_hdr;
-
-#ifdef NXP_NFC_MULTIPLE_FW
-    /** \internal Data Pointer to the Firmware Image Information */
-    phDnldNfc_sFwImageInfo_t    *p_img_info;
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
     /** \internal Data Pointer to the Firmware header section of the Firmware */
     fw_data_hdr_t               *p_fw_hdr;
     /** \internal Buffer pointer to store the Firmware Data */
     section_info_t              *p_fw_sec;
-    /** \internal Buffer pointer to store the Firmware Raw Data */
-    uint8_t                     *p_fw_raw;
 
     /** \internal Previous Download Size */
     uint32_t                    prev_dnld_size;
 
     /** \internal Single Data Block to download the Firmware */
-    uint8_t                     dnld_data[PHDNLD_MAX_PACKET
-                                                    + PHDNLD_PAGE_SIZE];
+    phDnldNfc_sData_t           dnld_data;
     /** \internal Index used to refer and process the Download Data */
     volatile uint32_t           dnld_index;
 
@@ -538,12 +424,11 @@
 #define NXP_FW_VMID_CARD_MODE_ADDR  0x00009931U
 #define NXP_FW_VMID_RD_MODE_ADDR    0x00009981U
 
-    uint8_t                     vmid_trim_update;
+    unsigned                    vmid_trim_update:1;
+    unsigned                    trim_bits_rfu:31;
 #endif /* #ifdef  NXP_FW_SW_VMID_TRIM */
 
-    uint8_t						cur_frame_info;
-
-    uint8_t						raw_mode_upgrade;
+	uint8_t						*p_system_mem_crc;
 
 	uint8_t						*p_patch_table_crc;
 
@@ -553,12 +438,18 @@
 
     uint16_t                    resp_length;
 
+    /** \internal Total length of the received buffer */
+    volatile uint16_t           rx_total;
+
     /** \internal Current FW Section in Process */
     volatile uint8_t            section_index;
 
     /** \internal Previous Command sent */
     volatile uint8_t            prev_cmd;
 
+    /** \internal Download Response pending */
+    volatile uint8_t            recv_pending;
+
     uint8_t                     dnld_retry;
 
 	/** \internal Current Download State */
@@ -571,25 +462,17 @@
     /** \internal Next step in Download Sequence */
     volatile uint8_t            next_dnld_seq;
 
-    /* \internal Data Transmit information */
-    phDnldNfc_TxInfo_t          tx_info;
-
-    /* \internal Data Receive information */
-    phDnldNfc_RxInfo_t          rx_info;
-
-
 }phDnldNfc_sContext_t;
 
 
+
 /*
 ################################################################################
 ******************** Global and Static Variables Definition ********************
 ################################################################################
 */
 
-#ifndef NFC_TIMER_CONTEXT
 static phDnldNfc_sContext_t *gpphDnldContext = NULL;
-#endif
 
 #ifdef NXP_FW_DNLD_CHECK_PHASE
 
@@ -597,7 +480,6 @@
 #define   NXP_FW_DNLD_SYSTEM_PHASE   0x01U
 #define   NXP_FW_DNLD_CFG_PHASE      0x02U
 #define   NXP_FW_DNLD_DATA_PHASE     0x03U
-#define   NXP_FW_DNLD_RAW_PHASE      0x04U
 #define   NXP_FW_DNLD_INVALID_PHASE  0xFFU
 
 static uint8_t  gphDnldPhase = NXP_FW_DNLD_COMPLETE_PHASE;
@@ -769,10 +651,8 @@
 STATIC
 void
 phDnldNfc_Abort (
-                    uint32_t abort_id
-#ifdef NFC_TIMER_CONTEXT
-                    , void     *dnld_cntxt
-#endif
+                    uint32_t abort_id,
+                    void *pContext
                 );
 
 
@@ -940,7 +820,6 @@
                                 phDnldNfc_sContext_t    **ppsDnldContext
                             )
 {
-
     if(NULL != (*ppsDnldContext)->p_resp_buffer)
     {
         phOsalNfc_FreeMemory((*ppsDnldContext)->p_resp_buffer);
@@ -1049,20 +928,8 @@
                                 (uint8_t) phDnld_Reset_State;
             psDnldContext->next_dnld_state =
                             (uint8_t)phDnld_Upgrade_State;
-            psDnldContext->cur_dnld_seq =
-                            (uint8_t)phDnld_Upgrade_Section;
             psDnldContext->next_dnld_seq =
-                                psDnldContext->cur_dnld_seq;
-            break;
-        }
-        case DNLD_SEQ_RAW:
-        {
-            psDnldContext->cur_dnld_state =
-                                (uint8_t) phDnld_Reset_State;
-            psDnldContext->next_dnld_state =
-                            (uint8_t)phDnld_Upgrade_State;
-            psDnldContext->cur_dnld_seq =
-                            (uint8_t)phDnld_Raw_Upgrade;
+                            (uint8_t)phDnld_Upgrade_Section;
             psDnldContext->next_dnld_seq =
                                 psDnldContext->cur_dnld_seq;
             break;
@@ -1077,17 +944,18 @@
             {
                 psDnldContext->next_dnld_state =
                                 (uint8_t)phDnld_Upgrade_State;
-                psDnldContext->cur_dnld_seq =
+                psDnldContext->next_dnld_seq =
                                 (uint8_t)phDnld_Upgrade_Section;
             }
             else
 #endif /* NXP_FW_DNLD_CHECK_PHASE */
             {
-            psDnldContext->next_dnld_state =
-                                (uint8_t) phDnld_Unlock_State;
-            psDnldContext->cur_dnld_seq =
+                psDnldContext->next_dnld_state =
+                                    (uint8_t) phDnld_Unlock_State;
+                psDnldContext->cur_dnld_seq =
                                     (uint8_t) phDnld_Activate_Patch;
             }
+
             psDnldContext->next_dnld_seq =
                                 psDnldContext->cur_dnld_seq;
             break;
@@ -1141,6 +1009,26 @@
                                 psDnldContext->cur_dnld_seq ;
             break;
         }
+#if 0
+        case DNLD_UPDATE_STATE1:
+        {
+            prev_temp_state = (uint8_t) psDnldContext->cur_dnld_state;
+            psDnldContext->cur_dnld_state =
+                        psDnldContext->next_dnld_state;
+            /* psDnldContext->next_dnld_state =
+                        (uint8_t)phDnld_Invalid_State ; */
+            break;
+        }
+        case DNLD_ROLLBACK_STATE1:
+        {
+            psDnldContext->cur_dnld_state = (uint8_t)  prev_temp_state;
+            /* psDnldContext->next_dnld_state =
+                        (uint8_t)phDnld_Invalid_State ; */
+            prev_temp_state = 0;
+
+            break;
+        }
+#endif
         default:
         {
             break;
@@ -1182,36 +1070,6 @@
 #endif
         status = plower_if->send((void *)plower_if->pcontext,
                                 (void *)pHwRef, pdata, length);
-
-#if defined(FW_DOWNLOAD_TIMER) && \
-                (FW_DOWNLOAD_TIMER == 2)
-    if ( 
-         (NFCSTATUS_PENDING == status)
-        && ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
-       )
-    {
-        psDnldContext->dnld_timeout = NXP_DNLD_COMPLETE_TIMEOUT;
-
-        if ( psDnldContext->dnld_timeout
-                        <   DNLD_DEFAULT_RESPONSE_TIMEOUT)
-        {
-            psDnldContext->dnld_timeout
-                            = DNLD_DEFAULT_RESPONSE_TIMEOUT;
-        }
-        /* Start the Download Timer */
-        phOsalNfc_Timer_Start( psDnldContext->timer_id,
-                psDnldContext->dnld_timeout, 
-                (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
-                , (void *) psDnldContext
-#endif
-                );
-
-        DNLD_DEBUG(" DNLD : Timer %X Started ", psDnldContext->timer_id);
-        DNLD_DEBUG(" \t\t With %U Timeout \n", psDnldContext->dnld_timeout);
-    }
-
-#endif /* (NXP_NFC_DNLD_TIMER == 1) */
     }
 
     return status;
@@ -1267,10 +1125,8 @@
                    )
 {
     NFCSTATUS               status = NFCSTATUS_SUCCESS;
-    phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
-    phDnldNfc_sParam_t      *p_data_param =
-                        &p_dnld_data->param_info.data_param;
+    phDnldNfc_sParam_t      *p_dnld_data =
+                        &psDnldContext->dnld_data.param_info.data_param;
     uint32_t        read_addr = (p_sec_info->p_sec_hdr->section_address
                                             + p_sec_info->section_offset);
     static unsigned sec_type = 0;
@@ -1280,7 +1136,7 @@
     sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type;
 
     if( ( FALSE ==  p_sec_info->section_read )
-    && ((sec_type & DNLD_TRIM_MASK))
+    && (TRUE == ((section_type_t *)(&sec_type))->trim_val)
     && (FALSE == p_sec_info->trim_write) )
     {
         read_size = (uint16_t) p_sec_info->p_sec_hdr->section_length;
@@ -1288,9 +1144,8 @@
     }
     else
     {
-        if (( FALSE ==  p_sec_info->section_read ) 
-            && ((sec_type & DNLD_VERIFY_MASK))
-            )
+        if (( FALSE ==  p_sec_info->section_read )
+            && (TRUE == ((section_type_t *)(&sec_type))->verify_mem ))
         {
             read_size = (uint16_t)(psDnldContext->prev_dnld_size );
             DNLD_DEBUG(" FW_DNLD: Section Read  = %X \n", read_size);
@@ -1317,24 +1172,24 @@
         read_size = (uint16_t)((PHDNLD_DATA_SIZE >= read_size)?
                                             read_size: PHDNLD_DATA_SIZE);
 
-        p_dnld_data->frame_length[i] = (uint8_t)0;
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t)0;
         /* Update the LSB of the Data and the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)((read_addr  >>
+        p_dnld_data->data_addr[i] = (uint8_t)((read_addr  >>
                                  (BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK);
-        p_data_param->data_len[i] = (uint8_t)((read_size >>
+        p_dnld_data->data_len[i] = (uint8_t)((read_size >>
                                     BYTE_SIZE) & BYTE_MASK);
         i++;
 
-        p_dnld_data->frame_length[i] = (uint8_t)
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t)
                             ( PHDNLD_CMD_READ_LEN & BYTE_MASK);
         /* Update the 2nd byte of the Data and the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)((read_addr  >>
+        p_dnld_data->data_addr[i] = (uint8_t)((read_addr  >>
                                BYTE_SIZE) & BYTE_MASK);
-        p_data_param->data_len[i] = (uint8_t) (read_size & BYTE_MASK);
+        p_dnld_data->data_len[i] = (uint8_t) (read_size & BYTE_MASK);
         i++;
 
         /* Update the 3rd byte of the the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)(read_addr & BYTE_MASK);
+        p_dnld_data->data_addr[i] = (uint8_t)(read_addr & BYTE_MASK);
 
         status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
                     PHDNLD_CMD_READ, NULL , 0 );
@@ -1363,10 +1218,8 @@
                      )
 {
     NFCSTATUS               status = NFCSTATUS_SUCCESS;
-    phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
     phDnldNfc_sParam_t      *dnld_data =
-                             &p_dnld_data->param_info.data_param;
+                        &psDnldContext->dnld_data.param_info.data_param;
     uint8_t                 *p_sm_trim_data = (uint8_t *)psDnldContext->
                                         dnld_resp.param_info.response_data;
     uint32_t                dnld_addr = 0;
@@ -1376,7 +1229,7 @@
     static unsigned         sec_type = 0;
     uint8_t                 i = 0;
     uint16_t                dnld_size = 0;
-        int cmp_val = 0x00;
+    int cmp_val = 0x00;
 
 
     sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type;
@@ -1386,7 +1239,7 @@
     {
         if( (TRUE == p_sec_info->trim_write)
             && (TRUE == p_sec_info->section_read)
-               && ((sec_type & DNLD_VERIFY_MASK))
+               && (TRUE == ((section_type_t *)(&sec_type))->verify_mem )
           )
         {
             if(NULL != psDnldContext->trim_store.buffer)
@@ -1415,7 +1268,7 @@
         else
         {
             if((NULL != psDnldContext->dnld_store.buffer)
-                && ((sec_type & DNLD_VERIFY_MASK))
+                && (TRUE == ((section_type_t *)(&sec_type))->verify_mem )
                 && (TRUE == p_sec_info->section_write)
                 && (TRUE == p_sec_info->section_read)
                 )
@@ -1480,6 +1333,7 @@
     if (dnld_size != 0)
     {
 
+
         dnld_size = (uint16_t)((PHDNLD_DATA_SIZE >= dnld_size)?
                                         dnld_size: PHDNLD_DATA_SIZE);
 
@@ -1488,7 +1342,7 @@
                                   (BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK);
         dnld_data->data_len[i] = (uint8_t)((dnld_size >> BYTE_SIZE)
                                         & BYTE_MASK);
-        p_dnld_data->frame_length[i] = (uint8_t)
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t)
                     (((dnld_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE)
                                         & BYTE_MASK);
         i++;
@@ -1496,16 +1350,16 @@
         dnld_data->data_addr[i] = (uint8_t)((dnld_addr  >> BYTE_SIZE)
                                         & BYTE_MASK);
         dnld_data->data_len[i] = (uint8_t) (dnld_size & BYTE_MASK);
-        p_dnld_data->frame_length[i] = (uint8_t) ((dnld_size +
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t) ((dnld_size +
                             PHDNLD_CMD_WRITE_MIN_LEN) & BYTE_MASK);
         i++;
         /* Update the 3rd byte of the the Address Parameter*/
         dnld_data->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
 
         (void)memcpy( dnld_data->data_packet,
-                        (p_sec_info->p_sec_data + *p_sec_offset), dnld_size );
+                    (p_sec_info->p_sec_data + *p_sec_offset), dnld_size );
 
-        if( ((sec_type & DNLD_TRIM_MASK))
+        if((TRUE == ((section_type_t *)(&sec_type))->trim_val )
             && (p_sec_info->sec_verify_retry != 0)
             && (NULL != psDnldContext->trim_store.buffer)
             )
@@ -1513,7 +1367,7 @@
             (void)memcpy( dnld_data->data_packet,
                         psDnldContext->trim_store.buffer, dnld_size );
         }
-        else if(((sec_type & DNLD_TRIM_MASK))
+        else if((TRUE == ((section_type_t *)(&sec_type))->trim_val )
             && ( TRUE ==  p_sec_info->section_read )
             )
         {
@@ -1563,14 +1417,8 @@
                 psDnldContext->trim_store.buffer = NULL;
                 psDnldContext->trim_store.length = 0;
             }
-#if 1
-            (void)
-                phDnldNfc_Allocate_Resource((void **)
-                              &(psDnldContext->trim_store.buffer),dnld_size);
-#else
             psDnldContext->trim_store.buffer =
                                 (uint8_t *) phOsalNfc_GetMemory(dnld_size);
-#endif
 
             if(NULL != psDnldContext->trim_store.buffer)
             {
@@ -1593,14 +1441,8 @@
                 psDnldContext->dnld_store.buffer = NULL;
                 psDnldContext->dnld_store.length = 0;
             }
-#if 1
-            (void)
-                phDnldNfc_Allocate_Resource((void **)
-                              &(psDnldContext->dnld_store.buffer),dnld_size);
-#else
             psDnldContext->dnld_store.buffer =
                                 (uint8_t *) phOsalNfc_GetMemory(dnld_size);
-#endif
             if(NULL != psDnldContext->dnld_store.buffer)
             {
                 (void )memset((void *)psDnldContext->dnld_store.buffer,0,
@@ -1612,24 +1454,15 @@
                 DNLD_DEBUG(" of Size %X ", dnld_size );
             }
         }
-
-        if(PHDNLD_FW_PATCH_SEC !=  psDnldContext->p_fw_hdr->fw_patch)
-        {
         status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
                     PHDNLD_CMD_WRITE, NULL , 0 );
-        }
-        else
-        {
-            status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
-                        PHDNLD_CMD_SEC_WRITE, NULL , 0 );
-        }
 
         DNLD_DEBUG(" FW_DNLD: Memory Write Status = %X \n", status);
         if ( NFCSTATUS_PENDING == status )
         {
             psDnldContext->prev_dnld_size = dnld_size;
             cmp_val = 0x00;
-            if((sec_type & DNLD_TRIM_MASK))
+            if(TRUE == ((section_type_t *)(&sec_type))->trim_val )
             {
                 p_sec_info->trim_write = TRUE;
                 DNLD_DEBUG(" FW_DNLD: Bytes Downloaded (Trimming Values) = %X Bytes \n",
@@ -1682,7 +1515,7 @@
             p_sec_info->trim_write = FALSE;
 
             DNLD_DEBUG(" FW_DNLD: Section %02X Download Complete\n", sec_index);
-            if((sec_type & DNLD_RESET_MASK))
+            if(TRUE == ((section_type_t *)(&sec_type))->reset_required )
             {
                 DNLD_DEBUG(" FW_DNLD: Reset After Section %02X Download \n", sec_index);
                 status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
@@ -1751,7 +1584,7 @@
 #if (ES_HW_VER <= 30)
 #define NXP_DNLD_PATCH_ADDR             0x01AFFFU
 #else
-#define NXP_DNLD_PATCH_ADDR             0x01A1E0U
+#define NXP_DNLD_PATCH_ADDR             0x01AFE0U
 #endif
 
 #if  (ES_HW_VER <= 30)
@@ -1772,16 +1605,14 @@
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
     uint32_t            dnld_addr = 0;
-    phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
-    phDnldNfc_sParam_t  *p_data_param =
-                          & p_dnld_data->param_info.data_param;
+    phDnldNfc_sParam_t  *dnld_data =  &psDnldContext->dnld_data
+                                            .param_info.data_param;
     uint8_t             *p_data = NULL;
     static  uint32_t    patch_size = 0;
 
 #if (ES_HW_VER == 32)
 
-    static  uint8_t     patch_table[] = {0xA0, 0xA1, 0xE0, 0x80, 0xA9, 0x6C };
+    static  uint8_t     patch_table[] = {0xA0, 0xAF, 0xE0, 0x80, 0xA9, 0x6C };
     static  uint8_t     patch_data[] = {0xA5, 0xD0, 0xFE, 0xA5, 0xD0, 0xFD, 0xA5,
                             0xD0, 0xFC, 0xA5, 0x02, 0x80, 0xA9, 0x75};
 
@@ -1924,25 +1755,25 @@
     {
 
         /* Update the LSB of the Data and the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)((dnld_addr  >>
+        dnld_data->data_addr[i] = (uint8_t)((dnld_addr  >>
                                             (BYTE_SIZE + BYTE_SIZE))
                                                     & BYTE_MASK);
-        p_data_param->data_len[i] = (uint8_t)((patch_size >> BYTE_SIZE)
+        dnld_data->data_len[i] = (uint8_t)((patch_size >> BYTE_SIZE)
                                                     & BYTE_MASK);
-        p_dnld_data->frame_length[i] = (uint8_t)
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t)
                     (((patch_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE)
                                                     & BYTE_MASK);
         i++;
         /* Update the 2nd byte of the Data and the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)((dnld_addr  >> BYTE_SIZE)
+        dnld_data->data_addr[i] = (uint8_t)((dnld_addr  >> BYTE_SIZE)
                                                 & BYTE_MASK);
-        p_data_param->data_len[i] = (uint8_t) (patch_size & BYTE_MASK);
-        p_dnld_data->frame_length[i] = (uint8_t)
+        dnld_data->data_len[i] = (uint8_t) (patch_size & BYTE_MASK);
+        psDnldContext->dnld_data.frame_length[i] = (uint8_t)
                             ((patch_size + PHDNLD_CMD_WRITE_MIN_LEN)
                                                     & BYTE_MASK);
         i++;
         /* Update the 3rd byte of the the Address Parameter*/
-        p_data_param->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
+        dnld_data->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
 
         status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
                     PHDNLD_CMD_WRITE,(void *)p_data , (uint8_t)patch_size );
@@ -1956,386 +1787,6 @@
     return status;
 }
 
-#define FRAME_HEADER_LEN   0x03U
-
-
-static
-void
-phDnldNfc_Tx_Reset(phDnldNfc_sContext_t    *psDnldContext)
-{
-    psDnldContext->tx_info.transmit_frame = NULL;
-    psDnldContext->tx_info.tx_total = 0x00;
-    psDnldContext->tx_info.tx_offset = 0x00;
-    psDnldContext->tx_info.tx_len = 0x00;
-    psDnldContext->tx_info.tx_chain = FALSE;
-}
-
-STATIC
-bool_t
-phDnldNfc_Extract_Chunks(
-                       uint8_t  *frame_data,
-                       uint16_t  frame_offset,
-                       uint16_t  frame_length,
-                       uint16_t  max_frame ,
-                       uint16_t  *chunk_length
-                       );
-
-
-STATIC
-bool_t
-phDnldNfc_Extract_Chunks(
-                       uint8_t  *frame_data,
-                       uint16_t  frame_offset,
-                       uint16_t  frame_length,
-                       uint16_t  max_frame ,
-                       uint16_t  *chunk_length
-                       )
-{
-    bool_t  chunk_present = FALSE;
-
-    if( 0 == frame_offset)
-    {
-        if( max_frame >= (frame_length
-                - frame_offset))
-        {
-           *chunk_length = (frame_length - frame_offset);
-        }
-        else
-        {
-            *chunk_length = max_frame 
-                            - FRAME_HEADER_LEN;
-            chunk_present = TRUE;
-        }
-    }
-    else
-    {
-        if( max_frame >= (frame_length
-                - frame_offset))
-        {
-           *chunk_length = (frame_length - frame_offset);
-        }
-        else
-        {
-            *chunk_length = max_frame 
-                            - FRAME_HEADER_LEN;
-            chunk_present = TRUE;
-        }
-    }
-
-    return chunk_present;
-}
-
-
-STATIC
-NFCSTATUS
-phDnldNfc_Send_Raw(
-                        phDnldNfc_sContext_t    *psDnldContext,
-                        void                    *pHwRef,
-                        uint8_t                 *raw_frame,
-                        uint16_t                frame_offset,
-                        uint16_t                frame_length
-                      )
-{
-	NFCSTATUS status = NFCSTATUS_SUCCESS;
-	phDnldNfc_sRawHdr_t *raw_frame_hdr = ( phDnldNfc_sRawHdr_t * ) raw_frame;
-	
-	
-    switch(raw_frame_hdr->frame_type)
-	{
-        case PHDNLD_CMD_RESET:
-        {
-            break;
-        }
-        case PHDNLD_CMD_READ:
-        {
-			/* TODO: To Update the length and the buffer to receive data */
-            break;
-        }
-        case PHDNLD_CMD_WRITE:
-        {
-			phDnldNfc_sRawDataHdr_t *raw_data_hdr = 
-				( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN);
-
-            psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-
-            break;
-        }
-        case PHDNLD_CMD_SEC_WRITE:
-        { 
-            uint16_t    tx_length = 0x00;
-            uint16_t    frame_offset = 
-                          psDnldContext->tx_info.tx_offset;
-            uint16_t    chain = 
-                    psDnldContext->tx_info.tx_chain;
-
-            chain = 
-            phDnldNfc_Extract_Chunks(
-                         raw_frame,
-                         frame_offset,
-                         frame_length,
-                         PHDNLD_FW_TX_RX_LEN,
-                         &tx_length
-                       );
-
-            if( TRUE == chain )
-            {
-                status = phDnldNfc_Send_Command( psDnldContext,
-                                    pHwRef, PHDNLD_CMD_ENCAPSULATE,
-                                    (raw_frame + frame_offset),
-                                    tx_length);
-                if(NFCSTATUS_PENDING == status)
-                {
-                    psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
-                    /* TODO: Update for the Chaining */
-                    psDnldContext->tx_info.tx_offset += tx_length;
-                    psDnldContext->tx_info.tx_chain = chain;
-                }
-            }
-            else if (0 != frame_offset)
-            {
-                status = phDnldNfc_Send_Command( psDnldContext,
-                                    pHwRef, PHDNLD_CMD_ENCAPSULATE,
-                                    (raw_frame + frame_offset),
-                                    tx_length);
-                if(NFCSTATUS_PENDING == status)
-                {
-                    psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
-                    /* TODO: Update for the Chaining */
-                    psDnldContext->prev_dnld_size = frame_length;
-                    phDnldNfc_Tx_Reset(psDnldContext);
-                }
-            }
-            else
-            {
-			    phDnldNfc_sRawDataHdr_t *raw_data_hdr = 
-				    ( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN);
-                psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-            }
-
-            break;
-        }
-        case PHDNLD_CMD_CHECK:
-        {
-            psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-            break;
-        }
-        case PHDNLD_CMD_SET_HIF:
-        {
-            psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-            break;
-        }
-        case PHDNLD_CMD_ACTIVATE_PATCH:
-        {
-            psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-            break;
-        }
-        case PHDNLD_CMD_CHECK_INTEGRITY:
-        {
-			uint8_t integrity_param = 
-				 *(raw_frame + FRAME_HEADER_LEN);
-            switch(integrity_param)
-            {
-                case CHK_INTEGRITY_CONFIG_PAGE_CRC:
-                case CHK_INTEGRITY_PATCH_TABLE_CRC:
-                {
-                    psDnldContext->resp_length = PHDNLD_MIN_PACKET 
-                                         + CHECK_INTEGRITY_RESP_CRC16_LEN;
-                    break;
-                }
-                case CHK_INTEGRITY_FLASH_CODE_CRC:
-                case CHK_INTEGRITY_PATCH_CODE_CRC:
-                {
-                    psDnldContext->resp_length = PHDNLD_MIN_PACKET 
-                                        +  CHECK_INTEGRITY_RESP_CRC32_LEN;
-                    break;
-                }
-                case CHK_INTEGRITY_COMPLETE_CRC:
-                default:
-                {
-                    psDnldContext->resp_length = PHDNLD_MIN_PACKET 
-                                        +  CHECK_INTEGRITY_RESP_COMP_LEN;
-                    break;
-                }
-            }
-            break;
-        }
-        default:
-        {
-            status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FEATURE_NOT_SUPPORTED);
-            break;
-        }
-    }
-	
-    if (NFCSTATUS_SUCCESS == status)
-    {
-        status = phDnldNfc_Send( psDnldContext, pHwRef ,
-                            raw_frame, frame_length);
-							
-        if(NFCSTATUS_PENDING == status)
-        {
-            psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
-            /* TODO: Update for the Chaining */
-            psDnldContext->prev_dnld_size = frame_length;
-        }
-    }
-	
-	return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Frame_Complete(phDnldNfc_sContext_t *psDnldContext)
-{
-    NFCSTATUS               status = NFCSTATUS_SUCCESS;
-    phDnldNfc_sData_Hdr_t   *p_dnld_raw = NULL;
-    uint32_t                dnld_index = psDnldContext->dnld_index;
-    uint8_t                 *p_raw_sec_hdr = NULL;
-    uint16_t                tx_length = 0x00;
-
-    dnld_index = dnld_index + psDnldContext->prev_dnld_size;
-    p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
-    dnld_index = dnld_index + *p_raw_sec_hdr;
-
-    p_dnld_raw = (phDnldNfc_sData_Hdr_t *) (psDnldContext->p_fw_raw + 
-                                              psDnldContext->dnld_index);
-
-    tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 
-                            p_dnld_raw->frame_length[1]);
-
-    tx_length = tx_length + PHDNLD_MIN_PACKET;
-
-    return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Raw_Write(
-                        phDnldNfc_sContext_t    *psDnldContext,
-                        void                    *pHwRef
-                     )
-{
-    NFCSTATUS               status = NFCSTATUS_SUCCESS;
-    uint32_t                dnld_index = psDnldContext->dnld_index;
-    uint32_t                tx_length = 0;
-    uint8_t                 *p_raw_sec_hdr = NULL;
-    uint8_t                 dnld_flag = FALSE;
-    uint8_t                 skip_frame = FALSE;
-
-    if(NULL != psDnldContext->p_fw_raw)
-    {
-
-        if( (TRUE != psDnldContext->tx_info.tx_chain)
-            && (0x00 == psDnldContext->dnld_retry)
-          )
-        {
-            dnld_index = dnld_index + psDnldContext->prev_dnld_size;
-            p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
-            dnld_index = dnld_index + *p_raw_sec_hdr;
-        }
-        else
-        {
-            
-            phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *)
-									(psDnldContext->p_fw_raw + 
-                                              psDnldContext->dnld_index);
-
-            tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 
-                                    p_dnld_raw->frame_length[1]);
-
-            tx_length = tx_length + PHDNLD_MIN_PACKET;
-
-            status = phDnldNfc_Send_Raw( psDnldContext, pHwRef, 
-                            (uint8_t *)(p_dnld_raw),
-                            psDnldContext->tx_info.tx_offset,
-                                (uint16_t)tx_length);
-        }
-        
-
-#define PHDNLD_MAJOR_OFFSET        0x04U
-#define PHDNLD_MINOR_OFFSET        0x05U
-#define PHDNLD_PHASE_OFFSET        0x06U
-#define PHDNLD_FRAMETYPE_OFFSET    0x07U
-
-#define PHDNLD_NO_OPERATION        0x00U
-#define PHDNLD_NORMAL_OPERATION    0x10U
-#define PHDNLD_ADVANCED_OPERATION  0x20U
-#define PHDNLD_SETUP_OPERATION	   0x40U
-#define PHDNLD_RECOVER_OPERATION   0x80U
-#define PHDNLD_COMPLETE_OPERATION  0xF0U
-
-#define PHDNLD_TERMINATE_TYPE      0x0EU
-
-#define PHDNLD_MARKER_MASK         0x0FU
-
-        while((NFCSTATUS_SUCCESS == status )
-                && (FALSE == dnld_flag)
-            )
-       {
-            phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *)
-												(psDnldContext->p_fw_raw + dnld_index);
-            uint8_t               frame_type = *(p_raw_sec_hdr + PHDNLD_FRAMETYPE_OFFSET);
-
-            tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 
-                                    p_dnld_raw->frame_length[1]);
-
-            tx_length = tx_length + PHDNLD_MIN_PACKET;
-
-            skip_frame = FALSE;
-
-            if(  (0x00 == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET))
-                    || (0xFF == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET))
-                	|| !( psDnldContext->raw_mode_upgrade
-                     & (frame_type & (~PHDNLD_MARKER_MASK)) )
-                     )
-            {
-                dnld_index = dnld_index + tx_length;
-                p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
-                dnld_index = dnld_index + *p_raw_sec_hdr;
-                skip_frame = TRUE;
-            }
-            if (PHDNLD_TERMINATE_TYPE == 
-                        (frame_type & PHDNLD_MARKER_MASK))
-            {
-				if(TRUE != skip_frame)
-				{
-                   psDnldContext->raw_mode_upgrade = 
-                       (psDnldContext->raw_mode_upgrade &
-                              ~(frame_type & ~PHDNLD_MARKER_MASK)) ;
-				}
-
-                if(PHDNLD_NO_OPERATION ==
-                        psDnldContext->raw_mode_upgrade)
-                {
-                   dnld_flag = TRUE;
-                }
-            }
-            else
-            {
-
-            }
-
-            if((FALSE == skip_frame)
-                && (FALSE == dnld_flag)
-                )
-            {
-                status = phDnldNfc_Send_Raw( psDnldContext, pHwRef, 
-                               (uint8_t *)(p_dnld_raw),
-                               psDnldContext->tx_info.tx_offset,
-                                    (uint16_t)tx_length);
-            }
-
-            if( NFCSTATUS_PENDING == status )
-            {
-                psDnldContext->dnld_index = dnld_index;
-				psDnldContext->cur_frame_info= frame_type;
-            }
-        }
-    }
-
-    return status;
-}
 
 static
 NFCSTATUS
@@ -2347,18 +1798,13 @@
                         )
 {
     NFCSTATUS               status = NFCSTATUS_SUCCESS;
+    /* section_info_t          *p_cur_sec = psDnldContext->p_fw_sec +
+                                  psDnldContext->section_index; */
 
     PHNFC_UNUSED_VARIABLE(pdata);
     PHNFC_UNUSED_VARIABLE(length);
 
-    if(phDnld_Raw_Upgrade == psDnldContext->cur_dnld_seq)
-    {
-       status = phDnldNfc_Raw_Write( psDnldContext, pHwRef );
-    }
-    else
-    {
     status = phDnldNfc_Resume_Write( psDnldContext, pHwRef );
-    }
 
     return status;
 }
@@ -2377,7 +1823,7 @@
     NFCSTATUS             status = NFCSTATUS_SUCCESS;
     phDnldNfc_eState_t    dnld_next_state = (phDnldNfc_eState_t)
                                     psDnldContext->cur_dnld_state;
-    phNfc_sCompletionInfo_t comp_info = {0};
+    phNfc_sCompletionInfo_t comp_info = {0,0,0};
 
     switch( dnld_next_state )
     {
@@ -2505,7 +1951,7 @@
                 {
                     if (crc_i < DNLD_CRC16_SIZE )
                     {
-                        patch_table_crc = patch_table_crc 
+                        patch_table_crc = patch_table_crc
                             | psDnldContext->chk_integrity_crc.patch_table.Chk_Crc16[crc_i]
                                     << (crc_i * BYTE_SIZE)  ;
                     }
@@ -2572,14 +2018,12 @@
                             psDnldContext->lower_interface.pcontext, pHwRef);
         phDnldNfc_Release_Lower(psDnldContext, pHwRef);
         phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
-        gpphDnldContext = psDnldContext;
-#endif
         /* Notify the Error/Success Scenario to the upper layer */
         phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, (uint8_t)
             ((NFCSTATUS_SUCCESS == comp_info.status )? NFC_IO_SUCCESS: NFC_IO_ERROR),
                     &comp_info );
     }
+
     return status;
 }
 
@@ -2597,19 +2041,20 @@
                         (phDnldNfc_sData_Hdr_t *) pdata;
 
     PHNFC_UNUSED_VARIABLE(pHwRef);
-    DNLD_DEBUG(" FW_DNLD: Receive Length = %X \n", length );
-    if(( psDnldContext->rx_info.rx_total == 0 )
+    /* DNLD_DEBUG(" FW_DNLD: Receive Length = %X \n", length ); */
+    if(( psDnldContext->rx_total == 0 )
         && (PHDNLD_MIN_PACKET <= length)
+        /* && (FALSE == psDnldContext->recv_pending) */
         )
     {
-        psDnldContext->rx_info.rx_total =
+        psDnldContext->rx_total =
             ((uint16_t)resp_data->frame_length[0] << BYTE_SIZE)|
                         resp_data->frame_length[1];
-        if( psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET == length )
+        if( psDnldContext->rx_total + PHDNLD_MIN_PACKET == length )
         {
 
             DNLD_DEBUG(" FW_DNLD: Success Memory Read = %X \n",
-                                                psDnldContext->rx_info.rx_total);
+                                                psDnldContext->rx_total);
 #ifndef DNLD_SUMMARY
             /* DNLD_PRINT_BUFFER("Receive Buffer",pdata,length); */
 #endif
@@ -2619,11 +2064,13 @@
         {
            /* status = phDnldNfc_Receive( psDnldContext, pHwRef,
                 psDnldContext->p_resp_buffer,
-               (uint8_t)((psDnldContext->rx_info.rx_total <= PHDNLD_MAX_PACKET)?
-                    psDnldContext->rx_info.rx_total: PHDNLD_MAX_PACKET) ); */
+               (uint8_t)((psDnldContext->rx_total <= PHDNLD_MAX_PACKET)?
+                    psDnldContext->rx_total: PHDNLD_MAX_PACKET) );
+            psDnldContext->recv_pending =
+                        (uint8_t)( NFCSTATUS_PENDING == status); */
             DNLD_PRINT(" FW_DNLD: Invalid Receive length ");
             DNLD_DEBUG(": Length Expected = %X \n",
-            (psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET));
+            (psDnldContext->rx_total + PHDNLD_MIN_PACKET));
             status = PHNFCSTVAL( CID_NFC_DNLD,
                                     NFCSTATUS_INVALID_RECEIVE_LENGTH );
         }
@@ -2631,7 +2078,7 @@
     else
     {
         /*TODO:*/
-        psDnldContext->rx_info.rx_total = 0 ;
+        psDnldContext->rx_total = 0 ;
         status = PHNFCSTVAL( CID_NFC_DNLD,
                                 NFCSTATUS_INVALID_RECEIVE_LENGTH );
     }
@@ -2653,7 +2100,7 @@
     void                    *pdata = NULL ;
     phDnldNfc_sData_Hdr_t   *resp_data = NULL;
     uint16_t                length = 0 ;
-    phNfc_sCompletionInfo_t comp_info = {0};
+    phNfc_sCompletionInfo_t comp_info = {0,0,0};
 
     DNLD_PRINT("\n FW_DNLD: Receive Response .... ");
     if ( (NULL != psContext)
@@ -2666,7 +2113,6 @@
         status = pInfo->status ;
         length = pInfo->length ;
         pdata = pInfo->buffer;
-
         if(status != NFCSTATUS_SUCCESS)
         {
             DNLD_DEBUG(" Failed. Status = %02X\n",status);
@@ -2678,10 +2124,9 @@
             /* Handle the Error Scenario */
             status = PHNFCSTVAL( CID_NFC_DNLD,  NFCSTATUS_FAILED );
         }
-        else if ((0 == length) 
-            || (PHDNLD_MIN_PACKET > length ))
+        else if (0 == length)
         {
-            DNLD_DEBUG(" Receive Response Length = %u .... \n",length);
+            DNLD_PRINT(" Receive Response Length = 0 .... \n");
             /* Handle the Error Scenario */
 #ifndef HAL_SW_DNLD_RLEN
              status = PHNFCSTVAL( CID_NFC_DNLD,
@@ -2691,15 +2136,6 @@
         else
         {
 
-#if defined(FW_DOWNLOAD_TIMER) && \
-                (FW_DOWNLOAD_TIMER == 2)
-        if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
-        {
-            phOsalNfc_Timer_Stop( psDnldContext->timer_id );
-        }
-
-#endif
-
 #ifndef DNLD_SUMMARY
             DNLD_PRINT_BUFFER("Receive Buffer",pdata,length);
 #endif
@@ -2718,9 +2154,6 @@
                     {
                         case PHDNLD_CMD_READ :
                         {
-							if( PHDNLD_NO_OPERATION
-							       == psDnldContext->raw_mode_upgrade)
-                            {
                             status = phDnldNfc_Process_Response(
                                     psDnldContext, pHwRef, pdata , length);
 
@@ -2730,18 +2163,10 @@
                                 psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
                                 /* psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY */
                             }
-                            }
-                            else
-                            {
-
-                            }
                             break;
                         }
                         case PHDNLD_CMD_CHECK_INTEGRITY :
                         {
-							if( PHDNLD_NO_OPERATION
-							       == psDnldContext->raw_mode_upgrade)
-							{
 #if  (NXP_FW_INTEGRITY_CHK >= 0x01)
                             phDnldNfc_sChkCrcComplete_t *p_dnld_crc_all = 
                                 &psDnldContext->chk_integrity_crc;
@@ -2786,16 +2211,8 @@
                                     break;
                                 }
                             }
+
 #endif /* #if  (NXP_FW_INTEGRITY_CHK >= 0x01) */
-							}
-							else
-							{
-                                psDnldContext->raw_mode_upgrade =
-                                     (PHDNLD_SETUP_OPERATION | PHDNLD_ADVANCED_OPERATION);
-                                /* psDnldContext->raw_mode_upgrade =
-                                    (psDnldContext->raw_mode_upgrade &
-                                     ( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); */
-							}
                             break;
                         }
                         case PHDNLD_CMD_WRITE:
@@ -2803,18 +2220,10 @@
                             psDnldContext->dnld_retry = 0;
                             break;
                         }
-                        case PHDNLD_CMD_SEC_WRITE:
-                        {
-                            psDnldContext->dnld_retry = 0;
-                            break;
-                        }
                         case PHDNLD_CMD_ACTIVATE_PATCH:
                         case PHDNLD_CMD_CHECK:
                         default:
                         {
-							if( PHDNLD_NO_OPERATION
-							       == psDnldContext->raw_mode_upgrade)
-							{
                             if( ( (PHDNLD_MIN_PACKET > length)
                                 || ( 0 != resp_length) )
                                 )
@@ -2827,20 +2236,14 @@
                             {
                                 psDnldContext->dnld_retry = 0;
                             }
-							}
-							else
-							{
-                                psDnldContext->raw_mode_upgrade =
-                                        (psDnldContext->raw_mode_upgrade & ~PHDNLD_RECOVER_OPERATION);
-							}
                             break;
                         }
                     } /* End of the Previous Command Switch Case */
                     break;
                 }/* Case PHDNLD_RESP_SUCCESS*/
                 case PHDNLD_RESP_TIMEOUT:
-                case PHDNLD_RESP_CRC_ERROR:
                 case PHDNLD_RESP_WRITE_ERROR:
+                case PHDNLD_RESP_CRC_ERROR:
                 {
                     if(psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY )
                     {
@@ -2852,139 +2255,22 @@
                 }
                 /* fall through */
                 case PHDNLD_RESP_ACCESS_DENIED:
+                case PHDNLD_RESP_PROTOCOL_ERROR:
                 case PHDNLD_RESP_INVALID_PARAMETER:
                 case PHDNLD_RESP_INVALID_LENGTH:
-                    /*  Initial Frame Checksum */
-                case PHDNLD_RESP_CHKSUM_ERROR:
-                case PHDNLD_RESP_MEMORY_UPDATE_ERROR:
                 {
                     psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
                     status = PHNFCSTVAL(CID_NFC_DNLD,
                                                 resp_data->frame_type);
                     break;
                 }
-                case PHDNLD_RESP_PROTOCOL_ERROR:
-                {
-					if(( PHDNLD_NO_OPERATION 
-							== psDnldContext->raw_mode_upgrade)
-                            || ( PHDNLD_ADVANCED_OPERATION 
-							== psDnldContext->raw_mode_upgrade)
-                            )
-                    {
-                        psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
-                        status = PHNFCSTVAL(CID_NFC_DNLD,
-                                            NFCSTATUS_INVALID_FORMAT);
-                    }
-					else if( (PHDNLD_NORMAL_OPERATION 
-                                 & psDnldContext->raw_mode_upgrade)
-                            )
-					{
-                        psDnldContext->raw_mode_upgrade = 
-                               (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION);
-					}
-                    else if ( PHDNLD_RECOVER_OPERATION 
-                                 & psDnldContext->raw_mode_upgrade )
-                    {
-                        psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
-                        status = PHNFCSTVAL(CID_NFC_DNLD,
-                                            NFCSTATUS_INVALID_FORMAT);
-                    }
-                    else
-                    {
-                       psDnldContext->raw_mode_upgrade =
-                        (psDnldContext->raw_mode_upgrade &
-                            ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
-                    }
-                    break;
-                }
-                case PHDNLD_RESP_VERSION_UPTODATE:
-                {
-					/* TODO: to make sure that the Advance Frames are sent to get
-					 *       the updated status */
-					if ( PHDNLD_ADVANCED_OPERATION
-                                 == psDnldContext->raw_mode_upgrade)
-					{
-						status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
-					}
-                    else if ( PHDNLD_NO_OPERATION
-                                != psDnldContext->raw_mode_upgrade)
-                    {
-
-                       psDnldContext->raw_mode_upgrade =
-                        (psDnldContext->raw_mode_upgrade &
-                            ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
-                    }
-                    else
-                    {
-                    }
-                    break;
-                }
-                case PHDNLD_RESP_CMD_NOT_SUPPORTED:
-                {
-
-                    if ( PHDNLD_NO_OPERATION 
-                                 == psDnldContext->raw_mode_upgrade)
-                    {
-                        status = PHNFCSTVAL(CID_NFC_DNLD,
-                            NFCSTATUS_FEATURE_NOT_SUPPORTED);
-                    }
-                    else if ( PHDNLD_ADVANCED_OPERATION 
-                                 == psDnldContext->raw_mode_upgrade)
-					{
-						status = PHNFCSTVAL(CID_NFC_DNLD,
-										 NFCSTATUS_FEATURE_NOT_SUPPORTED);
-					}
-#if 0
-					else if( (PHDNLD_NORMAL_OPERATION
-                                 & psDnldContext->raw_mode_upgrade)
-                            )
-					{
-                        psDnldContext->raw_mode_upgrade =
-                               (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION);
-					}
-                    else if ( PHDNLD_SETUP_OPERATION
-                                 & psDnldContext->raw_mode_upgrade )
-                    {
-                        psDnldContext->raw_mode_upgrade =
-                               (psDnldContext->raw_mode_upgrade & ~PHDNLD_SETUP_OPERATION);
-                    }
-#endif
-                    else
-                    {
-                       psDnldContext->raw_mode_upgrade =
-                        (psDnldContext->raw_mode_upgrade &
-                            ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
-                    }
-                    break;
-                }
-               /*  The Chaining of the Command Frame
-                                  was Successful in the Download Mode */
-                case PHDNLD_RESP_CHAINING_SUCCESS:
-                {
-					/* TODO: Handle the Corner Case Scenarios
-					 *       the updated status */
-                    psDnldContext->dnld_retry = 0x00;
-                    break;
-                }
-/*  The Error during the Chaining the Command Frame in the Download Mode */
-                case PHDNLD_RESP_CHAINING_ERROR:
-                {
-					/* TODO: Restart the Chunk in Corner Case
-					 *       the updated status */
-                    psDnldContext->dnld_retry++;
-                    phDnldNfc_Tx_Reset(psDnldContext);
-                    break;
-                }
-/*  The Command is not allowed anymore in the Download Mode */
-                case PHDNLD_RESP_CMD_NOT_ALLOWED:
                 default:
                 {
                     psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
                     status = PHNFCSTVAL(CID_NFC_DNLD,
-                                        NFCSTATUS_NOT_ALLOWED);
+                                     NFCSTATUS_FEATURE_NOT_SUPPORTED);
                     break;
                 }
-
             } /* End of the Response Frame Type Switch */
 
             if (NFCSTATUS_PENDING != status)
@@ -3003,57 +2289,10 @@
                                 psDnldContext->lower_interface.pcontext, pHwRef);
                     phDnldNfc_Release_Lower(psDnldContext, pHwRef);
                     phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
-                    gpphDnldContext = psDnldContext;
-#endif
                     /* Notify the Error/Success Scenario to the upper layer */
                     phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
                                     (uint8_t) NFC_IO_ERROR, &comp_info );
                 }
-                else if ( (NFCSTATUS_SUCCESS != status) &&
-                           (NFCSTATUS_SUCCESS == PHNFCSTATUS(status))
-                         )
-                {
-                    pphNfcIF_Notification_CB_t  p_upper_notify =
-                        psDnldContext->p_upper_notify;
-                    void                        *p_upper_context =
-                                        psDnldContext->p_upper_context;
-
-                    comp_info.status = NFCSTATUS_SUCCESS;
-                    DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status);
-                    status = phDal4Nfc_Unregister(
-                                psDnldContext->lower_interface.pcontext, pHwRef);
-                    phDnldNfc_Release_Lower(psDnldContext, pHwRef);
-                    phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
-                    gpphDnldContext = psDnldContext;
-#endif
-                    /* Notify the Error/Success Scenario to the upper layer */
-                    phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
-                        (uint8_t) NFC_IO_SUCCESS, &comp_info );
-
-                }
-                else if (NFCSTATUS_FEATURE_NOT_SUPPORTED == PHNFCSTATUS(status))
-                {
-                    pphNfcIF_Notification_CB_t  p_upper_notify =
-                        psDnldContext->p_upper_notify;
-                    void                        *p_upper_context =
-                                        psDnldContext->p_upper_context;
-
-                    comp_info.status = status;
-                    DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status);
-                    status = phDal4Nfc_Unregister(
-                                psDnldContext->lower_interface.pcontext, pHwRef);
-                    phDnldNfc_Release_Lower(psDnldContext, pHwRef);
-                    phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
-                    gpphDnldContext = psDnldContext;
-#endif
-                    /* Notify the Error/Success Scenario to the upper layer */
-                    phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
-                        (uint8_t) NFC_IO_SUCCESS, &comp_info );
-
-                }
                 else
                 {
                     /* DNLD_PRINT(" FW_DNLD: Successful.\n"); */
@@ -3103,28 +2342,22 @@
             if ((PHDNLD_CMD_SET_HIF != psDnldContext->prev_cmd)
                 && (PHDNLD_CMD_RESET != psDnldContext->prev_cmd))
             {
-                psDnldContext->rx_info.rx_total = 0;
+                psDnldContext->rx_total = 0;
                 status = phDnldNfc_Receive( psDnldContext, pHwRef,
                             (uint8_t *)(&psDnldContext->dnld_resp),
                                            psDnldContext->resp_length);
+                /* psDnldContext->recv_pending =
+                                (uint8_t)( NFCSTATUS_PENDING == status); */
             }
             else
             {
                 psDnldContext->resp_length = 0;
                 psDnldContext->dnld_retry = 0;
-                if( PHDNLD_CMD_RESET == psDnldContext->prev_cmd )
-                {
-                    DO_DELAY(PHDNLD_DNLD_DELAY);
-                }
-#if defined(FW_DOWNLOAD_TIMER) && \
-                (FW_DOWNLOAD_TIMER == 2)
-
-                if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
-                {
-                    phOsalNfc_Timer_Stop( psDnldContext->timer_id );
-                }
-#endif
-
+                /* clock unstable after SW reset command, especially on UART
+                 * platform because of its sensitivity to clock. Experimentally
+                 * we found clock unstable for 750us. Delay for 5ms to be sure.
+                 */
+                usleep(5000);
                 status = phDnldNfc_Set_Seq(psDnldContext,
                                                 DNLD_SEQ_UPDATE);
             }
@@ -3140,7 +2373,6 @@
 }
 
 
-
 STATIC
 NFCSTATUS
 phDnldNfc_Send_Command(
@@ -3155,8 +2387,6 @@
     uint16_t    tx_length = 0;
     uint16_t    rx_length = 0;
     uint8_t     **pp_resp_data = &psDnldContext->p_resp_buffer;
-    phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
 
     switch(cmd)
     {
@@ -3168,10 +2398,8 @@
         }
         case PHDNLD_CMD_READ:
         {
-            phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
             phDnldNfc_sParam_t  *param_info = /* (phDnldNfc_sParam_t *)params */
-                               &p_dnld_data->param_info.data_param;
+                                &psDnldContext->dnld_data.param_info.data_param;
             tx_length = PHDNLD_CMD_READ_LEN;
             if (NULL != *pp_resp_data)
             {
@@ -3182,18 +2410,21 @@
                                    << BYTE_SIZE) + param_info->data_len[1]);
 
             psDnldContext->resp_length =
-                (( rx_length + PHDNLD_MIN_PACKET ));
+#if 0
+                (((rx_length > PHDNLD_DATA_SIZE)?
+                            PHDNLD_DATA_SIZE + PHDNLD_MIN_PACKET:
+#else
+                ((
+#endif
+                               rx_length + PHDNLD_MIN_PACKET ));
             (void)phDnldNfc_Allocate_Resource( (void **) pp_resp_data,
                      rx_length);
             break;
         }
         case PHDNLD_CMD_WRITE:
-        case PHDNLD_CMD_SEC_WRITE:
         {
-            phDnldNfc_sData_t       *p_dnld_data =
-                 (phDnldNfc_sData_t *)psDnldContext->dnld_data;
             phDnldNfc_sParam_t  *param_info = /* (phDnldNfc_sParam_t *)params */
-                                &p_dnld_data->param_info.data_param;
+                                &psDnldContext->dnld_data.param_info.data_param;
             tx_length = (uint16_t) (((uint16_t)param_info->data_len[0]
                         << BYTE_SIZE) + param_info->data_len[1]
                                     + PHDNLD_CMD_WRITE_MIN_LEN );
@@ -3211,36 +2442,6 @@
             psDnldContext->resp_length = PHDNLD_MIN_PACKET;
             break;
         }
-        case PHDNLD_CMD_ENCAPSULATE:
-        {
-            uint8_t  i = 0x00;
-            if ((0 != param_length) && (NULL != params))
-            {
-                p_dnld_data->frame_type =
-                            PHDNLD_CMD_ENCAPSULATE;
-                (void)memcpy((void *)( ((uint8_t *)p_dnld_data)
-                                           + PHDNLD_FRAME_DATA_OFFSET)
-                                        , params, param_length);
-                tx_length = param_length;
-
-                p_dnld_data->frame_length[i++] =
-                           (uint8_t)(tx_length >> BYTE_SIZE);
-                p_dnld_data->frame_length[i]   =
-                           (uint8_t)( tx_length & BYTE_MASK );
-                tx_length += PHDNLD_FRAME_DATA_OFFSET;
-
-                psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-
-                status = phDnldNfc_Send( psDnldContext, pHwRef ,
-                                    (uint8_t *)p_dnld_data, tx_length);
-            }
-            else
-            {
-               status = PHNFCSTVAL(CID_NFC_DNLD,
-                              NFCSTATUS_NOT_ALLOWED);
-            }
-            break;
-        }
         case PHDNLD_CMD_SET_HIF:
         {
             tx_length++;
@@ -3252,14 +2453,14 @@
             psDnldContext->resp_length = PHDNLD_MIN_PACKET;
             if ((NULL != params) && ( param_length > 0 ))
             {
-                p_dnld_data->param_info.cmd_param =
+                psDnldContext->dnld_data.param_info.cmd_param =
                                             (*(uint8_t *)params);
                 tx_length = param_length;
             }
             else
             {
-                p_dnld_data->param_info.cmd_param = FALSE;
-            tx_length++;
+                psDnldContext->dnld_data.param_info.cmd_param = FALSE;
+                tx_length++;
             }
             break;
         }
@@ -3268,16 +2469,16 @@
 #if  (NXP_FW_INTEGRITY_CHK >= 0x01)
             if ((NULL != params) && ( param_length > 0 ))
             {
-                psDnldContext->chk_integrity_param =
+                psDnldContext->chk_integrity_param = 
                             (phDnldNfc_eChkCrc_t)(*(uint8_t *)params);
-                tx_length = param_length ;
+                tx_length = param_length;
             }
             else
             {
                 psDnldContext->chk_integrity_param = CHK_INTEGRITY_COMPLETE_CRC;
                 tx_length++;
             }
-            p_dnld_data->param_info.cmd_param =
+            psDnldContext->dnld_data.param_info.cmd_param =
                                 (uint8_t) psDnldContext->chk_integrity_param;
             switch(psDnldContext->chk_integrity_param)
             {
@@ -3305,7 +2506,7 @@
             }
 #else
             tx_length++;
-            p_dnld_data->param_info.cmd_param = 
+            psDnldContext->dnld_data.param_info.cmd_param =
                                 (uint8_t) CHK_INTEGRITY_COMPLETE_CRC;
 
 #endif /* #if  (NXP_FW_INTEGRITY_CHK >= 0x01) */
@@ -3321,32 +2522,58 @@
     {
         uint8_t     i = 0;
 
-        p_dnld_data->frame_type = cmd;
-        p_dnld_data->frame_length[i++] =
+        psDnldContext->dnld_data.frame_type = cmd;
+        psDnldContext->dnld_data.frame_length[i++] =
                                     (uint8_t)(tx_length >> BYTE_SIZE);
-        p_dnld_data->frame_length[i]   =
+        psDnldContext->dnld_data.frame_length[i]   =
                                     (uint8_t)( tx_length & BYTE_MASK );
         tx_length = tx_length + PHDNLD_MIN_PACKET;
         status = phDnldNfc_Send( psDnldContext, pHwRef ,
-                            (uint8_t *)p_dnld_data, tx_length);
+                            (uint8_t *)(&psDnldContext->dnld_data), tx_length);
         if(NFCSTATUS_PENDING == status)
         {
             psDnldContext->prev_cmd = cmd;
 
+            if( PHDNLD_CMD_RESET == cmd )
+                DO_DELAY(PHDNLD_DNLD_DELAY);  //this seems like its on the wrong thread
         }
+
     }
 
     return status;
 }
 
+
 static
 NFCSTATUS
-phDnldNfc_Check_FW(
-                    phHal_sHwReference_t    *pHwRef,
-                    fw_data_hdr_t           *cur_fw_hdr
+phDnldNfc_Process_FW(
+                        phDnldNfc_sContext_t    *psDnldContext,
+                        phHal_sHwReference_t    *pHwRef
+#ifdef NXP_FW_PARAM
+                        ,uint8_t                 *nxp_nfc_fw
+#endif
                      )
 {
     NFCSTATUS               status = NFCSTATUS_FAILED;
+    section_info_t          *p_cur_sec = NULL;
+    static unsigned         sec_type;
+    uint32_t                fw_index = 0;
+    fw_data_hdr_t           *cur_fw_hdr = NULL;
+    uint8_t                 sec_index = 0;
+    uint8_t                 i = 0;
+
+    psDnldContext->p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw;
+
+    fw_index = sizeof (img_data_hdr_t);
+
+    for ( i=0; i < psDnldContext->p_img_hdr->no_of_fw_img; i++ )
+    {
+
+        psDnldContext->p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index );
+        /* TODO: Create a memory of pointers to store all the Firmwares */
+        cur_fw_hdr = psDnldContext->p_fw_hdr;
+
+        fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
 
         if ( !pHwRef->device_info.fw_version )
         {
@@ -3362,6 +2589,9 @@
             status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
         }
         else if (( pHwRef->device_info.fw_version < cur_fw_hdr->fw_version  )
+#ifdef NXP_FW_PATCH_VERIFY
+            && (pHwRef->device_info.full_version[NXP_PATCH_VER_INDEX] < cur_fw_hdr->fw_patch )
+#endif
             )
         {
             /* TODO: Firmware Version Check and upgrade*/
@@ -3381,87 +2611,22 @@
             DNLD_PRINT(" FW_DNLD: Already Updated .... \n");
             status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
         }
-
-    return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Process_FW(
-                        phDnldNfc_sContext_t    *psDnldContext,
-                        phHal_sHwReference_t    *pHwRef
-#ifdef NXP_FW_PARAM
-                        ,uint8_t                 *nxp_nfc_fw
-                        ,uint32_t                 nxp_fw_len
-#endif
-                     )
-{
-    NFCSTATUS               status = NFCSTATUS_FAILED;
-    section_info_t          *p_cur_sec = NULL;
-    static unsigned         sec_type;
-    uint32_t                fw_index = 0;
-#ifdef NXP_NFC_MULTIPLE_FW
-    phDnldNfc_sFwImageInfo_t  *p_cur_fw = NULL;
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-    fw_data_hdr_t           *cur_fw_hdr = NULL;
-    uint8_t                 sec_index = 0;
-    uint8_t                 i = 0;
-
-    psDnldContext->p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw;
-
-#ifdef NXP_NFC_MULTIPLE_FW
-
-    /* TODO: Create a memory of pointers to store all the Firmwares */
-    if( (NXP_NFC_IMAG_FW_MAX > psDnldContext->p_img_hdr->no_of_fw_img)
-        && (0 != psDnldContext->p_img_hdr->no_of_fw_img)
-        )
-    {
-        ( void )phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_img_info,
-            (psDnldContext->p_img_hdr->no_of_fw_img * sizeof(phDnldNfc_sFwImageInfo_t)));
-
-        if(NULL != psDnldContext->p_img_info)
-        {
-            p_cur_fw = psDnldContext->p_img_info;
-        }
     }
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
-    fw_index = sizeof (img_data_hdr_t);
-
-    for ( i=0; i < psDnldContext->p_img_hdr->no_of_fw_img; i++ )
-    {
-
-        psDnldContext->p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index );
-
-#ifdef NXP_NFC_MULTIPLE_FW
-        if(NULL != p_cur_fw)
-        {
-            ( p_cur_fw + i)->p_fw_hdr = psDnldContext->p_fw_hdr;
-        }
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-        cur_fw_hdr = psDnldContext->p_fw_hdr;
-
-        fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
-
-        status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr);
-
-    }
-
     if ( ( NFCSTATUS_SUCCESS == status )
 #if  defined (NXP_FW_INTEGRITY_VERIFY)
         || (NFCSTATUS_SUCCESS == PHNFCSTATUS(status) )
 #endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */
         )
     {
-        if( (BYTE_MASK > cur_fw_hdr->no_of_sections)
-           && (0 != cur_fw_hdr->no_of_sections)
-          )
-        {
+
         (void) phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_fw_sec,
             (cur_fw_hdr->no_of_sections * sizeof(section_info_t)));
-
-            if(NULL != psDnldContext->p_fw_sec)
+        if(NULL == psDnldContext->p_fw_sec)
+        {
+            status = PHNFCSTVAL(CID_NFC_DNLD,
+                            NFCSTATUS_INSUFFICIENT_RESOURCES);
+        }
+        else
         {
             DNLD_DEBUG(" FW_DNLD: FW Index : %x \n",
                                             fw_index );
@@ -3490,7 +2655,7 @@
 
                 sec_type = (unsigned int)p_cur_sec->p_sec_hdr->section_mem_type;
 
-                    if((sec_type & DNLD_TRIM_MASK))
+                if(TRUE == ((section_type_t *)(&sec_type))->trim_val )
                 {
                     p_cur_sec->p_trim_data = (uint8_t *)
                                (nxp_nfc_fw + fw_index + sizeof(section_hdr_t));
@@ -3500,42 +2665,25 @@
                     p_cur_sec->p_trim_data = NULL;
                 }
 
-                    if (0 == sec_index)
-                    {
-                        if ((sec_type & DNLD_SM_UNLOCK_MASK))
-                        {
-                            (void)phDnldNfc_Set_Seq(psDnldContext,
-                                                            DNLD_SEQ_UNLOCK);
-                        }
-                        else
-                        {
-                            (void)phDnldNfc_Set_Seq(psDnldContext,
-                                                            DNLD_SEQ_INIT);
-                        }
-                    }
                 p_cur_sec->section_read = FALSE;
 
                 p_cur_sec->section_offset = 0;
 
                 p_cur_sec->p_sec_data = ((uint8_t *) nxp_nfc_fw) + fw_index +
+#ifdef SECTION_HDR
                     (p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN);
+#else
+                        sizeof (section_hdr_t) ;
+#endif
 
                 fw_index = fw_index +
+#ifdef SECTION_HDR
                     (p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN)
+#else
+                    sizeof (section_hdr_t)
+#endif
                    + p_cur_sec->p_sec_hdr->section_length;
 
-
-                    if( 0 != p_cur_sec->p_sec_hdr->section_checksum )
-                    {
-                            DNLD_DEBUG(" FW_DNLD: Section checksum : %x \n",
-                                            p_cur_sec->p_sec_hdr->section_checksum );
-
-                            p_cur_sec->p_sec_chksum = ( uint8_t *)(nxp_nfc_fw + fw_index);
-
-                            fw_index = fw_index +
-                                p_cur_sec->p_sec_hdr->section_checksum;
-                    }
-
                DNLD_DEBUG(" FW_DNLD: FW Index : %x \n", fw_index );
 
 #if  (NXP_FW_INTEGRITY_CHK >= 0x01)
@@ -3569,37 +2717,13 @@
                    {
                        break;
                    }
-
-                    } /* End of Address Switch */
-#endif /* #if  (NXP_FW_INTEGRITY_CHK >= 0x01) */
-                } /* End of For Loop */
-            } /* End of the Null Check */
-            else
-            {
-                status = PHNFCSTVAL(CID_NFC_DNLD,
-                        NFCSTATUS_INSUFFICIENT_RESOURCES);
                }
+#endif /* #if  (NXP_FW_INTEGRITY_CHK >= 0x01) */
 
             }
-        else if (
-                   (0 == cur_fw_hdr->no_of_sections)
-                   && (PHDNLD_FW_PATCH_SEC == cur_fw_hdr->fw_patch)
-                )
-        {
-            psDnldContext->p_fw_raw = (uint8_t *)(nxp_nfc_fw + fw_index);
-
-			psDnldContext->raw_mode_upgrade = PHDNLD_COMPLETE_OPERATION;
-
-            (void)phDnldNfc_Set_Seq(psDnldContext,
-                                            DNLD_SEQ_RAW);
-        }
-        else
-        {
-          DNLD_PRINT("*********  Empty Section and Firmware ******************\n\n");
-        }
 
             DNLD_PRINT("*******************************************\n\n");
-
+        }
     }
     return status;
 }
@@ -3634,7 +2758,45 @@
 
         fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
 
-        status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr);
+        if ( !pHwRef->device_info.fw_version )
+        {
+            /* Override the Firmware Version Check and upgrade*/;
+            DNLD_PRINT(" FW_DNLD_CHK: Forceful Upgrade of the Firmware .... Required \n");
+            status = NFCSTATUS_SUCCESS;
+        }
+        else    if ( (pHwRef->device_info.fw_version >> (BYTE_SIZE * 2)) 
+                != ( cur_fw_hdr->fw_version >> (BYTE_SIZE * 2) ))
+        {
+            /* Check for the Compatible Romlib Version for the Hardware */
+            DNLD_PRINT(" FW_DNLD: IC Hardware Version Mismatch.. \n");
+            status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
+        }
+        else if (( pHwRef->device_info.fw_version < cur_fw_hdr->fw_version  )
+#ifdef NXP_FW_PATCH_VERIFY
+            && (pHwRef->device_info.full_version[NXP_PATCH_VER_INDEX] < cur_fw_hdr->fw_patch )
+#endif
+            )
+        {
+            /* TODO: Firmware Version Check and upgrade*/
+            DNLD_PRINT(" FW_DNLD_CHK: Older Firmware. Upgrading to newer one.... \n");
+            status = NFCSTATUS_SUCCESS;
+        }
+#ifdef NXP_FW_CHK_LATEST
+        else if (( pHwRef->device_info.fw_version > cur_fw_hdr->fw_version  )
+            )
+        {
+            DNLD_PRINT(" FW_DNLD: Newer than the Stored One .... \n");
+            status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
+        }
+#endif /* NXP_FW_CHK_LATEST */
+        else
+        {
+            DNLD_PRINT(" FW_DNLD_CHK: Already Updated .... \n");
+            status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
+        }
+    }
+    if( NFCSTATUS_SUCCESS == status )
+    {
     }
     return status;
 }
@@ -3645,39 +2807,26 @@
 STATIC
 void
 phDnldNfc_Abort (
-                    uint32_t    abort_id
-#ifdef NFC_TIMER_CONTEXT
-                    , void     *dnld_cntxt
-#endif
+                    uint32_t    abort_id,
+                    void *pContext
                 )
 {
 
-    phNfc_sCompletionInfo_t  comp_info = {0};
+    phNfc_sCompletionInfo_t  comp_info = {0,0,0};
 
-    phDnldNfc_sContext_t *p_dnld_context = NULL;
-
-#ifdef NFC_TIMER_CONTEXT
-    p_dnld_context = (phDnldNfc_sContext_t *)dnld_cntxt;
-#else
-    p_dnld_context = gpphDnldContext;
-#endif
-
-    if ( ( NULL != p_dnld_context)
-            && (abort_id == p_dnld_context->timer_id ))
+    if ( ( NULL != gpphDnldContext)
+            && (abort_id == gpphDnldContext->timer_id ))
     {
         pphNfcIF_Notification_CB_t  p_upper_notify =
-            p_dnld_context->p_upper_notify;
+            gpphDnldContext->p_upper_notify;
         void                        *p_upper_context =
-                                p_dnld_context->p_upper_context;
-        phHal_sHwReference_t        *pHwRef = p_dnld_context->p_hw_ref;
+                                gpphDnldContext->p_upper_context;
+        phHal_sHwReference_t        *pHwRef = gpphDnldContext->p_hw_ref;
 
         (void)phDal4Nfc_Unregister(
-                     p_dnld_context->lower_interface.pcontext, pHwRef );
-        phDnldNfc_Release_Lower(p_dnld_context, pHwRef);
-        phDnldNfc_Release_Resources(&p_dnld_context);
-#ifndef NFC_TIMER_CONTEXT
-        gpphDnldContext = p_dnld_context;
-#endif
+                     gpphDnldContext->lower_interface.pcontext, pHwRef );
+        phDnldNfc_Release_Lower(gpphDnldContext, pHwRef);
+        phDnldNfc_Release_Resources(&gpphDnldContext);
 
         /* Notify the Error/Success Scenario to the upper layer */
         DNLD_DEBUG(" FW_DNLD: FW_DNLD Aborted with %x Timer Timeout \n",
@@ -3696,7 +2845,6 @@
 phDnldNfc_Upgrade (
                         phHal_sHwReference_t            *pHwRef,
 #ifdef NXP_FW_PARAM
-                        uint8_t                          type,
                         uint8_t                         *nxp_nfc_fw,
                         uint32_t                         fw_length,
 #endif
@@ -3705,7 +2853,7 @@
                  )
  {
     phDnldNfc_sContext_t    *psDnldContext = NULL;
-    phNfcIF_sReference_t    dnldReference = { NULL };
+    phNfcIF_sReference_t    dnldReference = { NULL,0,0 };
     phNfcIF_sCallBack_t     if_callback = { NULL, NULL, NULL, NULL };
     phNfc_sLowerIF_t        *plower_if = NULL;
     NFCSTATUS                status = NFCSTATUS_SUCCESS;
@@ -3720,15 +2868,16 @@
     else
     {
         DNLD_PRINT(" FW_DNLD: Starting the FW Upgrade Sequence .... \n");
+        /* Create the memory for Download Mgmt Context */
+        psDnldContext = (phDnldNfc_sContext_t *)
+                        phOsalNfc_GetMemory(sizeof(phDnldNfc_sContext_t));
 
-        (void)
-             phDnldNfc_Allocate_Resource((void **)
-                              &psDnldContext,sizeof(phDnldNfc_sContext_t));
         if(psDnldContext != NULL)
         {
-#ifndef NFC_TIMER_CONTEXT
+            (void ) memset((void *)psDnldContext,0,
+                                            sizeof(phDnldNfc_sContext_t));
+
             gpphDnldContext = psDnldContext;
-#endif
             psDnldContext->p_hw_ref = pHwRef;
             psDnldContext->timer_id = NXP_INVALID_TIMER_ID;
 
@@ -3762,7 +2911,7 @@
 
                 status = phDnldNfc_Process_FW( psDnldContext, pHwRef
 #ifdef NXP_FW_PARAM
-                ,*nxp_nfc_fw , fw_length
+                ,*nxp_nfc_fw /*, fw_length */
 #endif
                  );
 
@@ -3773,24 +2922,27 @@
                     if (NFCSTATUS_PENDING == status)
                     {
                         DNLD_PRINT("\n FW_DNLD: Initial Reset .... \n");
+                        p_cur_sec = ((section_info_t *)
+                            (psDnldContext->p_fw_sec ));
+                        sec_type = (unsigned )
+                            (p_cur_sec->p_sec_hdr->section_mem_type);
 
-#if defined(FW_DOWNLOAD_TIMER) 
-
+                        if(TRUE == ((section_type_t *)
+                                (&sec_type))->system_mem_unlock )
+                        {
+                            (void)phDnldNfc_Set_Seq(psDnldContext,
+                                                            DNLD_SEQ_UNLOCK);
+                        }
+                        else
+                        {
+                            (void)phDnldNfc_Set_Seq(psDnldContext,
+                                                            DNLD_SEQ_INIT);
+                        }
+#ifdef FW_DOWNLOAD_TIMER
                         psDnldContext->timer_id = phOsalNfc_Timer_Create( );
-
-#if (FW_DOWNLOAD_TIMER < 2)
                         phOsalNfc_Timer_Start( psDnldContext->timer_id,
-                                NXP_DNLD_COMPLETE_TIMEOUT,
-                                (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
-                                , (void *) psDnldContext
+                                NXP_DNLD_COMPLETE_TIMEOUT, phDnldNfc_Abort, NULL );
 #endif
-                                );
-
-#endif  /* #if (FW_DOWNLOAD_TIMER < 2) */
-
-#endif /* #if defined(FW_DOWNLOAD_TIMER)  */
-
                     }
                 }
                 else if (NFCSTATUS_SUCCESS == PHNFCSTATUS(status))
@@ -3802,33 +2954,23 @@
                      */
                     status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
                             PHDNLD_CMD_RESET , NULL , 0 );
+
                     if (NFCSTATUS_PENDING == status)
                     {
                         DNLD_PRINT("\n FW_DNLD: Integrity Reset .... \n");
                         (void)phDnldNfc_Set_Seq(psDnldContext, DNLD_SEQ_COMPLETE);
                         status = PHNFCSTVAL( CID_NFC_DNLD, 
                                         NFCSTATUS_PENDING );
-#if defined(FW_DOWNLOAD_TIMER) 
+#ifdef FW_DOWNLOAD_TIMER
                         psDnldContext->timer_id = phOsalNfc_Timer_Create( );
-#if (FW_DOWNLOAD_TIMER < 2)
                         phOsalNfc_Timer_Start( psDnldContext->timer_id,
-                                NXP_DNLD_COMPLETE_TIMEOUT, 
-                                (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
-                                , (void *) psDnldContext
+                                NXP_DNLD_COMPLETE_TIMEOUT, phDnldNfc_Abort, NULL );
 #endif
-                                );
-
-#endif  /* #if (FW_DOWNLOAD_TIMER < 2) */
-
-#endif /* #if defined(FW_DOWNLOAD_TIMER)  */
                     }
 
 #else
                     status = NFCSTATUS_SUCCESS;
-
-#endif /* #if  defined (NXP_FW_INTEGRITY_VERIFY) */
-
+#endif
                 }
                 else
                 {
@@ -3839,12 +2981,9 @@
             if (NFCSTATUS_PENDING != PHNFCSTATUS(status))
             {
                 (void)phDal4Nfc_Unregister(
-                            psDnldContext->lower_interface.pcontext, pHwRef);
-                phDnldNfc_Release_Lower(psDnldContext, pHwRef);
-                phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
-                gpphDnldContext = psDnldContext;
-#endif
+                            gpphDnldContext->lower_interface.pcontext, pHwRef);
+                phDnldNfc_Release_Lower(gpphDnldContext, pHwRef);
+                phDnldNfc_Release_Resources(&gpphDnldContext);
             }
         } /* End of Status Check for Memory */
         else
@@ -3857,9 +2996,3 @@
 
     return status;
  }
-
-
-
-
-
-
diff --git a/src/phFriNfc_FelicaMap.c b/src/phFriNfc_FelicaMap.c
index 2604649..8a810f9 100644
--- a/src/phFriNfc_FelicaMap.c
+++ b/src/phFriNfc_FelicaMap.c
@@ -57,13 +57,10 @@
                                               uint8_t EndIndex,
                                               uint16_t RecvChkSum);
 
-#ifndef PH_HAL4_ENABLE
 /* Helpers for Poll Related Operations*/
 static NFCSTATUS   phFriNfc_Felica_HPollCard( phFriNfc_NdefMap_t   *NdefMap,
                                               const uint8_t sysCode[],
                                               uint8_t state);
-#endif /* #ifndef PH_HAL4_ENABLE */
-
 
 static NFCSTATUS   phFriNfc_Felica_HUpdateManufIdDetails(const phFriNfc_NdefMap_t *NdefMap);
 
@@ -2118,39 +2115,65 @@
 NFCSTATUS phFriNfc_Felica_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
 {
     NFCSTATUS status = NFCSTATUS_PENDING;
-
-#ifndef PH_HAL4_ENABLE  
     uint8_t sysCode[2];
-#endif /* #ifndef PH_HAL4_ENABLE */
 
-#ifdef PH_HAL4_ENABLE
-
-    /* check the ndef compliency with the system code reecived in the RemoteDevInfo*/
-    status = phFriNfc_Felica_HUpdateManufIdDetails(NdefMap);
-
-    if (status == NFCSTATUS_SUCCESS)
-    {
-        
-        /* set the operation type to Check ndef type*/
-        NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_CHK_NDEF_OP;
-        status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
-    }
-#else
-    
     /* set the system code for selecting the wild card*/
     sysCode[0] = 0x12;
     sysCode[1] = 0xFC;
 
     status = phFriNfc_Felica_HPollCard( NdefMap,sysCode,PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_NDEF_APP);
-#endif /* #ifdef PH_HAL4_ENABLE */
 
     return (status);
 
 }                                        
 /*!
  * \brief Check whether a particular Remote Device is NDEF compliant.
- * selects the wild card and then NFC Forum Reference Applications
+ * selects the sysCode and then NFC Forum Reference Applications
  */
+#ifdef PH_HAL4_ENABLE
+static NFCSTATUS   phFriNfc_Felica_HPollCard(  phFriNfc_NdefMap_t     *NdefMap,
+                                        const uint8_t sysCode[],
+                                        uint8_t state)
+{
+    NFCSTATUS status = NFCSTATUS_PENDING;
+
+    /*Format the Poll Packet for selecting the system code passed as parameter */
+    NdefMap->SendRecvBuf[0] = 0x06;
+    NdefMap->SendRecvBuf[1] = 0x00;
+    NdefMap->SendRecvBuf[2] = sysCode[0];
+    NdefMap->SendRecvBuf[3] = sysCode[1];
+    NdefMap->SendRecvBuf[4] = 0x01;
+    NdefMap->SendRecvBuf[5] = 0x03;
+
+    NdefMap->SendLength = 6;
+
+     /*set the completion routines for the felica card operations*/
+    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Felica_Process;
+    NdefMap->MapCompletionInfo.Context = NdefMap;
+
+    /*Set Ndef State*/
+    NdefMap->State = state;
+
+    /* set the felica cmd */
+    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
+
+    /*set the additional informations for the data exchange*/
+    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
+    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
+
+    status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
+                                        &NdefMap->MapCompletionInfo,
+                                        NdefMap->psRemoteDevInfo,
+                                        NdefMap->Cmd,
+                                        &NdefMap->psDepAdditionalInfo,
+                                        NdefMap->SendRecvBuf,
+                                        NdefMap->SendLength,
+                                        NdefMap->SendRecvBuf,
+                                        NdefMap->SendRecvLength);
+    return (status);
+}
+#endif
+
 
 #ifndef PH_HAL4_ENABLE
 static NFCSTATUS   phFriNfc_Felica_HPollCard(  phFriNfc_NdefMap_t     *NdefMap,
@@ -2210,50 +2233,45 @@
 {
     NFCSTATUS status = NFCSTATUS_PENDING;
 
-#ifdef PH_HAL4_ENABLE
-    /* copy the IDm and PMm in Manufacture Details Structure*/
-    (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
-                (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
-                8);
-    (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
-                (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
-                8);
-		status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS);
-#else            
-
-    
-    /* Check the System Code for 0x12,0xFC*/
-    if( (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCodeAvailable == 1)
-        &&   (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCode[0] == 0x12)
-        &&   (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCode[1] == 0xFC))
+    /* Get the details from Poll Response packet */
+    if (NdefMap->SendRecvLength >= 20)
     {
-        
-        /* copy the IDm and PMm in Manufacture Details Structure*/
-         (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
-            (uint8_t *)NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t,
-            8);
-         (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
-            (uint8_t *)NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.PMm,
-            8);
-        
+        (void)memcpy(  (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
+                       (uint8_t *)&NdefMap->SendRecvBuf[2], 8);
+        (void)memcpy(  (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
+                       (uint8_t *)&NdefMap->SendRecvBuf[10], 8);
+        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] = NdefMap->SendRecvBuf[18];
+        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] = NdefMap->SendRecvBuf[19];
+        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDmLength = 8;
 
-         status = PHNFCSTVAL(CID_NFC_NONE,
-                                        NFCSTATUS_SUCCESS);
-              
+        /* copy the IDm and PMm in Manufacture Details Structure*/
+        (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
+                      (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
+                      8);
+        (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
+                      (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
+                      8);
+        if((NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] == 0x12)
+            && (NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] == 0xFC))
+        {
+            status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS);
+        }
+        else
+        {
+            status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+                                NFCSTATUS_NO_NDEF_SUPPORT);
+        }
     }
     else
     {
-         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
-                                        NFCSTATUS_NO_NDEF_SUPPORT);
+        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+                            NFCSTATUS_NO_NDEF_SUPPORT);
     }
-#endif /* #ifdef PH_HAL4_ENABLE */
-    
+
     return (status);
-
 }
 
 
-
 /*!
  * \brief Completion Routine, Processing function, needed to avoid long blocking.
  * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
diff --git a/src/phFriNfc_ISO15693Format.c b/src/phFriNfc_ISO15693Format.c
index 574c107..077035e 100644
--- a/src/phFriNfc_ISO15693Format.c
+++ b/src/phFriNfc_ISO15693Format.c
@@ -1,5 +1,5 @@
 /*
-/*
+ *
  * Copyright (C) 2010 NXP Semiconductors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -112,7 +112,7 @@
 typedef enum phFriNfc_ISO15693_FormatSeq
 {
     ISO15693_GET_SYS_INFO, 
-    ISO15693_RD_MULTIPLE_BLKS_CHECK, 
+    ISO15693_RD_SINGLE_BLK_CHECK,
     ISO15693_WRITE_CC_FMT, 
     ISO15693_WRITE_NDEF_TLV
 }phFriNfc_ISO15693_FormatSeq_t;
@@ -351,27 +351,12 @@
                 (uint8_t)(*psNdefSmtCrdFmt->SendRecvLength - 
                 ISO15693_EXTRA_RESPONSE_FLAG)))
             {
-                /* Send the READ MULTIPLE BLOCKS COMMAND */
-                command_type = ISO15693_RD_MULTIPLE_BLKS_CMD;
-                e_format_seq = ISO15693_RD_MULTIPLE_BLKS_CHECK;
+                /* Send the READ SINGLE BLOCK COMMAND */
+                command_type = ISO15693_RD_SINGLE_BLK_CMD;
+                e_format_seq = ISO15693_RD_SINGLE_BLK_CHECK;
 
-                /* Prepare data for the command, 
-                First add the current block */
-                *a_send_byte = (uint8_t)ps_iso15693_info->current_block;
-                send_index = (uint8_t)(send_index + 1);
-
-                /* Second, add number of blocks to read, here 2 blocks means 
-                8 bytes. 1 is decremented because to read multiple block.
-                the first block is read by default, apart from the first block,  
-                next block shall be read, that means remaining block to read is 1
-                So, if for eg: 2 blocks needs to be read from block number 0, then 1 
-                is number of blocks to read. This will read both block 0 and 1
-                */
-                *(a_send_byte + send_index) = (uint8_t)
-                                    (ISO15693_RD_2_BLOCKS - 1);
-                send_index = (uint8_t)(send_index + 1);
-
-                send_length = send_index;
+                /* Block number 0 to read */
+                psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block = 0x00;
             }
             else
             {
@@ -381,67 +366,76 @@
             break;
         }
 
-        case ISO15693_RD_MULTIPLE_BLKS_CHECK:
+        case ISO15693_RD_SINGLE_BLK_CHECK:
         {
-            /* RESPONSE received for READ MULTIPLE BLOCKS 
-            received, prepare data for writing CC bytes */            
-            
-            command_type = ISO15693_WR_SINGLE_BLK_CMD;
-            e_format_seq = ISO15693_WRITE_CC_FMT;
+            /* RESPONSE received for READ SINGLE BLOCK
+            received*/
 
-            /* CC magic number */
-            *a_send_byte = (uint8_t)ISO15693_CC_MAGIC_NUM;
-            send_index = (uint8_t)(send_index + 1);
+            /* Check if Card is really fresh
+               First 4 bytes must be 0 for fresh card */
 
-            /* CC Version and read/write access */
-            *(a_send_byte + send_index) = (uint8_t)
-                            ISO15693_CC_VER_RW;
-            send_index = (uint8_t)(send_index + 1);
-
-            /* CC MAX data size, calculated during GET system information */
-            *(a_send_byte + send_index) = (uint8_t)
-                            (ps_iso15693_info->max_data_size / 
-                            ISO15693_CC_MULTIPLE_FACTOR);
-            send_index = (uint8_t)(send_index + 1);
-
-            switch (ps_iso15693_info->max_data_size)
+            if ((psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block == 0x00) &&
+                (psNdefSmtCrdFmt->SendRecvBuf[1] != 0x00 ||
+                 psNdefSmtCrdFmt->SendRecvBuf[2] != 0x00 ||
+                 psNdefSmtCrdFmt->SendRecvBuf[3] != 0x00 ||
+                 psNdefSmtCrdFmt->SendRecvBuf[4] != 0x00))
             {
-                case ISO15693_SLI_X_MAX_SIZE:
-                {
-                    /* For SLI tags : Inventory Page read not supported */
-                    *(a_send_byte + send_index) = (uint8_t)
-                                        ISO15693_RDMULBLKS_CMD_MASK;
-                    break;
-                }
-
-                case ISO15693_SLI_X_S_MAX_SIZE:
-                {
-                    /* For SLI - S tags : Read multiple blocks not supported */
-                    *(a_send_byte + send_index) = (uint8_t)
-                                        ISO15693_INVENTORY_CMD_MASK;
-                    break;
-                }
-
-                case ISO15693_SLI_X_L_MAX_SIZE:
-                {
-                    /* For SLI - L tags : Read multiple blocks not supported */
-                    *(a_send_byte + send_index) = (uint8_t)
-                                        ISO15693_INVENTORY_CMD_MASK;
-                    break;
-                }
-
-                default:
-                {
-                    result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 
-                                        NFCSTATUS_INVALID_DEVICE_REQUEST);
-                    break;
-                }
+                result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_FORMAT);
             }
-            
-            send_index = (uint8_t)(send_index + 1);
+            else
+            {
+                /* prepare data for writing CC bytes */
 
-            send_length = sizeof (a_send_byte);
-            
+                command_type = ISO15693_WR_SINGLE_BLK_CMD;
+                e_format_seq = ISO15693_WRITE_CC_FMT;
+
+                /* CC magic number */
+                *a_send_byte = (uint8_t)ISO15693_CC_MAGIC_NUM;
+                send_index = (uint8_t)(send_index + 1);
+
+                /* CC Version and read/write access */
+                *(a_send_byte + send_index) = (uint8_t) ISO15693_CC_VER_RW;
+                send_index = (uint8_t)(send_index + 1);
+
+                /* CC MAX data size, calculated during GET system information */
+                *(a_send_byte + send_index) = (uint8_t) (ps_iso15693_info->max_data_size / ISO15693_CC_MULTIPLE_FACTOR);
+                send_index = (uint8_t)(send_index + 1);
+
+                switch (ps_iso15693_info->max_data_size)
+                {
+                    case ISO15693_SLI_X_MAX_SIZE:
+                    {
+                        /* For SLI tags : Inventory Page read not supported */
+                        *(a_send_byte + send_index) = (uint8_t) ISO15693_RDMULBLKS_CMD_MASK;
+                        break;
+                    }
+
+                    case ISO15693_SLI_X_S_MAX_SIZE:
+                    {
+                        /* For SLI - S tags : Read multiple blocks not supported */
+                        *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK;
+                        break;
+                    }
+
+                    case ISO15693_SLI_X_L_MAX_SIZE:
+                    {
+                        /* For SLI - L tags : Read multiple blocks not supported */
+                        *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK;
+                        break;
+                    }
+
+                    default:
+                    {
+                        result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_DEVICE_REQUEST);
+                        break;
+                    }
+                }
+
+                send_index = (uint8_t)(send_index + 1);
+
+                send_length = sizeof (a_send_byte);
+            }
+
             break;
         }
 
@@ -568,16 +562,8 @@
     }
     else
     {   
-        if (ISO15693_RD_MULTIPLE_BLKS_CHECK == 
-            (phFriNfc_ISO15693_FormatSeq_t)ps_iso15693_info->format_seq)
-        {
-            /* If READ MULTIPLE BLOCKS is not working then 
-                do further formatting, disable the READ MULTIPLE BLOCK 
-                flag in the CC 4th byte, this says that COMMAND is not 
-                supported and dont use this command
-                */
-            Status = phFriNfc_ISO15693_H_ProFormat (psNdefSmtCrdFmt);            
-        }
+        Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
+                            NFCSTATUS_FORMAT_ERROR);
     }
 
     /* Handle the all the error cases */
diff --git a/src/phFriNfc_ISO15693Map.c b/src/phFriNfc_ISO15693Map.c
index f07b1bf..a21d9c8 100644
--- a/src/phFriNfc_ISO15693Map.c
+++ b/src/phFriNfc_ISO15693Map.c
@@ -1,5 +1,5 @@
 /*
-/*
+ *
  * Copyright (C) 2010 NXP Semiconductors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/src/phFriNfc_ISO15693Map.h b/src/phFriNfc_ISO15693Map.h
index 596534a..f4c0c08 100644
--- a/src/phFriNfc_ISO15693Map.h
+++ b/src/phFriNfc_ISO15693Map.h
@@ -1,5 +1,5 @@
 /*
-/*
+ *
  * Copyright (C) 2010 NXP Semiconductors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/src/phFriNfc_Llcp.c b/src/phFriNfc_Llcp.c
index ac38311..2a4fcb4 100644
--- a/src/phFriNfc_Llcp.c
+++ b/src/phFriNfc_Llcp.c
@@ -196,24 +196,11 @@
 static NFCSTATUS phFriNfc_Llcp_SendSymm( phFriNfc_Llcp_t *Llcp )
 {
    phFriNfc_Llcp_sPacketHeader_t sHeader;
-   bool_t                        bPendingFlag;
 
-   /* Check for pending messages to send */
-   bPendingFlag = phFriNfc_Llcp_HandlePendingSend(Llcp);
-
-   if (bPendingFlag == FALSE)
-   {
-      /* No send pending, send a SYMM instead */
-      sHeader.dsap  = PHFRINFC_LLCP_SAP_LINK;
-      sHeader.ssap  = PHFRINFC_LLCP_SAP_LINK;
-      sHeader.ptype = PHFRINFC_LLCP_PTYPE_SYMM;
-      return phFriNfc_Llcp_InternalSend(Llcp, &sHeader, NULL, NULL);
-   }
-   else
-   {
-      /* A pending send has been sent, there is no need to send SYMM */
-      return NFCSTATUS_SUCCESS;
-   }
+   sHeader.dsap  = PHFRINFC_LLCP_SAP_LINK;
+   sHeader.ssap  = PHFRINFC_LLCP_SAP_LINK;
+   sHeader.ptype = PHFRINFC_LLCP_PTYPE_SYMM;
+   return phFriNfc_Llcp_InternalSend(Llcp, &sHeader, NULL, NULL);
 }
 
 
@@ -423,7 +410,7 @@
                break;
             }
             /* Get MIU */
-            sParams.miu = PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK;
+            sParams.miu = (PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1])) & PHFRINFC_LLCP_TLV_MIUX_MASK;
             break;
          }
          case PHFRINFC_LLCP_TLV_TYPE_WKS:
@@ -675,7 +662,7 @@
 static void phFriNfc_Llcp_LinkStatus_CB( void                              *pContext,
                                          phFriNfc_LlcpMac_eLinkStatus_t    eLinkStatus,
                                          phNfc_sData_t                     *psParamsTLV,
-                                         phFriNfc_LlcpMac_eType_t          PeerRemoteDevType)
+                                         phFriNfc_LlcpMac_ePeerType_t      PeerRemoteDevType)
 {
    NFCSTATUS status;
 
@@ -759,6 +746,8 @@
       nDuration = (Llcp->sLocalParams.lto * 10) / 2;
    }
 
+   LLCP_DEBUG("Starting LLCP timer with duration %d", nDuration);
+
    /* Restart timer */
    phOsalNfc_Timer_Start(
       Llcp->hSymmTimer,
@@ -915,6 +904,11 @@
          phFriNfc_Llcp_InternalDeactivate(Llcp);
       }
       return_value = TRUE;
+   } else if (Llcp->pfSendCB == NULL) {
+      // Nothing to send, send SYMM instead to allow peer to send something
+      // if it wants.
+      phFriNfc_Llcp_SendSymm(Llcp);
+      return_value = TRUE;
    }
 
 clean_and_return:
@@ -1441,6 +1435,10 @@
       /* Incorrect state for sending ! */
       result = PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_STATE);;
    }
+
+   if (result != NFCSTATUS_PENDING) {
+       Llcp->pfSendCB = NULL;
+   }
    return result;
 }
 
diff --git a/src/phFriNfc_Llcp.h b/src/phFriNfc_Llcp.h
index 73fa486..287f9f9 100644
--- a/src/phFriNfc_Llcp.h
+++ b/src/phFriNfc_Llcp.h
@@ -117,6 +117,7 @@
  /*@{*/
 #define PHFRINFC_LLCP_SAP_LINK                     0x00 /**< Link SAP.*/
 #define PHFRINFC_LLCP_SAP_SDP                      0x01 /**< Service Discovery Protocol SAP.*/
+#define PHFRINFC_LLCP_SAP_WKS_FIRST                0x02 /**< Other Well-Known Services defined by the NFC Forum.*/
 #define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST     0x10 /**< First SAP number from SDP-avertised SAP range.*/
 #define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST   0x20 /**< First SAP number from SDP-unavertised SAP range.*/
 #define PHFRINFC_LLCP_SAP_NUMBER                   0x40 /**< Number of possible SAP values (also first invalid value).*/
@@ -289,7 +290,7 @@
    phFriNfc_LlcpMac_t               MAC;
 
    /**< Local LLC role*/
-   phFriNfc_LlcpMac_eType_t         eRole;
+   phFriNfc_LlcpMac_ePeerType_t         eRole;
 
    /**< Local link parameters*/
    phFriNfc_Llcp_sLinkParameters_t  sLocalParams;
diff --git a/src/phFriNfc_LlcpTransport.c b/src/phFriNfc_LlcpTransport.c
index 130564d..960a33a 100644
--- a/src/phFriNfc_LlcpTransport.c
+++ b/src/phFriNfc_LlcpTransport.c
@@ -32,6 +32,44 @@
 #include <phFriNfc_LlcpTransport_Connectionless.h>
 #include <phFriNfc_LlcpTransport_Connection.h>
 
+/* local macros */
+
+/* Check if (a <= x < b) */
+#define IS_BETWEEN(x, a, b) (((x)>=(a)) && ((x)<(b)))
+
+
+static NFCSTATUS phFriNfc_LlcpTransport_AutoBind(phFriNfc_LlcpTransport_Socket_t *pSocket)
+{
+   uint8_t i;
+   uint8_t sap;
+   phFriNfc_LlcpTransport_Socket_t* pSocketTable = pSocket->psTransport->pSocketTable;
+
+   /* Try all possible SAPs */
+   for(sap=PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST ; sap<PHFRINFC_LLCP_SAP_NUMBER ; sap++)
+   {
+      /* Go through socket list to check if current SAP is in use */
+      for(i=0 ; i<PHFRINFC_LLCP_NB_SOCKET_MAX ; i++)
+      {
+         if((pSocketTable[i].eSocket_State >= phFriNfc_LlcpTransportSocket_eSocketBound) &&
+            (pSocketTable[i].socket_sSap == sap))
+         {
+            /* SAP is already in use */
+            break;
+         }
+      }
+
+      if (i >= PHFRINFC_LLCP_NB_SOCKET_MAX)
+      {
+         /* No socket is using current SAP, proceed with binding */
+         pSocket->socket_sSap = sap;
+         pSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketBound;
+         return NFCSTATUS_SUCCESS;
+      }
+   }
+
+   /* If we reach this point, it means that no SAP is free */
+   return NFCSTATUS_INSUFFICIENT_RESOURCES;
+}
 
 /* TODO: comment function Transport recv CB */
 static void phFriNfc_LlcpTransport__Recv_CB(void            *pContext,
@@ -227,6 +265,7 @@
          case phFriNfc_LlcpTransportSocket_eSocketRejected:
             phFriNfc_LlcpTransport_Close(&pLlcpTransport->pSocketTable[i]);
             break;
+         default: break;
          }
       }
       else
@@ -234,7 +273,6 @@
          phFriNfc_LlcpTransport_Close(&pLlcpTransport->pSocketTable[i]);
       }
    }
-
    return status;
 }
 
@@ -644,6 +682,20 @@
    {
       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
    }
+   /* Test the SAP range for SDP-advertised services */
+   else if((psServiceName->length > 0) &&
+           (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST)) &&
+           (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_WKS_FIRST, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST)))
+   {
+      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+   }
+   /* Test the SAP range for non SDP-advertised services */
+   else if((psServiceName->length == 0) &&
+           (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER)) &&
+           (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_WKS_FIRST, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST)))
+   {
+      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+   }
    else
    {
       status = phFriNfc_LlcpTransport_ConnectionOriented_Listen(pLlcpSocket,
@@ -835,26 +887,29 @@
    }
    else 
    {
+      /* Implicit bind if socket is not already bound */
       if(pLlcpSocket->eSocket_State != phFriNfc_LlcpTransportSocket_eSocketBound)
       {
-         /* Bind with a sSap Free */
-         pLlcpSocket->socket_sSap = 32;
-
-         for(i=0;i<PHFRINFC_LLCP_NB_SOCKET_MAX;i++)
+         status = phFriNfc_LlcpTransport_AutoBind(pLlcpSocket);
+         if (status != NFCSTATUS_SUCCESS)
          {
-            if(pLlcpSocket->socket_sSap == pLlcpSocket->psTransport->pSocketTable[i].socket_sSap)
-            {
-               pLlcpSocket->socket_sSap++;
-            }
+            return status;
          }
       }
-      pLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketBound;
 
-      status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
-                                                                 nSap,
-                                                                 NULL,
-                                                                 pConnect_RspCb,
-                                                                 pContext);
+      /* Test the SAP range for non SDP-advertised services */
+      if(!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER))
+      {
+         status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+      }
+      else
+      {
+         status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
+                                                                    nSap,
+                                                                    NULL,
+                                                                    pConnect_RspCb,
+                                                                    pContext);
+      }
    }
    
    return status;
@@ -915,24 +970,29 @@
    }
    else 
    {
+      /* Implicit bind if socket is not already bound */
       if(pLlcpSocket->eSocket_State != phFriNfc_LlcpTransportSocket_eSocketBound)
       {
-         /* Bind with a sSap Free */
-         pLlcpSocket->socket_sSap = 32;
-
-         for(i=0;i<PHFRINFC_LLCP_NB_SOCKET_MAX;i++)
+         status = phFriNfc_LlcpTransport_AutoBind(pLlcpSocket);
+         if (status != NFCSTATUS_SUCCESS)
          {
-            if(pLlcpSocket->socket_sSap == pLlcpSocket->psTransport->pSocketTable[i].socket_sSap)
-            {
-               pLlcpSocket->socket_sSap++;
-            }
+            return status;
          }
       }
-      status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
-                                                                 PHFRINFC_LLCP_SAP_DEFAULT,
-                                                                 psUri,
-                                                                 pConnect_RspCb,
-                                                                 pContext);
+
+      /* Test the SAP range for non SDP-advertised services */
+      if(!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER))
+      {
+         status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+      }
+      else
+      {
+         status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
+                                                                    PHFRINFC_LLCP_SAP_DEFAULT,
+                                                                    psUri,
+                                                                    pConnect_RspCb,
+                                                                    pContext);
+      }
    }
 
    return status;
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c
index fcdb246..b75406b 100644
--- a/src/phFriNfc_LlcpTransport_Connection.c
+++ b/src/phFriNfc_LlcpTransport_Connection.c
@@ -31,7 +31,6 @@
 #include <phFriNfc_Llcp.h>
 #include <phFriNfc_LlcpUtils.h>
 
-
 /* Function definition */
 static NFCSTATUS phFriNfc_Llcp_Send_DisconnectMode_Frame(phFriNfc_LlcpTransport_t*   psTransport,
                                                          uint8_t                     dsap,
@@ -42,8 +41,24 @@
 
 static NFCSTATUS phFriNfc_Llcp_Send_ReceiveNotReady_Frame(phFriNfc_LlcpTransport_Socket_t*   pLlcpSocket);
 
+static NFCSTATUS static_performSendInfo(phFriNfc_LlcpTransport_Socket_t * psLlcpSocket);
+
 /**********   End Function definition   ***********/
 
+NFCSTATUS phFriNfc_LlcpConnTransport_Send( phFriNfc_Llcp_t                  *Llcp,
+        phFriNfc_Llcp_sPacketHeader_t    *psHeader,
+        phFriNfc_Llcp_sPacketSequence_t  *psSequence,
+        phNfc_sData_t                    *psInfo,
+        phFriNfc_Llcp_Send_CB_t          pfSend_CB,
+        phFriNfc_LlcpTransport_t*        psTransport ) {
+    NFCSTATUS result = phFriNfc_Llcp_Send(Llcp, psHeader, psSequence, psInfo,
+            pfSend_CB, psTransport);
+    if (result == NFCSTATUS_PENDING) {
+        psTransport->bSendPending = TRUE;
+    }
+    return result;
+}
+
 /* TODO: comment functionphFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB */
 static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void*        pContext,
                                                                   NFCSTATUS    status)
@@ -73,16 +88,12 @@
          sFrmrBuffer.buffer = psTransport->FrmrInfoBuffer;
          sFrmrBuffer.length = 0x04; /* Size of FRMR Information field */
 
-         /* Send Pending */
-         psTransport->bSendPending = TRUE;
-
-         result =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+         result =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                       &psTransport->sLlcpHeader,
                                       NULL,
                                       &sFrmrBuffer,
                                       phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
                                       psTransport);
-        
       }
       else if(psTransport->bDmPending)
       {
@@ -131,9 +142,9 @@
                psTransport->pSocketTable[psTransport->socketIndex].pfSocketSend_Cb = NULL;
             }
          }break;
+      default: break;
       }
 
-
       /* Update Index value with the next socket */
       index = psTransport->socketIndex+1;
 
@@ -183,31 +194,7 @@
             /* Test the RW window */
             if(CHECK_SEND_RW(psLocalLlcpSocket))
             {
-               /* Set the Header */
-               psLocalLlcpSocket->sLlcpHeader.dsap   = psLocalLlcpSocket->socket_dSap;
-               psLocalLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-               psLocalLlcpSocket->sLlcpHeader.ssap   = psLocalLlcpSocket->socket_sSap;
-
-               /* Set Sequence Numbers */
-               psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
-               psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
-               /* Send Pending */
-               psTransport->bSendPending = TRUE;
-
-               /* Store the index of the socket */
-               psTransport->socketIndex = psLocalLlcpSocket->index ;
-
-               /* Send I_PDU */
-               result =  phFriNfc_Llcp_Send(psTransport->pLlcp,
-                                            &psLocalLlcpSocket->sLlcpHeader,
-                                            &psLocalLlcpSocket->sSequence,
-                                            &psLocalLlcpSocket->sSocketSendBuffer,
-                                            phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                            psTransport);
-
-               /* Update VS */
-               psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+               result = static_performSendInfo(psLocalLlcpSocket);
 
                /* Reset Send Pending Flag */
                psLocalLlcpSocket->bSocketSendPending = FALSE;
@@ -243,9 +230,6 @@
             psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_CC;
             psLocalLlcpSocket->sLlcpHeader.ssap  = psLocalLlcpSocket->socket_sSap;
 
-            /* Send Pending */
-            psTransport->bSendPending = TRUE;
-
             /* Set the socket state to accepted */
             psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketAccepted;
 
@@ -253,7 +237,7 @@
             psTransport->socketIndex = psLocalLlcpSocket->index;
 
             /* Send a CC Frame */
-            result =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+            result =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                          &psLocalLlcpSocket->sLlcpHeader,
                                          NULL,
                                          &psLocalLlcpSocket->sSocketSendBuffer,
@@ -266,9 +250,6 @@
             /* Reset Accept pending */
             psLocalLlcpSocket->bSocketConnectPending = FALSE;
 
-            /* Send Pending */
-            psTransport->bSendPending = TRUE;
-
             /* Store the index of the socket */
             psTransport->socketIndex = psLocalLlcpSocket->index;
 
@@ -276,7 +257,7 @@
             psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketConnecting;
 
             /* send CONNECT */
-            result =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+            result =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                        &psLocalLlcpSocket->sLlcpHeader,
                                        NULL,
                                        &psLocalLlcpSocket->sSocketSendBuffer,
@@ -289,9 +270,6 @@
             /* Reset Disc Pending */
             psLocalLlcpSocket->bSocketDiscPending = FALSE;
 
-            /* Send Pending */
-            psTransport->bSendPending = TRUE;
-
             /* Set the socket in connecting state */
             psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketDisconnecting;
 
@@ -299,7 +277,7 @@
             psTransport->socketIndex = psLocalLlcpSocket->index;
 
             /* Send DISC */
-            result =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+            result =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                          &psLocalLlcpSocket->sLlcpHeader,
                                          NULL,
                                          &psLocalLlcpSocket->sSocketSendBuffer,
@@ -330,6 +308,43 @@
    }
 }
 
+static NFCSTATUS static_performSendInfo(phFriNfc_LlcpTransport_Socket_t * psLlcpSocket)
+{
+   phFriNfc_LlcpTransport_t   *psTransport = psLlcpSocket->psTransport;
+   NFCSTATUS                  status;
+
+   /* Reset Send Pending */
+   psLlcpSocket->bSocketSendPending = FALSE;
+
+   /* Set the Header */
+   psLlcpSocket->sLlcpHeader.dsap   = psLlcpSocket->socket_dSap;
+   psLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
+   psLlcpSocket->sLlcpHeader.ssap   = psLlcpSocket->socket_sSap;
+
+   /* Set Sequence Numbers */
+   psLlcpSocket->sSequence.ns = psLlcpSocket->socket_VS;
+   psLlcpSocket->sSequence.nr = psLlcpSocket->socket_VR;
+
+   /* Update the VRA */
+   psLlcpSocket->socket_VRA = psLlcpSocket->socket_VR;
+
+   /* Store the index of the socket */
+   psTransport->socketIndex = psLlcpSocket->index;
+
+   /* Send I_PDU */
+   status =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
+                                &psLlcpSocket->sLlcpHeader,
+                                &psLlcpSocket->sSequence,
+                                &psLlcpSocket->sSocketSendBuffer,
+                                phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
+                                psTransport);
+
+   /* Update VS */
+   psLlcpSocket->socket_VS = (psLlcpSocket->socket_VS+1)%16;
+
+   return status;
+}
+
 static void phFriNfc_LlcpTransport_ConnectionOriented_Abort(phFriNfc_LlcpTransport_Socket_t * pLlcpSocket)
 {
    if (pLlcpSocket->pfSocketSend_Cb != NULL)
@@ -400,11 +415,8 @@
       psTransport->sDmPayload.buffer    = &psTransport->DmInfoBuffer[2];
       psTransport->sDmPayload.length    = PHFRINFC_LLCP_DM_LENGTH;
 
-      /* Send Pending */
-      psTransport->bSendPending = TRUE;
-
       /* Send DM frame */
-      status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                    &psTransport->sDmHeader,
                                    NULL,
                                    &psTransport->sDmPayload,
@@ -439,14 +451,11 @@
       /* Update VRA */
       pLlcpSocket->socket_VRA = (uint8_t)pLlcpSocket->sSequence.nr;
 
-      /* Send Pending */
-      pLlcpSocket->psTransport->bSendPending = TRUE;
-
       /* Store the index of the socket */
       pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
 
       /* Send RR frame */
-      status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
                                    &pLlcpSocket->sLlcpHeader,
                                    &pLlcpSocket->sSequence,
                                    NULL,
@@ -482,14 +491,11 @@
       /* Update VRA */
       pLlcpSocket->socket_VRA = (uint8_t)pLlcpSocket->sSequence.nr;
 
-      /* Send Pending */
-      pLlcpSocket->psTransport->bSendPending = TRUE;
-
       /* Store the index of the socket */
       pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
 
       /* Send RNR frame */
-      status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
                                    &pLlcpSocket->sLlcpHeader,
                                    &pLlcpSocket->sSequence,
                                    NULL,
@@ -573,11 +579,8 @@
          sFrmrBuffer.buffer =  psTransport->FrmrInfoBuffer;
          sFrmrBuffer.length =  0x04; /* Size of FRMR Information field */
       
-         /* Send Pending */
-         psTransport->bSendPending = TRUE;
-
          /* Send FRMR frame */
-         status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
+         status =  phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
                                       &psTransport->sLlcpHeader,
                                       NULL,
                                       &sFrmrBuffer,
@@ -1269,34 +1272,7 @@
                   /* Test if a send is pending at LLC layer */
                   if(psTransport->bSendPending != TRUE)
                   {
-                     /* Reset Send Pending */
-                     psLocalLlcpSocket->bSocketSendPending = FALSE;
-
-                     /* Send Pending */
-                     psTransport->bSendPending = TRUE;
-
-                     /* Store the index of the socket */
-                     psTransport->socketIndex = psLocalLlcpSocket->index;
-
-                     /* Set the Header */
-                     psLocalLlcpSocket->sLlcpHeader.dsap   = psLocalLlcpSocket->socket_dSap;
-                     psLocalLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-                     psLocalLlcpSocket->sLlcpHeader.ssap   = psLocalLlcpSocket->socket_sSap;
-
-                     /* Set Sequence Numbers */
-                     psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
-                     psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
-                     /* Send I_PDU */
-                     status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
-                                                  &psLocalLlcpSocket->sLlcpHeader,
-                                                  &psLocalLlcpSocket->sSequence,
-                                                  &psLocalLlcpSocket->sSocketSendBuffer,
-                                                  phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                                  psTransport);
-
-                     /* Update VS */
-                     psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+                     status = static_performSendInfo(psLocalLlcpSocket);
                   }
                }
                else
@@ -1375,34 +1351,7 @@
                  /* Test if a send is pending at LLC layer */
                  if(psTransport->bSendPending != TRUE)
                  {
-                    /* Reset Send Pending */
-                    psLocalLlcpSocket->bSocketSendPending = FALSE;
-
-                    /* Send Pending */
-                    psTransport->bSendPending = TRUE;
-
-                    /* Store the index of the socket */
-                    psTransport->socketIndex = psLocalLlcpSocket->index;
-
-                    /* Set the Header */
-                    psLocalLlcpSocket->sLlcpHeader.dsap   = psLocalLlcpSocket->socket_dSap;
-                    psLocalLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-                    psLocalLlcpSocket->sLlcpHeader.ssap   = psLocalLlcpSocket->socket_sSap;
-
-                    /* Set Sequence Numbers */
-                    psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
-                    psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
-                    /* Send I_PDU */
-                    status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
-                                                 &psLocalLlcpSocket->sLlcpHeader,
-                                                 &psLocalLlcpSocket->sSequence,
-                                                 &psLocalLlcpSocket->sSocketSendBuffer,
-                                                 phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                                 psTransport);
-
-                    /* Update VS */
-                    psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+                    status = static_performSendInfo(psLocalLlcpSocket);
                  }
               }
               else
@@ -1537,34 +1486,7 @@
                /* Test if a send is pending at LLC layer */
                if(psTransport->bSendPending != TRUE)
                {
-                  /* Reset Send Pending */
-                  psLocalLlcpSocket->bSocketSendPending = FALSE;;
-
-                  /* Send Pending */
-                  psTransport->bSendPending = TRUE;
-
-                  /* Store the index of the socket */
-                  psTransport->socketIndex = psLocalLlcpSocket->index;
-
-                  /* Set the Header */
-                  psLocalLlcpSocket->sLlcpHeader.dsap   = psLocalLlcpSocket->socket_dSap;
-                  psLocalLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-                  psLocalLlcpSocket->sLlcpHeader.ssap   = psLocalLlcpSocket->socket_sSap;
-
-                  /* Set Sequence Numbers */
-                  psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
-                  psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
-                  /* Send I_PDU */
-                  status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
-                                               &psLocalLlcpSocket->sLlcpHeader,
-                                               &psLocalLlcpSocket->sSequence,
-                                               &psLocalLlcpSocket->sSocketSendBuffer,
-                                               phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                               psTransport);
-
-                  /* Update VS */
-                  psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+                  status = static_performSendInfo(psLocalLlcpSocket);
                }
             }
          }
@@ -1673,34 +1595,7 @@
             /* Test if a send is pending at LLC layer */
             if(psTransport->bSendPending != TRUE)
             {
-               /* Reset Send Pending */
-               psLocalLlcpSocket->bSocketSendPending = FALSE;
-
-               /* Send Pending */
-               psTransport->bSendPending = TRUE;
-
-               /* Set the Header */
-               psLocalLlcpSocket->sLlcpHeader.dsap   = psLocalLlcpSocket->socket_dSap;
-               psLocalLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-               psLocalLlcpSocket->sLlcpHeader.ssap   = psLocalLlcpSocket->socket_sSap;
-
-               /* Set Sequence Numbers */
-               psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
-               psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
-               /* Store the index of the socket */
-               psTransport->socketIndex = psLocalLlcpSocket->index;
-
-               /* Send I_PDU */
-               status =  phFriNfc_Llcp_Send(psTransport->pLlcp,
-                                            &psLocalLlcpSocket->sLlcpHeader,
-                                            &psLocalLlcpSocket->sSequence,
-                                            &psLocalLlcpSocket->sSocketSendBuffer,
-                                            phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                            psTransport);
-
-               /* Update VS */
-               psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+               status = static_performSendInfo(psLocalLlcpSocket);
             }
          }
       }
@@ -2129,9 +2024,6 @@
       pLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_CC;
       pLlcpSocket->sLlcpHeader.ssap  = pLlcpSocket->socket_sSap;
 
-      /* Send Pending */
-      pLlcpSocket->psTransport->bSendPending = TRUE;
-
       /* Set the socket state to accepted */
       pLlcpSocket->eSocket_State           = phFriNfc_LlcpTransportSocket_eSocketAccepted;
 
@@ -2142,7 +2034,7 @@
       pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
 
       /* Send a CC Frame */
-      status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
                                    &pLlcpSocket->sLlcpHeader,
                                    NULL,
                                    &pLlcpSocket->sSocketSendBuffer,
@@ -2324,9 +2216,6 @@
    }
    else
    {
-      /* Send Pending */
-      pLlcpSocket->psTransport->bSendPending = TRUE;
-
       /* Update Send Buffer length value */
       pLlcpSocket->sSocketSendBuffer.length = offset;
 
@@ -2335,8 +2224,7 @@
 
       /* Store the index of the socket */
       pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
-
-      status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
                                    &pLlcpSocket->sLlcpHeader,
                                    NULL,
                                    &pLlcpSocket->sSocketSendBuffer,
@@ -2437,13 +2325,10 @@
    }
    else
    {
-      /* Send Pending */
-      pLlcpSocket->psTransport->bSendPending = TRUE;
-
       /* Store the index of the socket */
       pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
 
-      status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+      status =  phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
                                    &pLlcpSocket->sLlcpHeader,
                                    NULL,
                                    NULL,
@@ -2610,59 +2495,32 @@
    }
    else
    {
+      /* Store send buffer pointer */
+      pLlcpSocket->sSocketSendBuffer = *psBuffer;
+
+      /* Store the Send CB and context */
+      pLlcpSocket->pfSocketSend_Cb    = pSend_RspCb;
+      pLlcpSocket->pSendContext       = pContext;
+
       /* Test if a send is pending */
       if(pLlcpSocket->psTransport->bSendPending == TRUE)
       {
-         /* Store the Send CB and context */
-         pLlcpSocket->pfSocketSend_Cb    = pSend_RspCb;
-         pLlcpSocket->pSendContext       = pContext;
-
          /* Set Send pending */
          pLlcpSocket->bSocketSendPending = TRUE;
 
-         /* Store send buffer pointer */
-         pLlcpSocket->sSocketSendBuffer = *psBuffer;
-
          /* Set status */
          status = NFCSTATUS_PENDING;
       }
       else
       {
-         /* Store the Send CB and context */
-         pLlcpSocket->pfSocketSend_Cb    = pSend_RspCb;
-         pLlcpSocket->pSendContext       = pContext;
-
-         /* Set the Header */
-         pLlcpSocket->sLlcpHeader.dsap   = pLlcpSocket->socket_dSap;
-         pLlcpSocket->sLlcpHeader.ptype  = PHFRINFC_LLCP_PTYPE_I;
-         pLlcpSocket->sLlcpHeader.ssap   = pLlcpSocket->socket_sSap;
-
-         /* Set Sequence Numbers */
-         pLlcpSocket->sSequence.ns = pLlcpSocket->socket_VS;
-         pLlcpSocket->sSequence.nr = pLlcpSocket->socket_VR;
-
-         /* Send Pending */
-         pLlcpSocket->psTransport->bSendPending = TRUE;
-
-         /* Store the index of the socket */
-         pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
-
-         /* Send I_PDU */
-         status =  phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
-                                      &pLlcpSocket->sLlcpHeader,
-                                      &pLlcpSocket->sSequence,
-                                      psBuffer,
-                                      phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
-                                      pLlcpSocket->psTransport);
+         /* Perform I-Frame send */
+         status = static_performSendInfo(pLlcpSocket);
          if(status != NFCSTATUS_PENDING)
          {
             LLCP_PRINT("Release Send callback");
             pLlcpSocket->pfSocketSend_Cb = NULL;
             pLlcpSocket->pSendContext = NULL;
          }
-
-         /* Update VS */
-         pLlcpSocket->socket_VS = (pLlcpSocket->socket_VS+1)%16;
       }
 
    }
@@ -2789,33 +2647,32 @@
          if(dataLengthRead != 0)
          {
             /* Test If data is present in the RW Buffer */
-            if(pLlcpSocket->indexRwRead != pLlcpSocket->indexRwWrite)
+            while(pLlcpSocket->indexRwRead != pLlcpSocket->indexRwWrite)
             {
-               do
+               /* Get the data length available in the linear buffer  */
+               dataLengthAvailable = phFriNfc_Llcp_CyclicFifoAvailable(&pLlcpSocket->sCyclicFifoBuffer);
+
+               /* Exit if not enough memory available in linear buffer */
+               if(dataLengthAvailable < pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length)
                {
-                  /* Get the data length available in the linear buffer  */
-                  dataLengthAvailable = phFriNfc_Llcp_CyclicFifoAvailable(&pLlcpSocket->sCyclicFifoBuffer);
+                  break;
+               }
 
-                  /* Test if enought place is available */
-                  if(dataLengthAvailable > pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length )
-                  {
-                     /* Write data into the linear buffer */
-                     dataLengthWrite = phFriNfc_Llcp_CyclicFifoWrite(&pLlcpSocket->sCyclicFifoBuffer,
-                                                                     pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].buffer,
-                                                                     pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
-                     /* Update VR */
-                     pLlcpSocket->socket_VR = (pLlcpSocket->socket_VR+1)%16;
+               /* Write data into the linear buffer */
+               dataLengthWrite = phFriNfc_Llcp_CyclicFifoWrite(&pLlcpSocket->sCyclicFifoBuffer,
+                                                               pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].buffer,
+                                                               pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
+               /* Update VR */
+               pLlcpSocket->socket_VR = (pLlcpSocket->socket_VR+1)%16;
 
-                     /* Set flag bufferized to TRUE */
-                     dataBufferized = TRUE;
+               /* Set flag bufferized to TRUE */
+               dataBufferized = TRUE;
 
-                     /* Update RW Buffer length */
-                     pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length = 0;
+               /* Update RW Buffer length */
+               pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length = 0;
 
-                     /* Update Value Rw Read Index*/
-                     pLlcpSocket->indexRwRead++;
-                  }
-               }while(dataLengthAvailable > pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
+               /* Update Value Rw Read Index*/
+               pLlcpSocket->indexRwRead++;
             }
 
             /* Test if data has been bufferized after a read access */
diff --git a/src/phFriNfc_TopazDynamicMap.c b/src/phFriNfc_TopazDynamicMap.c
index 697604d..2aa29ea 100644
--- a/src/phFriNfc_TopazDynamicMap.c
+++ b/src/phFriNfc_TopazDynamicMap.c
@@ -1010,7 +1010,7 @@
                 lock_byte_index = (uint8_t)(lock_byte_index + 1);
                 byte_index = (uint8_t)(byte_index + 1);
             }
-        } /* else of /* if (mod_value) */
+        } /* else of if (mod_value) */
         ps_tpz_info->lock_bytes_written = remaining_lock_bits;
     }
     else /* if (no_of_bits_left_in_block >= remaining_lock_bits) */
@@ -3848,7 +3848,7 @@
 #endif /* #ifdef TOPAZ_RAW_SUPPORT */
         psNdefMap->State = (uint8_t)PH_FRINFC_TOPAZ_STATE_WRITE;
 
-        if ((write_len - psNdefMap->ApduBuffIndex) >= TOPAZ_WRITE_8_DATA_LENGTH)
+        if ((write_len - psNdefMap->ApduBuffIndex) >= (uint16_t)TOPAZ_WRITE_8_DATA_LENGTH)
         {
             copy_length = (uint8_t)TOPAZ_WRITE_8_DATA_LENGTH;
             (void)memcpy ((void *)write_buf, 
diff --git a/src/phHal4Nfc.c b/src/phHal4Nfc.c
index 726b4b5..341f183 100644
--- a/src/phHal4Nfc.c
+++ b/src/phHal4Nfc.c
@@ -153,11 +153,7 @@
         gpphHal4Nfc_Hwref = NULL;
         PHDBG_INFO("Hal4:Open Failed");
         /*Call upper layer's Open Cb with error status*/
-        if(NULL != pUpper_OpenCb)
-        {
-            /*Upper layer's Open Cb*/
         (*pUpper_OpenCb)(pUpper_Context,status);
-        }
     }
     return;
 }
@@ -306,15 +302,17 @@
 #include <utils/Log.h>
 #include <dlfcn.h>
 
-const unsigned char *nxp_nfc_full_version;
-const unsigned char *nxp_nfc_fw;
+#define FW_PATH "/system/vendor/firmware/libpn544_fw.so"
+
+const unsigned char *nxp_nfc_full_version = NULL;
+const unsigned char *nxp_nfc_fw = NULL;
 
 int dlopen_firmware() {
     void *p;
 
-    void *handle = dlopen("/system/lib/libpn544_fw.so", RTLD_NOW);
+    void *handle = dlopen(FW_PATH, RTLD_NOW);
     if (handle == NULL) {
-        LOGE("Could not open libpn544.so");
+        LOGE("Could not open %s", FW_PATH);
         return -1;
     }
 
@@ -408,7 +406,7 @@
             if( openRetVal == NFCSTATUS_SUCCESS )
             {
                 /*update Next state*/
-                Hal4Ctxt->Hal4NextState = (HCI_NFC_DEVICE_TEST == eHciInitType?
+                Hal4Ctxt->Hal4NextState = (HCI_SELF_TEST == eHciInitType?
                                 eHal4StateSelfTestMode:eHal4StateOpenAndReady);
                 /*Store callback and context ,and set Default settings in Context*/
                 Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb = pOpenCallback;
@@ -472,17 +470,13 @@
     else if(NULL == psHwReference->hal_context)
     {
 #ifdef FW_DOWNLOAD
-
-#if  !defined (NXP_FW_INTEGRITY_VERIFY)
         if(NFC_FW_DOWNLOAD_CHECK == IoctlCode)
         {
             RetStatus = phDnldNfc_Run_Check(
                 psHwReference                       
                 );
         }
-        else
-#endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */
-        if((NFC_FW_DOWNLOAD == IoctlCode)
+        else if((NFC_FW_DOWNLOAD == IoctlCode)
             &&(NULL == gpphHal4Nfc_Hwref))/*Indicates current state is shutdown*/
         {
             Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)
@@ -511,9 +505,7 @@
                         phHal4Nfc_DownloadComplete,
                         Hal4Ctxt
                         );
-                if((NFCSTATUS_SUCCESS == RetStatus)
-                    || (NFCSTATUS_PENDING != PHNFCSTATUS(RetStatus))
-                    )
+                if(NFCSTATUS_SUCCESS == RetStatus)
                 {
                     phOsalNfc_FreeMemory(Hal4Ctxt);
                     ((phHal_sHwReference_t *)psHwReference)->hal_context = NULL;
@@ -1016,15 +1008,10 @@
                 break;
             case NFC_NOTIFY_DEVICE_ERROR:
             {
-                NFCSTATUS status = NFCSTATUS_BOARD_COMMUNICATION_ERROR;
-                pphHal4Nfc_GenCallback_t pUpper_OpenCb
-                                                = Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb;
-                void                   *pUpper_Context
-                                            = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
                 static phHal4Nfc_NotificationInfo_t uNotificationInfo;
+                Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
                 if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler)
                 {                    
-                    Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
                     Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler(
                         Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt,
                         NFC_EVENT_NOTIFICATION,
@@ -1032,31 +1019,8 @@
                         NFCSTATUS_BOARD_COMMUNICATION_ERROR
                         );
                 }
-                else if (( eHal4StateSelfTestMode == Hal4Ctxt->Hal4NextState )
-                    || ( eHal4StateOpenAndReady == Hal4Ctxt->Hal4NextState ) )
-                {
-                    Hal4Ctxt->Hal4CurrentState = eHal4StateClosed;
-                    Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
-                    (void)phHciNfc_Release((void *)Hal4Ctxt->psHciHandle,
-                                              pHwRef, (pphNfcIF_Notification_CB_t)NULL,
-                                               (void *)Hal4Ctxt);/*Clean up Hci*/
-                    Hal4Ctxt->psHciHandle = NULL;
-                    phOsalNfc_FreeMemory((void *)Hal4Ctxt->pHal4Nfc_LayerCfg);
-                    Hal4Ctxt->pHal4Nfc_LayerCfg = NULL;
-                    phOsalNfc_FreeMemory((void *)Hal4Ctxt);
-                    gpphHal4Nfc_Hwref->hal_context = NULL;
-                    gpphHal4Nfc_Hwref = NULL;
-                    PHDBG_INFO("Hal4:Open Failed");
-                    /*Call upper layer's Open Cb with error status*/
-                    if(NULL != pUpper_OpenCb)
-                    {
-                        /*Upper layer's Open Cb*/
-                        (*pUpper_OpenCb)(pUpper_Context,status);
-                    }
-                }
                 else
                 {
-                    Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
                     phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1);
                 }
                 break;
@@ -1254,7 +1218,6 @@
         case NFC_INFO_TXLDO_OVERCUR:
         case NFC_INFO_MEM_VIOLATION:
         case NFC_INFO_TEMP_OVERHEAT:
-        case NFC_INFO_LLC_ERROR:
         {
             sNotificationInfo.info = psEventInfo;
             sNotificationInfo.status = NFCSTATUS_SUCCESS;
@@ -1331,23 +1294,10 @@
         = Hal4Ctxt->sUpperLayerInfo.pUpperIoctlCb;
     void  *pUpper_Context = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
     /*check for Success*/
-    if(( DEVMGMT_SWP_TEST == Hal4Ctxt->Ioctl_Type )
-        || ( DEVMGMT_ANTENNA_TEST == Hal4Ctxt->Ioctl_Type ))
+    if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
     {
         status = NFCSTATUS_SUCCESS;
     }
-    else if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
-    {
-        status = NFCSTATUS_SUCCESS;
-    }
-    else
-    {
-        if (NULL != pInfo)
-        {
-            status = ((phNfc_sCompletionInfo_t *)pInfo)->status;
-        }
-    }
-
     /*Copy response buffer and length*/
     (void)memcpy(Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->buffer,
                  SelfTestResults->buffer,
@@ -1406,8 +1356,7 @@
     {
         /*for NFC_MEM_READ and NFC_GPIO_READ ,provide one Byte Response*/
         if ((NFC_MEM_READ == Hal4Ctxt->Ioctl_Type)
-            || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type)
-            )
+            || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type))
         {
             Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->length 
                 = sizeof (uint8_t);
diff --git a/src/phHal4Nfc_ADD.c b/src/phHal4Nfc_ADD.c
index 0be1670..5751219 100644
--- a/src/phHal4Nfc_ADD.c
+++ b/src/phHal4Nfc_ADD.c
@@ -489,17 +489,13 @@
                         psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.UidLength))
                         {
                             aRemoteDevTypes[Count] = phHal_eMifare_PICC;
-                            
+                            Count++;
                         }
-                        else/*TYPE 3A*/
-                        {
-                            aRemoteDevTypes[Count] = phHal_eISO14443_3A_PICC;
-                        }
-                        Count++;
                     }
-                    else if ( !(Sak & ISO_14443_BITMASK) &&
-                          !(Sak & NFCIP_BITMASK) && (0 == Count))
+                    if ( !(Sak & NFCIP_BITMASK) )
                     {
+                        // Always add a separate 3A target on a separate
+                        // handle, so the upper layers can connect to it.
                         aRemoteDevTypes[Count] = phHal_eISO14443_3A_PICC;
                         Count++;
                     }
diff --git a/src/phHal4Nfc_Internal.h b/src/phHal4Nfc_Internal.h
index 8675c55..50f4ea1 100644
--- a/src/phHal4Nfc_Internal.h
+++ b/src/phHal4Nfc_Internal.h
@@ -226,6 +226,7 @@
     /*used to ignore multiple Protected events*/
     uint8_t                          Ignore_Event_Protected;
 #endif/*#ifdef IGNORE_EVT_PROTECTED*/
+    uint8_t                          FelicaIDm[(PHHAL_FEL_ID_LEN + 2)];
 }phHal4Nfc_Hal4Ctxt_t;
 
 
diff --git a/src/phHal4Nfc_Reader.c b/src/phHal4Nfc_Reader.c
index b767858..5a91e85 100644
--- a/src/phHal4Nfc_Reader.c
+++ b/src/phHal4Nfc_Reader.c
@@ -51,6 +51,7 @@
 #define PH_HAL4NFC_SEL_SECTOR2_BYTE0                0x02
 #define PH_HAL4NFC_SEL_SECTOR2_BYTE_RESERVED        0x00
 
+phHal4Nfc_Hal4Ctxt_t *gpHal4Ctxt;
                                                               
 /* --------------------Structures and enumerations --------------------------*/
 
@@ -962,13 +963,24 @@
         /*allow only one Presence chk command at any point in time*/
         if (eHal4StatePresenceCheck != Hal4Ctxt->Hal4NextState)
         {
+            /* Check if remote device is felica */
+            if (Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemDevType ==
+                phHal_eFelica_PICC)
+            {
+                /* If felica PICC then copy existing IDm to compare later,
+                   If IDm will be same then same PICC is present after presence check
+                   else PICC is changed */
+                (void) memcpy(Hal4Ctxt->FelicaIDm,
+                              Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+                              Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength);
+            }
             Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = context;
             Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb = pPresenceChkCb;
             RetStatus = phHciNfc_Presence_Check(Hal4Ctxt->psHciHandle,
                                                 psHwReference
                                                 );
             Hal4Ctxt->Hal4NextState = (NFCSTATUS_PENDING == RetStatus?
-                eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState); 
+                eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState);
         }
         else/*Ongoing presence chk*/
         {
@@ -990,6 +1002,28 @@
     {
         Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->SessionOpened
                      =(uint8_t)(NFCSTATUS_SUCCESS == RetStatus?TRUE:FALSE);
+        /* Check if remote device is felica */
+        if (Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemDevType ==
+            phHal_eFelica_PICC)
+        {
+            /* Check if IDm received is same as saved */
+            if (0 != phOsalNfc_MemCompare(Hal4Ctxt->FelicaIDm,
+                Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+                Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength))
+            {
+                RetStatus = NFCSTATUS_FAILED;
+
+                /* Presence check failed so reset remote device information */
+                (void) memset(Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+                              0, PHHAL_FEL_ID_LEN + 2);
+                (void) memset(Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.PMm,
+                              0, PHHAL_FEL_PM_LEN);
+            }
+
+            /* Cleanup for stored IDm value for using it next time */
+            (void) memset(Hal4Ctxt->FelicaIDm, 0, PHHAL_FEL_ID_LEN + 2);
+        }
+
         (*Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb)(
                         Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
                         RetStatus
@@ -1035,7 +1069,28 @@
     return;
 }
 
+void phHal4Nfc_Felica_RePoll(void     *context,
+                                        NFCSTATUS status)
+{
+     phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt = gpHal4Ctxt;
+     pphHal4Nfc_ConnectCallback_t pUpperConnectCb
+                                = Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb;
 
+     Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = NULL;
+     PHDBG_INFO("Hal4:Calling Connect callback");
+
+    if (pUpperConnectCb != NULL)
+    {
+         /*Notify to the upper layer*/
+         (*pUpperConnectCb)(
+                    Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
+                    Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
+                    status
+                    );
+    }
+
+    return;
+}
 void phHal4Nfc_ConnectComplete(
                                phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                                void *pInfo
@@ -1046,18 +1101,25 @@
                                 = Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb;
     /*Flag to decide whether or not upper layer callback has to be called*/
     uint8_t CallConnectCb = TRUE;
+    uint8_t felicaRePoll = FALSE;
+
     /*Remote device Connect successful*/
     if((NFCSTATUS_SUCCESS == ConnectStatus)
 		||(eHal4StateTargetConnected == Hal4Ctxt->Hal4CurrentState))
     {
+        phHal_sRemoteDevInformation_t *psRmtTgtConnected =
+                            Hal4Ctxt->sTgtConnectInfo.psConnectedDevice;
         PHDBG_INFO("Hal4:Connect status Success");
         Hal4Ctxt->Hal4CurrentState = eHal4StateTargetConnected;
         Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
         /* Open the Session */
-        Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->SessionOpened = 
+        psRmtTgtConnected->SessionOpened =
             (uint8_t)(NFCSTATUS_SUCCESS == ConnectStatus?TRUE:FALSE);
         Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = NULL;
-        
+        if (psRmtTgtConnected->RemDevType == phHal_eFelica_PICC)
+        {
+            felicaRePoll = TRUE;
+        }
     }
     else/*Remote device Connect failed*/
     {        
@@ -1094,13 +1156,37 @@
     }
     if(TRUE == CallConnectCb)
     {
-        PHDBG_INFO("Hal4:Calling Connect callback");
-        /*Notify to the upper layer*/
-        (*pUpperConnectCb)(
+        if (felicaRePoll == TRUE)
+        {
+            /* Felica repoll through presence check */
+
+            /* If felica PICC then copy existing IDm to compare later,
+               If IDm will be same then same PICC is present after presence check
+               else PICC is changed */
+            (void) memcpy(Hal4Ctxt->FelicaIDm,
+                          Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+                          Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength);
+
+            gpHal4Ctxt = Hal4Ctxt;
+            Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb = phHal4Nfc_Felica_RePoll;
+            ConnectStatus = phHciNfc_Presence_Check(Hal4Ctxt->psHciHandle,
+                                                    gpphHal4Nfc_Hwref
+                                                    );
+            Hal4Ctxt->Hal4NextState = (NFCSTATUS_PENDING == ConnectStatus?
+                    eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState);
+            felicaRePoll = FALSE;
+            Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = pUpperConnectCb;
+        }
+        else
+        {
+            PHDBG_INFO("Hal4:Calling Connect callback");
+            /*Notify to the upper layer*/
+            (*pUpperConnectCb)(
                     Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
                     Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
                     ConnectStatus
                     );
+	 }
     }
     else
     {
diff --git a/src/phHciNfc.c b/src/phHciNfc.c
index 9400820..d6990c1 100644
--- a/src/phHciNfc.c
+++ b/src/phHciNfc.c
@@ -95,7 +95,7 @@
                      )
 {
     phHciNfc_sContext_t *psHciContext = NULL;
-    phNfcIF_sReference_t hciReference = { NULL };
+    phNfcIF_sReference_t hciReference = { NULL, 0, 0 };
     phNfcIF_sCallBack_t  if_callback = { NULL, NULL, NULL, NULL };
     phNfc_sLowerIF_t    *plower_if = NULL;
     NFCSTATUS            status = NFCSTATUS_SUCCESS;
diff --git a/src/phHciNfc.h b/src/phHciNfc.h
index 4f52b4a..f360413 100644
--- a/src/phHciNfc.h
+++ b/src/phHciNfc.h
@@ -78,9 +78,8 @@
 typedef enum phHciNfc_Init
 {
   HCI_SESSION = 0x00,
-  HCI_NFC_DEVICE_TEST,
-  HCI_CUSTOM_INIT,
-  HCI_SELF_TEST
+  HCI_SELF_TEST,
+  HCI_CUSTOM_INIT
 }phHciNfc_Init_t;
 
 /** \ingroup  grp_hal_hci
@@ -264,7 +263,7 @@
  *                                      of the HCI Layer.
  *  \param[in]  pHwRef                  pHwRef is the Information of
  *                                      the Device Interface Link .
- *  \param[in]  discovery_type                 If True: Start re-polling of the target
+ *  \param[in]  re_poll                 If True: Start re-polling of the target
  *                                      after the Target Device is de-activated
  *                                      or else - continue discovery with next
  *                                      technology.
@@ -280,7 +279,7 @@
  phHciNfc_Restart_Discovery (
                         void                            *psHciHandle,
                         void                            *pHwRef,
-                        uint8_t                         discovery_type
+                        uint8_t                         repoll
                      );
 
 
@@ -496,11 +495,10 @@
  *                                      of the HCI Layer.
  *  \param[in]  pHwRef                  pHwRef is the Information of
  *                                      the Device Interface Link .
- *  \param[in]  discovery_type          If NFC_RF_DISCOVERY_REPOLL: Start re-polling of
- *                                      the target after the Target Device is
- *                                      de-activatedor if NFC_RF_DISCOVERY_CONTINUE -
- *                                      continue discovery with next technology or
- *                                      stop the discovery wheel.
+ *  \param[in]  re_poll                 If True: Start re-polling of the target
+ *                                      after the Target Device is de-activated
+ *                                      or else - continue discovery with next
+ *                                      technology.
  *
  *  \retval NFCSTATUS_PENDING           To De-select the remote target pending.
  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
@@ -514,7 +512,7 @@
  phHciNfc_Disconnect (
                     void                            *psHciHandle,
                     void                            *pHwRef,
-                    uint8_t                         discovery_type
+                    uint8_t                         re_poll
                  );
 
 
diff --git a/src/phHciNfc_DevMgmt.c b/src/phHciNfc_DevMgmt.c
index 5b3eddc..ef3aa78 100644
--- a/src/phHciNfc_DevMgmt.c
+++ b/src/phHciNfc_DevMgmt.c
@@ -71,7 +71,6 @@
 #define NXP_EVT_INFO_EXT_RF_FIELD    0x12U
 #define NXP_EVT_INFO_MEM_VIOLATION   0x13U
 #define NXP_EVT_INFO_TEMP_OVERHEAT   0x14U
-#define NXP_EVT_INFO_LLC_ERROR       0x15U
 
 #define NFC_DEV_TXLDO_MASK           0x03U
 
@@ -119,6 +118,7 @@
     DEV_MGMT_LLC_GRD_TO_L,
     DEV_MGMT_LLC_ACK_TO_H,
     DEV_MGMT_LLC_ACK_TO_L,
+    DEV_MGMT_FELICA_RC,
     DEV_MGMT_EVT_AUTONOMOUS,
     DEV_MGMT_PIPE_CLOSE
 } phHciNfc_DevMgmt_Seq_t;
@@ -518,18 +518,8 @@
                                                     pHwRef, p_pipe_info );
                     if(status == NFCSTATUS_SUCCESS)
                     {
-                        
-                        if ((HCI_SELF_TEST == psHciContext->init_mode )
-                            || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode ))
-                        {
-                            p_device_mgmt_info->next_seq =
-                                                DEV_MGMT_GPIO_PDIR;
-                        }
-                        else
-                        {
-                            p_device_mgmt_info->next_seq =
-                                                DEV_MGMT_GET_EEPROM_INFO;
-                        }
+                        p_device_mgmt_info->next_seq =
+                                    DEV_MGMT_FELICA_RC;
                         status = NFCSTATUS_PENDING;
                     }
                     break;
@@ -581,6 +571,26 @@
                     }
                     break;
                 }
+                case DEV_MGMT_FELICA_RC:
+                {
+                    config = 0x00;
+                    status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
+                                 NFC_FELICA_RC_ADDR , config );
+                    if(NFCSTATUS_PENDING == status )
+                    {
+                        if (HCI_SELF_TEST == psHciContext->init_mode )
+                        {
+                            p_device_mgmt_info->next_seq =
+                                   DEV_MGMT_GPIO_PDIR;
+                        }
+                        else
+                        {
+                            p_device_mgmt_info->next_seq =
+                                   DEV_MGMT_GET_EEPROM_INFO;
+                        }
+                    }
+                    break;
+                }
                 
 #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 )
 
@@ -643,27 +653,18 @@
 #endif /* #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */
                 case DEV_MGMT_TX_LDO:
                 {
-#if ( NXP_HAL_VERIFY_EEPROM_CRC & 0x01U )
-                    if (0 != p_device_mgmt_info->eeprom_crc)
-                    {
-                        status = NFCSTATUS_FAILED;
-                    }
-                    else
-#endif
-                    {
-                       config = (NFC_DEV_HWCONF_DEFAULT |
+                    config = (NFC_DEV_HWCONF_DEFAULT |
                                     (NXP_DEFAULT_TX_LDO & NFC_DEV_TXLDO_MASK));
-                       status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
+                    status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
                             NFC_ADDRESS_HW_CONF , config );
-                       if(NFCSTATUS_PENDING == status )
-                       {
+                    if(NFCSTATUS_PENDING == status )
+                    {
 #if ( SW_TYPE_RF_TUNING_BF & 0x01)
-                           p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF;
+                        p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF;
 #else
-                           p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ;
+                        p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ;
 #endif
-                           /* status = NFCSTATUS_SUCCESS; */
-                       }
+                        /* status = NFCSTATUS_SUCCESS; */
                     }
                     break;
                 }
@@ -1063,20 +1064,17 @@
             {
                 p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN;
                 p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN ;
-                break;
-            }
+            }break;
             case UPDATE_SEQ:
             {
                 p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq;
             
-                break;
-            }
+            }break;
             case REL_SEQ:
             {
                 p_device_mgmt_info->current_seq = DEV_MGMT_EVT_AUTONOMOUS;
                 p_device_mgmt_info->next_seq = DEV_MGMT_EVT_AUTONOMOUS ;
-                break;
-            }
+            }break;
             default:
             {
                 break;
@@ -1121,8 +1119,6 @@
     }
     else
     {
-        phHciNfc_DevMgmt_Info_t *p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)
-                                        psHciContext->p_device_mgmt_info ;
         p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)
                        psHciContext->p_device_mgmt_info)->p_pipe_info ;
         switch(test_type)
@@ -1140,8 +1136,6 @@
                         p_pipe_info->param_info = test_param->buffer;
                         p_pipe_info->param_length = (uint8_t)test_param->length;
                     }
-                    p_device_mgmt_info->test_result.buffer = NULL;
-                    p_device_mgmt_info->test_result.length = 0;
                     status = 
                         phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, 
                             pipe_id, (uint8_t)test_type );
@@ -1231,15 +1225,15 @@
                 break;
             }
             case NXP_DBG_READ:
+            {
+                *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ?
+                                    pResponse[HCP_HEADER_LEN]: 0;
+                p_device_mgmt_info->p_val = NULL;
+
+            }
             /* fall through */
             case NXP_DBG_WRITE:
             {
-                if( NULL != p_device_mgmt_info->p_val )
-                {
-                    *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ?
-                                        pResponse[HCP_HEADER_LEN]: 0;
-                    p_device_mgmt_info->p_val = NULL;
-                }
                 break;
             }
             /* Self Test Commands */
@@ -1357,6 +1351,7 @@
             case NXP_EVT_INFO_MEM_VIOLATION:
             {
                 event_info.eventType = NFC_INFO_MEM_VIOLATION;
+                LOGW("Your NFC controller is kinda hosed, take it to npelly@ to fix");
                 break;
             }
             case NXP_EVT_INFO_TEMP_OVERHEAT:
@@ -1368,11 +1363,6 @@
                                     p_device_mgmt_info->overheat_status;
                 break;
             }
-            case NXP_EVT_INFO_LLC_ERROR:
-            {
-                event_info.eventType = NFC_INFO_LLC_ERROR;
-                break;
-            }
             default:
             {
                 status = PHNFCSTVAL(CID_NFC_HCI,
diff --git a/src/phHciNfc_DevMgmt.h b/src/phHciNfc_DevMgmt.h
index 571fac2..e886013 100644
--- a/src/phHciNfc_DevMgmt.h
+++ b/src/phHciNfc_DevMgmt.h
@@ -119,6 +119,7 @@
 #define NFC_ADDRESS_PMOS_MOD            0x997AU
 #endif
 
+#define NFC_FELICA_RC_ADDR              0x9F9AU
 
 /* The Address Definition for the Enabling the EVT_HOT_PLUG */
 #define NFC_ADDRESS_HOTPLUG_EVT         0x9FF0U
diff --git a/src/phHciNfc_Felica.c b/src/phHciNfc_Felica.c
index 1a353a5..2897690 100644
--- a/src/phHciNfc_Felica.c
+++ b/src/phHciNfc_Felica.c
@@ -51,6 +51,7 @@
 #define NXP_WRA_CONTINUE_ACTIVATION         0x12U
 
 #define NXP_FEL_SYS_CODE                    0x01U
+#define NXP_FEL_POLREQ_SYS_CODE             0x02U
 #define NXP_FEL_CURRENTIDM                  0x04U
 #define NXP_FEL_CURRENTPMM                  0x05U
 
@@ -58,10 +59,12 @@
 #define NXP_FEL_CUR_IDM_PMM_LEN             0x08U
 
 #define FELICA_STATUS                       0x00U
-#define FELICA_TIMEOUT                      NXP_FELICA_XCHG_TIMEOUT
+
+uint8_t nxp_nfc_felica_timeout = NXP_FELICA_XCHG_TIMEOUT;
 
 /* Presence check command for felica tag */
 #define FELICA_REQ_MODE                     0x04U
+
 /*
 *************************** Structure and Enumeration ***************************
 */
@@ -417,10 +420,9 @@
         {
             if (NXP_FEL_SYS_CODE_LEN == reg_length)
             {
-                HCI_PRINT_BUFFER("\tFelica system code data", reg_value, reg_length);
-                /* Update current system code values */
-                (void)memcpy(p_fel_tag_info->SystemCode, reg_value, 
-                            reg_length);
+                /* System code from registry is invalid in this case */
+		p_fel_tag_info->SystemCode[0] = 0;
+                p_fel_tag_info->SystemCode[1] = 0;
             } 
             else
             {
@@ -500,6 +502,39 @@
             index = (index + 1);
             psHciContext->rx_index = (HCP_HEADER_LEN + 1);
             HCI_PRINT_BUFFER("Felica Bytes received", &pResponse[index], (length - index));
+            /* If Poll response received then update IDm and PMm parameters, when presence check going on */
+            if (pResponse[index + 1] == 0x01)
+            {
+                if (length >= 19)
+                {
+                    /* IDm */
+                    (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.IDm,
+                                  &pResponse[index + 2], 8);
+                    /* PMm */
+                    (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.PMm,
+                                  &pResponse[index + 2 + 8], 8);
+                    index = index + 2 + 8 + 8;
+
+                    /* SC */
+                    if (length >= 21)
+                    {
+                        /* Copy SC if available */
+                        psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = pResponse[index];
+                        psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = pResponse[index + 1];
+                    }
+                    else
+                    {
+                        /* If SC is not available in packet then set to zero */
+                        psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = 0;
+                        psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = 0;
+                    }
+                }
+                else
+                {
+                    status = PHNFCSTVAL(CID_NFC_HCI,
+                                        NFCSTATUS_INVALID_HCI_RESPONSE);
+                }
+            }
         }
         else
         {
@@ -827,7 +862,7 @@
             pres_chk_data[1] = 0x00; // Felica poll
             pres_chk_data[2] = 0xFF;
             pres_chk_data[3] = 0xFF;
-            pres_chk_data[4] = 0x00;
+            pres_chk_data[4] = 0x01;
             pres_chk_data[5] = 0x00;
 
             ps_pipe_info->param_info = pres_chk_data;
@@ -842,7 +877,6 @@
     return status;
 }
 
-
 NFCSTATUS
 phHciNfc_Send_Felica_Command(
                               phHciNfc_sContext_t   *psContext,
@@ -908,7 +942,7 @@
                     hcp_message = &(hcp_packet->msg.message);
 
                     /* Time out */
-                    hcp_message->payload[i++] = FELICA_TIMEOUT ;
+                    hcp_message->payload[i++] = nxp_nfc_felica_timeout ;
                     /* Status */
                     hcp_message->payload[i++] = FELICA_STATUS;
 
diff --git a/src/phHciNfc_Generic.c b/src/phHciNfc_Generic.c
index 45aefdc..875e295 100644
--- a/src/phHciNfc_Generic.c
+++ b/src/phHciNfc_Generic.c
@@ -90,7 +90,7 @@
 static
 void
 phHciNfc_Response_Timeout (
-                uint32_t resp_timer_id
+                uint32_t resp_timer_id, void *pContext
                 );
 
 #endif /* (NXP_NFC_HCI_TIMER == 1) */
@@ -269,10 +269,10 @@
 static
 void
 phHciNfc_Response_Timeout (
-                    uint32_t resp_timer_id
+                    uint32_t resp_timer_id, void *pContext
                 )
 {
-    phNfc_sCompletionInfo_t  comp_info = {0};
+    phNfc_sCompletionInfo_t  comp_info = {0,0,0};
 
     if ( ( NULL != gpsHciContext)
             && (resp_timer_id == hci_resp_timer_id ))
@@ -1147,11 +1147,11 @@
 #ifndef EVENT_NOTIFY
             ( NFCSTATUS_SUCCESS == status  )
             || ( NFCSTATUS_RF_TIMEOUT == status  )
-            || ( NFCSTATUS_MORE_INFORMATION == status  )
+            || (( NFCSTATUS_MORE_INFORMATION == status  )
 #else
-            (FALSE == psHciContext->event_pending )
+            ((FALSE == psHciContext->event_pending )
 #endif
-            && ( pipe_id <= PHHCINFC_MAX_PIPE )
+            && ( pipe_id <= PHHCINFC_MAX_PIPE ))
             )
         {
             /* phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]); */
@@ -1562,11 +1562,11 @@
                 psHciContext->tx_total = HCP_ZERO_LEN ;
                 psHciContext->tx_remain = HCP_ZERO_LEN ;
                 psHciContext->tx_hcp_frgmnt_index = HCP_ZERO_LEN ;
-                HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
-                HCI_DEBUG("HCI: Response Pending status --> %s \n",
-                    (psHciContext->response_pending)?"TRUE":"FALSE");
-                HCI_DEBUG("HCI: Event Pending status --> %s \n",
-                    (psHciContext->event_pending)?"TRUE":"FALSE");
+                HCI_DEBUG("HCI: %s: response_pending=%s, event_pending=%s",
+                        __FUNCTION__,
+                        (psHciContext->response_pending)?"TRUE":"FALSE",
+                        (psHciContext->event_pending)?"TRUE":"FALSE"
+                         );
                 if ((TRUE == psHciContext->response_pending)
                     || (TRUE == psHciContext->event_pending))
                 {
@@ -2015,7 +2015,7 @@
 
                 if ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
                 {
-                    HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X : %X\n",
+                    HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
                                                           psCompInfo->status);
                     /* Stop and Un-Intialise the Response Timer */
                     phOsalNfc_Timer_Stop( hci_resp_timer_id );
@@ -2041,7 +2041,7 @@
                 if (( NFCSTATUS_BOARD_COMMUNICATION_ERROR == PHNFCSTATUS(psCompInfo->status))
                         && ( NXP_INVALID_TIMER_ID != hci_resp_timer_id ))                
                 {
-                    HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X : %X\n",
+                    HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
                                                           psCompInfo->status);
                     /* Stop the HCI Response Timer */
                     phOsalNfc_Timer_Stop( hci_resp_timer_id );
diff --git a/src/phHciNfc_Generic.h b/src/phHciNfc_Generic.h
index b4f8a6d..16ffa0e 100644
--- a/src/phHciNfc_Generic.h
+++ b/src/phHciNfc_Generic.h
@@ -55,21 +55,17 @@
 ***************************** Header File Inclusion ****************************
 ################################################################################
 */
-
+#define LOG_TAG "NFC-HCI"
+#include <cutils/log.h>
 #include <phNfcIoctlCode.h>
 #include<phNfcInterface.h>
 #include <phHciNfc.h>
-
 /*
 ################################################################################
 ****************************** Macro Definitions *******************************
 ################################################################################
 */
 
-#if defined(DEBUG)  /*|| defined(_DEBUG) */
-#define HCI_TRACE
-#endif
-
 #define Trace_buffer    phOsalNfc_DbgTraceBuffer
 
 /* HCI TRACE Macros */
@@ -80,14 +76,14 @@
 #define MAX_TRACE_BUFFER    150
 /* #define HCI_PRINT( str )  phOsalNfc_DbgTrace(str) */
 #define HCI_PRINT( str )  phOsalNfc_DbgString(str)
-#define HCI_DEBUG(str, arg) \
-    {                                               \
-        snprintf(Trace_buffer,MAX_TRACE_BUFFER,str,arg);    \
-        phOsalNfc_DbgString(Trace_buffer);              \
-    }
+#define HCI_DEBUG(...) LOGD(__VA_ARGS__)
+
+
+
+
 #define HCI_PRINT_BUFFER(msg,buf,len)               \
     {                                               \
-        snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \
+        snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \
         phOsalNfc_DbgString(Trace_buffer);              \
         phOsalNfc_DbgTrace(buf,len);                \
         phOsalNfc_DbgString("\r");                  \
@@ -101,7 +97,7 @@
 #define HCI_PRINT_BUFFER(msg,buf,len)   
 #else
 #define HCI_PRINT( str ) 
-#define HCI_DEBUG(str, arg) 
+#define HCI_DEBUG(...)
 #define HCI_PRINT_BUFFER(msg,buf,len)   
 #endif  /* #if defined(PHDBG_TRACES) */
 /* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */
@@ -458,7 +454,6 @@
 
     /* HCI Device Management Sequence */
     DEV_INIT_SEQ,
-    DEV_HAL_INFO_SEQ,
     DEV_CONFIG_SEQ,
     DEV_REL_SEQ,
 
@@ -612,8 +607,8 @@
     /** \internal Mode of HCI Initialisation */
     phHciNfc_Init_t             init_mode;
 
-    /** \internal Memory Information for HCI Initialisation */
-    uint8_t                     hal_mem_info[NXP_HAL_MEM_INFO_SIZE];
+    /** \internal Mode of HCI Initialisation */
+    void                        *p_io_params;
 
     /** \internal HCI Configuration Type */
     phHciNfc_eConfigType_t      config_type;
diff --git a/src/phHciNfc_RFReaderA.c b/src/phHciNfc_RFReaderA.c
index ba71724..1b1280a 100644
--- a/src/phHciNfc_RFReaderA.c
+++ b/src/phHciNfc_RFReaderA.c
@@ -67,6 +67,7 @@
 
 #define RDR_A_MIFARE_RAW_LENGTH             0x03U
 
+uint8_t nxp_nfc_mifareraw_timeout = NXP_MIFARE_XCHG_TIMEOUT;
 /*
 *************************** Structure and Enumeration ***************************
 */
@@ -1037,7 +1038,7 @@
                         hcp_message = &(hcp_packet->msg.message);
 #ifdef ENABLE_MIFARE_RAW
                         /* Time out */
-                        hcp_message->payload[i++] = NXP_MIFARE_XCHG_TIMEOUT ;
+                        hcp_message->payload[i++] = nxp_nfc_mifareraw_timeout;
                         /* Status */
                         hcp_message->payload[i++] = RDR_A_MIFARE_STATUS;
 #else
diff --git a/src/phHciNfc_Sequence.c b/src/phHciNfc_Sequence.c
index 53e8b70..73d7b79 100644
--- a/src/phHciNfc_Sequence.c
+++ b/src/phHciNfc_Sequence.c
@@ -65,10 +65,6 @@
 ################################################################################
 */
 
-/* Address Definitions for HAL Configuration */
-#define NFC_ADDRESS_HAL_CONF            0x9FD0U
-
-
 /*
 ################################################################################
 ********************** Structure/Enumeration Definitions ***********************
@@ -247,10 +243,8 @@
                         /* Initialise to Perform Test on 
                            the Antenna/SWP Link */
                         case hciState_Test:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -272,10 +266,8 @@
                         case hciState_Listen:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -314,10 +306,8 @@
                         case hciState_Connect:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -348,10 +338,8 @@
                         case hciState_Disconnect:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -375,10 +363,8 @@
                         case hciState_Transact:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -400,10 +386,8 @@
                         case hciState_Config:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
                             break;
                     }
@@ -428,14 +412,10 @@
                         case hciState_Listen:
                         /* Specifies the Starting of the Release Sequence */
                         case hciState_Release:
-                        {
                             status = NFCSTATUS_SUCCESS;
                             break;
-                        }
                         default:
-                        {
                             break;
-                        }
                     }
                     break;
                 }
@@ -547,16 +527,16 @@
                     )
 {
 
-    HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
+    HCI_DEBUG("HCI: %s: transition=%02u, cur_state=%02u, next_state=%02u\n",
+            __func__,
+            psHciContext->hci_state.transition,
+            psHciContext->hci_state.cur_state,
+            psHciContext->hci_state.next_state);
 
-    HCI_DEBUG(" HCI: Transition Before FSM Rollback --> %02u \n", 
-                    psHciContext->hci_state.transition );
- 
-    HCI_DEBUG(" HCI: Current State Before FSM Rollback --> %02u \n", 
-                            psHciContext->hci_state.cur_state );
 
-    HCI_DEBUG(" HCI: Next State Before FSM Rollback  --> %02u \n", 
-                            psHciContext->hci_state.next_state );
+
+
+
 
     if( (NFC_FSM_IN_PROGRESS  == psHciContext->hci_state.transition)
       )
@@ -660,7 +640,7 @@
             {
                 if (hciState_Reset == psHciContext->hci_state.cur_state)
                 {
-                    phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                    phNfc_sCompletionInfo_t     comp_info;
 
                     phHciNfc_Release_Lower( psHciContext, pHwRef );
                     /* Release all the resources and 
@@ -674,7 +654,7 @@
                 {
                     /* Notify the Poll/Emulation Configure failure to the upper layer */
 
-                    phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                    phNfc_sCompletionInfo_t     comp_info;
 
                     comp_info.status = error_status ;
 
@@ -691,8 +671,7 @@
                 {
 
                     /* Notify the Poll Configure failure to the upper layer */
-                    phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
-
+                    phNfc_sCompletionInfo_t     comp_info;
 
                     psHciContext->error_status = error_status;
                     status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
@@ -721,7 +700,7 @@
             case hciState_Config:
             {
                 /* Notify the Configure failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 psHciContext->error_status = error_status;
                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
@@ -737,7 +716,7 @@
             case hciState_Select:
             {
                 /* Notify the Configure failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info={0,0,0};
 
                 /* Rollback the FSM as the Target Discovery Failed */
                 phHciNfc_FSM_Rollback(psHciContext);
@@ -763,7 +742,7 @@
             case hciState_Transact:
                 /* Notify the Transceive failure to the upper layer */
             {
-                phNfc_sTransactionInfo_t        transact_info={FALSE,0,NULL,NULL,0};
+                phNfc_sTransactionInfo_t        transact_info; 
 
                 /* Rollback the FSM as the Transceive Failed */
                 phHciNfc_FSM_Rollback(psHciContext);
@@ -780,7 +759,7 @@
             case hciState_Connect:
             {
                 /* Notify the General failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 /* psHciContext->host_rf_type = phHal_eUnknown_DevType; */
                 status = phHciNfc_ReaderMgmt_Update_Sequence(
@@ -797,7 +776,7 @@
             case hciState_Reactivate:
             {
                 /* Notify the General failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info={FALSE, 0, 0};
 
                 /* psHciContext->host_rf_type = phHal_eUnknown_DevType; 
                 status = phHciNfc_ReaderMgmt_Update_Sequence(
@@ -813,7 +792,7 @@
             }
             case hciState_Presence:
             {
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 /* Roll Back to Connect State as Presence Check is Complete */
                 phHciNfc_FSM_Rollback(psHciContext);
@@ -830,7 +809,7 @@
             case hciState_Disconnect:
             {
                 /* Notify the General failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 phHciNfc_FSM_Rollback(psHciContext);
                 comp_info.status = error_status ;
@@ -844,7 +823,7 @@
 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE
                 status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
 #else
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 phHciNfc_Release_Lower( psHciContext, pHwRef );
                 /* Release all the resources and 
@@ -859,7 +838,7 @@
             default:
             {
                 /* Notify the General failure to the upper layer */
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 phHciNfc_FSM_Rollback(psHciContext);
                 comp_info.status = error_status ;
@@ -880,7 +859,8 @@
     else
     {
         /* Notify the General failure to the upper layer */
-        phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+        phNfc_sCompletionInfo_t     comp_info;
+
         phHciNfc_FSM_Rollback(psHciContext);
         comp_info.status = error_status ;
         /* Disable the Notification to the Upper Layer */
@@ -913,14 +893,14 @@
                           )
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
-   
-    HCI_DEBUG("HCI: In Function: %s \n",
-        __FUNCTION__);
 
-    HCI_DEBUG(" HCI: Current HCI State --> %02u \n", 
-                            psHciContext->hci_state.cur_state );
-    HCI_DEBUG(" HCI: Next HCI State --> %02u \n", 
-                            psHciContext->hci_state.next_state );
+    HCI_DEBUG("HCI: %s: cur_state=%02u, next_state=%02u",
+        __FUNCTION__,
+        psHciContext->hci_state.cur_state,
+        psHciContext->hci_state.next_state);
+
+
+
 
     switch(psHciContext->hci_state.next_state)
     {
@@ -946,7 +926,7 @@
                 case hciState_Select:
                 case hciState_Connect:
                 {
-                    phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                    phNfc_sCompletionInfo_t     comp_info;
 
                     /* Update to the Intialise state as the discovery wheel is 
                      * restarted.
@@ -1003,7 +983,7 @@
         }
         case hciState_Presence:
         {
-            phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+            phNfc_sCompletionInfo_t     comp_info;
 
             /* Roll Back to Connect State as Presence Check is Complete */
             phHciNfc_FSM_Rollback(psHciContext);
@@ -1122,7 +1102,7 @@
                 }
                 else
                 {
-#if defined( ESTABLISH_SESSION )
+#ifdef ESTABLISH_SESSION
                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
                     PHNFC_UNUSED_VARIABLE(info_status);
                     info_status = phHciNfc_IDMgmt_Update_Sequence( 
@@ -1130,11 +1110,7 @@
 
                     if(NFCSTATUS_SUCCESS == info_status)
                     {
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-                        psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
-#else
                         psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
                     }
                     else
                     {
@@ -1142,11 +1118,10 @@
                         status = PHNFCSTVAL(CID_NFC_HCI,
                                     NFCSTATUS_INVALID_HCI_SEQUENCE);
                     }
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-                    psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
 #else
                     psHciContext->hci_seq = HCI_END_SEQ;
-#endif /* #ifdef ESTABLISH_SESSION */
+
+#endif
                 }
 
             }
@@ -1183,10 +1158,8 @@
             status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
             if(NFCSTATUS_SUCCESS == status)
             {
-#if defined( ESTABLISH_SESSION )
+#ifdef ESTABLISH_SESSION
                 psHciContext->hci_seq = ADMIN_SESSION_SEQ;
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-                psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
 #else
                 psHciContext->hci_seq = HCI_END_SEQ;
 #endif
@@ -1199,11 +1172,7 @@
             status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
             if(NFCSTATUS_SUCCESS == status)
             {
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-                psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
-#else
                 psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
             }
             break;
         }
@@ -1213,13 +1182,11 @@
                                                 psHciContext, pHwRef );
             if(NFCSTATUS_SUCCESS == status)
             {
-#if defined( SW_AUTO_ACTIVATION )
+#ifdef SW_AUTO_ACTIVATION
                 psHciContext->hci_seq = READER_SW_AUTO_SEQ;
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-                psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
 #else
                 psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
+#endif
             }
             break;
         }
@@ -1252,8 +1219,7 @@
             {
                 if ((HCI_SELF_TEST != psHciContext->init_mode)
                     /* && ( TRUE == ((phHal_sHwReference_t *)pHwRef)->se_detect ) */
-                    && (HCI_CUSTOM_INIT != psHciContext->init_mode)
-                    && (HCI_NFC_DEVICE_TEST != psHciContext->init_mode))
+                    && (HCI_CUSTOM_INIT != psHciContext->init_mode))
                 {
                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
                     PHNFC_UNUSED_VARIABLE(info_status);
@@ -1281,42 +1247,10 @@
             }
             break;
         }
-#endif /* #ifdef ESTABLISH_SESSION */
-
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-        case DEV_HAL_INFO_SEQ:
-        {
-            static uint8_t      mem_index = 0;
-            status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
-                        (NFC_ADDRESS_HAL_CONF + mem_index),
-                            (psHciContext->hal_mem_info + mem_index));
-            if(NFCSTATUS_PENDING == status)
-            {
-                mem_index++;
-                if (NXP_HAL_MEM_INFO_SIZE <= mem_index )
-                {
-                    NFCSTATUS info_status = NFCSTATUS_SUCCESS;
-                    PHNFC_UNUSED_VARIABLE(info_status);
-                    info_status = phHciNfc_IDMgmt_Update_Sequence(
-                                                psHciContext, INFO_SEQ );
-                    mem_index = 0;
-                    psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-                    /* psHciContext->hci_seq =
-                            (HCI_SELF_TEST != psHciContext->init_mode)?
-                                    IDENTITY_INFO_SEQ : HCI_END_SEQ; */
-                }
-            }
-            break;
-        }
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
+#endif
         case HCI_END_SEQ:
         {
-            phHal_sMemInfo_t    *p_mem_info =
-                    (phHal_sMemInfo_t *) ( psHciContext->hal_mem_info );
-            if (
-                (HCI_SELF_TEST == psHciContext->init_mode )
-                || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode )
-                )
+            if (HCI_SELF_TEST == psHciContext->init_mode )
             {
                 psHciContext->hci_state.next_state
                     = (uint8_t) hciState_Test;
@@ -1326,17 +1260,10 @@
             phHciNfc_Uicc_Connectivity( psHciContext, pHwRef );
 #endif /* #ifdef UICC_CONNECTIVITY_PATCH */
 
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
-            if(NXP_FW_UPLOAD_SUCCESS != p_mem_info->fw_magic )
-            {
-                status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FAILED );
-            }
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
-
             /* Initialisation Complete Notification to the Upper Layer */
             if(NFCSTATUS_SUCCESS == status)
             {
-                phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
+                phNfc_sCompletionInfo_t     comp_info;
 
                 comp_info.status = status;
                 phHciNfc_Notify(psHciContext->p_upper_notify,
@@ -1406,10 +1333,6 @@
         }
         case DEV_REL_SEQ:
         {
-            NFCSTATUS info_status = NFCSTATUS_SUCCESS;
-            PHNFC_UNUSED_VARIABLE(info_status);
-            info_status = phHciNfc_DevMgmt_Update_Sequence(
-                                            psHciContext, REL_SEQ );
             status = phHciNfc_DevMgmt_Release( psHciContext, pHwRef );
             if(NFCSTATUS_SUCCESS == status)
             {
@@ -1511,7 +1434,7 @@
                         )
 {
     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
-    phNfc_sCompletionInfo_t     comp_info = {FALSE,0,NULL};
+    phNfc_sCompletionInfo_t     comp_info;
 
     switch(psHciContext->config_type)
     {
@@ -1837,7 +1760,7 @@
                          )
 {
     NFCSTATUS               status = NFCSTATUS_SUCCESS;
-    static phNfc_sCompletionInfo_t      comp_info = {FALSE,0,NULL};
+    static phNfc_sCompletionInfo_t      comp_info;
 #if defined(HOST_EMULATION)
     phHciNfc_GateID_t       ce_gate = phHciNfc_UnknownGate;
 #endif  /* #ifdef HOST_EMULATION */
@@ -1984,7 +1907,8 @@
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
     phHal_sADD_Cfg_t    *p_poll_config = (phHal_sADD_Cfg_t * )
         psHciContext->p_config_params;
-    phNfc_sCompletionInfo_t     comp_info = {FALSE,0,NULL};
+    phNfc_sCompletionInfo_t     comp_info;
+
     if (NULL != p_poll_config)
     {
         switch(psHciContext->hci_seq)
@@ -2090,7 +2014,7 @@
                          )
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
-    static phNfc_sCompletionInfo_t      comp_info = {FALSE,0,NULL};
+    static phNfc_sCompletionInfo_t      comp_info;
     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
 
     if( NULL != psHciContext->p_target_info )
@@ -2202,7 +2126,7 @@
                          )
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
-    static phNfc_sCompletionInfo_t      comp_info = {FALSE, 0 , NULL};
+    static phNfc_sCompletionInfo_t      comp_info;
     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
     uint8_t             re_poll = 0;
 
@@ -2286,7 +2210,7 @@
                             void                    *pHwRef
                          )
 {
-    static phNfc_sTransactionInfo_t transact_info = {FALSE,0,NULL,NULL,0};
+    static phNfc_sTransactionInfo_t transact_info;
 
     pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
     void                        *pcontext = psHciContext->p_upper_context;
@@ -2433,8 +2357,8 @@
                          )
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
-    static phNfc_sCompletionInfo_t      comp_info = {0};
-    static phNfc_sData_t test_result= {NULL,0};
+    static phNfc_sCompletionInfo_t      comp_info;
+    static phNfc_sData_t test_result;
 
     /* Complete the Test Sequence and notify the HAL */
     status = phHciNfc_FSM_Complete ( psHciContext );
@@ -2456,7 +2380,7 @@
         phHciNfc_Notify(psHciContext->p_upper_notify,
                         psHciContext->p_upper_context, pHwRef,
                         NFC_NOTIFY_RESULT , &comp_info);
-        HCI_DEBUG(" HCI System Test Completed : Status = %u\n", test_status);
+        HCI_PRINT(" HCI System Test Completed. \n");
     }
     else
     {
@@ -2482,7 +2406,7 @@
                          )
 {
     NFCSTATUS           status = NFCSTATUS_SUCCESS;
-    static phNfc_sCompletionInfo_t      comp_info = {0};
+    static phNfc_sCompletionInfo_t      comp_info;
 
     /* To remove "warning (VS 4100) : unreferenced formal parameter" */
     PHNFC_UNUSED_VARIABLE(pdata);
diff --git a/src/phLibNfc.c b/src/phLibNfc.c
index e0ef435..92bdc40 100644
--- a/src/phLibNfc.c
+++ b/src/phLibNfc.c
@@ -31,6 +31,8 @@
 ************************* Header Files ****************************************
 */
 
+#define LOG_TAG "NFC"
+
 #include <phLibNfc.h>
 #include <phDal4Nfc.h>
 #include <phHal4Nfc.h>
@@ -134,12 +136,40 @@
     return NFCSTATUS_SUCCESS;
 }
 
+int phLibNfc_GetIsoXchgTimeout() {
+    return nxp_nfc_isoxchg_timeout;
+}
+
 extern uint32_t nxp_nfc_hci_response_timeout;
 NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms) {
     nxp_nfc_hci_response_timeout = timeout_in_ms;
     return NFCSTATUS_SUCCESS;
 }
 
+int phLibNfc_GetHciTimeout() {
+    return nxp_nfc_hci_response_timeout;
+}
+
+extern uint32_t nxp_nfc_felica_timeout;
+NFCSTATUS phLibNfc_SetFelicaTimeout(uint8_t timeout_in_ms) {
+    nxp_nfc_felica_timeout = timeout_in_ms;
+    return NFCSTATUS_SUCCESS;
+}
+
+int phLibNfc_GetFelicaTimeout() {
+    return nxp_nfc_felica_timeout;
+}
+
+extern uint8_t nxp_nfc_mifareraw_timeout;
+NFCSTATUS phLibNfc_SetMifareRawTimeout(uint8_t timeout) {
+    nxp_nfc_mifareraw_timeout = timeout;
+    return NFCSTATUS_SUCCESS;
+}
+
+int phLibNfc_GetMifareRawTimeout() {
+    return nxp_nfc_mifareraw_timeout;
+}
+
 /**
 *    Initialize the phLibNfc interface.
 */
@@ -837,10 +867,15 @@
             gpphLibContext->psHwReference->device_info.model_id;        
         (void)memcpy(phLibNfc_StackCapabilities->psDevCapabilities.full_version,
             gpphLibContext->psHwReference->device_info.full_version,NXP_FULL_VERSION_LEN);
-        
         /* Check the firmware version */
-        phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = memcmp(phLibNfc_StackCapabilities->psDevCapabilities.full_version, nxp_nfc_full_version,
-                   NXP_FULL_VERSION_LEN);
+        if (nxp_nfc_full_version == NULL) {
+            // Couldn't load firmware, just pretend we're up to date.
+            LOGW("Firmware image not available: this device might be running old NFC firmware!");
+            phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = 0;
+        } else {
+            phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = memcmp(phLibNfc_StackCapabilities->psDevCapabilities.full_version, nxp_nfc_full_version,
+                       NXP_FULL_VERSION_LEN);
+        }
 
         if(NFCSTATUS_SUCCESS != RetVal)
         {       
diff --git a/src/phLibNfc.h b/src/phLibNfc.h
index 719cfc1..8621361 100644
--- a/src/phLibNfc.h
+++ b/src/phLibNfc.h
@@ -129,7 +129,10 @@
                                         This can be applied to UICC as well as SmartMX*/
     phLibNfc_SE_ActModeVirtual=0x02,    /**< Enables Virtual Mode communication.
                                         This can be applied to UICC as well as SmartMX*/
-    phLibNfc_SE_ActModeOff  =0x03       /**< Inactivate SE.This means,put SE in in-active state */
+    phLibNfc_SE_ActModeOff  =0x03,      /**< Inactivate SE.This means,put SE in in-active state
+                                        This can be applied to UICC as well as SmartMX*/
+    phLibNfc_SE_ActModeVirtualVolatile = 0x04 /**< Enabled virtual mode communication for SE through an event
+                                             This can be applied to UICC as well as SmartMX*/
 
 }phLibNfc_eSE_ActivationMode;
 
@@ -862,7 +865,27 @@
 // bit [4]     => timeout enable
 // bit [5..7]  => unused
 NFCSTATUS phLibNfc_SetIsoXchgTimeout(uint8_t timeout);
+int phLibNfc_GetIsoXchgTimeout();
+
 NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms);
+int phLibNfc_GetHciTimeout();
+
+// Felica timeout
+// [0]      -> timeout disabled
+// [1..255] -> timeout in ms
+NFCSTATUS phLibNfc_SetFelicaTimeout(uint8_t timeout_in_ms);
+int phLibNfc_GetFelicaTimeout();
+
+// MIFARE RAW timeout (ISO14443-3A / NfcA timeout)
+// timeout is 8 bits
+// bits [0..3] => timeout value, (256*16/13.56*10^6) * 2^value
+//                  [0] -> 0.0003s
+//                  ..
+//                  [14] -> 4.9s
+//                  [15] -> not allowed
+// bits [4..7] => 0
+NFCSTATUS phLibNfc_SetMifareRawTimeout(uint8_t timeout);
+int phLibNfc_GetMifareRawTimeout();
 
 /**
 * \ingroup grp_lib_nfc
diff --git a/src/phLibNfc_Ioctl.c b/src/phLibNfc_Ioctl.c
index 08f34b5..9983c60 100644
--- a/src/phLibNfc_Ioctl.c
+++ b/src/phLibNfc_Ioctl.c
@@ -238,11 +238,8 @@
                               NFCSTATUS      status )
 {
     phLibNfc_Ioctl_Cntx_t *pIoctlCntx=NULL;
-    if(PHNFCSTATUS(status) == NFCSTATUS_FEATURE_NOT_SUPPORTED)
-    {
-        status = NFCSTATUS_FEATURE_NOT_SUPPORTED;
-    }
-    else if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
+
+    if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
     {
         status = NFCSTATUS_FAILED;
     }
diff --git a/src/phLibNfc_SE.c b/src/phLibNfc_SE.c
index 4e839cf..968c239 100644
--- a/src/phLibNfc_SE.c
+++ b/src/phLibNfc_SE.c
@@ -135,7 +135,7 @@
 {
     pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)context;
     phHal_sEventInfo_t  *pEvtInfo = NULL;     
-    phLibNfc_uSeEvtInfo_t Se_Trans_Info={0};
+    phLibNfc_uSeEvtInfo_t Se_Trans_Info={{{0,0},{0,0}}};
     phLibNfc_SE_List_t  *pSeInfo=NULL;  
     
     if(pLibContext != gpphLibContext)
@@ -473,7 +473,6 @@
         switch(eActivation_mode)
         {
             case phLibNfc_SE_ActModeVirtual: 
-            case phLibNfc_SE_ActModeDefault:
             {
                 if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
                 {
@@ -507,6 +506,69 @@
                 }
             }
             break;
+            case phLibNfc_SE_ActModeVirtualVolatile:
+            {
+                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
+                {
+                    eEmulationType = NFC_SMARTMX_EMULATION;
+                    /*Enable the SMX -External reader can see it*/
+                    pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE;
+                    pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
+
+                    Status = phHal4Nfc_Switch_SMX_Mode(
+                                        pLibContext->psHwReference,
+                                        eSmartMx_Virtual,
+                                        phLibNfc_SE_SetMode_cb,
+                                        pLibContext
+                                        );
+                }
+                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
+                {
+                    eEmulationType = NFC_UICC_EMULATION;
+                    /*Enable the UICC -External reader can see it*/
+                    pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE;
+                    pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
+
+                    Status = phHal4Nfc_Switch_Swp_Mode(
+                                        pLibContext->psHwReference,
+                                        eSWP_Switch_On,
+                                        phLibNfc_SE_SetMode_cb,
+                                        pLibContext
+                                        );
+                }
+                else
+                {
+                    Status = NFCSTATUS_INVALID_HANDLE;
+                }
+            }
+            break;
+            case phLibNfc_SE_ActModeDefault:
+            {
+                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
+                {
+                    Status = phHal4Nfc_Switch_SMX_Mode(
+                                        pLibContext->psHwReference,
+                                        eSmartMx_Default,
+                                        phLibNfc_SE_SetMode_cb,
+                                        pLibContext
+                                        );
+                }
+                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
+                {
+                    Status = phHal4Nfc_Switch_Swp_Mode(
+                                        pLibContext->psHwReference,
+                                        eSWP_Switch_Default,
+                                        phLibNfc_SE_SetMode_cb,
+                                        pLibContext
+                                        );
+                }
+                else
+                {
+                    Status = NFCSTATUS_INVALID_HANDLE;
+                }
+            }
+            break;
+
             case phLibNfc_SE_ActModeWired:
             {
                 if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
diff --git a/src/phLibNfc_initiator.c b/src/phLibNfc_initiator.c
index 2a03c05..0f71606 100644
--- a/src/phLibNfc_initiator.c
+++ b/src/phLibNfc_initiator.c
@@ -133,6 +133,10 @@
     {
         Status = NFCSTATUS_FAILED;
     }
+    else if (PHNFCSTATUS(status) == NFCSTATUS_DESELECTED)
+    {
+        return;
+    }
 	else
 	{
 		DeviceIndx=0;DeviceIndx1=0;
diff --git a/src/phLibNfc_ndef_raw.c b/src/phLibNfc_ndef_raw.c
index 1e5b395..c39364e 100644
--- a/src/phLibNfc_ndef_raw.c
+++ b/src/phLibNfc_ndef_raw.c
@@ -1049,7 +1049,7 @@
                                 NFCSTATUS  status
                                 )
 {
-    phLibNfc_ChkNdef_Info_t    Ndef_Info = {0,0};
+    phLibNfc_ChkNdef_Info_t    Ndef_Info = {0,0,0};
     NFCSTATUS RetStatus = NFCSTATUS_SUCCESS;
     pphLibNfc_ChkNdefRspCb_t       pClientCb=NULL;
     phLibNfc_LibContext_t           *pLibNfc_Ctxt = 
diff --git a/src/phLlcNfc.c b/src/phLlcNfc.c
index af0a3a1..36b442b 100644
--- a/src/phLlcNfc.c
+++ b/src/phLlcNfc.c
@@ -228,7 +228,7 @@
 {
     NFCSTATUS               result = NFCSTATUS_SUCCESS;
     phLlcNfc_Context_t      *ps_llc_ctxt = (phLlcNfc_Context_t*)pContext;
-    phLlcNfc_LlcPacket_t    *ps_packet_info = NULL;
+    phLlcNfc_LlcPacket_t    s_packet_info;
     
     PH_LLCNFC_PRINT("Llc Init called\n");
     if ((NULL == ps_llc_ctxt) || (NULL == pLinkInfo))
@@ -239,8 +239,6 @@
     else
     {
         /* Initialisation */
-        ps_packet_info = &(ps_llc_ctxt->s_frameinfo.s_llcpacket);
-    
         ps_llc_ctxt->phwinfo = pLinkInfo;
         /* Call the internal frame initialise */
         phLlcNfc_H_Frame_Init(ps_llc_ctxt);
@@ -258,17 +256,17 @@
             phLlcNfc_CreateTimers();               
 
             /* Create a U frame */
-            result = phLlcNfc_H_CreateUFramePayload(ps_llc_ctxt, 
-                                    ps_packet_info, 
-                                    &(ps_packet_info->llcbuf_len), 
+            result = phLlcNfc_H_CreateUFramePayload(ps_llc_ctxt,
+                                    &s_packet_info,
+                                    &(s_packet_info.llcbuf_len),
                                     phLlcNfc_e_rset);
         }
         if (NFCSTATUS_SUCCESS == result)
         {
             /* Call DAL write */
             result = phLlcNfc_Interface_Write(ps_llc_ctxt, 
-                                (uint8_t*)&(ps_packet_info->s_llcbuf), 
-                                (uint32_t)ps_packet_info->llcbuf_len);
+                                (uint8_t*)&(s_packet_info.s_llcbuf),
+                                (uint32_t)s_packet_info.llcbuf_len);
         }
         if (NFCSTATUS_PENDING == result)
         {
@@ -364,8 +362,7 @@
     NFCSTATUS               result = NFCSTATUS_SUCCESS;
     phLlcNfc_Context_t      *ps_llc_ctxt = (phLlcNfc_Context_t*)pContext;
     phLlcNfc_Frame_t        *ps_frame_info = NULL;
-    phLlcNfc_LlcPacket_t    *ps_packet_info = NULL, 
-                            s_packet_info;
+    phLlcNfc_LlcPacket_t    s_packet_info;
     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
 #if 0
     uint8_t                 count = 1;
@@ -404,7 +401,6 @@
                                 &s_packet_info, 
                                 pLlcBuf, (uint8_t)llcBufLength);
 
-        ps_packet_info = &(ps_frame_info->s_llcpacket);
 
         /* Store the I frame in the send list */
         (void)phLlcNfc_H_StoreIFrame (ps_store_frame, s_packet_info);
@@ -423,13 +419,11 @@
 
 #endif /* #ifdef CTRL_WIN_SIZE_COUNT */
         {
-            (void)memcpy ((void *)ps_packet_info, (void *)&s_packet_info, 
-                        sizeof(phLlcNfc_LlcPacket_t));
             /* Call write to the below layer, only if previous write 
                 is completed */
             result = phLlcNfc_Interface_Write (ps_llc_ctxt, 
-                                (uint8_t *)&(ps_packet_info->s_llcbuf), 
-                                (uint32_t)ps_packet_info->llcbuf_len);
+                                (uint8_t *)&(s_packet_info.s_llcbuf),
+                                (uint32_t)s_packet_info.llcbuf_len);
 
             if ((NFCSTATUS_PENDING == result) || 
                 (NFCSTATUS_BUSY == PHNFCSTATUS (result)))
diff --git a/src/phLlcNfc_DataTypes.h b/src/phLlcNfc_DataTypes.h
index 2257513..9d5b588 100644
--- a/src/phLlcNfc_DataTypes.h
+++ b/src/phLlcNfc_DataTypes.h
@@ -105,79 +105,81 @@
 #endif /* #if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) */
 
 
-/* If the below MACRO (RECV_NR_CHECK_ENABLE) is 
-ENABLED : then check for the NR frame received from PN544 in the I frame is 
-    added. This shall be greater than sent NS from the HOST. 
-    This is used to stop the timer 
-DISABLED : dont check the N9R) frame received from the PN544
+/* If the below MACRO (RECV_NR_CHECK_ENABLE) is
+DEFINED : then check for the NR frame received from PN544 in the I frame is
+    added. This shall be greater than sent NS from the HOST.
+    This is used to stop the timer
+COMMENTED : dont check the N(R) frame received from the PN544
 */    
 /* #define RECV_NR_CHECK_ENABLE */
 
-/* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is 
-ENABLED : then if an I frame is received and the 
-        upper layer response callback (before another READ is pended) is called 
-        only after sending S frame and wait for the callback and then notify the 
+/* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is
+DEFINED : then if an I frame is received and the
+        upper layer response callback (before another READ is pended) is called
+        only after sending S frame and wait for the callback and then notify the
         upper layer 
-DISABLED : then if an I frame is received and the 
-            upper layer response callback (before another READ is pended) is called 
-            immediately after sending S frame (not waiting for the sent S frame 
+COMMENTED : then if an I frame is received and the
+            upper layer response callback (before another READ is pended) is called
+            immediately after sending S frame (not waiting for the sent S frame
             callback)  
 */
-#define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
+/* #define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
 
-/* PN544 continuously sends an incorrect I frames to the HOST, 
+/* PN544 continuously sends an incorrect I frames to the HOST,
     even after the REJ frame from HOST to PN544
-If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is 
-ENABLED : then if the received NS = (expected NR - 1) then instead of REJ 
+If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is
+DEFINED : then if the received NS = (expected NR - 1) then instead of REJ
         RR frame is sent
-DISABLED : then REJ frame is sent
+COMMENTED : then REJ frame is sent
 */
 #define LLC_RR_INSTEAD_OF_REJ
 
 #define SEND_UFRAME
 
-/* If the below MACRO (CTRL_WIN_SIZE_COUNT) is 
-ENABLED : then window size will be maximum
-DISABLED : then window size is 1
+/* If the below MACRO (CTRL_WIN_SIZE_COUNT) is
+DEFINED : then window size will be maximum
+COMMENTED : then window size is 1
 */
 #define CTRL_WIN_SIZE_COUNT
 
 /* 
 If the below MACRO (LLC_URSET_NO_DELAY) is
-ENABLED : then after receiving the UA frame, then immediately this will be  
+DEFINED : then after receiving the UA frame, then immediately this will be
             notified or further operation will be carried on.
-DISABLED : then after receiving the UA frame, then a timer is started, to  
+COMMENTED : then after receiving the UA frame, then a timer is started, to
             delay the notifiation or to carry on the next operation
 */
 #define LLC_URSET_NO_DELAY 
 
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
-    /* NO definition is required */
-
-#else
-
     /* 
-    This macro is useful only if the LLC_UPP_LAYER_NTFY_WRITE_RSP_CB is DISABLED
     If the below MACRO (LLC_RELEASE_FLAG) is
-    ENABLED : then whenever LLC release is called the g_release_flag variable 
-                will be made TRUE. Also, NO notification is allowed to the 
+DEFINED : then whenever LLC release is called the g_release_flag variable
+                will be made TRUE. Also, NO notification is allowed to the
                 upper layer.
-    DISABLED : g_release_flag is not declared and not used
+COMMENTED : g_release_flag is not declared and not used
     */
     #define LLC_RELEASE_FLAG
 
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
 
  /* 
-    Actually, there is a send and receive error count, if either of them reaches 
+    Actually, there is a send and receive error count, if either of them reaches
     limit, then exception is raised.
     If the below MACRO (LLC_RSET_INSTEAD_OF_EXCEPTION) is
-    ENABLED : then exception is not raised, instead a U RSET command is sent.
-    DISABLED : then exception is raised
+DEFINED : then exception is not raised, instead a U RSET command is sent.
+COMMENTED : then exception is raised
     */
 /* #define LLC_RSET_INSTEAD_OF_EXCEPTION */
 
+#ifndef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
+    /*
+    If the below MACRO (PIGGY_BACK) is
+    DEFINED : After receiving I frame, wait till the ACK timer to expire to send an ACK to PN544.
+    COMMENTED : immediately ACK the received I frame
+    */
+    #define PIGGY_BACK
+
+#endif /* LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
+
 #define LLC_SEND_ERROR_COUNT
 
 #define RECV_ERROR_FRAME_COUNT                      (0x50U)
@@ -191,7 +193,7 @@
 #define PH_LLCNFC_CRC_LENGTH                        (2)
 #define PH_LLCNFC_MAX_LLC_PAYLOAD                   ((PH_LLCNFC_MAX_IFRAME_BUFLEN) + (4))
 /** Maximum timer used in the Llc */
-#define PH_LLCNFC_MAX_TIMER_USED                    (2)
+#define PH_LLCNFC_MAX_TIMER_USED                    (3)
 /** Maximum timer used in the Llc */
 #define PH_LLCNFC_MAX_ACK_GUARD_TIMER               (4)
 /** Maximum I frame that can be stored */
@@ -496,7 +498,7 @@
 
 #ifdef PIGGY_BACK
     /** This will store the ack time out values */
-    uint16_t                ack_to_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER];
+    uint16_t                ack_to_value;
 #endif /* #ifdef PIGGY_BACK */
 
     /** This is a timer flag 
@@ -547,6 +549,9 @@
     /** Store the I frames, that has been received, Storage will be 
         till the window size */
     phLlcNfc_StoreIFrame_t          s_recv_store;
+
+    /** Response received count to send the ACK once it reaches the window size */
+    uint8_t                         resp_recvd_count;
 #endif /* #ifdef PIGGY_BACK */
 
     /** To receive the packet sent by below layer */
diff --git a/src/phLlcNfc_Frame.c b/src/phLlcNfc_Frame.c
index 81eb1ff..af61761 100644
--- a/src/phLlcNfc_Frame.c
+++ b/src/phLlcNfc_Frame.c
@@ -52,7 +52,6 @@
 #ifdef LLC_RELEASE_FLAG
     extern uint8_t             g_release_flag;
 #endif /* #ifdef LLC_RELEASE_FLAG */
-
 /************************ End of global variables *****************************/
 
 /*********************** Local functions ****************************/
@@ -107,28 +106,6 @@
 /**
 * \ingroup grp_hal_nfc_llc_helper
 *
-* \brief LLC component <b>Create S frame</b> function
-*
-* \copydoc page_reg This is a helper function which, creates the S frame
-*
-* \param[in/out] psFrameInfo    Generic frame information
-* \param[in/out] cmdType        Command type of S frame
-*
-* \retval NFCSTATUS_SUCCESS                Operation successful.
-* \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
-*
-*/
-static 
-NFCSTATUS
-phLlcNfc_H_CreateSFramePayload (
-    phLlcNfc_Frame_t    *psFrameInfo, 
-    phLlcNfc_LlcCmd_t   cmdType
-);
-
-
-/**
-* \ingroup grp_hal_nfc_llc_helper
-*
 * \brief LLC helper functions <b>Update I frame list</b> function
 *
 * \copydoc page_reg This function checks the nr value with the stored I frames 
@@ -433,10 +410,10 @@
     return result;
 }
 
-static 
 NFCSTATUS
 phLlcNfc_H_CreateSFramePayload (
     phLlcNfc_Frame_t    *psFrameInfo, 
+    phLlcNfc_LlcPacket_t    *psLlcPacket,
     phLlcNfc_LlcCmd_t   cmdType
 )
 {
@@ -451,7 +428,7 @@
     phLlcNfc_Buffer_t       *ps_llc_buf = NULL;
     uint8_t                 length = 0;
     
-    ps_llc_buf = &(psFrameInfo->s_llcpacket.s_llcbuf);
+    ps_llc_buf = &(psLlcPacket->s_llcbuf);
 
     /* Initial S frame header */
     ps_llc_buf->sllcpayload.llcheader = PH_LLCNFC_S_HEADER_INIT;
@@ -467,11 +444,10 @@
                 (ps_llc_buf->sllcpayload.llcheader | (uint8_t)cmdType);
 
     /* Maximum S frame length */
-    psFrameInfo->s_llcpacket.llcbuf_len = (uint8_t)
-                                            PH_LLCNFC_MAX_S_FRAME_LEN;
+    psLlcPacket->llcbuf_len = (uint8_t)PH_LLCNFC_MAX_S_FRAME_LEN;
     /* S frame length byte value */
     ps_llc_buf->llc_length_byte = (uint8_t)
-                            (psFrameInfo->s_llcpacket.llcbuf_len - 1);
+                            (psLlcPacket->llcbuf_len - 1);
 
     /* 
         psFrameInfo->s_llcpacket.s_llcbuf : 
@@ -493,7 +469,7 @@
         (psFrameInfo->s_llcpacket.llcbuf_len - 3) : 
                 is the array index of the second CRC byte to be calculated
     */
-    length = psFrameInfo->s_llcpacket.llcbuf_len;
+    length = psLlcPacket->llcbuf_len;
     phLlcNfc_H_ComputeCrc(
         (uint8_t *)ps_llc_buf, (length - 2),
         &(ps_llc_buf->sllcpayload.llcpayload[(length - 4)]),
@@ -760,7 +736,7 @@
 {
     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
     phLlcNfc_Frame_t        *ps_frame_info = NULL;
-    phLlcNfc_LlcPacket_t    *ps_create_packet = NULL;
+    phLlcNfc_LlcPacket_t    s_create_packet;
     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
@@ -778,7 +754,6 @@
     else
     {
         ps_frame_info = &(psLlcCtxt->s_frameinfo);
-        ps_create_packet = &(ps_frame_info->s_llcpacket);
         ps_store_frame = &(ps_frame_info->s_send_store);
 
         if (
@@ -788,7 +763,7 @@
         {
             /* Get the stored I frame, only if the new frame is sent 
                 from the upper layer */
-            result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, 
+            result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
                                                 ps_frame_info->n_s);
         }
 
@@ -800,25 +775,25 @@
             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
 
             /* Create the packet */
-            (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, 
+            (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
                         sizeof (phLlcNfc_LlcPacket_t));
 
-            ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
-            ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+            s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+            ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
 
             /* Length of the complete llc buffer, sent to PN544 */
-            length = ps_create_packet->llcbuf_len;
+            length = s_create_packet.llcbuf_len;
 
             /* Compute CRC for the created packet */
-            phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf), 
+            phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
                         (length - 2),
                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), 
                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
 
             /* Send the i frame */
-            result = phLlcNfc_Interface_Write (psLlcCtxt, 
-                            (uint8_t *)&(ps_create_packet->s_llcbuf), 
-                            (uint32_t)ps_create_packet->llcbuf_len);
+            result = phLlcNfc_Interface_Write (psLlcCtxt,
+                            (uint8_t *)&(s_create_packet.s_llcbuf),
+                            (uint32_t)s_create_packet.llcbuf_len);
 
             ps_frame_info->write_status = result;
 
@@ -865,7 +840,7 @@
 {
     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
     phLlcNfc_Frame_t        *ps_frame_info = NULL;
-    phLlcNfc_LlcPacket_t    *ps_create_packet = NULL;
+    phLlcNfc_LlcPacket_t    s_create_packet;
     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
@@ -883,7 +858,6 @@
     else
     {
         ps_frame_info = &(psLlcCtxt->s_frameinfo);
-        ps_create_packet = &(ps_frame_info->s_llcpacket);
         ps_store_frame = &(ps_frame_info->s_send_store);
 
 
@@ -898,7 +872,7 @@
                 ps_store_frame->s_llcpacket[ns_rejected].frame_to_send)
             {
                 /* Above check is added to know only if   */
-                result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, 
+                result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
                                                     ns_rejected);
             }
             else
@@ -918,25 +892,25 @@
             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
 
             /* Create the packet */
-            (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, 
+            (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
                         sizeof (phLlcNfc_LlcPacket_t));
 
-            ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
-            ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+            s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+            ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
 
             /* Length of the complete llc buffer, sent to PN544 */
-            length = ps_create_packet->llcbuf_len;
+            length = s_create_packet.llcbuf_len;
 
             /* Compute CRC for the created packet */
-            phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf), 
+            phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
                         (length - 2),
                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), 
                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
 
             /* Send the i frame */
             result = phLlcNfc_Interface_Write (psLlcCtxt, 
-                            (uint8_t *)&(ps_create_packet->s_llcbuf), 
-                            (uint32_t)ps_create_packet->llcbuf_len);
+                            (uint8_t *)&(s_create_packet.s_llcbuf),
+                            (uint32_t)s_create_packet.llcbuf_len);
 
             ps_frame_info->write_status = result;
 
@@ -946,7 +920,7 @@
                     so update the below variable */
                 ps_frame_info->write_wait_call = (phLlcNfc_eSentFrameType_t)
                                 (((ns_rejected != ps_store_frame->start_pos) && 
-                                (resend_i_frame != ps_frame_info->write_wait_call))? 
+                                (resend_i_frame != ps_frame_info->write_wait_call))?
                                 rejected_i_frame : ps_frame_info->write_wait_call);
             }
             else
@@ -1009,7 +983,7 @@
     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
     phLlcNfc_Frame_t        *ps_frame_info = NULL;
     phLlcNfc_Timerinfo_t    *ps_timer_info = NULL;
-    phLlcNfc_LlcPacket_t    *ps_create_packet = NULL;
+    phLlcNfc_LlcPacket_t    s_create_packet;
     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
@@ -1033,7 +1007,6 @@
 
         ps_frame_info = &(psLlcCtxt->s_frameinfo);
         ps_timer_info = &(psLlcCtxt->s_timerinfo);
-        ps_create_packet = &(ps_frame_info->s_llcpacket);
         ps_store_frame = &(ps_frame_info->s_send_store);        
         
         timer_index = ps_timer_info->index_to_send;
@@ -1043,16 +1016,17 @@
         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL WIN SIZE CNT : 0x%02X\n", ps_store_frame->winsize_cnt);
         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL START POS : 0x%02X\n", ps_store_frame->start_pos);
         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL N S value : 0x%02X\n", ps_frame_info->n_s);
+        PH_LLCNFC_DEBUG("SEND TIMEOUT TIMER INDEX : 0x%02X\n", timer_index);
         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL frame type : 0x%02X\n", ps_timer_info->frame_type[timer_index]);
 
         if (resend_i_frame == ps_timer_info->frame_type[timer_index])
         {
             /* Get the stored I frame */
-            result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, 
+            result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
                                                 ns_index);
         }        
 
-        PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Packet : 0x%02X\n", ps_get_packet);
+        PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Packet : 0x%p\n", ps_get_packet);
         if (NULL != ps_get_packet)
         {
             llc_header = ps_get_packet->s_llcbuf.sllcpayload.llcheader;
@@ -1061,25 +1035,25 @@
             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
 
             /* create the packet */
-            (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, 
+            (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
                         sizeof (phLlcNfc_LlcPacket_t));
 
-            ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
-            ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+            s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+            ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
 
             /* Length of the complete llc buffer, sent to PN544 */
-            length = ps_create_packet->llcbuf_len;
+            length = s_create_packet.llcbuf_len;
 
             /* Compute CRC */
-            phLlcNfc_H_ComputeCrc((uint8_t *)&(ps_create_packet->s_llcbuf), 
+            phLlcNfc_H_ComputeCrc((uint8_t *)&(s_create_packet.s_llcbuf),
                         (length - 2),
-                        (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), 
+                        (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
 
             /* Send the i frame */
             result = phLlcNfc_Interface_Write (psLlcCtxt, 
-                            (uint8_t *)&(ps_create_packet->s_llcbuf), 
-                            (uint32_t)ps_create_packet->llcbuf_len);
+                            (uint8_t *)&(s_create_packet.s_llcbuf),
+                            (uint32_t)s_create_packet.llcbuf_len);
 
             ps_frame_info->write_status = result;
             PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Write status : 0x%02X\n", result);
@@ -1102,9 +1076,9 @@
 
                 PH_LLCNFC_DEBUG("SEND TIMEOUT CALL timer index : 0x%02X\n", timer_index);
 
-                PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]);
                 if (timer_index > 0)
                 {                    
+                    PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]);
                     /* Copy the maximum time-out value. */
                     time_out_value = (uint16_t)
                         ((ps_timer_info->guard_to_value[(timer_index - 1)] >= 
@@ -1206,18 +1180,12 @@
     phLlcNfc_eSentFrameType_t   eframe_type = invalid_frame;
     uint8_t                     dont_send_s_frame = FALSE;
     uint8_t                     no_of_del_frames = 0;
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
 
 #ifdef RECV_NR_CHECK_ENABLE
     uint8_t                     recvd_nr = 0;    
 #endif /* #ifdef RECV_NR_CHECK_ENABLE */
 
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-    /* Nothing required in this define */
-#else
-    uint8_t                     prev_local_nr = 0;
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
     ps_frame_info = &(psLlcCtxt->s_frameinfo);
     ps_store_frame = &(ps_frame_info->s_send_store);
     ps_recv_pkt = &(ps_frame_info->s_recvpacket);
@@ -1259,12 +1227,6 @@
         phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames);
     }
 
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-    /* Nothing required in this define */
-#else
-    prev_local_nr = ps_frame_info->n_r;
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
     /* Received buffer, N(S) value = N(R) of host (our 
         structure) then send RR type of s frame else send 
         REJ type of s frame */
@@ -1290,7 +1252,6 @@
                         ps_recv_pkt->s_llcbuf.sllcpayload.llcpayload), 
                         psLlcCtxt->recvbuf_length);
         
-        
 #if defined (LLC_SEND_RR_ACK)
 
         if (((ns_index < ps_frame_info->n_r) && 
@@ -1309,6 +1270,11 @@
             ps_frame_info->n_r = ((ps_frame_info->n_r + 1)
                                     % PH_LLCNFC_MOD_NS_NR);
 
+#ifdef PIGGY_BACK
+            ps_frame_info->resp_recvd_count = (uint8_t)
+                                    (ps_frame_info->resp_recvd_count + 1);
+#endif /* #ifdef PIGGY_BACK */
+
         }
 
         if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
@@ -1334,9 +1300,7 @@
         {
             dont_send_s_frame = TRUE;
 #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
             phLlcNfc_H_SendInfo (psLlcCtxt);
-
 #endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */        
         }
         else
@@ -1349,15 +1313,10 @@
                             resend_s_frame : s_frame);
         }
 
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
-        /* Nothing required in this define */
-
-#else /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
+#ifdef PIGGY_BACK
         phLlcNfc_H_SendInfo (psLlcCtxt);
+#endif /* #ifdef PIGGY_BACK */
 
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
     }
     else
     {
@@ -1374,8 +1333,8 @@
 #ifdef LLC_RR_INSTEAD_OF_REJ
 
             if (((ps_frame_info->n_r > 0) && (ns_index == (ps_frame_info->n_r - 1)))
-                || (0 == ps_frame_info->n_r) && 
-                (ns_index == (PH_LLCNFC_MOD_NS_NR - 1)))
+                || ((0 == ps_frame_info->n_r) &&
+                (ns_index == (PH_LLCNFC_MOD_NS_NR - 1))))
             {
                 cmdtype = phLlcNfc_e_rr;
                 eframe_type = rej_rr_s_frame;
@@ -1425,23 +1384,61 @@
 
 #endif /* #ifdef LLC_RELEASE_FLAG */
     {
-        result = phLlcNfc_Interface_Read(psLlcCtxt, 
+        (void)phLlcNfc_Interface_Read(psLlcCtxt,
                         PH_LLCNFC_READWAIT_OFF, 
                         &(ps_recv_pkt->s_llcbuf.llc_length_byte),
                         (uint8_t)PH_LLCNFC_BYTES_INIT_READ);
     
+#ifdef PIGGY_BACK
+        /* Check if any write call is performed or not */
+        if (NFCSTATUS_PENDING != result)
+        {
+            /* No write is performed, So, now check */
+            if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
+            {
+                /* Any how write cannot be done and some frame is ready to be sent
+                so this frame will act as the ACK */
+                result = phLlcNfc_H_WriteWaitCall (psLlcCtxt);
+            }
+        }
 
+        if (NFCSTATUS_PENDING != result)
+        {
+            if (ps_frame_info->window_size == ps_frame_info->resp_recvd_count)
+            {
+                phLlcNfc_LlcPacket_t    s_packet_info;
+                /* Create S frame */
+                (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
+
+                result = phLlcNfc_Interface_Write(psLlcCtxt,
+                            (uint8_t *)&(s_packet_info.s_llcbuf),
+                            (uint32_t)(s_packet_info.llcbuf_len));
+
+
+                if (0 == ps_frame_info->send_error_count)
+                {
+                    ps_frame_info->write_wait_call = invalid_frame;
+                }
+                ps_frame_info->sent_frame_type = eframe_type;
+            }
+            else
+            {
+                result = phLlcNfc_StartTimers (PH_LLCNFC_ACKTIMER, 0);
+            }
+        }
+#else /* #ifdef PIGGY_BACK */
 
         if ((TRUE != ps_frame_info->write_pending) &&  
             (PH_LLCNFC_READPEND_REMAIN_BYTE != ps_frame_info->read_pending) && 
             (FALSE == dont_send_s_frame))
         {
+            phLlcNfc_LlcPacket_t    s_packet_info = {0};
             /* Create S frame */
-            (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, cmdtype);
+            (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
 
             result = phLlcNfc_Interface_Write(psLlcCtxt,
-                        (uint8_t *)&(ps_frame_info->s_llcpacket.s_llcbuf), 
-                        (uint32_t)(ps_frame_info->s_llcpacket.llcbuf_len));
+                        (uint8_t *)&(s_packet_info.s_llcbuf),
+                        (uint32_t)(s_packet_info.llcbuf_len));
 
 
             if (0 == ps_frame_info->send_error_count)
@@ -1450,6 +1447,7 @@
             }
             ps_frame_info->sent_frame_type = eframe_type;
         }
+#endif /* #ifdef PIGGY_BACK */
     }
 
     return ;
@@ -1465,7 +1463,7 @@
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
     phLlcNfc_LlcPacket_t        *ps_uframe_pkt = NULL;
 #ifdef LLC_URSET_NO_DELAY
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
 #else /* #ifdef LLC_URSET_NO_DELAY */
     uint32_t                    delay_timer_id = 
                                 PH_OSALNFC_INVALID_TIMER_ID;
@@ -1580,12 +1578,12 @@
 #if 0
                                 prev_win_count = 0;
 #endif /* #if 0 */
-    phNfc_sTransactionInfo_t    compinfo = {0};
+    phNfc_sTransactionInfo_t    compinfo = {0, 0, 0, 0, 0};
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
     phLlcNfc_StoreIFrame_t      *ps_store_frame = NULL;
     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
     uint8_t                     no_of_del_frames = 0;
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
     
     ps_frame_info = &(psLlcCtxt->s_frameinfo);
     ps_recv_pkt = &(ps_frame_info->s_recvpacket);
@@ -1962,13 +1960,16 @@
                       )
 {
     NFCSTATUS       result = NFCSTATUS_SUCCESS;
+    phLlcNfc_LlcPacket_t    s_packet_info = {0};
+
     result = phLlcNfc_H_CreateSFramePayload(
-                                    &(psLlcCtxt->s_frameinfo), 
+                                    &(psLlcCtxt->s_frameinfo),
+                                    &(s_packet_info),
                                     phLlcNfc_e_rej);
     /* Send the "S" frame to the lower layer */
     result = phLlcNfc_Interface_Write(psLlcCtxt,
-        (uint8_t *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf), 
-        (uint32_t)(psLlcCtxt->s_frameinfo.s_llcpacket.llcbuf_len));
+        (uint8_t *)&(s_packet_info.s_llcbuf),
+        (uint32_t)(s_packet_info.llcbuf_len));
 
     if (NFCSTATUS_PENDING == result)
     {
@@ -2160,23 +2161,22 @@
                       )
 {
     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
-    phLlcNfc_LlcPacket_t        *ps_packet_info = NULL;
+    phLlcNfc_LlcPacket_t        s_packet_info;
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
     
     ps_frame_info = &(psLlcCtxt->s_frameinfo);
-    ps_packet_info = &(psLlcCtxt->s_frameinfo.s_llcpacket);
 
-    result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt, 
-                                    ps_packet_info, 
-                                    &(ps_packet_info->llcbuf_len), 
+    result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt,
+                                    &(s_packet_info),
+                                    &(s_packet_info.llcbuf_len),
                                     phLlcNfc_e_rset);
 
     if (NFCSTATUS_SUCCESS == result)
     {
         /* Call DAL write */
-        result = phLlcNfc_Interface_Write(psLlcCtxt, 
-                            (uint8_t*)&(ps_packet_info->s_llcbuf), 
-                            (uint32_t)ps_packet_info->llcbuf_len);
+        result = phLlcNfc_Interface_Write(psLlcCtxt,
+                            (uint8_t*)&(s_packet_info.s_llcbuf),
+                            (uint32_t)s_packet_info.llcbuf_len);
     }
 
     ps_frame_info->write_status = result;
diff --git a/src/phLlcNfc_Frame.h b/src/phLlcNfc_Frame.h
index e1662df..e76e017 100644
--- a/src/phLlcNfc_Frame.h
+++ b/src/phLlcNfc_Frame.h
@@ -264,6 +264,7 @@
 *
 * \param[in/out]    psFrameInfo Information related to LLC frames are stored 
 *                           in this structure
+* \param[in/out]    psLlcPacket         Llc packet sent by the upper layer
 * \param[in]        pLlcBuf     User given buffer or the buffer which needs LLC framing
 * \param[in]        llcBufLength    Length of the parameter "pLlcBuf" 
 *
@@ -427,6 +428,28 @@
 /**
 * \ingroup grp_hal_nfc_llc_helper
 *
+* \brief LLC component <b>Create S frame</b> function
+*
+* \copydoc page_reg This is a helper function which, creates the S frame
+*
+* \param[in/out] psFrameInfo    Generic frame information
+* \param[in/out] psLlcPacket         Llc packet sent by the upper layer
+* \param[in/out] cmdType        Command type of S frame
+*
+* \retval NFCSTATUS_SUCCESS                Operation successful.
+* \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
+*
+*/
+NFCSTATUS
+phLlcNfc_H_CreateSFramePayload (
+    phLlcNfc_Frame_t        *psFrameInfo,
+    phLlcNfc_LlcPacket_t    *psLlcPacket,
+    phLlcNfc_LlcCmd_t       cmdType
+);
+
+/**
+* \ingroup grp_hal_nfc_llc_helper
+*
 * \brief LLC Send upper layer information function
 *
 * \copydoc page_reg Sends received information to the upper layer frame.
diff --git a/src/phLlcNfc_Interface.c b/src/phLlcNfc_Interface.c
index 92be48d..a1e9938 100644
--- a/src/phLlcNfc_Interface.c
+++ b/src/phLlcNfc_Interface.c
@@ -48,7 +48,6 @@
 /***************************** Macros *******************************/
 #define PH_LLCNFC_APPEND_LEN                        (4)
 #define LLC_NS_FRAME_HEADER_MASK                    (0x38U)
-
 /************************ End of macros *****************************/
 
 /*********************** Local functions ****************************/
@@ -81,8 +80,8 @@
 )
 {
     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
-    phNfcIF_sCallBack_t         if_cb;
-    phNfcIF_sReference_t        sreference;
+    phNfcIF_sCallBack_t         if_cb = {0,0,0,0};
+    phNfcIF_sReference_t        sreference = {0,0,0};
     
     if ((NULL == psLlcCtxt) || (NULL == psIFConfig))
     {
@@ -223,8 +222,8 @@
         (0 == llcBufferLength) || 
         (NULL == psLlcCtxt->lower_if.send))
     {
-        PH_LLCNFC_DEBUG ("psLlcCtxt : 0x%08X\n", psLlcCtxt);
-        PH_LLCNFC_DEBUG ("pLlcBuffer : 0x%08X\n", pLlcBuffer);
+        PH_LLCNFC_DEBUG ("psLlcCtxt : 0x%p\n", psLlcCtxt);
+        PH_LLCNFC_DEBUG ("pLlcBuffer : 0x%p\n", pLlcBuffer);
         PH_LLCNFC_DEBUG ("llcBufferLength : 0x%08X\n", llcBufferLength);
         result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
     }
@@ -247,13 +246,24 @@
             PH_LLCNFC_STRING (";\n");
     
 #endif /* LLC_DATA_BYTES */
+
+            psLlcCtxt->s_frameinfo.s_llcpacket.llcbuf_len = (uint8_t)llcBufferLength;
+            (void)memcpy ((void *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf),
+                        (void *)pLlcBuffer, llcBufferLength);
+
             result = psLlcCtxt->lower_if.send(psLlcCtxt->lower_if.pcontext, 
                                                 psLlcCtxt->phwinfo, 
-                                                pLlcBuffer, 
+                                                (uint8_t *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf),
                                                 (uint16_t)llcBufferLength);
             if(NFCSTATUS_PENDING == result)
             {
                 psLlcCtxt->s_frameinfo.write_pending = TRUE;
+#ifdef PIGGY_BACK
+                /* Stop the ACK timer, as the ACK or I frame is sent */
+                phLlcNfc_StopTimers (PH_LLCNFC_ACKTIMER, 0);
+                /* ACK is sent, so reset the response received count */
+                psLlcCtxt->s_frameinfo.resp_recvd_count = 0;
+#endif /* #ifdef PIGGY_BACK */
             }
         }
     }
@@ -279,7 +289,7 @@
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
     phLlcNfc_StoreIFrame_t      *ps_store_frame = NULL;
-    phNfc_sCompletionInfo_t     notifyinfo;
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
     uint8_t                     count = 0;
 
     PH_LLCNFC_PRINT("\n\nLLC : WRITE RESP CB CALLED\n\n");
@@ -497,6 +507,7 @@
                     }
                     else 
                     {
+                        /* ***** This notification needs to be disabled ***** */
                         if(NULL != ps_llc_ctxt->cb_for_if.send_complete) 
                         {
                             pCompInfo->length = (pCompInfo->length - 
@@ -650,7 +661,7 @@
     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
     phLlcNfc_Payload_t          *ps_llc_payload = NULL;
     pphNfcIF_Notification_CB_t  notifyul = NULL;
-    phNfc_sCompletionInfo_t     notifyinfo;
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
 
     PH_LLCNFC_PRINT("\n\nLLC : READ RESP CB CALLED\n\n");
     
@@ -932,7 +943,7 @@
 {
     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
-    phNfc_sTransactionInfo_t    comp_info;
+    phNfc_sTransactionInfo_t    comp_info = {0,0,0,0,0};
 
     ps_frame_info = &(psLlcCtxt->s_frameinfo);
     ps_recv_pkt = &(ps_frame_info->s_recvpacket);
diff --git a/src/phLlcNfc_Timer.c b/src/phLlcNfc_Timer.c
index 9a596b4..06ca7e4 100644
--- a/src/phLlcNfc_Timer.c
+++ b/src/phLlcNfc_Timer.c
@@ -44,8 +44,6 @@
 /***************************** Macros *******************************/
 /**< Timer for connection timer index */
 #define PH_LLCNFC_CONNECTION_TO_INDEX       (0x00)
-/**< 0x0A Timer for ack time out value */
-#define PH_LLCNFC_ACK_TO_VALUE              (1000)
 /**< Maximum guard timer can be present */
 #define PH_LLCNFC_MAX_GUARD_TIMER           (0x04)
 /** Connection time out bit to set */
@@ -60,6 +58,8 @@
 #define PH_LLCNFC_CON_TO_BIT_VAL            (0x01)
 /** Guard time out bit to set */
 #define PH_LLCNFC_GUARD_TO_BIT_VAL          (0x02)
+/** ACK time out bit to set */
+#define PH_LLCNFC_ACK_TO_BIT_VAL            (0x04)
 
 #define GUARD_TO_URSET
 
@@ -84,7 +84,7 @@
 phLlcNfc_AckTimeoutCb (
     uint32_t TimerId                    
 );
-#endif
+#endif /* #ifdef PIGGY_BACK */
 
 /* This callback is for connection time out */
 static 
@@ -290,17 +290,22 @@
             /* Get the ack timer flag */
             timerstarted = (uint8_t)GET_BITS8 (
                                     ps_timer_info->timer_flag, 
-                                    PH_LLCNFC_GUARD_TO_BIT, 
+                                    PH_LLCNFC_ACK_TO_BIT,
                                     PH_LLCNFC_TO_NOOFBITS);
-            if (0 == timerstarted)
+
+            if (FALSE == timerstarted)
             {
                 /* Timer not started, so start the timer */
                 ps_timer_info->timer_flag = (uint8_t)
                                 SET_BITS8 (ps_timer_info->timer_flag, 
-                                        PH_LLCNFC_GUARD_TO_BIT
-                                        PH_LLCNFC_TO_NOOFBITS
-                                        (PH_LLCNFC_GUARD_TO_BIT - 1));
+                                        PH_LLCNFC_ACK_TO_BIT,
+                                        PH_LLCNFC_TO_NOOFBITS,
+                                        (PH_LLCNFC_ACK_TO_BIT - 1));
             }
+
+
+            timer_resolution = ps_timer_info->ack_to_value = (uint16_t)
+                                            PH_LLCNFC_ACK_TO_VALUE;
             timerid = ps_timer_info->timer_id[PH_LLCNFC_ACKTIMER];
             Callback = (ppCallBck_t)&phLlcNfc_AckTimeoutCb;
             break;
@@ -380,7 +385,7 @@
             {
                 /* The number of guard timer count is more than the 
                     guard timer to delete  */
-                while (start_index < no_of_guard_to_del)
+                while (start_index < (timer_count - no_of_guard_to_del))
                 {
                     /* Copy the previous stored timer values to the present */
                     ps_timer_info->guard_to_value[start_index] = (uint16_t)
@@ -457,11 +462,14 @@
 #ifdef PIGGY_BACK
         case PH_LLCNFC_ACKTIMER:
         {
+            timerflag = (timerflag & PH_LLCNFC_ACK_TO_BIT_VAL);
+
             ps_timer_info->timer_flag = (uint8_t)
                                 SET_BITS8 (ps_timer_info->timer_flag, 
-                                        PH_LLCNFC_GUARD_TO_BIT, 
+                                        PH_LLCNFC_ACK_TO_BIT,
                                         PH_LLCNFC_TO_NOOFBITS, 0);
             timerid = ps_timer_info->timer_id[PH_LLCNFC_ACKTIMER];
+            ps_timer_info->ack_to_value = 0;
             break;
         }
 #endif /* #ifdef PIGGY_BACK */
@@ -486,7 +494,7 @@
 
     PHNFC_UNUSED_VARIABLE (result);
     PHNFC_UNUSED_VARIABLE (TimerType);
-    PHNFC_UNUSED_VARIABLE (no_of_gaurd_to_del);
+    PHNFC_UNUSED_VARIABLE (no_of_guard_to_del);
 
 #endif /* #ifdef LLC_TIMER_ENABLE */
 }
@@ -602,23 +610,25 @@
     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
     phLlcNfc_Timerinfo_t        *ps_timer_info = NULL;
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
-    phLlcNfc_LlcPacket_t        *ps_packet_info = NULL;
+    phLlcNfc_LlcPacket_t        s_packet_info;
     uint8_t                     index = 0;
+    /* zero_to_index = Time out index has become 0 */
     uint8_t                     zero_to_index = 0;
+
 #if defined (GUARD_TO_ERROR)
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
 #endif /* #if defined (GUARD_TO_ERROR) */
-    PHNFC_UNUSED_VARIABLE(pContext);
 
     PH_LLCNFC_PRINT("\n\nLLC : GUARD TIMEOUT CB CALLED \n\n");
 
-    if ((NULL != gpphLlcNfc_Ctxt) && (TimerId == 
-        gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_GUARDTIMER]) && 
-        (PH_LLCNFC_GUARD_TO_BIT_VAL == 
-        (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag & 
+    if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
+        gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_GUARDTIMER]) &&
+        (PH_LLCNFC_GUARD_TO_BIT_VAL ==
+        (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag &
         PH_LLCNFC_GUARD_TO_BIT_VAL)))
     {
         uint8_t                 timer_expired = FALSE;
+
         ps_frame_info = &(gpphLlcNfc_Ctxt->s_frameinfo);
         ps_timer_info = &(gpphLlcNfc_Ctxt->s_timerinfo);
 
@@ -632,8 +642,15 @@
            send called */
         while (index < ps_timer_info->guard_to_count) 
         {
+            /* This loop runs for all the timer present in the data structure.
+                This means if there are 2 I frame has been sent and
+                response is not received for the I frames sent then the
+                each time this timer expires, the time out value is decremented
+                by the PH_LLCNFC_RESOLUTION value */
             if (0 != ps_timer_info->guard_to_value[index])
             {
+                /* If timer value is not zero then enter,
+                    this means that the value is not zero */
                 if (ps_timer_info->guard_to_value[index] > 0)
                 {
                     if (ps_timer_info->guard_to_value[index] >= 
@@ -651,10 +668,20 @@
 
                 if (0 == ps_timer_info->guard_to_value[index])
                 {
+                    /* Timer value has expired, so resend has to be done
+                        Timer value is 0 */
+                    ps_timer_info->frame_type[index] = (uint8_t)resend_i_frame;
+                    if (FALSE == timer_expired)
+                    {
+                        /* As the statement is in the loop, so there are possibilities
+                            of more than 1 timer value can be 0, so if previous timer
+                            value has already been 0, then again dont change the
+                            index */
                     zero_to_index = index;
                     timer_expired = TRUE;
                 }
             }
+            }
             index = (uint8_t)(index + 1);
         }
 
@@ -686,7 +713,6 @@
 
                     timer_count = ps_timer_info->guard_to_count;
 
-                    
                     /* Check before changing the index to resend, if index 
                         already exist then dont set the index */
                     while ((FALSE == while_exit) && (start_index < timer_count))
@@ -702,13 +728,29 @@
                         }
                     }
 
-                    if (TRUE == while_exit)
+                    if (FALSE == while_exit)
                     {
+                        /* This " ps_timer_info->index_to_send " member is
+                           useful, when 2 time out values are 0, then
+                           only first timed out value has to be resent and
+                           other has to wait until the the first timed out
+                           I frame is resent
+                           This statement is executed only if, none of the timer
+                           has expires previously, this is the first timer in the
+                           list that has time out value has 0
+                           */
                         ps_timer_info->index_to_send = zero_to_index;
                     }
+                    else
+                    {
+                        /* This statement is executed only if, any one of the time
+                           out value was 0 previously, so first resend has to be done
+                           for the previous I frame, so the index is set to the previous
+                           I frame
+                           */
+                        ps_timer_info->index_to_send = start_index;
+                    }
 
-                    ps_timer_info->frame_type[zero_to_index] = (uint8_t)
-                                                            resend_i_frame;
                     /* Now resend the frame stored */
                     result = phLlcNfc_H_SendTimedOutIFrame (gpphLlcNfc_Ctxt, 
                                             &(ps_frame_info->s_send_store), 
@@ -741,16 +783,15 @@
 #if (!defined (GUARD_TO_ERROR) && defined (GUARD_TO_URSET))
 
                     PH_LLCNFC_PRINT("U-RSET IS SENT \n");
-                    ps_packet_info = &(gpphLlcNfc_Ctxt->s_frameinfo.s_llcpacket);
 
-                    result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt, 
-                                        ps_packet_info, 
-                                        &(ps_packet_info->llcbuf_len), 
+                    result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt,
+                                        &(s_packet_info),
+                                        &(s_packet_info.llcbuf_len),
                                         phLlcNfc_e_rset);
 
-                    result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt, 
-                                    (uint8_t*)&(ps_packet_info->s_llcbuf), 
-                                    (uint32_t)ps_packet_info->llcbuf_len);
+                    result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt,
+                                    (uint8_t*)&(s_packet_info.s_llcbuf),
+                                    (uint32_t)s_packet_info.llcbuf_len);
 
                     ps_frame_info->write_status = result;
                     if (NFCSTATUS_PENDING == result)
@@ -782,15 +823,71 @@
 }
 
 #ifdef PIGGY_BACK
+
 static 
 void 
 phLlcNfc_AckTimeoutCb (
     uint32_t TimerId
 )
 {
+    NFCSTATUS                   result = NFCSTATUS_SUCCESS;
+    phLlcNfc_Frame_t            *ps_frame_info = NULL;
+    phLlcNfc_Timerinfo_t        *ps_timer_info = NULL;
+    phLlcNfc_LlcPacket_t        s_packet_info;
 
+    PH_LLCNFC_PRINT("\n\nLLC : ACK TIMEOUT CB CALLED\n\n");
+
+    if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
+        gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_ACKTIMER])
+        && (PH_LLCNFC_ACK_TO_BIT_VAL ==
+        (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag &
+        PH_LLCNFC_ACK_TO_BIT_VAL)))
+    {
+        ps_frame_info = &(gpphLlcNfc_Ctxt->s_frameinfo);
+        ps_timer_info = &(gpphLlcNfc_Ctxt->s_timerinfo);
+
+        phLlcNfc_StopTimers (PH_LLCNFC_ACKTIMER, 0);
+
+        if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
+        {
+            /* Any how write cannot be done and some frame is ready to be sent
+            so this frame will act as the ACK */
+            result = phLlcNfc_H_WriteWaitCall (gpphLlcNfc_Ctxt);
+        }
+        else
+        {
+            /* Create S frame */
+            (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), phLlcNfc_e_rr);
+
+            result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt,
+                        (uint8_t *)&(s_packet_info.s_llcbuf),
+                        (uint32_t)(s_packet_info.llcbuf_len));
+
+            if (NFCSTATUS_PENDING == result)
+            {
+                if (0 == ps_frame_info->send_error_count)
+                {
+                    ps_frame_info->write_wait_call = invalid_frame;
+                }
+                ps_frame_info->sent_frame_type = s_frame;
+            }
+            else
+            {
+                if (invalid_frame == ps_frame_info->write_wait_call)
+                {
+                    ps_frame_info->write_wait_call = s_frame;
+                }
+            }
+        }
+    }
+
+    /* ACK is sent, so reset the response received count */
+    gpphLlcNfc_Ctxt->s_frameinfo.resp_recvd_count = 0;
+
+    PH_LLCNFC_PRINT("\n\nLLC : ACK TIMEOUT CB END\n\n");
 }
-#endif
+
+#endif /* #ifdef PIGGY_BACK */
 
 static 
 void 
@@ -800,12 +897,12 @@
 )
 {
     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
     pphNfcIF_Notification_CB_t  notifyul = NULL;
     void                        *p_upperctxt = NULL;
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
     phLlcNfc_Timerinfo_t        *ps_timer_info = NULL;
-    PHNFC_UNUSED_VARIABLE(pContext);
+    phLlcNfc_LlcPacket_t        s_packet_info;
     
     PH_LLCNFC_PRINT("\n\nLLC : CONNECTION TIMEOUT CB CALLED\n\n");
     if ((NULL != gpphLlcNfc_Ctxt) && (TimerId == 
@@ -834,16 +931,16 @@
                 {
                     /* Create a U frame */
                     result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt, 
-                                        &(ps_frame_info->s_llcpacket),
-                                        &(ps_frame_info->s_llcpacket.llcbuf_len), 
+                                        &(s_packet_info),
+                                        &(s_packet_info.llcbuf_len),
                                         phLlcNfc_e_rset);
 
                     if (NFCSTATUS_SUCCESS == result)
                     {
                         /* Call DAL write */
                         result = phLlcNfc_Interface_Write (gpphLlcNfc_Ctxt, 
-                                (uint8_t*)&(ps_frame_info->s_llcpacket.s_llcbuf), 
-                                (uint32_t)(ps_frame_info->s_llcpacket.llcbuf_len));
+                                (uint8_t*)&(s_packet_info.s_llcbuf),
+                                (uint32_t)(s_packet_info.llcbuf_len));
                     }
                     if (NFCSTATUS_PENDING == result)
                     {
@@ -927,7 +1024,7 @@
     void                *pContext)
 {
     phLlcNfc_Frame_t            *ps_frame_info = NULL;
-    phNfc_sCompletionInfo_t     notifyinfo = {0};
+    phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
     
     if (NULL != gpphLlcNfc_Ctxt)
     {
diff --git a/src/phLlcNfc_Timer.h b/src/phLlcNfc_Timer.h
index d8f702a..f212a32 100644
--- a/src/phLlcNfc_Timer.h
+++ b/src/phLlcNfc_Timer.h
@@ -56,6 +56,12 @@
 /**< 0x05 Timer for guard time out value */
 #define PH_LLCNFC_GUARD_TO_VALUE            LINK_GUARD_TIMEOUT
 
+#ifdef PIGGY_BACK
+
+#define PH_LLCNFC_ACK_TO_VALUE              LINK_ACK_TIMEOUT
+
+#endif /* #ifdef PIGGY_BACK */
+
 #ifdef LLC_RESET_DELAY
     #define LLC_URSET_DELAY_TIME_OUT        LLC_RESET_DELAY
 #else
@@ -201,8 +207,10 @@
 
 void 
 phLlcNfc_URSET_Delay_Notify (
-    uint32_t            delay_id,
-    void                *pContext);
+
+    uint32_t            delay_id);
+
+
 
 #endif /* #ifdef LLC_URSET_NO_DELAY */