diff --git a/src/gtpV2Codec/gtpV2Stack.cpp b/src/gtpV2Codec/gtpV2Stack.cpp
new file mode 100644
index 0000000..c1f415f
--- /dev/null
+++ b/src/gtpV2Codec/gtpV2Stack.cpp
@@ -0,0 +1,1175 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/******************************************************************************
+ *
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/GtpV2StackCodeGen/tts/stacktemplate.cpp.tt>
+ ******************************************************************************/
+#include <cstring>
+#include <stdint.h>
+#include "gtpV2Stack.h"
+#include "msgClasses/gtpV2MsgFactory.h"
+#include "msgClasses/manual/gtpV2Message.h"
+#include "msgClasses/createSessionRequestMsg.h"
+#include "msgClasses/createSessionResponseMsg.h"
+#include "msgClasses/modifyBearerRequestMsg.h"
+#include "msgClasses/modifyBearerResponseMsg.h"
+#include "msgClasses/deleteSessionRequestMsg.h"
+#include "msgClasses/deleteSessionResponseMsg.h"
+#include "msgClasses/releaseAccessBearersRequestMsg.h"
+#include "msgClasses/releaseAccessBearersResponseMsg.h"
+#include "msgClasses/createBearerRequestMsg.h"
+#include "msgClasses/createBearerResponseMsg.h"
+#include "msgClasses/deleteBearerRequestMsg.h"
+#include "msgClasses/deleteBearerResponseMsg.h"
+#include "msgClasses/downlinkDataNotificationMsg.h"
+#include "msgClasses/downlinkDataNotificationAcknowledgeMsg.h"
+#include "msgClasses/downlinkDataNotificationFailureIndicationMsg.h"
+
+cmn::utils::Debug errorStream;
+
+GtpV2Stack::GtpV2Stack ()
+{
+    // TODO Auto-generated constructor stub
+
+}
+
+GtpV2Stack::~GtpV2Stack ()
+{
+    // TODO Auto-generated destructor stub
+}
+
+bool
+GtpV2Stack::encodeMessage (GtpV2MessageHeader & msgHeader, 
+			   MsgBuffer & buffer, void *data_p)
+{
+
+    //Clear the global errorStream
+    errorStream.clearStream ();
+    bool rc = false;
+    GtpV2Message & msg =
+    GtpV2MsgFactory::getInstance ().getMsgObject (msgHeader.msgType);
+
+	uint16_t gtpHeaderStartIdx = buffer.getCurrentIndex();
+    // Encode the header
+    GtpV2Message::encodeHeader (buffer, msgHeader);
+
+    Uint16 startIndex = buffer.getCurrentIndex();
+
+    switch (msgHeader.msgType)
+    {
+        case CreateSessionRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               CreateSessionRequestMsg & >(msg).
+               encodeCreateSessionRequestMsg(buffer,
+    			     *((CreateSessionRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                CreateSessionRequestMsg & >(msg).
+                encodeCreateSessionRequestMsg (buffer,
+                            createSessionRequestStackData);
+            }
+            break;
+        }
+        case CreateSessionResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               CreateSessionResponseMsg & >(msg).
+               encodeCreateSessionResponseMsg(buffer,
+    			     *((CreateSessionResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                CreateSessionResponseMsg & >(msg).
+                encodeCreateSessionResponseMsg (buffer,
+                            createSessionResponseStackData);
+            }
+            break;
+        }
+        case ModifyBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               ModifyBearerRequestMsg & >(msg).
+               encodeModifyBearerRequestMsg(buffer,
+    			     *((ModifyBearerRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                ModifyBearerRequestMsg & >(msg).
+                encodeModifyBearerRequestMsg (buffer,
+                            modifyBearerRequestStackData);
+            }
+            break;
+        }
+        case ModifyBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               ModifyBearerResponseMsg & >(msg).
+               encodeModifyBearerResponseMsg(buffer,
+    			     *((ModifyBearerResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                ModifyBearerResponseMsg & >(msg).
+                encodeModifyBearerResponseMsg (buffer,
+                            modifyBearerResponseStackData);
+            }
+            break;
+        }
+        case DeleteSessionRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DeleteSessionRequestMsg & >(msg).
+               encodeDeleteSessionRequestMsg(buffer,
+    			     *((DeleteSessionRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DeleteSessionRequestMsg & >(msg).
+                encodeDeleteSessionRequestMsg (buffer,
+                            deleteSessionRequestStackData);
+            }
+            break;
+        }
+        case DeleteSessionResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DeleteSessionResponseMsg & >(msg).
+               encodeDeleteSessionResponseMsg(buffer,
+    			     *((DeleteSessionResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DeleteSessionResponseMsg & >(msg).
+                encodeDeleteSessionResponseMsg (buffer,
+                            deleteSessionResponseStackData);
+            }
+            break;
+        }
+        case ReleaseAccessBearersRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               ReleaseAccessBearersRequestMsg & >(msg).
+               encodeReleaseAccessBearersRequestMsg(buffer,
+    			     *((ReleaseAccessBearersRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                ReleaseAccessBearersRequestMsg & >(msg).
+                encodeReleaseAccessBearersRequestMsg (buffer,
+                            releaseAccessBearersRequestStackData);
+            }
+            break;
+        }
+        case ReleaseAccessBearersResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               ReleaseAccessBearersResponseMsg & >(msg).
+               encodeReleaseAccessBearersResponseMsg(buffer,
+    			     *((ReleaseAccessBearersResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                ReleaseAccessBearersResponseMsg & >(msg).
+                encodeReleaseAccessBearersResponseMsg (buffer,
+                            releaseAccessBearersResponseStackData);
+            }
+            break;
+        }
+        case CreateBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               CreateBearerRequestMsg & >(msg).
+               encodeCreateBearerRequestMsg(buffer,
+    			     *((CreateBearerRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                CreateBearerRequestMsg & >(msg).
+                encodeCreateBearerRequestMsg (buffer,
+                            createBearerRequestStackData);
+            }
+            break;
+        }
+        case CreateBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               CreateBearerResponseMsg & >(msg).
+               encodeCreateBearerResponseMsg(buffer,
+    			     *((CreateBearerResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                CreateBearerResponseMsg & >(msg).
+                encodeCreateBearerResponseMsg (buffer,
+                            createBearerResponseStackData);
+            }
+            break;
+        }
+        case DeleteBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DeleteBearerRequestMsg & >(msg).
+               encodeDeleteBearerRequestMsg(buffer,
+    			     *((DeleteBearerRequestMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DeleteBearerRequestMsg & >(msg).
+                encodeDeleteBearerRequestMsg (buffer,
+                            deleteBearerRequestStackData);
+            }
+            break;
+        }
+        case DeleteBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DeleteBearerResponseMsg & >(msg).
+               encodeDeleteBearerResponseMsg(buffer,
+    			     *((DeleteBearerResponseMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DeleteBearerResponseMsg & >(msg).
+                encodeDeleteBearerResponseMsg (buffer,
+                            deleteBearerResponseStackData);
+            }
+            break;
+        }
+        case DownlinkDataNotificationMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DownlinkDataNotificationMsg & >(msg).
+               encodeDownlinkDataNotificationMsg(buffer,
+    			     *((DownlinkDataNotificationMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DownlinkDataNotificationMsg & >(msg).
+                encodeDownlinkDataNotificationMsg (buffer,
+                            downlinkDataNotificationStackData);
+            }
+            break;
+        }
+        case DownlinkDataNotificationAcknowledgeMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DownlinkDataNotificationAcknowledgeMsg & >(msg).
+               encodeDownlinkDataNotificationAcknowledgeMsg(buffer,
+    			     *((DownlinkDataNotificationAcknowledgeMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DownlinkDataNotificationAcknowledgeMsg & >(msg).
+                encodeDownlinkDataNotificationAcknowledgeMsg (buffer,
+                            downlinkDataNotificationAcknowledgeStackData);
+            }
+            break;
+        }
+        case DownlinkDataNotificationFailureIndicationMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               DownlinkDataNotificationFailureIndicationMsg & >(msg).
+               encodeDownlinkDataNotificationFailureIndicationMsg(buffer,
+    			     *((DownlinkDataNotificationFailureIndicationMsgData *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                DownlinkDataNotificationFailureIndicationMsg & >(msg).
+                encodeDownlinkDataNotificationFailureIndicationMsg (buffer,
+                            downlinkDataNotificationFailureIndicationStackData);
+            }
+            break;
+        }
+    }
+
+    Uint16 endIndex = buffer.getCurrentIndex ();
+
+    Uint16 messageLength = (endIndex - startIndex)+8;
+
+    buffer.goToIndex (gtpHeaderStartIdx  + 2); // 2 is where length is encoded in a gtp message TODO remove hardcoding
+    buffer.writeUint16 (messageLength, false);
+    buffer.goToIndex (endIndex);
+    return rc;
+}
+
+bool
+GtpV2Stack::decodeGtpMessageHeader(GtpV2MessageHeader& msgHeader, MsgBuffer& buffer)
+{
+	 return GtpV2Message::decodeHeader (buffer, msgHeader);
+}
+
+
+bool
+GtpV2Stack::decodeMessage (GtpV2MessageHeader& msgHeader, 
+                MsgBuffer& buffer,void* data_p)
+{
+    errorStream.clearStream();
+    // First decode the message header
+    bool rc = false;
+      
+    
+    
+    Uint16 msgDataLength = msgHeader.msgLength;
+    
+    if (msgHeader.teidPresent)
+    {
+        msgDataLength = msgDataLength - 8; //teid and sequence number
+    }
+    else
+    {
+        msgDataLength = msgDataLength - 4; //only sequence number
+    }
+  
+    // Validate the length before proceeding
+    if (msgDataLength != buffer.lengthLeft() )
+    {
+        // Encoded message length does not match the number of bytes left in the message
+        errorStream.add ((char *)"Message length does not match bytes in buffer\n");
+        errorStream.add ((char *)"Computed Message length: ");
+        errorStream.add (msgDataLength);
+        errorStream.add ((char *)"  Bytes Left in buffer: ");
+        errorStream.add (buffer.lengthLeft());
+        errorStream.endOfLine ();
+        return false;
+    }
+
+    GtpV2Message& msg = 
+    GtpV2MsgFactory::getInstance ().getMsgObject (msgHeader.msgType);
+
+    switch (msgHeader.msgType){
+        case CreateSessionRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                CreateSessionRequestMsg & >(msg).
+                decodeCreateSessionRequestMsg(buffer,
+                            *(CreateSessionRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&createSessionRequestStackData, 0,
+                sizeof (CreateSessionRequestMsgData));
+                rc =
+                dynamic_cast<
+                CreateSessionRequestMsg & >(msg).
+                decodeCreateSessionRequestMsg(buffer,
+                            createSessionRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case CreateSessionResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                CreateSessionResponseMsg & >(msg).
+                decodeCreateSessionResponseMsg(buffer,
+                            *(CreateSessionResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&createSessionResponseStackData, 0,
+                sizeof (CreateSessionResponseMsgData));
+                rc =
+                dynamic_cast<
+                CreateSessionResponseMsg & >(msg).
+                decodeCreateSessionResponseMsg(buffer,
+                            createSessionResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case ModifyBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                ModifyBearerRequestMsg & >(msg).
+                decodeModifyBearerRequestMsg(buffer,
+                            *(ModifyBearerRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&modifyBearerRequestStackData, 0,
+                sizeof (ModifyBearerRequestMsgData));
+                rc =
+                dynamic_cast<
+                ModifyBearerRequestMsg & >(msg).
+                decodeModifyBearerRequestMsg(buffer,
+                            modifyBearerRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case ModifyBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                ModifyBearerResponseMsg & >(msg).
+                decodeModifyBearerResponseMsg(buffer,
+                            *(ModifyBearerResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&modifyBearerResponseStackData, 0,
+                sizeof (ModifyBearerResponseMsgData));
+                rc =
+                dynamic_cast<
+                ModifyBearerResponseMsg & >(msg).
+                decodeModifyBearerResponseMsg(buffer,
+                            modifyBearerResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DeleteSessionRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DeleteSessionRequestMsg & >(msg).
+                decodeDeleteSessionRequestMsg(buffer,
+                            *(DeleteSessionRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&deleteSessionRequestStackData, 0,
+                sizeof (DeleteSessionRequestMsgData));
+                rc =
+                dynamic_cast<
+                DeleteSessionRequestMsg & >(msg).
+                decodeDeleteSessionRequestMsg(buffer,
+                            deleteSessionRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DeleteSessionResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DeleteSessionResponseMsg & >(msg).
+                decodeDeleteSessionResponseMsg(buffer,
+                            *(DeleteSessionResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&deleteSessionResponseStackData, 0,
+                sizeof (DeleteSessionResponseMsgData));
+                rc =
+                dynamic_cast<
+                DeleteSessionResponseMsg & >(msg).
+                decodeDeleteSessionResponseMsg(buffer,
+                            deleteSessionResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case ReleaseAccessBearersRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                ReleaseAccessBearersRequestMsg & >(msg).
+                decodeReleaseAccessBearersRequestMsg(buffer,
+                            *(ReleaseAccessBearersRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&releaseAccessBearersRequestStackData, 0,
+                sizeof (ReleaseAccessBearersRequestMsgData));
+                rc =
+                dynamic_cast<
+                ReleaseAccessBearersRequestMsg & >(msg).
+                decodeReleaseAccessBearersRequestMsg(buffer,
+                            releaseAccessBearersRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case ReleaseAccessBearersResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                ReleaseAccessBearersResponseMsg & >(msg).
+                decodeReleaseAccessBearersResponseMsg(buffer,
+                            *(ReleaseAccessBearersResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&releaseAccessBearersResponseStackData, 0,
+                sizeof (ReleaseAccessBearersResponseMsgData));
+                rc =
+                dynamic_cast<
+                ReleaseAccessBearersResponseMsg & >(msg).
+                decodeReleaseAccessBearersResponseMsg(buffer,
+                            releaseAccessBearersResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case CreateBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                CreateBearerRequestMsg & >(msg).
+                decodeCreateBearerRequestMsg(buffer,
+                            *(CreateBearerRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&createBearerRequestStackData, 0,
+                sizeof (CreateBearerRequestMsgData));
+                rc =
+                dynamic_cast<
+                CreateBearerRequestMsg & >(msg).
+                decodeCreateBearerRequestMsg(buffer,
+                            createBearerRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case CreateBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                CreateBearerResponseMsg & >(msg).
+                decodeCreateBearerResponseMsg(buffer,
+                            *(CreateBearerResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&createBearerResponseStackData, 0,
+                sizeof (CreateBearerResponseMsgData));
+                rc =
+                dynamic_cast<
+                CreateBearerResponseMsg & >(msg).
+                decodeCreateBearerResponseMsg(buffer,
+                            createBearerResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DeleteBearerRequestMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DeleteBearerRequestMsg & >(msg).
+                decodeDeleteBearerRequestMsg(buffer,
+                            *(DeleteBearerRequestMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&deleteBearerRequestStackData, 0,
+                sizeof (DeleteBearerRequestMsgData));
+                rc =
+                dynamic_cast<
+                DeleteBearerRequestMsg & >(msg).
+                decodeDeleteBearerRequestMsg(buffer,
+                            deleteBearerRequestStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DeleteBearerResponseMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DeleteBearerResponseMsg & >(msg).
+                decodeDeleteBearerResponseMsg(buffer,
+                            *(DeleteBearerResponseMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&deleteBearerResponseStackData, 0,
+                sizeof (DeleteBearerResponseMsgData));
+                rc =
+                dynamic_cast<
+                DeleteBearerResponseMsg & >(msg).
+                decodeDeleteBearerResponseMsg(buffer,
+                            deleteBearerResponseStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DownlinkDataNotificationMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationMsg & >(msg).
+                decodeDownlinkDataNotificationMsg(buffer,
+                            *(DownlinkDataNotificationMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&downlinkDataNotificationStackData, 0,
+                sizeof (DownlinkDataNotificationMsgData));
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationMsg & >(msg).
+                decodeDownlinkDataNotificationMsg(buffer,
+                            downlinkDataNotificationStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DownlinkDataNotificationAcknowledgeMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationAcknowledgeMsg & >(msg).
+                decodeDownlinkDataNotificationAcknowledgeMsg(buffer,
+                            *(DownlinkDataNotificationAcknowledgeMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&downlinkDataNotificationAcknowledgeStackData, 0,
+                sizeof (DownlinkDataNotificationAcknowledgeMsgData));
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationAcknowledgeMsg & >(msg).
+                decodeDownlinkDataNotificationAcknowledgeMsg(buffer,
+                            downlinkDataNotificationAcknowledgeStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+        case DownlinkDataNotificationFailureIndicationMsgType:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationFailureIndicationMsg & >(msg).
+                decodeDownlinkDataNotificationFailureIndicationMsg(buffer,
+                            *(DownlinkDataNotificationFailureIndicationMsgData*)
+                             data_p, msgDataLength);
+            }
+            else
+            { 
+                // Application wants to use the data structure provided by the stack
+                // let us first clear any data present in the internal data structure
+                memset (&downlinkDataNotificationFailureIndicationStackData, 0,
+                sizeof (DownlinkDataNotificationFailureIndicationMsgData));
+                rc =
+                dynamic_cast<
+                DownlinkDataNotificationFailureIndicationMsg & >(msg).
+                decodeDownlinkDataNotificationFailureIndicationMsg(buffer,
+                            downlinkDataNotificationFailureIndicationStackData,
+                            msgDataLength);
+            }
+            break;
+        }
+    }
+    return rc;
+}
+
+void 
+GtpV2Stack::display_v(Uint8 msgType, Debug& stream, void* data_p)
+{
+    // Display the messageType
+    stream.add ((char *)"MessageType: ");
+    stream.add (msgType);
+    stream.endOfLine ();
+      
+    GtpV2Message& msg = GtpV2MsgFactory::getInstance ().getMsgObject (msgType);
+
+    switch (msgType){
+        case CreateSessionRequestMsgType:
+        {
+            stream.add ((char *)"Message: CreateSessionRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            CreateSessionRequestMsg & >(msg).
+            displayCreateSessionRequestMsgData_v (*
+                        ((CreateSessionRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            CreateSessionRequestMsg & >(msg).
+            displayCreateSessionRequestMsgData_v
+                        (createSessionRequestStackData, stream);
+            }
+           break;
+        }
+        case CreateSessionResponseMsgType:
+        {
+            stream.add ((char *)"Message: CreateSessionResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            CreateSessionResponseMsg & >(msg).
+            displayCreateSessionResponseMsgData_v (*
+                        ((CreateSessionResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            CreateSessionResponseMsg & >(msg).
+            displayCreateSessionResponseMsgData_v
+                        (createSessionResponseStackData, stream);
+            }
+           break;
+        }
+        case ModifyBearerRequestMsgType:
+        {
+            stream.add ((char *)"Message: ModifyBearerRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            ModifyBearerRequestMsg & >(msg).
+            displayModifyBearerRequestMsgData_v (*
+                        ((ModifyBearerRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            ModifyBearerRequestMsg & >(msg).
+            displayModifyBearerRequestMsgData_v
+                        (modifyBearerRequestStackData, stream);
+            }
+           break;
+        }
+        case ModifyBearerResponseMsgType:
+        {
+            stream.add ((char *)"Message: ModifyBearerResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            ModifyBearerResponseMsg & >(msg).
+            displayModifyBearerResponseMsgData_v (*
+                        ((ModifyBearerResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            ModifyBearerResponseMsg & >(msg).
+            displayModifyBearerResponseMsgData_v
+                        (modifyBearerResponseStackData, stream);
+            }
+           break;
+        }
+        case DeleteSessionRequestMsgType:
+        {
+            stream.add ((char *)"Message: DeleteSessionRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DeleteSessionRequestMsg & >(msg).
+            displayDeleteSessionRequestMsgData_v (*
+                        ((DeleteSessionRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DeleteSessionRequestMsg & >(msg).
+            displayDeleteSessionRequestMsgData_v
+                        (deleteSessionRequestStackData, stream);
+            }
+           break;
+        }
+        case DeleteSessionResponseMsgType:
+        {
+            stream.add ((char *)"Message: DeleteSessionResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DeleteSessionResponseMsg & >(msg).
+            displayDeleteSessionResponseMsgData_v (*
+                        ((DeleteSessionResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DeleteSessionResponseMsg & >(msg).
+            displayDeleteSessionResponseMsgData_v
+                        (deleteSessionResponseStackData, stream);
+            }
+           break;
+        }
+        case ReleaseAccessBearersRequestMsgType:
+        {
+            stream.add ((char *)"Message: ReleaseAccessBearersRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            ReleaseAccessBearersRequestMsg & >(msg).
+            displayReleaseAccessBearersRequestMsgData_v (*
+                        ((ReleaseAccessBearersRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            ReleaseAccessBearersRequestMsg & >(msg).
+            displayReleaseAccessBearersRequestMsgData_v
+                        (releaseAccessBearersRequestStackData, stream);
+            }
+           break;
+        }
+        case ReleaseAccessBearersResponseMsgType:
+        {
+            stream.add ((char *)"Message: ReleaseAccessBearersResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            ReleaseAccessBearersResponseMsg & >(msg).
+            displayReleaseAccessBearersResponseMsgData_v (*
+                        ((ReleaseAccessBearersResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            ReleaseAccessBearersResponseMsg & >(msg).
+            displayReleaseAccessBearersResponseMsgData_v
+                        (releaseAccessBearersResponseStackData, stream);
+            }
+           break;
+        }
+        case CreateBearerRequestMsgType:
+        {
+            stream.add ((char *)"Message: CreateBearerRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            CreateBearerRequestMsg & >(msg).
+            displayCreateBearerRequestMsgData_v (*
+                        ((CreateBearerRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            CreateBearerRequestMsg & >(msg).
+            displayCreateBearerRequestMsgData_v
+                        (createBearerRequestStackData, stream);
+            }
+           break;
+        }
+        case CreateBearerResponseMsgType:
+        {
+            stream.add ((char *)"Message: CreateBearerResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            CreateBearerResponseMsg & >(msg).
+            displayCreateBearerResponseMsgData_v (*
+                        ((CreateBearerResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            CreateBearerResponseMsg & >(msg).
+            displayCreateBearerResponseMsgData_v
+                        (createBearerResponseStackData, stream);
+            }
+           break;
+        }
+        case DeleteBearerRequestMsgType:
+        {
+            stream.add ((char *)"Message: DeleteBearerRequestMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DeleteBearerRequestMsg & >(msg).
+            displayDeleteBearerRequestMsgData_v (*
+                        ((DeleteBearerRequestMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DeleteBearerRequestMsg & >(msg).
+            displayDeleteBearerRequestMsgData_v
+                        (deleteBearerRequestStackData, stream);
+            }
+           break;
+        }
+        case DeleteBearerResponseMsgType:
+        {
+            stream.add ((char *)"Message: DeleteBearerResponseMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DeleteBearerResponseMsg & >(msg).
+            displayDeleteBearerResponseMsgData_v (*
+                        ((DeleteBearerResponseMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DeleteBearerResponseMsg & >(msg).
+            displayDeleteBearerResponseMsgData_v
+                        (deleteBearerResponseStackData, stream);
+            }
+           break;
+        }
+        case DownlinkDataNotificationMsgType:
+        {
+            stream.add ((char *)"Message: DownlinkDataNotificationMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DownlinkDataNotificationMsg & >(msg).
+            displayDownlinkDataNotificationMsgData_v (*
+                        ((DownlinkDataNotificationMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DownlinkDataNotificationMsg & >(msg).
+            displayDownlinkDataNotificationMsgData_v
+                        (downlinkDataNotificationStackData, stream);
+            }
+           break;
+        }
+        case DownlinkDataNotificationAcknowledgeMsgType:
+        {
+            stream.add ((char *)"Message: DownlinkDataNotificationAcknowledgeMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DownlinkDataNotificationAcknowledgeMsg & >(msg).
+            displayDownlinkDataNotificationAcknowledgeMsgData_v (*
+                        ((DownlinkDataNotificationAcknowledgeMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DownlinkDataNotificationAcknowledgeMsg & >(msg).
+            displayDownlinkDataNotificationAcknowledgeMsgData_v
+                        (downlinkDataNotificationAcknowledgeStackData, stream);
+            }
+           break;
+        }
+        case DownlinkDataNotificationFailureIndicationMsgType:
+        {
+            stream.add ((char *)"Message: DownlinkDataNotificationFailureIndicationMsg");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            DownlinkDataNotificationFailureIndicationMsg & >(msg).
+            displayDownlinkDataNotificationFailureIndicationMsgData_v (*
+                        ((DownlinkDataNotificationFailureIndicationMsgData*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            DownlinkDataNotificationFailureIndicationMsg & >(msg).
+            displayDownlinkDataNotificationFailureIndicationMsgData_v
+                        (downlinkDataNotificationFailureIndicationStackData, stream);
+            }
+           break;
+        }
+    }
+}
